Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 808 → Rev 853

/impl/build/ant/war/user/processes/listMetaProcesses.jsp
New file
0,0 → 1,33
<%@ page import="jomm.dao.utils.HibernateUtils" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.web.UserSessionProxy" %>
<%@ page import="pt.estgp.estgweb.domain.UserSession" %>
<%@ page import="pt.estgp.estgweb.domain.MetaProcessImpl" %>
<%@ page import="java.util.List" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Listagem de MetaProcessos</title>
</head>
<body>
<%
HibernateUtils.getCurrentSession().beginTransaction();
List<MetaProcessImpl> metaProcesses = DaoFactory.getMetaProcessDaoImpl().findRoleMetaProcesses(UserSession.getUser().getRolesList());
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("metaProcesses",metaProcesses);
%>
<ul>
<logic:iterate id="meta" name="metaProcesses" type="pt.estgp.estgweb.domain.MetaProcessImpl">
<li><a href="<%=request.getContextPath()%>/user/startNewProcess.do?metaProcessId=${meta.id}">${meta.name}</a> - ${meta.description}</li>
</logic:iterate>
</ul>
 
 
</body>
</html>
/impl/build/ant/war/user/processes/startMetaProcess.jsp
New file
0,0 → 1,75
<%@ page import="jomm.dao.utils.HibernateUtils" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.domain.MetaProcessImpl" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.domain.MetaProcess" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
long metaProcessId = Long.parseLong(request.getParameter("metaProcessId"));
HibernateUtils.getCurrentSession().beginTransaction();
MetaProcess metaProcess = DaoFactory.getMetaProcessDaoImpl().get(metaProcessId);
 
request.setAttribute("metaProcess",metaProcess);
%>
<html>
<head>
<title>Iniciar Processo ${metaProcess.name}</title>
</head>
<body>
<h2>${metaProcess.name}</h2>
 
<p>Caro ${UserSession.name} Está prestes a submeter um processo de <b>${metaProcess.name}</b></p>
 
<p>Para concretizar este pedido deverá fazer <i>download</i> do seguinte documento digital, preencher o mesmo com a informação requisitada e envia-lo por este formulário para que seja expedido para o serviço respectivo:</p>
<p><a href="<%=request.getContextPath()%>/repositoryStream/${metaProcess.repositoryStream}">Documento Digital</a></p>
<%
if(metaProcess.getTargetPerson() == null)
{
%>
<p>Este documento vai ser expedido para: <b><bean:message key="user.role.${metaProcess.targetRole}"/></b></p>
<%
}
else
{
%>
<p>Pessoa para expedir: <bean:message key="user.role.${metaProcess.targetPerson.name}"/></p>
<%
}
%>
 
<html:form action="/user/processesController" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="submitNew">
<html:hidden property="metaProcessId" value="${metaProcess.id}"/>
<table class="dataTable">
<tr>
<td align="right">Remetente</td>
<td>${UserSession.name}</td>
</tr>
<tr>
<td align="right">Carregue o ficheiro digital do seu disco aqui</td>
<td><html:file property="file"/></td>
</tr>
<tr>
<td align="right" style="vertical-align: top">Coloque aqui um comentário se achar necessário</td>
<td><html:textarea style="width: 300;height: 200" property="notes"/></td>
</tr>
<tr>
<td colspan="2"><html:submit/></td>
</tr>
 
</table>
 
 
</html:form>
 
</body>
</html>
<%
HibernateUtils.getCurrentSession().getTransaction().commit();
%>
/impl/conf/language/MessageResourcesEmail.properties
3,15 → 3,15
# MAIL MESSAGE RESOURCES
#
################################################################################
module.Email=Serviço de Email
pop.no.messages=Não tem mensagens na sua caixa de correio
pop.title=Ir para <a target="_blank" href="http://mail.estgp.pt/exchange/{0}">WEBMAIL</a>
pop.last.messages=Últimas mensagens de Email
module.Email=Servi\u00e7o de Email
pop.no.messages=N\u00e3o tem mensagens na sua caixa de correio
pop.title=Ir para <a target="_blank" href="http://mail.google.com/a/estgp.pt/{0}">WEBMAIL</a>
pop.last.messages=\u00daltimas mensagens de Email
pop.text=Mensagem
pop.from=De
pop.to=Para
pop.subject=Assunto
pop.loading=Carregando mensagens de Email...
pop.date=Recebido
pop.not.configured=A caixa POP do seu servidor de Email não está configurado. A sigla POP refere-se ao protocolo de leitura de mensagens em servidores de email externos. Por favor configure o seu servidor de POP nos seus dados de perfil<br>(exemplo na ESTG:<br> pop = mail.estgp.pt)
pop.danger.messages=Existem mensagens na sua caixa de correio da escola que estão incorrectamente formatadas e que podem prejudicar a vizualização deste sítio. Por favor remova-as da sua caixa para que as restantes possam ser aqui apresentadas.
pop.not.configured=A caixa POP do seu servidor de Email n\u00e3o est\u00e1 configurado. A sigla POP refere-se ao protocolo de leitura de mensagens em servidores de email externos. Por favor configure o seu servidor de POP nos seus dados de perfil<br>(exemplo na ESTG:<br> pop = mail.estgp.pt)
pop.danger.messages=Existem mensagens na sua caixa de correio da escola que est\u00e3o incorrectamente formatadas e que podem prejudicar a vizualiza\u00e7\u00e3o deste s\u00edtio. Por favor remova-as da sua caixa para que as restantes possam ser aqui apresentadas.
/impl/conf/language/MessageResourcesSurvey.properties
101,6 → 101,7
 
# TO.DO
module.Surveys=Questionários
 
survey.type.todo=Para responder
 
 
/impl/conf/language/MessageResourcesCourse.properties
43,13 → 43,13
course.Bs=Bacharelatos
course.Ls=Licenciaturas
course.Ms=Mestrados
course.Ps=Pós Graduaçãos
course.Ps=Pós Graduações
course.Es=CET's
 
 
course.units.no.program=Unidades sem programa entregue
course.units.with.program.not.checked=Unidades com programa por validar
course.units.with.program.checked=Unidades com programa válido
course.units.no.program=Unidades sem programa entregue <br/> Os docentes devem entregar estes programas na página das suas unidades
course.units.with.program.not.checked=Unidades com programa por validar <br/> (O programa só pode ser validado pelos membros da comissão deste curso)
course.units.with.program.checked=Unidades com programa válido <br/> (O programa só pode ser invalidado pelos membros da comissão deste curso ficando assim aberto a edição pelos docentes das unidades)
course.valid.program=Programa Validado
course.directed.coordinated=Cursos que coordena e/ou dirige (Apenas os Presidentes dos Departamentos tem permissão para alterar o estado de um programa)
courseunit.programs=Programas Curriculares
82,11 → 82,11
course.menu.home=Inicio
course.menu.studiesplan=Plano de Estudos
course.menu.internacionalicao=Internacionalização
course.menu.labs=Laboratorios
course.menu.labs=Laboratórios
course.menu.actividades=Actividades
course.menu.casos=Casos de sucesso
course.menu.parceiros=Parceiros
course.menu.faq=FAQ
course.menu.publicacoes=Publicações
 
 
status=Curso Activo
/impl/conf/language/MessageResourcesProcesses.properties
New file
0,0 → 1,39
################################################################################
#
# PROCESSES MESSAGE RESOURCES
#
################################################################################
processes.list.meta.processes=Listar processos de expedição
processes.new.process=Expedir de Pedido
 
process.submited=Processo submetido com sucesso
 
processes.list.processes=Listagem de Processos
processes.opening.process=Processo em Vizualização
 
module.Processes=Processos requerendo a sua intervenção
 
processes.type.todo=Transitado
 
process.cant.reopen=Não tem permissão para reabrir este processo
 
processes.file.set.ghost=O ficheiro foi colocado como invisivel e o nivel de acesso alterado para apenas você poderá descarrega-lo
processes.file.unset.ghost=O ficheiro foi colocado como visivel e o nivel de acesso reposto para {0}
 
process.access.level.ALL_EXCEPT_STARTER=Todos menos o requerente
process.access.level.ALL_IN_PROCESS=Todos os intervenientes
process.access.level.OWNER=Apenas EU
process.access.level.FORWARD_EVENTS=Daqui para a frente
process.access.level.BACKWARD_EVENTS=Daqui para trás
process.access.level.DEFINED_USERS_IDS=Utilizadores definidos
process.access.level.DEFINED_ROLES_IDS=Papeis definidos
 
process.state.OPEN=Aberto
process.state.TRANSITION=Em Trânsito
process.state.CLOSED=Fechado
 
 
process.event.state.NOT_ACCEPTED=Não Aceite
process.event.state.ACCEPTED=Aceite
process.event.state.FINNISH_TRANSITATED=Transitado
process.event.state.FINNISH_CLOSED=Fechado
/impl/conf/language/MessageResources.properties
116,7 → 116,23
user.role.invited=Convidado
user.role.services=Serviços
user.role.servicesPrograms=Gestão de Programas Curriculares
user.role.administrativeCouncil=Director
 
user.role.administrativeCouncil=Membro da Direcção
 
 
user.role.administrativeCouncil.director=Director
user.role.administrativeCouncil.vice=Vice Director
user.role.schoolSecretary=Secretário da Escola
user.role.administrativeCouncilSecretariat=Secretaria da Direcção
user.role.teachersSecretariat=Secretaria de Pessoal Docente
user.role.dtd.president=Presidente do departamento de Tecnologia e Design
user.role.cesh.president=Presidente do departamento de Ciências Empresariais Sociais e Humanas
user.role.dtd.presidency=Membro da Presidencia do departamento de Tecnologia e Design
user.role.cesh.presidency=Membro da Presidencia do departamento de Ciências Empresariais Sociais e Humanas
user.role.scientificCouncil.president=Presidente do Conselho Científico
user.role.representativeCouncil.president=Presidente do Conselho de Representantes
user.role.pedagogicCouncil.president=Presidente do Conselho Pedagógico
 
user.role.representativeCouncil=Conselho de Representantes
user.role.scientificCouncil=Conselho Científico
user.role.erasmusCouncil=Conselho Erasmus
136,6 → 152,7
user.role.admin,teacher=Admin e Professor
user.role.assessementsTester=Testador de Provas de Avaliação
 
user.role.processes.admin=Inspector de Processos
#Filter Errors
fail.role=Lamentamos o incómodo, mas necessita de permissões especiais para aceder a esta área.
fail.owner=Lamentamos o incómodo, mas não tem permissões sobre o objecto ao qual tentou aceder.
/impl/conf/language/MessageResourcesCourseUnits.properties
8,21 → 8,22
courseunit={0}
 
course.nav.without.arrow={0}
courseunit.security.not.implemented=Não implementado por razões de segurança
courseunit.security.not.implemented=N\u00e3o implementado por raz\u00f5es de seguran\u00e7a
courseunit.removed=Unidade Removida com sucesso
courseunit.menu.unit.old.units=Anos anteriores
courseunit.menu.unit.other.units=Outros Anos
courseunit.menu.unit=Unidade
courseunit.teachers=Corpo Docente
courseunit.objectives=Objectivos da Unidade
courseunit.programfile.invalid=O programa encontra-se submetido pela administração mas não está validado pela Comissão de Curso
courseunit.programfile.invalid=O programa encontra-se submetido pela administra\u00e7\u00e3o mas n\u00e3o est\u00e1 validado pela Comiss\u00e3o de Curso
courseunit.programfilepath=Programa Curricular
courseunit.programfilepath.not.available=O Programa Curricular não está disponivel
courseunit.objectives.not.available=Os objectivos não estão disponiveis
courseunit.summaries=Sumários
courseunit.programfilepath.not.available=O Programa Curricular n\u00e3o est\u00e1 disponivel
courseunit.objectives.not.available=Os objectivos n\u00e3o est\u00e3o disponiveis
courseunit.summaries=Sum\u00e1rios
courseunit.summary.present.students=alunos presentes (valor de amostragem)
courseunit.summaries.zero.placed=Não existem sumários disponiveis
courseunit.summaries.zero.placed=N\u00e3o existem sum\u00e1rios disponiveis
courseunit.program.description=Programa Curricular de {0}
courseunit.pathIntranet=Pasta de ficheiros na intranet
 
courseunit.program.archive=Arquivo
 
33,7 → 34,7
courseunit.objectives.todo=Peenchimento dos objectivos da unidade
courseunit.program.todo=Upload do programa da unidade
courseunit.program.objectives.todo=Programa e/ou Objectivos
courseunit.question.todo=Dúvida
courseunit.question.todo=D\u00favida
courseunit.assignement.todo=Trabalho por entregar
course.unit.works=Trabalhos
courseunit.works=Trabalhos
42,9 → 43,9
courseunit.search.unit=Procurar Unidade Curricular
 
courseunit.name=Nome
courseunit.code=Código
courseunit.code=C\u00f3digo
courseunit.semestre=Semestre
courseunit.importYear=Ano de Importação
courseunit.importYear=Ano de Importa\u00e7\u00e3o
courseunit.course=Curso
 
 
54,32 → 55,32
 
courseunit.assignement=Trabalho: {0}
 
courseunit.teacher.situation=Situação de Professores
courseunit.teacher.situation=Situa\u00e7\u00e3o de Professores
courseunit.teacher.situation.withTeachers=Com Professor
courseunit.teacher.situation.withNoTeachers=Sem Professor
courseunit.teacher.situation.all=Todos
courseunit.S1=1º Semestre
courseunit.S2=2ª Semestre
courseunit.S1=1\u00ba Semestre
courseunit.S2=2\u00aa Semestre
courseunit.ALL=Todos os Semestres
courseunit.assignement.delivered.date=Data de Entrega
courseunit.assignement.delivered.date.first.version=Data de Entrega da Primeira Versão
courseunit.assignement.delivered.versions=Total de Versões Entregues
courseunit.assignement.delivered.date.first.version=Data de Entrega da Primeira Vers\u00e3o
courseunit.assignement.delivered.versions=Total de Vers\u00f5es Entregues
courseunit.assignement.deliver.date=Data Limite de Entrega
courseunit.assignement.deliver.type=Tipo de entrega
courseunit.assignement.deliver.type.zipfile=Ficheiro Comprimido (ZIP)
courseunit.assignement.deliver.type.file=Ficheiro Electrónico
courseunit.assignement.deliver.type.file=Ficheiro Electr\u00f3nico
courseunit.assignement.deliver.grade=Nota
courseunit.assignement.deliver.show.obs=Adicionar observações
courseunit.assignement.deliver.show.obs=Adicionar observa\u00e7\u00f5es
courseunit.assignement.deliver.obs=obs
courseunit.assignement.deliver.type.nofile=Entrega não controlada pelo sistema
courseunit.assignement.deliver.type.nofile=Entrega n\u00e3o controlada pelo sistema
courseunit.assignement.deliver.late.permission=Permitir entregas atrasadas
courseunit.assignement.delivers=Número de Entregas
courseunit.assignement.deliver.version=Versão Entregue
courseunit.assignement.delivers=N\u00famero de Entregas
courseunit.assignement.deliver.version=Vers\u00e3o Entregue
courseunit.assignement.deliver=Entregar Trabalho
courseunit.search=Procurar Unidade Curricular
courseunitwork.confirm.delete=Atenção: Todas as entregas de alunos serão também removidas. Pode Invalidar o trabalho para este não ficar visivel aos alunos e desta forma mantém a informação relativa a entregas. De certeza que pretende apagar o Trabalho selecionado?
courseunitwork.confirm.delete=Aten\u00e7\u00e3o: Todas as entregas de alunos ser\u00e3o tamb\u00e9m removidas. Pode Invalidar o trabalho para este n\u00e3o ficar visivel aos alunos e desta forma mant\u00e9m a informa\u00e7\u00e3o relativa a entregas. De certeza que pretende apagar o Trabalho selecionado?
courseunit.assignement.deliver.sucess=Trabalho {0} entregue com sucesso
errors.courseunit.assignement.deliver.file=O Ficheiro que escolheu não existe ou estão vazio
errors.courseunit.assignement.deliver.file=O Ficheiro que escolheu n\u00e3o existe ou est\u00e3o vazio
errors.courseunit.assignement.deliver.zip=Por favor escolha um ficheiro comprimido em formato ZIP
errors.courseunit.assignement.file.type=Por favor escolha um ficheiro comprimido em formato ZIP
courseunit.students=Estudantes
91,69 → 92,69
courseunit.assignement.deliver.time.ok=Entregue a Horas
courseunit.assignement.deliver.time.late=Entrega atrasada
courseunit.assignement.deliver.time.no=Por Entregar
courseunit.menu.home=Início
courseunit.menu.put.question=Colocar dúvida
courseunit.menu.put.announcement=Colocar Anúncio
courseunit.menu.home=In\u00edcio
courseunit.menu.put.question=Colocar d\u00favida
courseunit.menu.put.announcement=Colocar An\u00fancio
courseunit.menu.assignements=Trabalhos
courseunit.menu.blog=Blog da Unidade
courseunit.menu.files=Ficheiros
courseunit.menu.presences=Assiduidade
courseunit.menu.contents=Conteúdos
courseunit.menu.grades=Avaliação
courseunit.menu.contents=Conte\u00fados
courseunit.menu.grades=Avalia\u00e7\u00e3o
 
replace=Substituir
 
courseunit.assignement.file=Enunciado
 
error.courseunit.student.not.found=Estudante não encontrado
error.courseunit.teacher.not.found=Professor não encontrado
error.courseunit.student.not.found=Estudante n\u00e3o encontrado
error.courseunit.teacher.not.found=Professor n\u00e3o encontrado
 
 
 
 
 
backups=Cópias de Segurança
courseunits.backups=Criar cópia de Segurança de todos das Unidades Curriculares em todos os cursos
courseunits.backups.actual.year=Criar cópia de Segurança (apenas do ano corrente) de todos das Unidades Curriculares em todos os cursos
backups=C\u00f3pias de Seguran\u00e7a
courseunits.backups=Criar c\u00f3pia de Seguran\u00e7a de todos das Unidades Curriculares em todos os cursos
courseunits.backups.actual.year=Criar c\u00f3pia de Seguran\u00e7a (apenas do ano corrente) de todos das Unidades Curriculares em todos os cursos
courseunits.actual.year.backup=Backup do ano corrente
courseunits.all.backup=Backup de todos os anos (Este serviço pode demorar alguns minutos a executar)
courseunits.all.backup=Backup de todos os anos (Este servi\u00e7o pode demorar alguns minutos a executar)
 
 
 
 
 
 
courseunits.units.warning=Caro {0}, caso alguma das unidades curriculares lhe esteja indevidamente atribuida por favor dirija-se ao Centro Informático para que a situação seja corrijida.
courseunits.units.warning=Caro {0}, caso alguma das unidades curriculares lhe esteja indevidamente atribuida por favor dirija-se ao Centro Inform\u00e1tico para que a situa\u00e7\u00e3o seja corrijida.
 
 
 
courseunit.responsable=Professor responsável
courseunit.responsable=Professor respons\u00e1vel
 
 
 
courseunits.contentsGrants=Permissões de Consulta dos Ficheiros de Conteúdos
courseunits.contentsGrants=Permiss\u00f5es de Consulta dos Ficheiros de Conte\u00fados
courseunits.contentsGrants.PUBLIC=PUBLICAS
courseunits.contentsGrants.PRIVATE=PRIVADOS A ESTUDANTES E DOCENTES DA UNIDADE
courseunits.contentsGrants.INTERNAL=COMUNIDADE ACADÉMICA
courseunits.contentsGrants.INTERNAL=COMUNIDADE ACAD\u00c9MICA
 
 
courseunit.program.objectivos=Objetivos da aprendizagem (conhecimentos, aptidões e competências) a desenvolver pelos estudantes, operacionalização dos objetivos e medição do seu grau de cumprimento)
courseunit.program.conteudosProgramaticos=Conteúdos
courseunit.program.prerequisitos=Pré-requisitos
courseunit.program.demonstracaoCoerenciaConteudosObjectivos=Demonstração da coerência dos conteúdos programáticos com os objectivos da unidade curricular
courseunit.program.objectivos=Objetivos da aprendizagem (conhecimentos, aptid\u00f5es e compet\u00eancias) a desenvolver pelos estudantes, operacionaliza\u00e7\u00e3o dos objetivos e medi\u00e7\u00e3o do seu grau de cumprimento)
courseunit.program.conteudosProgramaticos=Conte\u00fados
courseunit.program.prerequisitos=Pr\u00e9-requisitos
courseunit.program.demonstracaoCoerenciaConteudosObjectivos=Demonstra\u00e7\u00e3o da coer\u00eancia dos conte\u00fados program\u00e1ticos com os objectivos da unidade curricular
courseunit.program.metodologiasEnsino=Metodologias de ensino e Aprendizagem
courseunit.program.demonstracaoDaCoerenciaMetodologiasObjectivos=Demonstração da coerência das metodologias de ensino com os objectivos da aprendizagem da unidade curricular
courseunit.program.lingua1=Língua de ensino
courseunit.program.lingua2=Língua de ensino 2
courseunit.program.avaliacao=Avaliação <br/>[indicar os componentes d sistema de avaliação, tipo, matéria e peso de cada componente na classificação final]
courseunit.program.alunosOrdinariosPorFrequencia=Avaliação por frequência
courseunit.program.alunosOrdinariosPorExame=Avaliação por Exame
courseunit.program.demonstracaoDaCoerenciaMetodologiasObjectivos=Demonstra\u00e7\u00e3o da coer\u00eancia das metodologias de ensino com os objectivos da aprendizagem da unidade curricular
courseunit.program.lingua1=L\u00edngua de ensino
courseunit.program.lingua2=L\u00edngua de ensino 2
courseunit.program.avaliacao=Avalia\u00e7\u00e3o <br/>[indicar os componentes d sistema de avalia\u00e7\u00e3o, tipo, mat\u00e9ria e peso de cada componente na classifica\u00e7\u00e3o final]
courseunit.program.alunosOrdinariosPorFrequencia=Avalia\u00e7\u00e3o por frequ\u00eancia
courseunit.program.alunosOrdinariosPorExame=Avalia\u00e7\u00e3o por Exame
courseunit.program.bibliografia=Bibliografia
courseunit.program.bibliografiaPrincipal=Bibliografia Principal
courseunit.program.bibliografiaComplementar=Bibliografia Complementar
courseunit.program.avaliacao.especial=Alunos em mobilidade e alunos com estatuto especial
courseunit.program.alunosMobilidadeAlunosComEstatutoEspecialPorFrequencia=Avaliação por frequência
courseunit.program.alunosMobilidadeAlunosComEstatutoEspecialPorExame=Avaliação por Exame
courseunit.program.alunosMobilidadeAlunosComEstatutoEspecialPorFrequencia=Avalia\u00e7\u00e3o por frequ\u00eancia
courseunit.program.alunosMobilidadeAlunosComEstatutoEspecialPorExame=Avalia\u00e7\u00e3o por Exame
courseunit.program.ects.title=ECTS/tempo de trabalho (horas)
courseunit.program.ects=ECTS
courseunit.program.ects.cargaHorariaTotal=Total
167,5 → 168,6
 
 
 
courseunit.consultaroutros=Consultar outros programas
courseunit.confirmaclonagem=Tem a certeza que deseja clonar o programa do ano na caixa de selecção para este programa actualmente aberto para edição? Vai gerar uma nova versão de programa e a anterior será arquivada em PDF.
 
 
/impl/conf/WEB-INF/struts/tiles-processes.xml
New file
0,0 → 1,35
<?xml version="1.0" encoding="UTF-8" ?>
 
<!--<!DOCTYPE tiles-definitions PUBLIC-->
<!--"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"-->
<!--"http://struts.apache.org/dtds/tiles-config_1_1.dtd">-->
 
 
<tiles-definitions>
 
 
<definition name="page.open.process" extends="page.separators.home">
<put name="title" value="Ver Processo" />
<put name="topnav" value="/user/processes/topnavOpenProcess.jsp"/>
<put name="body" value="/user/processes/openProcess.jsp" />
</definition>
 
<definition name="page.list.processes" extends="page.separators.home">
<put name="title" value="Processos" />
<put name="topnav" value="/user/processes/topnavListProcesses.jsp"/>
<put name="body" value="/user/processes/listProcesses.jsp" />
</definition>
 
<definition name="page.list.meta.processes" extends="page.separators.utils">
<put name="title" value="Escolher um processo para pedido" />
<put name="topnav" value="/user/processes/topnavListMetaProcesses.jsp"/>
<put name="body" value="/user/processes/listMetaProcesses.jsp" />
</definition>
 
<definition name="page.new.process" extends="page.separators.utils">
<put name="title" value="Expedir um pedido" />
<put name="topnav" value="/user/processes/topnavNewProcess.jsp"/>
<put name="body" value="/user/processes/startMetaProcess.jsp" />
</definition>
</tiles-definitions>
/impl/conf/WEB-INF/struts/struts-courseunits.xml
48,7 → 48,7
</action>
 
<action path="/courseUnitProgramController"
type="pt.estgp.estgweb.web.controllers.courseunits.CourseUnitsController"
type="pt.estgp.estgweb.web.controllers.courseunits.CourseUnitsProgramController"
name="CourseUnitProgramForm"
scope="request"
parameter="dispatch"
/impl/conf/WEB-INF/struts/tiles-assessments.xml
New file
0,0 → 1,60
<?xml version="1.0" encoding="UTF-8" ?>
 
<!--<!DOCTYPE tiles-definitions PUBLIC-->
<!--"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"-->
<!--"http://struts.apache.org/dtds/tiles-config_1_1.dtd">-->
 
<tiles-definitions>
 
<definition name="page.submit.assessment.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavCreateAssessment.jsp"/>
<put name="body" value="/user/assessments/submitAssessment.jsp"/>
</definition>
 
<definition name="page.list.assessments.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavListAssessment.jsp"/>
<put name="body" value="/user/assessments/listAssessments.jsp"/>
</definition>
 
<definition name="page.submit.schedule.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavScheduleAssessment.jsp"/>
<put name="body" value="/user/assessments/scheduleAssessment.jsp"/>
</definition>
 
<definition name="page.submit.editSchedule.from.serviceZone" extends="page.separators.serviceZone">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavEditScheduleAssessment.jsp"/>
<put name="body" value="/user/assessments/editScheduleAssessment.jsp"/>
</definition>
 
<definition name="page.submit.assessment.response.from.home" extends="page.separators.home">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/home/topnavResponseAssessment.jsp"/>
<put name="body" value="/user/assessments/submitAssessmentResponse.jsp"/>
</definition>
 
<definition name="page.configure.correct.assessment.from.serviceZone" extends="page.separators.home">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavConfigureCorrectAssessment.jsp"/>
<put name="body" value="/user/assessments/switchCorrectAssessment.jsp"/>
</definition>
<definition name="page.list.questionsOrResponsesCorrect.from.serviceZone" extends="page.separators.home">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavAssessmentToCorrect.jsp"/>
<put name="body" value="/user/assessments/listQuestionsOrResponsesToCorrect.jsp"/>
</definition>
<definition name="page.submit.correct.assessment.response.from.serviceZone" extends="page.separators.home">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavCorrectAssessmentResponse.jsp"/>
<put name="body" value="/user/assessments/submitCorrectAssessmentResponse.jsp"/>
</definition>
<definition name="page.submit.correct.question.responses.from.serviceZone" extends="page.separators.home">
<put name="title" value="Prova"/>
<put name="topnav" value="/user/serviceZone/topnavCorrectAssessmentQuestionResponses.jsp"/>
<put name="body" value="/user/assessments/submitCorrectQuestionResponses.jsp"/>
</definition>
 
</tiles-definitions>
/impl/conf/WEB-INF/struts/struts-assessment.xml
New file
0,0 → 1,141
<?xml version="1.0" encoding="UTF-8"?>
 
<!--<!DOCTYPE struts-config PUBLIC-->
<!--"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"-->
<!--"http://struts.apache.org/dtds/struts-config_1_3.dtd">-->
 
<struts-config>
 
<form-beans>
<form-bean type="pt.estgp.estgweb.web.form.assessments.AssessmentsForm" name="AssessmentsForm"/>
</form-beans>
 
<global-exceptions>
 
</global-exceptions>
 
<global-forwards>
 
</global-forwards>
 
<action-mappings>
 
<action path="/user/submitAssessmentFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.assessment.from.serviceZone"
validate="true">
<forward name="serviceZone" path="page.separators.serviceZone"/>
</action>
 
<action path="/user/scheduleAssessmentFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.schedule.from.serviceZone"
validate="true">
<forward name="serviceZone" path="page.separators.serviceZone"/>
</action>
 
<action path="/user/editScheduleAssessmentFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.editSchedule.from.serviceZone"
validate="false">
<forward name="serviceZone" path="page.separators.serviceZone"/>
</action>
 
<action path="/user/startAssessmentResponseFromHome" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=loadResponse&amp;from=Home"/>
<action path="/user/submitAssessmentResponseFromHome"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.assessment.response.from.home"
validate="false">
<forward name="home" path="page.separators.home"/>
</action>
 
<action path="/user/submitConfigureCorrectAssessmentFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.configure.correct.assessment.from.serviceZone"
validate="false">
<forward name="listQuestionsOrResponsesToCorrect" path="page.list.questionsOrResponsesCorrect.from.serviceZone"/>
</action>
 
<action path="/user/chooseQuestionOrAssessmentToCorrectFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.list.questionsOrResponsesCorrect.from.serviceZone"
validate="false">
<!--<forward name="listQuestionsOrResponsesToCorrect" path="page.list.questionsOrResponsesCorrect.from.serviceZone"/>-->
</action>
 
<!--SUBMETER CORRECCAO A UMA PROVA INDIVIDUAL-->
<action path="/user/startSubmitCorrectAssessmentResponseFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=loadCorrectResponse&amp;from=ServiceZone"/>
<action path="/user/submitCorrectAssessmentResponseFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.correct.assessment.response.from.serviceZone"
validate="false">
<forward name="serviceZone" path="page.separators.serviceZone"/>
<forward name="listQuestionsOrResponsesToCorrect" path="page.list.questionsOrResponsesCorrect.from.serviceZone"/>
</action>
 
<!--SUBMETER CORRECCAO ÀS RESPOSTAS DE UMA QUESTÃO INDIVIDUAL-->
<action path="/user/startSubmitCorrectQuestionResponsesFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=loadQuestionResponses&amp;from=ServiceZone"/>
<action path="/user/submitCorrectQuestionResponsesFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.correct.question.responses.from.serviceZone"
validate="false">
<forward name="serviceZone" path="page.separators.serviceZone"/>
<forward name="listQuestionsOrResponsesToCorrect" path="page.list.questionsOrResponsesCorrect.from.serviceZone"/>
</action>
 
<!--<action path="/user/startLoadSurveyNodeGraphs" forward="page.load.survey.node.graphs"/>-->
<!--<action path="/user/startListSurveyStats" forward="/user/surveysControllerFromServiceZone.do?dispatch=listStats"/>-->
<action path="/user/generateEvaluationsPdfFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=generateEvaluationsPdf&amp;from=ServiceZone"/>
<action path="/user/startCorrectAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=startCorrect&amp;from=ServiceZone"/>
<action path="/user/startScheduleAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=schedule&amp;from=ServiceZone"/>
<action path="/user/startEditScheduleAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=editSchedule&amp;from=ServiceZone"/>
<action path="/user/startCloneAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=clone&amp;from=ServiceZone"/>
<action path="/user/startEditAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=edit&amp;from=ServiceZone"/>
<action path="/user/startListAssessmentsFromServiceZone" forward="page.list.assessments.from.serviceZone"/>
<action path="/user/startSubmitAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=create&amp;from=ServiceZone"/>
<action path="/user/assessmentsControllerFromServiceZone"
type="pt.estgp.estgweb.web.controllers.assessments.AssessmentController"
name="AssessmentsForm"
scope="request"
parameter="dispatch"
input="page.submit.assessment.from.serviceZone"
validate="false">
<forward name="listAssessments" path="page.list.assessments.from.serviceZone"/>
<forward name="loadQuestionResponses" path="page.submit.correct.question.responses.from.serviceZone"/>
<forward name="loadCorrectResponse" path="page.submit.correct.assessment.response.from.serviceZone"/>
<forward name="startCorrect" path="page.configure.correct.assessment.from.serviceZone"/>
<forward name="response" path="page.submit.assessment.response.from.home"/>
<!--<forward name="stats" path="page.list.survey.stats"/>-->
<forward name="schedule" path="page.submit.schedule.from.serviceZone"/>
<forward name="editSchedule" path="page.submit.editSchedule.from.serviceZone"/>
<forward name="serviceZone" path="page.separators.serviceZone"/>
<forward name="from.add.role" path="page.submit.assessment.from.serviceZone"/>
</action>
 
</action-mappings>
 
</struts-config>
/impl/conf/WEB-INF/struts/struts-default.xml
204,6 → 204,7
/WEB-INF/struts/tiles-managedidentifier.xml,
/WEB-INF/struts/tiles-srusource.xml,
/WEB-INF/struts/tiles-survey.xml,
/WEB-INF/struts/tiles-processes.xml,
/WEB-INF/struts/tiles-comunicationfolder.xml"/> <!-- Duarte Santos -->
</plug-in>
 
/impl/conf/WEB-INF/struts/struts-processes.xml
New file
0,0 → 1,53
<?xml version="1.0" encoding="UTF-8"?>
 
<!--<!DOCTYPE struts-config PUBLIC-->
<!--"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"-->
<!--"http://struts.apache.org/dtds/struts-config_1_3.dtd">-->
 
<struts-config>
<form-beans>
<form-bean type="pt.estgp.estgweb.web.form.processes.NewProcessForm" name="NewProcessForm"/>
<form-bean type="pt.estgp.estgweb.web.form.processes.NewMetaProcessForm" name="NewMetaProcessForm"/>
<form-bean type="pt.estgp.estgweb.web.form.processes.ProcessEventForm" name="ProcessEventForm"/>
</form-beans>
 
<global-exceptions>
 
</global-exceptions>
 
<global-forwards>
 
</global-forwards>
<action-mappings>
 
 
 
<action path="/user/openProcess" forward="page.open.process"/>
<action path="/user/listProcesses" forward="page.list.processes"/>
<action path="/user/listMetaProcesses" forward="page.list.meta.processes"/>
<action path="/user/startNewProcess" forward="page.new.process"/>
 
<action path="/user/processesController"
type="pt.estgp.estgweb.web.controllers.processes.ProcessesController"
name="NewProcessForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.welcome">
 
<forward name="process.submited" path="page.separators.home"/>
</action>
 
<action path="/user/processEventController"
type="pt.estgp.estgweb.web.controllers.processes.ProcessEventController"
name="ProcessEventForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.open.process">
 
<forward name="process.submited" path="page.separators.home"/>
</action>
 
</action-mappings>
</struts-config>
/impl/conf/WEB-INF/web.xml
147,7 → 147,8
/WEB-INF/struts/struts-managedidentifier.xml,
/WEB-INF/struts/struts-srusource.xml,
/WEB-INF/struts/struts-survey.xml, <!-- Duarte Santos -->
/WEB-INF/struts/struts-comunicationfolder.xml
/WEB-INF/struts/struts-comunicationfolder.xml,
/WEB-INF/struts/struts-processes.xml
</param-value>
</init-param>
<init-param>
355,6 → 356,35
<!--TLDS-->
<jsp-config>
<taglib>
<taglib-uri>/WEB-INF/tlds/jomm.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/jomm.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/baco.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/baco.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/struts-nested.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-nested.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/struts-tiles.tld</taglib-location>
</taglib>
 
<taglib>
<taglib-uri>/WEB-INF/jomm.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/jomm.tld</taglib-location>
</taglib>
/impl/conf/app.properties
80,6 → 80,8
module.surveys=true
#Filipe Matos
module.assessments=true
 
module.processes=true
##################################################
# SMS
#
144,13 → 146,29
user.role.12=worker
user.role.13=invited
user.role.14=services
 
 
user.role.15=administrativeCouncil
user.role.16=scientificCouncil
user.role.17=pedagogicCouncil
user.role.1511=administrativeCouncil.director
user.role.1512=administrativeCouncil.vice
user.role.1513=schoolSecretary
user.role.1514=administrativeCouncilSecretariat
user.role.1515=teachersSecretariat
user.role.1516=dtd.president
user.role.1517=cesh.president
user.role.1518=dtd.presidency
user.role.1519=cesh.presidency
user.role.1520=scientificCouncil
user.role.1521=scientificCouncil.president
user.role.1522=representativeCouncil
user.role.1523=representativeCouncil.president
user.role.1524=pedagogicCouncil
user.role.1525=pedagogicCouncil.president
 
user.role.18=erasmusCouncil
user.role.19=courseCoordinator
user.role.20=studentAssociation
user.role.21=representativeCouncil
 
user.role.22=computerCenter
user.role.23=courseCoordinator
user.role.24=courseDirector
196,6 → 214,7
user.role.82=sendMailMessages
user.role.83=assessementsTester
 
user.role.84=processes.admin
 
 
 
442,7 → 461,8
pop.container.use=true
#pop.container.use=false
pop.web.interface=http://mail.estgp.pt/exchange
pop.server=mail.estgp.pt
#pop.server=mail.estgp.pt
pop.server=pop.gmail.com
pop.use.default.server=true
pop.use.username.and.password.first.authentication=true
pop.max.messages=15
575,4 → 595,4
assessments.correctA.0=anonymous
assessments.correctA.1=notAnonymous
assessments.correction.selection.0=question
assessments.correction.selection.1=assessment
assessments.correction.selection.1=assessment
/impl/conf/berserk/sd.xml
1920,4 → 1920,48
</service>
 
 
 
<service>
<name>LoadUnitOtherYearsWithProgram</name>
<implementationClass>pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService</implementationClass>
<description>Loads units with program from diferent year parameters (Long unitId)</description>
<isTransactional>true</isTransactional>
<defaultMethod>findOtherUnitsWithProgram</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
</filterChains>
</service>
 
<service>
<name>CloneCourseUnitProgram</name>
<implementationClass>pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService</implementationClass>
<description>Clone unit program from a unit into another unit parameters (long fromUnitId, long intoUnitId) </description>
<isTransactional>true</isTransactional>
<defaultMethod>cloneProgram</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
</filterChains>
</service>
 
 
 
<!--PROCESSOS-->
<service>
<name>CreateNewProcess</name>
<implementationClass>pt.estgp.estgweb.services.processes.ProcessesService</implementationClass>
<description>Create a new instance of Process and transitates it </description>
<isTransactional>true</isTransactional>
<defaultMethod>submitNew</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="AuthenticatedUsers"/>
</filterChains>
</service>
 
 
</serviceDefinitions>
/impl/src/java/pt/estgp/estgweb/Globals.java
51,6 → 51,7
 
 
 
public static final String ROLE_PROCESSES_ADMIN = "processes.admin";
public static final String INTRANET_IMPRESSAO_SERVICO_API = ConfigProperties.getProperty("impressao.servicos.api");
public static final boolean INTRANET_IMPRESSAO_SERVICO_AUTH = ConfigProperties.getBooleanProperty("impressao.servicos.auth");
 
245,6 → 246,9
public static final boolean MODULE_STATUS_ASSESSMENTS = ConfigProperties.getBooleanProperty("module.assessments");
//Filipe Matos
 
public static final boolean MODULE_STATUS_PROCESSES = ConfigProperties.getBooleanProperty("module.processes");
 
 
public static final String SURVEY_TYPE_GENERAL = ConfigProperties.getProperty("surveys.type.0");
public static final String SURVEY_TYPE_PEDAGOGIC = ConfigProperties.getProperty("surveys.type.1");
public static final String SURVEY_PEDAGOGIC_STUDENT_COURSEUNIT = ConfigProperties.getProperty("surveys.target.pair.0");
/impl/src/java/pt/estgp/estgweb/services/courseunits/SaveCourseUnitProgram.java
70,6 → 70,7
cupv.persistViewInObjectAdministrator(program);
cupv.persistViewInObjectCoordinator(program);
cupv.persistViewInObjectTeacher(program);
setResponsableTeacher(cupv, c);
}
if(usession.getUser() instanceof Teacher && (((Teacher)(usession.getUser())).isTeacherOfCourseUnit(c.getId(),true)))
{
82,6 → 83,7
)
{
cupv.persistViewInObjectCoordinator(program);
setResponsableTeacher(cupv, c);
}
List<String> errors = new ArrayList<String>();
createPdf(c,errors,usession);
96,6 → 98,13
return cupv;
}
 
private void setResponsableTeacher(CourseUnitProgramView cupv, CourseUnit c) {
if(cupv.getResponsableId() > 0)
{
Teacher t = DaoFactory.getTeacherDaoImpl().load(cupv.getResponsableId());
c.setResponsableTeacher(t);
}
}
 
 
public void createPdf(CourseUnit cu, List<String> errors) throws IOException, TransformerException, FOPException {
/impl/src/java/pt/estgp/estgweb/services/email/SendEmailService.java
56,14 → 56,17
{
valid=true;
message.addRecipient(email.getType(),new InternetAddress(recipient));
logger.info("Adding recipient to transport:"+recipient);
}
}
if(valid)
{
 
String content = TemplateUtils.getOrLoadTemplate(Globals.TEMPLATE_EMAIL_PATH + "/" + email.getEmailTemplateName());
// Format the mail message
String fullMessage = MessageFormat.format(content, email.getArguments().toArray());
 
logger.info("FROM:" + email.getFrom());
message.setFrom(new InternetAddress(email.getFrom()));
message.setSubject(email.getSubject());
message.setText(fullMessage,"utf-8");
74,7 → 77,9
else
message.setHeader("Content-Type","text/plain; charset=\"utf-8\"");
message.setHeader("Content-Transfer-Encoding", "quoted-printable");
logger.info("Sending email to transport:"+fullMessage);
 
 
Transport.send(message);
}
}
167,7 → 172,16
if(Email.validEmail(u.getOutEmail()))
recipients.add(u.getOutEmail());
}
logger.info("subject: " + subject);
logger.info("user: " + user.getEmail());
logger.info("template: " + template);
logger.info("arguments:");
for(String arg: arguments)
logger.info(arg);
logger.info("recipients:");
for(String rec: recipients)
logger.info(rec);
logger.info("arguments end");
return new Email(subject ,recipients,user.getEmail(),template,arguments,Message.RecipientType.BCC);
}
 
/impl/src/java/pt/estgp/estgweb/services/email/ReadEmailService.java
9,6 → 9,7
import pt.estgp.estgweb.services.email.impl.DefaultPopEmail;
import pt.estgp.estgweb.services.email.impl.DefaultAddress;
 
import com.sun.mail.pop3.POP3SSLStore;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import java.util.List;
19,6 → 20,8
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
 
import org.apache.log4j.Logger;
import jomm.utils.DesUtils;
33,10 → 36,44
public class ReadEmailService implements IService
{
 
private static final boolean POP_SECURE = true; //todo mudar isto
private static final String POP_MAIL_DATE_KEY = "POP_MAIL_DATE_KEY";
private static final String POP_MAIL_MESSAGES_KEY = "POP_MAIL_MESSAGES_KEY";
private static final Logger logger = Logger.getLogger(ReadEmailService.class);
 
private Store getStoreSSL(String username,String password,String host)
{
Session session = null;
Store store = null;
Folder folder;
String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties pop3Props = new Properties();
pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
pop3Props.setProperty("mail.pop3.port", "995");
pop3Props.setProperty("mail.pop3.socketFactory.port", "995");
URLName url = new URLName("pop3", host, 995, "",
username, password);
session = Session.getInstance(pop3Props, null);
store = new POP3SSLStore(session, url);
return store;
}
private Store getStore(Properties props) throws NoSuchProviderException
{
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("pop3");
return store;
}
public List<IPopEmail> run(UserSession userSession)
{
if (!((UserImpl) userSession.getUser()).hasPopConfigured())
55,7 → 92,7
 
String host = userSession.getUser().getPop3server();
String username = userSession.getUser().getPop3username();
String password = DesUtils.getInstance().decrypt(userSession.getUser().getPop3password());
String password = DesUtils.getInstance().decrypt(userSession.getUser().getPop3password()); //DesUtils.getInstance().decrypt(userSession.getUser().getPop3password());
String provider = "pop3";
if (host == null || username == null || password == null || host.trim().length() == 0 || password.trim().length() == 0 || username.trim().length() == 0)
{
63,10 → 100,19
}
try
{
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore(provider);
store.connect(host, username, password);
Folder inbox = store.getFolder("INBOX");
Store store;
if(POP_SECURE)
{
store = getStoreSSL(username, password, host);
store.connect();
}
else
{
store = getStore(props);
store.connect(host, username, password);
}
Folder inbox = store.getFolder("Inbox");
if (inbox == null)
{
logger.warn("No INBOX for user:" + userSession.getUser().getId());
75,13 → 121,41
inbox.open(Folder.READ_ONLY);
List<IPopEmail> popMessages = new ArrayList<IPopEmail>();
int count = inbox.getMessageCount();
final String usernameF = username;
Message[] arrayMessages = inbox.getMessages();
Comparator<Message> messageComparator = new Comparator<Message>() {
public int compare(Message m1, Message m2) {
try {
if (m1.getSentDate() == null || m2.getSentDate() == null)
return 0;
return m2.getSentDate().compareTo(m1.getSentDate());
} catch (MessagingException ex) {
logger.error(ex,ex);
}
return 0;
}
};
 
for (int i = count; i > count - Globals.POP_MAX_MESSAGES && i > 0; i--)
Arrays.sort(arrayMessages, messageComparator);
if(usernameF.startsWith("jmachado"))
for(Message m : arrayMessages)
{
System.out.println("folder " + m.getFolder().getName() + " - " + m.getFolder().getType() + " - " + m.getSubject());
}
System.out.println("arrayMessages.length " + arrayMessages.length);
for (int i = 0; i < Globals.POP_MAX_MESSAGES && i < arrayMessages.length ; i++)
{
 
try
{
Message message = inbox.getMessage(i);
System.out.println("i" + i);
Message message = arrayMessages[i];
System.out.println("folder " + message.getFolder().getName());
DefaultPopEmail popEmail = new DefaultPopEmail();
String date = DatesUtils.getStringFromDate(message.getSentDate());
popEmail.setDate(date);
/impl/src/java/pt/estgp/estgweb/services/sigesimports/SincronizeLastYearCourseUnitProgramsService.java
1,13 → 1,13
package pt.estgp.estgweb.services.sigesimports;
 
import com.lowagie.text.pdf.SimpleBookmark;
import jomm.dao.impl.AbstractDao;
import org.apache.fop.apps.FOPException;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.CourseUnitProgram;
import pt.estgp.estgweb.domain.CourseUnitProgramImpl;
import pt.estgp.estgweb.domain.CourseUnitProgramPart2Impl;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.services.courseunits.SaveCourseUnitProgram;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.services.logresults.ILogMessages;
16,8 → 16,13
import pt.estgp.estgweb.services.logresults.impl.DefaultLogMessages;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.utl.ist.berserk.logic.serviceManager.IService;
import sun.tools.java.Imports;
 
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
/**
31,16 → 36,16
/**
* DESCRICAO DE SERVICO
*
* Unidades sem ficha é-lhes atribuida a ficha do ano anterior,
* 1º é atribuido o mesmo professor como responsável
* 2º a Ficha é clonada
* 3º a Ficha fica com estado de não validada
* Unidades sem ficha �-lhes atribuida a ficha do ano anterior,
* 1� � atribuido o mesmo professor como respons�vel
* 2� a Ficha � clonada
* 3� a Ficha fica com estado de n�o validada
*
* Restrições por ordem de prioridade
* - Fichas com estado validadas não são clonadas
* - Fichas invalidas poderão ser clonadas se:
* - Não existir ficha
* - ou para fichas já clonadas apenas são clonadas novamente se a condição
* Restri��es por ordem de prioridade
* - Fichas com estado validadas n�o s�o clonadas
* - Fichas invalidas poder�o ser clonadas se:
* - N�o existir ficha
* - ou para fichas j� clonadas apenas s�o clonadas novamente se a condi��o
* de entrada cloneOnlyNews for false
*
* @param year
100,7 → 105,7
cu.setValidProgram(false);
}
 
//So clona a ficha no caso de não estar validada pelo CC
//So clona a ficha no caso de n�o estar validada pelo CC
if(novaFicha || (!cu.isValidProgram() && !cloneOnlyNews))
{
updated++;
160,6 → 165,105
}
 
 
/**
* Load all importYear on format 201213 201314 from units of previous ant forward years from the given unit
* The search clause is based on sigesCode and CourseSigesCode
* @param courseUnitId pattern unit to search for
* @return sorted list of importYears
*/
public List<String> findOtherYearsWithProgram(long courseUnitId,UserSession sess)
{
CourseUnit u = DaoFactory.getCourseUnitDaoImpl().load(courseUnitId);
List<CourseUnit> cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodes(u.getCode(),u.getCourseCode());
List<String> importYears = new ArrayList<String>();
for(CourseUnit cu : cus)
{
if( cu.getImportYear() != null && !cu.getImportYear().equals(u.getImportYear()) &&
!importYears.contains(cu.getImportYear())
&&
cu.getCourseUnitProgram() != null)
importYears.add(cu.getImportYear());
}
Collections.sort(importYears,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
 
}
});
return importYears;
}
 
/**
* Load all units of previous ant forward years from the given unit
* The search clause is based on sigesCode and CourseSigesCode
* @param courseUnitId pattern unit to search for
* @return sorted list of units with all information inside
*/
public List<CourseUnitView> findOtherUnitsWithProgram(Long courseUnitId,UserSession sess)
{
CourseUnit u = DaoFactory.getCourseUnitDaoImpl().load(courseUnitId);
List<CourseUnit> cus = DaoFactory.getCourseUnitDaoImpl().loadBySigesCodes(u.getCode(),u.getCourseCode());
List<CourseUnitView> views = new ArrayList<CourseUnitView>();
for(CourseUnit cu : cus)
{
if( cu.getImportYear() != null && !cu.getImportYear().equals(u.getImportYear()) &&
!views.contains(cu.getImportYear())
&&
cu.getCourseUnitProgram() != null)
views.add(new CourseUnitView(cu));
}
Collections.sort(views,new Comparator<CourseUnitView>() {
@Override
public int compare(CourseUnitView o1, CourseUnitView o2) {
return o1.getImportYear().compareTo(o2.getImportYear());
 
}
});
return views;
}
 
/**
* Given a courseunit the target intoUnit will have a cloned program from the fromUnit
* The PDF file is Generated and saved into repository with SaveCourseUnitProgram Service
* @param fromUnitId from unit
* @param intoUnitId target unit
* @return the cloned courseunit program
*/
 
public CourseUnitProgram cloneProgram(long fromUnitId,long intoUnitId,UserSession sess)
{
CourseUnit cuFrom = DaoFactory.getCourseUnitDaoImpl().load(fromUnitId);
CourseUnit cuInto = DaoFactory.getCourseUnitDaoImpl().load(intoUnitId);
if(cuInto.getCourseUnitProgram() == null)
{
CourseUnitProgram program = new CourseUnitProgramImpl();
DaoFactory.getCourseUnitProgramDaoImpl().save(program);
program.setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
DaoFactory.getCourseUnitProgramPart2DaoImpl().save(program.getCourseUnitProgramPart2());
cuInto.setCourseUnitProgram(program);
cuInto.setValidProgram(false);
}
logger.info("AQUI");
((CourseUnitProgramImpl)cuInto.getCourseUnitProgram()).cloneFrom(cuFrom.getCourseUnitProgram());
DaoFactory.getCourseUnitProgramDaoImpl().saveOrUpdate(((CourseUnitProgramImpl)cuInto.getCourseUnitProgram()));
DaoFactory.getCourseUnitProgramPart2DaoImpl().saveOrUpdate(((CourseUnitProgramImpl)cuInto.getCourseUnitProgram()).getCourseUnitProgramPart2());
 
SaveCourseUnitProgram service = new SaveCourseUnitProgram();
List<String> errors = new ArrayList<String>();
try {
service.createPdf(cuInto,errors);
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerException e) {
logger.error(e,e);
} catch (FOPException e) {
logger.error(e, e);
}
return cuInto.getCourseUnitProgram();
}
 
 
public static void main(String[] args) throws ServiceException
{
String year = DatesUtils.getImportYear();
/impl/src/java/pt/estgp/estgweb/services/common/ModuleEnum.java
8,6 → 8,7
import pt.estgp.estgweb.services.courses.CoursesCommonServices;
import pt.estgp.estgweb.services.courseunits.CourseUnitsCommonServices;
import pt.estgp.estgweb.services.email.EmailCommonServices;
import pt.estgp.estgweb.services.processes.ProcessesCommonService;
import pt.estgp.estgweb.services.profile.ProfileCommonServices;
import pt.estgp.estgweb.services.reminders.RemindersCommonServices;
import pt.estgp.estgweb.services.srusources.SruSourcesCommonServices;
37,6 → 38,7
// Duarte Santos
Surveys("module.Surveys", new SurveysCommonServices()),
 
Processes("module.Processes", new ProcessesCommonService()),
// Filipe Matos
Assessments("module.Assessments", new AssessmentsCommonServices());
// Events("module.Events",null),
/impl/src/java/pt/estgp/estgweb/services/profile/CurriculumService.java
1,22 → 1,20
package pt.estgp.estgweb.services.profile;
 
import pt.utl.ist.berserk.logic.serviceManager.IService;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.domain.views.*;
import jomm.utils.FilesUtils;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.enums.RecordEnum;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.dao.impl.CourseUnitDaoImpl;
import pt.estgp.estgweb.domain.views.*;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.utils.DatesUtils;
import org.apache.log4j.Logger;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.InputStream;
import java.util.*;
 
import jomm.utils.FilesUtils;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
*
136,11 → 134,19
userView.setContributorRecords(RecordView.getViews(new ArrayList<Record>(u.getContributorRecords())));
}
 
Set<CourseUnit> responsableCourseUnits = null;
Set<CourseUnit> courseUnits = null;
if(u instanceof Teacher)
{
Teacher teacher = (Teacher) u;
courseUnits = new HashSet<CourseUnit>(DaoFactory.getCourseUnitDaoImpl().loadTeachedImportYearUnits(teacher.getId(), DatesUtils.getImportYear()));
responsableCourseUnits = new HashSet<CourseUnit>(DaoFactory.getCourseUnitDaoImpl().loadResponsableImportYearUnits(teacher.getId(), DatesUtils.getImportYear()));
userView.setResponsableCourseUnits(new ArrayList<CourseUnitView>());
for(CourseUnit c: responsableCourseUnits)
{
CourseUnitView courseUnitView = new CourseUnitView(c);
userView.getResponsableCourseUnits().add(courseUnitView);
}
}
else if(u instanceof Student)
{
/impl/src/java/pt/estgp/estgweb/services/users/LoadUsersService.java
78,10 → 78,7
 
public List<UserView> loadTeachers() throws ServiceException
{
List<Teacher> users = DaoFactory.getTeacherDaoImpl().getAll();
if(users == null)
return null;
return UserView.getTeacherViews(users);
return run(Teacher.class);
}
 
 
/impl/src/java/pt/estgp/estgweb/services/processes/ProcessesCommonService.java
New file
0,0 → 1,79
package pt.estgp.estgweb.services.processes;
 
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.services.common.*;
import pt.estgp.estgweb.services.common.impl.DefaultToDo;
 
import java.util.ArrayList;
import java.util.List;
 
/**
* Created by jorgemachado on 13/01/14.
*/
public class ProcessesCommonService implements IModuleCommonServices {
@Override
public int countSearch(String search, SearchTypeEnum searchType, UserSession userSession) {
return 0;
}
 
@Override
public ISearchResults search(String search, SearchTypeEnum searchType, int page, int maxResults, UserSession userSession) {
return null;
}
 
@Override
public ISearchResults search(String from, String search, SearchTypeEnum searchType, int page, int maxResults, UserSession userSession) {
return null;
}
 
@Override
public List<ISearchResults> searchList(String moduleInternalKey, String search, SearchTypeEnum searchType, int page, int maxResults, UserSession userSession) {
return null;
}
 
@Override
public List<ISearchResults> searchList(String moduleInternalKey, String from, String search, SearchTypeEnum searchType, int page, int maxResults, UserSession userSession) {
return null;
}
 
@Override
public int countToDo(UserSession userSession)
{
return DaoFactory.getProcessDaoImpl().getProcessesWaitingFor(userSession.getUser()).size();
}
 
@Override
public IToDoCat getToDo(UserSession userSession)
{
return null;
}
 
@Override
public List<IToDo> getAllToDos(UserSession userSession) {
 
 
List<IToDo> todos = new ArrayList<IToDo>();
if(Globals.MODULE_STATUS_PROCESSES){
List<ProcessImpl> processWaiting = DaoFactory.getProcessDaoImpl().getProcessesWaitingFor(userSession.getUser());
for(ProcessImpl p: processWaiting)
{
DefaultToDo defaultToDo = new DefaultToDo(p.getMetaProcess().getName(),null,p.getOwner().getName(),"processes.type.todo","/user/openProcess.do?id="+p.getId());
todos.add(defaultToDo);
}
}
 
return todos;
}
 
@Override
public void adviseNew(DomainObject object) {
 
}
 
@Override
public void adviseUpdate(DomainObject object) {
 
}
}
/impl/src/java/pt/estgp/estgweb/services/processes/ProcessesService.java
New file
0,0 → 1,136
package pt.estgp.estgweb.services.processes;
 
import jomm.utils.FilesUtils;
import org.apache.log4j.Logger;
import org.apache.struts.upload.FormFile;
import org.dom4j.Document;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseView;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.data.IRepositoryFile;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.expceptions.AlreadyExistsException;
import pt.estgp.estgweb.services.expceptions.ServiceException;
import pt.estgp.estgweb.utils.DatesUtils;
import pt.estgp.estgweb.utils.Dom4jUtil;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.*;
 
/*
* @author Goncalo Luiz gedl [AT] rnl [DOT] ist [DOT] utl [DOT] pt
*
*
* Created at 17/Out/2003 , 23:45:24
*
*/
 
/**
* @author Jorge Machado
*
*
* Created at 17/Out/2003 , 23:45:24
*
*/
public class ProcessesService implements IService
{
private static final Logger logger = Logger.getLogger(ProcessesService.class);
 
RepositoryService repositoryService = new RepositoryService();
 
 
public void submitNew(long metaProcessId, String notes, FormFile file,UserSession sess) throws ServiceException, IOException {
Date now = new Date();
MetaProcessImpl metaProcess = (MetaProcessImpl) DaoFactory.getMetaProcessDaoImpl().load(metaProcessId);
ProcessImpl process = DomainObjectFactory.createProcessImpl();
process.setMetaProcess(metaProcess);
 
process.setOpenDate(now);
process.setSaveDate(now);
process.setLastChangeDate(now);
process.setCloseDate(null);
process.setNowStateEnum(ProcessImpl.ProcessState.OPEN);
process.setOwner(sess.getUser());
 
ProcessEventImpl eventDest = DomainObjectFactory.createProcessEventImpl();
ProcessEventImpl eventStart = DomainObjectFactory.createProcessEventImpl();
eventStart.setOwner(sess.getUser());
eventStart.setOpenDate(now);
eventStart.setNowStateEnum(ProcessEventImpl.ProcessEventState.FINNISH_TRANSITATED);
eventStart.setSaveDate(now);
eventStart.setLastChangeDate(now);
eventStart.setCloseDate(now);
eventStart.setAccepted(true);
eventStart.setAcceptedDate(now);
eventStart.setDispatchedDate(now);
eventStart.setNotes(notes);
eventStart.setDestinationRole(metaProcess.getSrcRole());
eventStart.setPreviousEvent(null);
eventStart.setNextEvent(eventDest);
 
 
String repositoryId;
try {
repositoryId = repositoryService.storeRepositoryFile(file.getInputStream(),file.getContentType(), FilesUtils.getExtension(file.getFileName()),
file.getFileSize(),file.getFileName(),"Process file " + metaProcess.getName(), ResourceAccessControlEnum.processDomain,sess);
} catch (IOException e) {
logger.error(e,e);
throw e;
}
 
ProcessEventFileImpl f = DomainObjectFactory.createProcessEventFileImpl();
Set proceSet = new HashSet<ProcessEventFileImpl>();
proceSet.add(f);
f.setImportDate(now);
f.setOwner(sess.getUser());
f.setProcessEvent(eventStart);
f.setRepositoryStream(repositoryId);
f.setSaveDate(now);
f.setName(file.getFileName());
f.setFileAccessLevelEnum(ProcessEventFileImpl.AccessLevel.ALL_IN_PROCESS);
 
eventStart.setFiles(proceSet);
 
 
 
//EVENT DESTINATION
 
eventDest.setOwner(null);
eventDest.setOpenDate(now);
eventDest.setNowStateEnum(ProcessEventImpl.ProcessEventState.NOT_ACCEPTED);
eventDest.setSaveDate(now);
eventDest.setLastChangeDate(now);
eventDest.setCloseDate(null);
eventDest.setAccepted(false);
eventDest.setAcceptedDate(null);
eventDest.setDispatchedDate(null);
eventDest.setNotes("");
eventDest.setDestinationRole(metaProcess.getTargetRole());
eventDest.setPreviousEvent(eventStart);
eventDest.setNextEvent(null);
 
Set<ProcessEvent> events = new HashSet<ProcessEvent>();
events.add(eventStart);
events.add(eventDest);
process.setLastEvent(eventDest);
process.setEvents(events);
 
DaoFactory.getProcessDaoImpl().save(process);
DaoFactory.getProcessEventDaoImpl().save(eventStart);
DaoFactory.getProcessEventDaoImpl().save(eventDest);
DaoFactory.getProcessEventFileDaoImpl().save(f);
 
DaoFactory.getProcessDaoImpl().saveOrUpdate(process);
DaoFactory.getProcessEventDaoImpl().saveOrUpdate(eventStart);
DaoFactory.getProcessEventDaoImpl().saveOrUpdate(eventDest);
DaoFactory.getProcessEventFileDaoImpl().saveOrUpdate(f);
 
}
 
}
/impl/src/java/pt/estgp/estgweb/domain/ProcessEventImpl.java
New file
0,0 → 1,179
package pt.estgp.estgweb.domain;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.utils.RoleManager;
import pt.estgp.estgweb.utils.StringsUtils;
 
import java.io.Serializable;
import java.util.List;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class ProcessEventImpl extends ProcessEvent
{
private static final Logger logger = Logger.getLogger(ProcessEventImpl.class);
 
public static enum ProcessEventState
{
NOT_ACCEPTED,
ACCEPTED,
FINNISH_TRANSITATED,
FINNISH_CLOSED
}
 
public static enum AccessLevel
{
ALL_IN_PROCESS,
ALL_EXCEPT_STARTER,
ONLY_STARTER, //Owner is included
OWNER, //ONLY the owner of the event
FORWARD_EVENTS, //Owner is included
BACKWARD_EVENTS, //Owner is included
DEFINED_USERS_IDS, //Owner is included
DEFINED_ROLES_IDS //Owner is included
}
 
@Override
public List<String> getOwnerRoles() {
return null;
}
 
@Override
public String getChoosedOwnerRole() {
return null;
}
 
@Override
public Serializable getSerializable() {
return getId();
}
 
 
 
public void setNotesAccessLevelEnum(AccessLevel notesAccessLevel) {
super.setNotesAccessLevel(notesAccessLevel.name());
}
 
public AccessLevel getNotesAccessLevelEnum()
{
for(AccessLevel al : AccessLevel.values())
{
if(al.name().equals(getNotesAccessLevel()))
{
return al;
}
}
return AccessLevel.OWNER;
}
 
public void setNowStateEnum(ProcessEventState state)
{
super.setNowState(state.name());
}
 
 
public ProcessEventState getNowStateEnum()
{
 
for(ProcessEventState ps : ProcessEventState.values())
{
if(ps.name().equals(getNowState()))
{
return ps;
}
}
return ProcessEventState.NOT_ACCEPTED;
}
 
public boolean isInNextEvents(User u)
{
if(isOwnedBy(u))
return true;
ProcessEvent next = getNextEvent();
while(next != null)
{
if(next.isOwnedBy(u))
return true;
next = next.getNextEvent();
}
return false;
}
 
public boolean isInPreviousEvents(User u)
{
if(isOwnedBy(u))
return true;
ProcessEvent next = getPreviousEvent();
while(next != null)
{
if(next.isOwnedBy(u))
return true;
next = next.getPreviousEvent();
}
return false;
}
 
public boolean canSeeNotes(User user)
{
if(user.isSuperuser())
return true;
switch(getNotesAccessLevelEnum())
{
case ALL_IN_PROCESS:
return ((ProcessImpl)getProcess()).isInProcess(user);
case ALL_EXCEPT_STARTER:
return ((ProcessImpl)getProcess()).isInProcess(user)
&&
!getProcess().isOwnedBy(user);
case ONLY_STARTER:
return isOwnedBy(user) ||
getProcess().isOwnedBy(user);
case OWNER:
return isOwnedBy(user);
case FORWARD_EVENTS:
return isOwnedBy(user) ||
isInNextEvents(user);
case BACKWARD_EVENTS:
return isOwnedBy(user) ||
isInPreviousEvents(user);
case DEFINED_USERS_IDS:
if(getNotesAccessIdentifiers() == null || getNotesAccessIdentifiers().trim().length() == 0)
{
logger.error("Atention event: " +getId() + " has no target ids and defined access is DEFINED_USERS_IDS");
return false;
}
if(isOwnedBy(user)) return true;
List<String> ids = StringsUtils.getStringsFromSerial(getNotesAccessIdentifiers(),";");
for(String idstr: ids)
{
if(user.getId() == Long.parseLong(idstr))
return true;
}
return false;
case DEFINED_ROLES_IDS:
if(getNotesAccessRoles() == null || getNotesAccessRoles().trim().length() == 0)
{
logger.error("Atention event: " +getId() + " has no roles and defined access is DEFINED_ROLES_IDS");
return false;
}
return isOwnedBy(user) ||
user.hasRole(RoleManager.getRolesFromSerial(getNotesAccessRoles()));
}
logger.error("Access Level not found in process event " + getId());
return false;
}
 
public boolean isTarget(User user)
{
if(getOwner() != null && getOwner().getId() == user.getId() )
return true;
else if(getOwner() != null)
return false;
if(user.hasRole(getDestinationRole()))
{
return true;
}
return false;
}
}
/impl/src/java/pt/estgp/estgweb/domain/ProcessEventFileImpl.java
New file
0,0 → 1,123
package pt.estgp.estgweb.domain;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.utils.RoleManager;
import pt.estgp.estgweb.utils.StringsUtils;
 
import java.io.Serializable;
import java.util.List;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class ProcessEventFileImpl extends ProcessEventFile
{
private static final Logger logger = Logger.getLogger(ProcessEventImpl.class);
 
 
public static enum AccessLevel
{
ALL_IN_PROCESS,
ALL_EXCEPT_STARTER,
ONLY_STARTER,
OWNER,
FORWARD_EVENTS,
BACKWARD_EVENTS,
DEFINED_USERS_IDS,
DEFINED_ROLES_IDS
}
 
@Override
public List<String> getOwnerRoles() {
return null;
}
 
@Override
public String getChoosedOwnerRole() {
return null;
}
 
@Override
public Serializable getSerializable() {
return getId();
}
 
public void setFileAccessLevelEnum(AccessLevel fileAccessLevel) {
super.setFileAccessLevel(fileAccessLevel.name());
}
 
public AccessLevel getFileAccessLevelEnum()
{
System.out.println("File Level:" + getFileAccessLevel());
if(getFileAccessLevel() == null)
return AccessLevel.OWNER;
for(AccessLevel al : AccessLevel.values())
{
if(al.name().equals(getFileAccessLevel()))
{
return al;
}
}
return AccessLevel.OWNER;
}
 
public boolean canSeeFile(User user)
{
if(user.isSuperuser() || user.hasRole(Globals.ROLE_PROCESSES_ADMIN))
return true;
if(isOwnedBy(user))
return true;
 
switch(getFileAccessLevelEnum())
{
case ALL_IN_PROCESS:
return ((ProcessImpl)getProcessEvent().getProcess()).isInProcess(user);
case ALL_EXCEPT_STARTER:
return ((ProcessImpl)getProcessEvent().getProcess()).isInProcess(user)
&&
!getProcessEvent().getProcess().isOwnedBy(user);
case ONLY_STARTER:
return isOwnedBy(user) ||
getProcessEvent().getProcess().isOwnedBy(user);
case OWNER:
return isOwnedBy(user);
case FORWARD_EVENTS:
return isOwnedBy(user) ||
((ProcessEventImpl)getProcessEvent()).isInNextEvents(user);
case BACKWARD_EVENTS:
return isOwnedBy(user) ||
((ProcessEventImpl)getProcessEvent()).isInPreviousEvents(user);
case DEFINED_USERS_IDS:
if(getFileAccessIdentifiers() == null || getFileAccessIdentifiers().trim().length() == 0)
{
logger.error("Atention event: " +getId() + " has no target ids and defined access is DEFINED_USERS_IDS");
return false;
}
if(isOwnedBy(user)) return true;
List<String> ids = StringsUtils.getStringsFromSerial(getFileAccessIdentifiers(), ";");
for(String idstr: ids)
{
if(user.getId() == Long.parseLong(idstr))
return true;
}
return false;
case DEFINED_ROLES_IDS:
if(getFileAccessRoles() == null || getFileAccessRoles().trim().length() == 0)
{
logger.error("Atention event file: " +getId() + " has no roles and defined access is DEFINED_ROLES_IDS");
return false;
}
return isOwnedBy(user) ||
user.hasRole(RoleManager.getRolesFromSerial(getFileAccessRoles()));
}
logger.error("Access Level not found in process event file " + getId());
return false;
}
 
public boolean canOpenCloseGhost(User user)
{
return (isOwnedBy(user) && getProcessEvent().getCloseDate() == null && getProcessEvent().getNextEvent() == null)
|| user.isSuperuser() || user.hasRole(Globals.ROLE_PROCESSES_ADMIN);
}
}
/impl/src/java/pt/estgp/estgweb/domain/views/UserView.java
71,6 → 71,8
private List<CourseUnitView> courseUnits;
private List<CourseUnitGradeView> grades;
 
private List<CourseUnitView> responsableCourseUnits;
 
public UserView()
{}
 
123,6 → 125,14
}
}
 
public List<CourseUnitView> getResponsableCourseUnits() {
return responsableCourseUnits;
}
 
public void setResponsableCourseUnits(List<CourseUnitView> responsableCourseUnits) {
this.responsableCourseUnits = responsableCourseUnits;
}
 
public boolean isAutoBlockMode() {
return autoBlockMode;
}
/impl/src/java/pt/estgp/estgweb/domain/views/CourseUnitProgramView.java
14,6 → 14,18
public class CourseUnitProgramView extends DomainObjectView
{
 
//INICIADO a -1 porque só vai ser preciso nalguns serviços WEB
//serviço em uso Salvar Ficha Curricular
private long responsableId = -1;
 
public long getResponsableId() {
return responsableId;
}
 
public void setResponsableId(long responsableId) {
this.responsableId = responsableId;
}
 
private CourseUnitProgram courseUnitProgram;
 
public Class getReferenceClass()
/impl/src/java/pt/estgp/estgweb/domain/DomainObjectFactory.java
279,4 → 279,21
{
return new AssessmentResponseImpl();
}
 
public static MetaProcessImpl createMetaProcessImpl()
{
return new MetaProcessImpl();
}
public static ProcessImpl createProcessImpl()
{
return new ProcessImpl();
}
public static ProcessEventImpl createProcessEventImpl()
{
return new ProcessEventImpl();
}
public static ProcessEventFileImpl createProcessEventFileImpl()
{
return new ProcessEventFileImpl();
}
}
/impl/src/java/pt/estgp/estgweb/domain/ProcessImpl.java
New file
0,0 → 1,66
package pt.estgp.estgweb.domain;
 
import pt.estgp.estgweb.Globals;
 
import java.io.Serializable;
import java.util.List;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class ProcessImpl extends Process
{
public static enum ProcessState
{
OPEN,
TRANSITION,
CLOSED
}
@Override
public List<String> getOwnerRoles() {
return null;
}
 
@Override
public String getChoosedOwnerRole() {
return null;
}
 
@Override
public Serializable getSerializable() {
return getId();
}
 
public void setNowStateEnum(ProcessState state)
{
super.setNowState(state.name());
}
 
 
public boolean isInProcess(User u)
{
if(u.getId() == getOwner().getId()) return true;
if(getEvents() == null)
return false;
for(ProcessEvent e: getEvents())
{
if(e.isOwnedBy(u))
return true;
}
return false;
}
 
 
public GenericUser getLastPersonEvent()
{
if(getLastEvent().getOwner() == null)
return getLastEvent().getPreviousEvent().getOwner();
else
return getLastEvent().getOwner();
}
 
public boolean canReopen(User user)
{
return user.isSuperuser() || user.hasRole(Globals.ROLE_PROCESSES_ADMIN) || user.getId() == getLastEvent().getOwner().getId();
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/ProcessDaoImpl.java
New file
0,0 → 1,118
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import pt.estgp.estgweb.domain.*;
 
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.*;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class ProcessDaoImpl extends ProcessDao
{
 
 
public static ProcessDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new ProcessDaoImpl();
return (ProcessDaoImpl) myInstance;
}
 
 
public List<ProcessImpl> getProcessesWithParticipation(User user)
{
Criteria c = createCriteria();
c.createAlias("events","evt");
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.add(eq("evt.owner.id",user.getId()));
c.addOrder(Order.asc("nowState")).addOrder(Order.asc("id"));
return c.list();
}
 
public List<ProcessImpl> getProcessesOpened()
{
Criteria c = createCriteria();
c.add(eq("nowState",ProcessImpl.ProcessState.OPEN.name()));
c.addOrder(Order.asc("id"));
return c.list();
}
 
public List<ProcessImpl> getProcessesClosed()
{
Criteria c = createCriteria();
c.add(eq("nowState",ProcessImpl.ProcessState.CLOSED.name()));
c.addOrder(Order.asc("id"));
return c.list();
}
 
public List<ProcessImpl> getProcessesWaitingFor(User user)
{
Criteria c = createCriteria();
c.createAlias("lastEvent", "l");
 
Criterion acceptedByUser =
and(
eq("l.nowState",ProcessEventImpl.ProcessEventState.ACCEPTED.name()),
eq("l.owner.id",user.getId())
);
 
Criterion startedToUser =
and(
eq("l.nowState", ProcessEventImpl.ProcessEventState.NOT_ACCEPTED.name()),
eq("l.owner.id",user.getId())
);
 
Criterion destinatedToUserRoles = eq("l.nowState", ProcessEventImpl.ProcessEventState.NOT_ACCEPTED.name());
Criterion rolesC = null;
for(String role: user.getRolesList())
{
if(rolesC == null)
rolesC = eq("l.destinationRole",role);
else
rolesC = or(rolesC,eq("l.destinationRole",role));
}
destinatedToUserRoles = and(destinatedToUserRoles,rolesC);
c.add(or(acceptedByUser,or(destinatedToUserRoles,startedToUser)));
return c.list();
}
 
public List<ProcessImpl> getProcessesWaitingFor()
{
Criteria c = createCriteria();
return c.add(eq("nowState", ProcessImpl.ProcessState.TRANSITION.name()))
.list();
}
 
 
public List<ProcessImpl> getProcessesStardedByUser(User user)
{
Criteria c = createCriteria().add(eq("owner.id",user.getId()));
return c.list();
}
public List<ProcessImpl> getProcessesStardedByUserNotClosed(User user)
{
return createCriteria().add(eq("owner.id", user.getId())).
add(not(eq("nowState", ProcessImpl.ProcessState.CLOSED.name())))
.list();
}
public List<ProcessImpl> getProcessesStardedByUserClosed(User user)
{
return createCriteria().add(eq("owner.id", user.getId())).
add(eq("nowState", ProcessImpl.ProcessState.CLOSED.name()))
.list();
}
 
public List<ProcessImpl> findAllImpls()
{
return createCriteria().list();
}
 
}
 
 
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/MetaProcessDaoImpl.java
New file
0,0 → 1,70
package pt.estgp.estgweb.domain.dao.impl;
 
import jomm.utils.MyCalendar;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.dao.DaoUtils;
import pt.estgp.estgweb.services.announcements.CreateAnnouncementService;
import pt.estgp.estgweb.services.common.SearchTypeEnum;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.*;
 
 
/**
* @author Jorge Machado
* @date 28/Fev/2008
* @time 2:51:06
* @see pt.estgp.estgweb.domain.dao.impl
*/
public class MetaProcessDaoImpl extends MetaProcessDao
{
public static MetaProcessDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new MetaProcessDaoImpl();
return (MetaProcessDaoImpl) myInstance;
}
 
public List<MetaProcessImpl> findRoleMetaProcesses(List<String> roles)
{
Criteria metas = createCriteria();
Criterion c = null;
for(String role: roles)
{
if(c == null)
c = eq("srcRole",role);
else
c = or(eq("srcRole", role), c);
}
if(c == null)
return null;
 
metas.add(c).addOrder(Order.asc("name"));
return metas.list();
}
 
public List<String> getCategories()
{
Query q = createQuery("select distinct c.category from c in class " + MetaProcess.class.getName());
return q.list();
}
 
public List<String> getSubCategories(String category)
{
Query q = createQuery("select distinct c.subCategory from c in class " + MetaProcess.class.getName() + " where c.category = ?");
q.setParameter(0,category);
return q.list();
}
 
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/CourseUnitDaoImpl.java
101,6 → 101,12
.add(eq("st.id", teacherId)).addOrder(Order.asc("importYear")).addOrder(Order.asc("name")).list();
}
 
public List<CourseUnitImpl> loadResponsableImportYearUnits(long teacherId, String importYear)
{
return createCriteria().add(eq("importYear", importYear))
.add(eq("responsableTeacher.id", teacherId)).addOrder(Order.asc("importYear")).addOrder(Order.asc("name")).list();
}
 
public List<CourseUnit> loadTeachedImportYearSemestreUnits(long teacherId, String importYear, String semestre)
{
Criteria c =createCriteria()
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/ProcessEventFileDaoImpl.java
New file
0,0 → 1,37
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.MetaProcessImpl;
import pt.estgp.estgweb.domain.ProcessEventFile;
 
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.eq;
import static org.hibernate.criterion.Restrictions.or;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class ProcessEventFileDaoImpl extends ProcessEventFileDao {
 
 
public ProcessEventFileDaoImpl()
{
 
}
public static ProcessEventFileDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new ProcessEventFileDaoImpl();
return (ProcessEventFileDaoImpl) myInstance;
}
 
public ProcessEventFile findByRepositoryFile(String repositoryId)
{
Criteria c = createCriteria();
c.add(eq("repositoryStream",repositoryId));
return (ProcessEventFile) c.uniqueResult();
}
}
/impl/src/java/pt/estgp/estgweb/domain/dao/impl/ProcessEventDaoImpl.java
New file
0,0 → 1,32
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.MetaProcessImpl;
 
import java.util.List;
 
import static org.hibernate.criterion.Restrictions.eq;
import static org.hibernate.criterion.Restrictions.or;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class ProcessEventDaoImpl extends ProcessEventDao
{
 
public ProcessEventDaoImpl()
{
 
}
 
public static ProcessEventDaoImpl getInstance()
{
if (myInstance == null)
myInstance = new ProcessEventDaoImpl();
return (ProcessEventDaoImpl) myInstance;
}
 
 
}
/impl/src/java/pt/estgp/estgweb/domain/dao/DaoFactory.java
274,4 → 274,21
{
return AssessmentResponseDaoImpl.getInstance();
}
 
public static MetaProcessDaoImpl getMetaProcessDaoImpl()
{
return MetaProcessDaoImpl.getInstance();
}
public static ProcessDaoImpl getProcessDaoImpl()
{
return ProcessDaoImpl.getInstance();
}
public static ProcessEventDaoImpl getProcessEventDaoImpl()
{
return ProcessEventDaoImpl.getInstance();
}
public static ProcessEventFileDaoImpl getProcessEventFileDaoImpl()
{
return ProcessEventFileDaoImpl.getInstance();
}
}
/impl/src/java/pt/estgp/estgweb/domain/MetaProcessImpl.java
New file
0,0 → 1,10
package pt.estgp.estgweb.domain;
 
/**
* Created by jorgemachado on 10/01/14.
*/
public class MetaProcessImpl extends MetaProcess
{
 
 
}
/impl/src/java/pt/estgp/estgweb/filters/chains/ResourceAccessControlEnum.java
17,8 → 17,10
courseunitDeliverableDomain("resource.access.courseunitDeliverableDomain",new ResourceAccessControlCourseUnitDeliverableFilter()),
courseunitDomain("resource.access.courseunitDomain",new ResourceAccessControlCourseUnitFilter()),
// Duarte Santos
surveyStatsDomain("resource.access.survey", new ResourceAccessControlSurvey());
surveyStatsDomain("resource.access.survey", new ResourceAccessControlSurvey()),
 
processDomain("resource.access.process", new ResourceAccessControlProcessDomainFilter());
 
private String key;
private ResourceAccessControlFilter filter;
 
/impl/src/java/pt/estgp/estgweb/filters/filters/ResourceAccessControlProcessDomainFilter.java
New file
0,0 → 1,21
package pt.estgp.estgweb.filters.filters;
 
import pt.estgp.estgweb.domain.ProcessEventFile;
import pt.estgp.estgweb.domain.ProcessEventFileImpl;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlFilter;
 
/**
* @author Jorge Machado
* @date 4/Jun/2008
* @see pt.estgp.estgweb.filters.filters
*/
public class ResourceAccessControlProcessDomainFilter extends ResourceAccessControlFilter
{
public boolean canAccessResource(UserSession userSession, String identifier)
{
ProcessEventFileImpl file = (ProcessEventFileImpl) DaoFactory.getProcessEventFileDaoImpl().findByRepositoryFile(identifier);
return file.canSeeFile(userSession.getUser());
}
}
/impl/src/java/pt/estgp/estgweb/web/StartPathLayoutProxy.java
20,7 → 20,7
{
 
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
/impl/src/java/pt/estgp/estgweb/web/TmpStream.java
25,7 → 25,7
 
private static final Logger logger = Logger.getLogger(TmpStream.class);
 
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
/** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
/impl/src/java/pt/estgp/estgweb/web/tags/CanManageTag.java
70,7 → 70,9
 
 
IInternal iInternal = (IInternal) owned;
if(userSession.getUser() == null && iInternal.isInternal())
System.out.println("userSession: " + userSession);
System.out.println("iInternal: " + iInternal);
if((userSession==null || userSession.getUser() == null) && iInternal.isInternal())
{
return false;
}
78,10 → 80,10
{
boolean valid = Boolean.parseBoolean(this.valid);
IValid iValid = (IValid) owned;
return owned != null && userSession.getUser() != null && (iValid.isValid() == valid && owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
return owned != null && userSession != null && userSession.getUser() != null && (iValid.isValid() == valid && owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
}
else
return owned != null && userSession.getUser() != null && (owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
return owned != null && userSession != null && userSession.getUser() != null && (owned.isOwnedBy(userSession.getUser(),false) || (userSession.getUser()).isSuperuserOrAdmin());
 
}
 
/impl/src/java/pt/estgp/estgweb/web/DirWebProxy.java
43,7 → 43,7
public static final String FTP_ACTUAL_PATH_KEY = "pt.estgp.estgweb.web.DirWebProxy.FTP_ACTUAL_PATH_KEY";
 
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
/impl/src/java/pt/estgp/estgweb/web/WebProxy.java
30,7 → 30,7
{
 
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
/impl/src/java/pt/estgp/estgweb/web/LayoutProxy.java
19,7 → 19,7
*/
public class LayoutProxy extends HttpServlet {
 
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
/** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
/impl/src/java/pt/estgp/estgweb/web/DirProxy.java
21,7 → 21,7
public class DirProxy extends HttpServlet
{
 
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
/** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
/impl/src/java/pt/estgp/estgweb/web/HTTPProxy.java
25,7 → 25,7
public class HTTPProxy extends HttpServlet
{
 
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
/** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
/impl/src/java/pt/estgp/estgweb/web/form/courseunits/CourseUnitProgramForm.java
13,14 → 13,16
* @time 14:28:59
* @see pt.estgp.estgweb.web.form.blogs
*/
public class CourseUnitProgramForm extends ApplicationForm
public class CourseUnitProgramForm extends CourseUnitsForm
{
private static final Logger logger = Logger.getLogger(CourseUnitProgramForm.class);
 
CourseUnitProgramView courseUnitProgramView = new CourseUnitProgramView();
CourseUnitView courseUnitView = new CourseUnitView();
 
long courseUnitId;
long cloneFromUnitId;
 
 
public CourseUnitProgramForm(CourseUnitProgramView courseUnitProgramView, CourseUnitView courseUnitView, long courseUnitId) {
this.courseUnitProgramView = courseUnitProgramView;
this.courseUnitView = courseUnitView;
57,4 → 59,12
public void setCourseUnitId(long courseUnitId) {
this.courseUnitId = courseUnitId;
}
 
public long getCloneFromUnitId() {
return cloneFromUnitId;
}
 
public void setCloneFromUnitId(long cloneIntoUnitId) {
this.cloneFromUnitId = cloneIntoUnitId;
}
}
/impl/src/java/pt/estgp/estgweb/web/form/processes/NewMetaProcessForm.java
New file
0,0 → 1,42
package pt.estgp.estgweb.web.form.processes;
 
import org.apache.struts.upload.FormFile;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.MetaProcess;
import pt.estgp.estgweb.domain.MetaProcessImpl;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class NewMetaProcessForm extends ApplicationForm
{
 
private MetaProcessImpl metaProcess;
private FormFile file;
 
public NewMetaProcessForm()
{
metaProcess = DomainObjectFactory.createMetaProcessImpl();
}
 
 
 
public FormFile getFile() {
return file;
}
 
public void setFile(FormFile file) {
this.file = file;
}
 
public MetaProcessImpl getMetaProcess() {
return metaProcess;
}
 
public void setMetaProcess(MetaProcessImpl metaProcess) {
this.metaProcess = metaProcess;
}
}
/impl/src/java/pt/estgp/estgweb/web/form/processes/ProcessEventForm.java
New file
0,0 → 1,69
package pt.estgp.estgweb.web.form.processes;
 
import org.apache.struts.upload.FormFile;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.ProcessEventImpl;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class ProcessEventForm extends ApplicationForm
{
 
private ProcessEventImpl processEvent = null;
private String destinationRole;
private String destinationPerson;
 
private FormFile file;
private String fileAccess;
 
public ProcessEventForm()
{
processEvent = DomainObjectFactory.createProcessEventImpl();
processEvent.setProcess(DomainObjectFactory.createProcessImpl());
}
 
public ProcessEventImpl getProcessEvent()
{
return processEvent;
}
 
public void setProcessEvent(ProcessEventImpl processEvent) {
this.processEvent = processEvent;
}
 
public FormFile getFile() {
return file;
}
 
public void setFile(FormFile file) {
this.file = file;
}
 
public String getDestinationRole() {
return destinationRole;
}
 
public void setDestinationRole(String destinationRole) {
this.destinationRole = destinationRole;
}
 
public String getDestinationPerson() {
return destinationPerson;
}
 
public void setDestinationPerson(String destinationPerson) {
this.destinationPerson = destinationPerson;
}
 
public String getFileAccess() {
return fileAccess;
}
 
public void setFileAccess(String fileAccess) {
this.fileAccess = fileAccess;
}
}
/impl/src/java/pt/estgp/estgweb/web/form/processes/NewProcessForm.java
New file
0,0 → 1,47
package pt.estgp.estgweb.web.form.processes;
 
import org.apache.struts.upload.FormFile;
import pt.estgp.estgweb.web.form.ApplicationForm;
 
/**
* @author Jorge Machado
* @date 25/Jun/2008
* @see pt.estgp.estgweb.web.form.courses
*/
public class NewProcessForm extends ApplicationForm
{
 
 
private String notes = "";
private Long metaProcessId = new Long(0);
private FormFile file;
 
public NewProcessForm()
{
 
}
 
public String getNotes() {
return notes;
}
 
public void setNotes(String notes) {
this.notes = notes;
}
 
public Long getMetaProcessId() {
return metaProcessId;
}
 
public void setMetaProcessId(Long metaProcessId) {
this.metaProcessId = metaProcessId;
}
 
public FormFile getFile() {
return file;
}
 
public void setFile(FormFile file) {
this.file = file;
}
}
/impl/src/java/pt/estgp/estgweb/web/form/commons/TeachersForm.java
53,6 → 53,7
String[] names = new String[]{"serializable"};
Object[] args = new Object[]{Teacher.class};
teachers = (List<UserView>) sm.execute(RequestUtils.getRequester(request, response), "LoadUsers", args, names);
}
catch (Throwable e)
{
/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsProgramController.java
New file
0,0 → 1,270
package pt.estgp.estgweb.web.controllers.courseunits;
 
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import org.hibernate.ObjectNotFoundException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.CourseUnitProgram;
import pt.estgp.estgweb.domain.CourseUnitProgramImpl;
import pt.estgp.estgweb.domain.CourseUnitProgramPart2Impl;
import pt.estgp.estgweb.domain.views.*;
import pt.estgp.estgweb.filters.exceptions.NotFoundException;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.controllers.blogs.BlogsController;
import pt.estgp.estgweb.web.controllers.profile.ProfileController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.form.blogs.BlogForm;
import pt.estgp.estgweb.web.form.courseunits.CourseUnitProgramForm;
import pt.estgp.estgweb.web.form.courseunits.CourseUnitsForm;
import pt.estgp.estgweb.web.form.profile.ProfileForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterRetrieveException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.IncompatibleFilterException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.InvalidFilterException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.InvalidFilterExpressionException;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.exceptions.ExecutedFilterException;
import pt.utl.ist.berserk.logic.serviceManager.exceptions.FilterChainFailedException;
import pt.utl.ist.berserk.logic.serviceManager.exceptions.ServiceManagerException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
/**
* @author Jorge Machado
* @author Fabio Velez
* @date 26/Fev/2008
* @time 18:01:54
* @see pt.estgp.estgweb.web
*/
public class CourseUnitsProgramController extends CourseUnitsController
{
private static final Logger logger = Logger.getLogger(CourseUnitsProgramController.class);
 
 
 
 
public ActionForward editProgram(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitId();
if(id <= 0)
id = cUF.getCourseUnitView().getId();
 
 
CourseUnitView cV = loadCourseUnitViewAndCourse(id,true,false, mapping, request, response);
 
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
CourseUnitProgramView cpv;
if(cV.getCourseUnit().getCourseUnitProgram() == null)
cpv = new CourseUnitProgramView(new CourseUnitProgramImpl());
else
cpv = new CourseUnitProgramView(cV.getCourseUnit().getCourseUnitProgram());
// request.setAttribute("CourseUnitProgramView", cpv);
 
if(cpv.getCourseUnitProgram().getCourseUnitProgramPart2() == null)
cpv.getCourseUnitProgram().setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
 
 
cUF.setCourseUnitProgramView(cpv);
cUF.setCourseUnitView(cV);
return mapping.findForward("edit.program");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward saveProgram(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitView().getId();
CourseUnitProgramView cuV = cUF.getCourseUnitProgramView();
cuV.setResponsableId(cUF.getCourseUnitView().getResponsableId());
 
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{cuV, id};
sm.execute(RequestUtils.getRequester(request, response), "SaveCourseUnitProgram", args);
CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
return mapping.findForward("load");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward cloneProgram(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitView().getId();
long idFrom = cUF.getCloneFromUnitId();
 
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{idFrom, id};
CourseUnitProgram cP = (CourseUnitProgram) sm.execute(RequestUtils.getRequester(request, response), "CloneCourseUnitProgram", args);
 
CourseUnitView cV = loadCourseUnitViewAndCourse(id,true,false, mapping, request, response);
 
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
CourseUnitProgramView cpv;
if(cV.getCourseUnit().getCourseUnitProgram() == null)
cpv = new CourseUnitProgramView(new CourseUnitProgramImpl());
else
cpv = new CourseUnitProgramView(cV.getCourseUnit().getCourseUnitProgram());
// request.setAttribute("CourseUnitProgramView", cpv);
 
if(cpv.getCourseUnitProgram().getCourseUnitProgramPart2() == null)
cpv.getCourseUnitProgram().setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
 
 
cUF.setCourseUnitProgramView(cpv);
cUF.setCourseUnitView(cV);
return mapping.findForward("edit.program");
 
 
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
 
}
 
 
//TODO meter aqui a navegação respectiva de adicionar teacher e ir para o programa de novo
public ActionForward addTeacher(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
long teacherId = cUF.getTeacherId();
long courseUnitId = cUF.getCourseUnitView().getId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{teacherId,courseUnitId};
 
CourseUnitView cV = (CourseUnitView) sm.execute(RequestUtils.getRequester(request, response), "AddTeacherCourseUnit", args, names);
if(cV.isNotFound())
addError(request,"error.courseunit.teacher.not.found");
 
return editProgram(mapping,form,request,response);
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
 
public ActionForward removeTeacher(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
long teacherId = cUF.getId(); //can't come in SELECT BOX because is for choose
long courseUnitId = cUF.getCourseUnitView().getId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{teacherId,courseUnitId};
 
sm.execute(RequestUtils.getRequester(request, response), "RemoveTeacherCourseUnit", args, names);
return editProgram(mapping,form,request,response);
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
 
 
}
/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitLayoutProxy.java
28,7 → 28,7
public class CourseUnitLayoutProxy extends LayoutProxy
{
 
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
/** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsAdminController.java
5,9 → 5,14
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.CourseUnitProgram;
import pt.estgp.estgweb.domain.CourseUnitProgramImpl;
import pt.estgp.estgweb.domain.CourseUnitProgramPart2Impl;
import pt.estgp.estgweb.domain.views.CourseUnitProgramView;
import pt.estgp.estgweb.domain.views.CourseUnitView;
import pt.estgp.estgweb.filters.exceptions.NotFoundException;
import pt.estgp.estgweb.services.common.ISearchResults;
import pt.estgp.estgweb.web.form.courseunits.CourseUnitProgramForm;
import pt.estgp.estgweb.web.form.courseunits.CourseUnitsForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
379,7 → 384,7
// sm.execute(RequestUtils.getRequester(request, response), "DeleteCourseUnit", args, names);
 
// addMessage(request,"courseunit.removed");
logger.info("Não implementado por razoes de segurança");
logger.info("N�o implementado por razoes de seguran�a");
addMessage(request,"courseunit.security.not.implemented");
} catch (Throwable e) {
addMessage(request,"error.500");
424,5 → 429,4
 
 
 
 
}
/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsController.java
8,6 → 8,7
import org.apache.struts.upload.FormFile;
import org.hibernate.ObjectNotFoundException;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.CourseUnitProgram;
import pt.estgp.estgweb.domain.CourseUnitProgramImpl;
import pt.estgp.estgweb.domain.CourseUnitProgramPart2Impl;
import pt.estgp.estgweb.domain.views.*;
47,7 → 48,7
{
private static final Logger logger = Logger.getLogger(CourseUnitsController.class);
 
private ActionForward createBackup(String service,
protected ActionForward createBackup(String service,
Object[] args,
ActionMapping mapping,
ActionForm form,
98,7 → 99,7
return createBackup("CreateUserImportYearCourseUnitWorksBackup",args,mapping,form,request,response);
}
 
private ActionForward loadCourseUnitAndForward(CourseUnitsForm cUF, long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
protected ActionForward loadCourseUnitAndForward(CourseUnitsForm cUF, long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
CourseUnitView cV = loadCourseUnitView(id,initTeachers,initStudents, mapping, request, response);
107,7 → 108,7
return mapping.findForward("load");
}
 
private CourseUnitView loadCourseUnitView(long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
protected CourseUnitView loadCourseUnitView(long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
IServiceManager sm = ServiceManager.getInstance();
128,7 → 129,7
}
}
 
private CourseUnitView loadCourseUnitViewAndCourse(long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
protected CourseUnitView loadCourseUnitViewAndCourse(long id, boolean initTeachers, boolean initStudents, ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
throws Throwable, InvalidFilterException, ServiceManagerException, InvalidFilterExpressionException, IncompatibleFilterException, FilterRetrieveException, NoCookiesException
{
IServiceManager sm = ServiceManager.getInstance();
373,89 → 374,8
}
 
 
public ActionForward editProgram(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitId();
 
 
CourseUnitView cV = loadCourseUnitViewAndCourse(id,true,false, mapping, request, response);
 
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
CourseUnitProgramView cpv;
if(cV.getCourseUnit().getCourseUnitProgram() == null)
cpv = new CourseUnitProgramView(new CourseUnitProgramImpl());
else
cpv = new CourseUnitProgramView(cV.getCourseUnit().getCourseUnitProgram());
// request.setAttribute("CourseUnitProgramView", cpv);
 
if(cpv.getCourseUnitProgram().getCourseUnitProgramPart2() == null)
cpv.getCourseUnitProgram().setCourseUnitProgramPart2(new CourseUnitProgramPart2Impl());
 
cUF.setCourseUnitProgramView(cpv);
cUF.setCourseUnitView(cV);
return mapping.findForward("edit.program");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward saveProgram(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitId();
CourseUnitProgramView cuV = cUF.getCourseUnitProgramView();
 
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{cuV, id};
sm.execute(RequestUtils.getRequester(request, response), "SaveCourseUnitProgram", args);
CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
return mapping.findForward("load");
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward validateInvalidateAssignement(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
854,4 → 774,5
 
 
 
 
}
/impl/src/java/pt/estgp/estgweb/web/controllers/processes/ProcessEventController.java
New file
0,0 → 1,442
package pt.estgp.estgweb.web.controllers.processes;
 
import com.sun.tools.javac.code.Type;
import jomm.dao.utils.HibernateUtils;
import jomm.utils.FilesUtils;
import jomm.utils.MessageResources;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;
import pt.estgp.estgweb.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.Process;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.form.processes.NewProcessForm;
import pt.estgp.estgweb.web.form.processes.ProcessEventForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
 
/**
* @author Jorge Machado
* @date 26/Fev/2008
* @time 18:01:54
* @see pt.estgp.estgweb.web
*/
public class ProcessEventController extends ApplicationDispatchController
{
 
private static final Logger logger = Logger.getLogger(ProcessEventController.class);
 
public ActionForward updateProcessEvent(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
ProcessEventForm f = (ProcessEventForm)form;
System.out.println("Actualizando");
HibernateUtils.getCurrentSession().beginTransaction();
ProcessEvent p = DaoFactory.getProcessEventDaoImpl().load(f.getProcessEvent().getId());
p.setNotes(f.getProcessEvent().getNotes());
p.setNotesAccessLevel(f.getProcessEvent().getNotesAccessLevel());
p.setNotesToStarter(f.getProcessEvent().getNotesToStarter());
Date now = new Date();
p.setLastChangeDate(now);
 
importPossibleFile(request, f, p, now);
 
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId",f.getProcessEvent().getProcess().getId());
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
public ActionForward transitProcessEventRole(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
ProcessEventForm f = (ProcessEventForm)form;
System.out.println("Actualizando com destino a um role");
HibernateUtils.getCurrentSession().beginTransaction();
ProcessEvent p = DaoFactory.getProcessEventDaoImpl().load(f.getProcessEvent().getId());
 
//updata data
p.setNotes(f.getProcessEvent().getNotes());
p.setNotesAccessLevel(f.getProcessEvent().getNotesAccessLevel());
p.setNotesToStarter(f.getProcessEvent().getNotesToStarter());
 
 
Date now = new Date();
ProcessEventImpl eventDest = DomainObjectFactory.createProcessEventImpl();
eventDest.setOwner(null);
eventDest.setOpenDate(now);
eventDest.setNowStateEnum(ProcessEventImpl.ProcessEventState.NOT_ACCEPTED);
eventDest.setSaveDate(now);
eventDest.setLastChangeDate(now);
eventDest.setCloseDate(null);
eventDest.setAccepted(false);
eventDest.setAcceptedDate(null);
eventDest.setDispatchedDate(null);
eventDest.setNotes("");
eventDest.setDestinationRole(f.getDestinationRole());//OK
eventDest.setPreviousEvent(p);
eventDest.setNextEvent(null);
eventDest.setProcess(p.getProcess());
 
p.setNextEvent(eventDest);
 
p.setNowState(ProcessEventImpl.ProcessEventState.FINNISH_TRANSITATED.name());
p.setLastChangeDate(now);
p.setCloseDate(now);
p.setDispatchedDate(now);
 
DaoFactory.getProcessEventDaoImpl().save(eventDest);
p.getProcess().setLastChangeDate(now);
p.getProcess().setLastEvent(eventDest);
p.getProcess().getEvents().add(eventDest);
p.getProcess().setNowState(ProcessImpl.ProcessState.TRANSITION.name());
 
 
//importPossibleFile(request, f, p, now);
 
 
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId",f.getProcessEvent().getProcess().getId());
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
private void importPossibleFile(HttpServletRequest request, ProcessEventForm f, ProcessEvent p, Date now) throws IOException {
if(f.getFile() != null && f.getFile().getFileSize() > 0)
{
UserSession sess = UserSessionProxy.loadUserSessionFromRequest(request);
FormFile file = f.getFile();
logger.info("Adding file " + f.getFile().getFileName() + " to process " + p.getProcess().getId() + " in event " + p.getId());
RepositoryService repositoryService = new RepositoryService();
 
String repositoryId;
try {
repositoryId = repositoryService.storeRepositoryFile(file.getInputStream(),file.getContentType(), FilesUtils.getExtension(file.getFileName()),
file.getFileSize(),file.getFileName(),"Process Event file " + p.getProcess().getMetaProcess().getName(), ResourceAccessControlEnum.processDomain,sess);
 
ProcessEventFileImpl ef = DomainObjectFactory.createProcessEventFileImpl();
Set<ProcessEventFile> proceSet = null;
if(p.getFiles() != null){
proceSet = p.getFiles();
}
else{
proceSet = new HashSet<ProcessEventFile>();
p.setFiles(proceSet);
}
proceSet.add(ef);
ef.setImportDate(now);
ef.setOwner(sess.getUser());
ef.setProcessEvent(p);
ef.setRepositoryStream(repositoryId);
ef.setFileAccessLevel(f.getFileAccess());
ef.setGhost(false);
ef.setSaveDate(now);
ef.setName(file.getFileName());
DaoFactory.getProcessEventFileDaoImpl().save(ef);
} catch (IOException e) {
logger.error(e,e);
throw e;
}
}
}
 
public ActionForward transitProcessEventPerson(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
ProcessEventForm f = (ProcessEventForm)form;
HibernateUtils.getCurrentSession().beginTransaction();
ProcessEvent p = DaoFactory.getProcessEventDaoImpl().load(f.getProcessEvent().getId());
 
//updata data
p.setNotes(f.getProcessEvent().getNotes());
p.setNotesAccessLevel(f.getProcessEvent().getNotesAccessLevel());
p.setNotesToStarter(f.getProcessEvent().getNotesToStarter());
 
 
Date now = new Date();
ProcessEventImpl eventDest = DomainObjectFactory.createProcessEventImpl();
eventDest.setOwner(null);
eventDest.setOpenDate(now);
eventDest.setNowStateEnum(ProcessEventImpl.ProcessEventState.NOT_ACCEPTED);
eventDest.setSaveDate(now);
eventDest.setLastChangeDate(now);
eventDest.setCloseDate(null);
eventDest.setAccepted(false);
eventDest.setAcceptedDate(null);
eventDest.setDispatchedDate(null);
eventDest.setNotes("");
eventDest.setDestinationRole(null);//OK
 
//UNICA COISA DIFERENTE DO ROLE DESTINATED
User u = DaoFactory.getUserDaoImpl().loadByUsername(f.getDestinationPerson());
eventDest.setOwner(u);
//UNICA COISA DIFERENTE
 
eventDest.setPreviousEvent(p);
eventDest.setNextEvent(null);
eventDest.setProcess(p.getProcess());
 
p.setNextEvent(eventDest);
 
p.setNowState(ProcessEventImpl.ProcessEventState.FINNISH_TRANSITATED.name());
p.setLastChangeDate(now);
p.setCloseDate(now);
p.setDispatchedDate(now);
 
DaoFactory.getProcessEventDaoImpl().save(eventDest);
p.getProcess().setLastChangeDate(now);
p.getProcess().setLastEvent(eventDest);
p.getProcess().getEvents().add(eventDest);
p.getProcess().setNowState(ProcessImpl.ProcessState.TRANSITION.name());
 
//importPossibleFile(request, f, p, now);
 
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId",f.getProcessEvent().getProcess().getId());
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
 
 
public ActionForward reopenProcessEventPerson(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
ProcessEventForm f = (ProcessEventForm)form;
HibernateUtils.getCurrentSession().beginTransaction();
 
User user = UserSessionProxy.loadUserSessionFromRequest(request).getUser();
long processId = Long.parseLong(request.getParameter("id"));
ProcessImpl process = (ProcessImpl) DaoFactory.getProcessDaoImpl().load(processId);
if(!process.canReopen(user))
{
addError(request,"process.cant.reopen");
return mapping.getInputForward();
}
process.setCloseDate(null);
 
//updata data
 
 
Date now = new Date();
ProcessEventImpl eventDest = DomainObjectFactory.createProcessEventImpl();
eventDest.setOwner(null);
eventDest.setOpenDate(now);
eventDest.setNowStateEnum(ProcessEventImpl.ProcessEventState.ACCEPTED);
eventDest.setSaveDate(now);
eventDest.setLastChangeDate(now);
eventDest.setCloseDate(null);
eventDest.setAccepted(true);
eventDest.setAcceptedDate(now);
eventDest.setDispatchedDate(null);
eventDest.setNotes("");
eventDest.setDestinationRole(null);//OK
 
//UNICA COISA DIFERENTE DO ROLE DESTINATED
 
eventDest.setOwner(user);
//UNICA COISA DIFERENTE
 
eventDest.setPreviousEvent(process.getLastEvent());
 
eventDest.setNextEvent(null);
eventDest.setProcess(process);
 
process.getLastEvent().setNextEvent(eventDest);
 
//lets keep it closed
//process.getLastEvent().setNowState(ProcessEventImpl.ProcessEventState.FINNISH_TRANSITATED.name());
 
DaoFactory.getProcessEventDaoImpl().save(eventDest);
process.setLastChangeDate(now);
process.setLastEvent(eventDest);
process.getEvents().add(eventDest);
process.setNowState(ProcessImpl.ProcessState.TRANSITION.name());
 
f.setProcessEvent(eventDest);
 
 
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId",processId);
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
public ActionForward finnishProcessEvent(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
ProcessEventForm f = (ProcessEventForm)form;
HibernateUtils.getCurrentSession().beginTransaction();
ProcessEvent p = DaoFactory.getProcessEventDaoImpl().load(f.getProcessEvent().getId());
 
//updata data
p.setNotes(f.getProcessEvent().getNotes());
p.setNotesAccessLevel(f.getProcessEvent().getNotesAccessLevel());
p.setNotesToStarter(f.getProcessEvent().getNotesToStarter());
 
Date now = new Date();
p.setNowState(ProcessEventImpl.ProcessEventState.FINNISH_CLOSED.name());
p.setLastChangeDate(now);
p.setCloseDate(now);
p.setDispatchedDate(now);
 
p.getProcess().setLastChangeDate(now);
p.getProcess().setCloseDate(now);
p.getProcess().setNowState(ProcessImpl.ProcessState.CLOSED.name());
 
 
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId",f.getProcessEvent().getProcess().getId());
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
 
public ActionForward setGhostFileFromProcessEvent(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
long fileId = Long.parseLong(request.getParameter("fileId"));
 
User user = UserSessionProxy.loadUserSessionFromRequest(request).getUser();
 
HibernateUtils.getCurrentSession().beginTransaction();
ProcessEventFileImpl ef = (ProcessEventFileImpl) DaoFactory.getProcessEventFileDaoImpl().load(fileId);
 
if(!ef.isGhost())
{
if(ef.canOpenCloseGhost(user))
{
ef.setGhost(true);
ef.setOldFileAccessLevel(ef.getFileAccessLevel());
ef.setFileAccessLevelEnum(ProcessEventFileImpl.AccessLevel.OWNER);
addMessage(request, "processes.file.set.ghost");
}
}
 
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId", ef.getProcessEvent().getProcess().getId());
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
public ActionForward unsetGhostFileFromProcessEvent(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
 
long fileId = Long.parseLong(request.getParameter("fileId"));
User user = UserSessionProxy.loadUserSessionFromRequest(request).getUser();
 
 
HibernateUtils.getCurrentSession().beginTransaction();
ProcessEventFileImpl ef = (ProcessEventFileImpl) DaoFactory.getProcessEventFileDaoImpl().load(fileId);
if(ef.isGhost())
{
if(ef.canOpenCloseGhost(user))
{
ef.setGhost(false);
ef.setFileAccessLevel(ef.getOldFileAccessLevel());
String level = MessageResources.getMessage(request,"process.access.level." + ef.getFileAccessLevel());
addMessage(request,"processes.file.unset.ghost",level);
}
}
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("processId",ef.getProcessEvent().getProcess().getId());
return mapping.getInputForward();
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error501");
}
}
 
 
}
/impl/src/java/pt/estgp/estgweb/web/controllers/processes/ProcessesController.java
New file
0,0 → 1,88
package pt.estgp.estgweb.web.controllers.processes;
 
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.domain.views.SurveyView;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.form.processes.NewProcessForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterRetrieveException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.IncompatibleFilterException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.InvalidFilterException;
import pt.utl.ist.berserk.logic.filterManager.exceptions.InvalidFilterExpressionException;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.exceptions.ServiceManagerException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
* @author Jorge Machado
* @date 26/Fev/2008
* @time 18:01:54
* @see pt.estgp.estgweb.web
*/
public class ProcessesController extends ApplicationDispatchController
{
 
private static final Logger logger = Logger.getLogger(ProcessesController.class);
 
/**
* Submit a new Process into database
* @param id
* @param mapping
* @param request
* @param response
* @return
* @throws Throwable
* @throws InvalidFilterException
* @throws ServiceManagerException
* @throws InvalidFilterExpressionException
* @throws IncompatibleFilterException
* @throws FilterRetrieveException
* @throws NoCookiesException
*/
public ActionForward submitNew(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Throwable, ServletException
{
try
{
System.out.println("AQUI");
NewProcessForm f = (NewProcessForm)form;
System.out.println(f.getNotes());
System.out.println(f.getMetaProcessId());
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = {};
Object[] args = {f.getMetaProcessId(),f.getNotes(),f.getFile()};
 
 
sm.execute(RequestUtils.getRequester(request,response),"CreateNewProcess",args,names);
 
 
addMessage(request,"process.submited");
return mapping.findForward("process.submited");
 
}
//catch (FilterChainFailedException e)
//{
// return mapping.findForward("error401");
//}
catch (Throwable e)
{
logger.error(e, e);
throw e;
}
}
 
 
 
}
/impl/src/java/pt/estgp/estgweb/web/FTPProxy.java
29,7 → 29,7
*/
public class FTPProxy extends HttpServlet {
 
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
/** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
/impl/src/java/pt/utl/ist/berserk/logic/serviceManager/ServiceDefinition.java
77,7 → 77,7
this.isTransactional = boolean1;
}
/**
* Processes the object and gives a text human-readable version of it.
* sss the object and gives a text human-readable version of it.
*
* @return the text-based representation of all object's fields
*/
/impl/src/updates/db/update-18-bacoProcess.sql
New file
0,0 → 1,183
 
-- MySQL dump 10.13 Distrib 5.6.13, for osx10.6 (i386)
--
-- Host: localhost Database: baco3
-- ------------------------------------------------------
-- Server version 5.6.12
 
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
--
-- Table structure for table `process`
--
 
DROP TABLE IF EXISTS `process`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `process` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`discrimitator` varchar(255) NOT NULL,
`updateDate` datetime NOT NULL,
`openDate` datetime DEFAULT NULL,
`lastChangeDate` datetime DEFAULT NULL,
`closeDate` datetime DEFAULT NULL,
`nowState` varchar(255) DEFAULT NULL,
`owner` bigint(20) DEFAULT NULL,
`lastEvent` bigint(20) DEFAULT NULL,
`meta_process_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FKED8D1E6F63C05A89` (`meta_process_id`),
KEY `FKED8D1E6F52876F6F` (`owner`),
KEY `FKED8D1E6F382B17F5` (`lastEvent`),
CONSTRAINT `FKED8D1E6F382B17F5` FOREIGN KEY (`lastEvent`) REFERENCES `process_event` (`id`),
CONSTRAINT `FKED8D1E6F52876F6F` FOREIGN KEY (`owner`) REFERENCES `user` (`id`),
CONSTRAINT `FKED8D1E6F63C05A89` FOREIGN KEY (`meta_process_id`) REFERENCES `meta_process` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `process`
--
 
LOCK TABLES `process` WRITE;
/*!40000 ALTER TABLE `process` DISABLE KEYS */;
/*!40000 ALTER TABLE `process` ENABLE KEYS */;
UNLOCK TABLES;
 
--
-- Table structure for table `process_event_file`
--
 
DROP TABLE IF EXISTS `process_event_file`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `process_event_file` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`discrimitator` varchar(255) NOT NULL,
`updateDate` datetime NOT NULL,
`fileAccessLevel` varchar(255) DEFAULT NULL,
`fileAccessIdentifiers` varchar(255) DEFAULT NULL,
`importDate` datetime DEFAULT NULL,
`repositoryStream` varchar(255) DEFAULT NULL,
`notes` text,
`owner` bigint(20) DEFAULT NULL,
`process_event_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FKAB3EF7D15DFAAAE1` (`process_event_id`),
KEY `FKAB3EF7D152876F6F` (`owner`),
CONSTRAINT `FKAB3EF7D152876F6F` FOREIGN KEY (`owner`) REFERENCES `user` (`id`),
CONSTRAINT `FKAB3EF7D15DFAAAE1` FOREIGN KEY (`process_event_id`) REFERENCES `process_event` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `process_event_file`
--
 
LOCK TABLES `process_event_file` WRITE;
/*!40000 ALTER TABLE `process_event_file` DISABLE KEYS */;
/*!40000 ALTER TABLE `process_event_file` ENABLE KEYS */;
UNLOCK TABLES;
 
--
-- Table structure for table `meta_process`
--
 
DROP TABLE IF EXISTS `meta_process`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `meta_process` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`discrimitator` varchar(255) NOT NULL,
`updateDate` datetime NOT NULL,
`saveDate` datetime DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`repositoryStream` varchar(255) DEFAULT NULL,
`description` text,
`category` varchar(255) DEFAULT NULL,
`subCategory` varchar(255) DEFAULT NULL,
`srcRole` varchar(255) DEFAULT NULL,
`targetRole` varchar(255) DEFAULT NULL,
`targetPerson` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK5E3006354B29E6B7` (`targetPerson`),
CONSTRAINT `FK5E3006354B29E6B7` FOREIGN KEY (`targetPerson`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `meta_process`
--
 
LOCK TABLES `meta_process` WRITE;
/*!40000 ALTER TABLE `meta_process` DISABLE KEYS */;
/*!40000 ALTER TABLE `meta_process` ENABLE KEYS */;
UNLOCK TABLES;
 
--
-- Table structure for table `process_event`
--
 
DROP TABLE IF EXISTS `process_event`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `process_event` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`discrimitator` varchar(255) NOT NULL,
`updateDate` datetime NOT NULL,
`openDate` datetime DEFAULT NULL,
`acceptedDate` datetime DEFAULT NULL,
`dispatchedDate` datetime DEFAULT NULL,
`lastChangeDate` datetime DEFAULT NULL,
`closeDate` datetime DEFAULT NULL,
`nowState` varchar(255) DEFAULT NULL,
`accepted` bit(1) DEFAULT NULL,
`destinationRole` varchar(255) DEFAULT NULL,
`notes` text,
`notesAccessLevel` varchar(255) DEFAULT NULL,
`notesAccessIdentifiers` varchar(255) DEFAULT NULL,
`notesToStarter` text,
`previous_event_id` bigint(20) DEFAULT NULL,
`next_event_id` bigint(20) DEFAULT NULL,
`owner` bigint(20) DEFAULT NULL,
`process_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK627524CAD7AC12DD` (`next_event_id`),
KEY `FK627524CAB2F24AD4` (`process_id`),
KEY `FK627524CA52876F6F` (`owner`),
KEY `FK627524CA1627A759` (`previous_event_id`),
CONSTRAINT `FK627524CA1627A759` FOREIGN KEY (`previous_event_id`) REFERENCES `process_event` (`id`),
CONSTRAINT `FK627524CA52876F6F` FOREIGN KEY (`owner`) REFERENCES `user` (`id`),
CONSTRAINT `FK627524CAB2F24AD4` FOREIGN KEY (`process_id`) REFERENCES `process` (`id`),
CONSTRAINT `FK627524CAD7AC12DD` FOREIGN KEY (`next_event_id`) REFERENCES `process_event` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
 
--
-- Dumping data for table `process_event`
--
 
LOCK TABLES `process_event` WRITE;
/*!40000 ALTER TABLE `process_event` DISABLE KEYS */;
/*!40000 ALTER TABLE `process_event` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
-- Dump completed on 2014-01-11 18:16:23
/impl/src/hbm/pt/estgp/estgweb/domain/GenericUser.hbm.xml
122,6 → 122,10
<property name="unitCheck" type="boolean"/>
<property name="academicDegree" type="string"/>
<property name="localRemovedTeachedUnits" type="string"/>
<set name="responsibleUnits" lazy="true" order-by="name">
<key column="responsableTeacher"/>
<one-to-many class="pt.estgp.estgweb.domain.CourseUnit"/>
</set>
<set name="teachedUnits" lazy="true" order-by="courseUnitId" table="teachedunits">
<key column="teacherId"/>
<many-to-many class="pt.estgp.estgweb.domain.CourseUnit" column="courseUnitId"/>
/impl/src/hbm/pt/estgp/estgweb/domain/Process.hbm.xml
New file
0,0 → 1,133
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 
<hibernate-mapping>
<class name="pt.estgp.estgweb.domain.MetaProcess" table="meta_process" abstract="true">
<meta attribute="extends">pt.estgp.estgweb.domain.DomainObject</meta>
<meta attribute="scope-class">public abstract</meta>
<id name="id" type="long">
<generator class="native"/>
</id>
<discriminator column="discrimitator"/>
<timestamp source="db" name="updateDate" unsaved-value="null"/>
<property name="saveDate" type="timestamp"/>
<property name="name" type="string"/>
<property name="possibleTargets" type="text" />
<property name="possiblePersons" type="text" />
<property name="repositoryStream" type="string"/>
<property name="description" type="text"/>
<property name="category" type="string"/>
<property name="subCategory" type="string"/>
<property name="srcRole" type="string"/>
<property name="targetRole" type="string"/>
<many-to-one name="targetPerson" class="pt.estgp.estgweb.domain.User" lazy="false" outer-join="true"/>
<set name="processes" cascade="none" lazy="true">
<key column="meta_process_id"/>
<one-to-many class="pt.estgp.estgweb.domain.Process"/>
</set>
<subclass name="pt.estgp.estgweb.domain.MetaProcessImpl" discriminator-value="MetaProcessImpl">
</subclass>
</class>
 
<class name="pt.estgp.estgweb.domain.Process" table="process" abstract="true">
<meta attribute="extends">pt.estgp.estgweb.domain.OwnedDomainObject</meta>
<meta attribute="scope-class">public abstract</meta>
<id name="id" type="long">
<generator class="native"/>
</id>
<discriminator column="discrimitator"/>
<timestamp source="db" name="updateDate" unsaved-value="null"/>
<property name="openDate" type="timestamp"/>
<property name="lastChangeDate" type="timestamp"/>
<property name="closeDate" type="timestamp"/>
<property name="nowState" type="string"/>
 
<many-to-one name="owner" class="pt.estgp.estgweb.domain.GenericUser" lazy="no-proxy" outer-join="true"/>
<many-to-one name="lastEvent" class="pt.estgp.estgweb.domain.ProcessEvent" lazy="false" outer-join="true"/>
 
<many-to-one name="metaProcess" column="meta_process_id" class="pt.estgp.estgweb.domain.MetaProcess" lazy="false" outer-join="true"/>
<set name="events" cascade="delete" lazy="true">
<key column="process_id"/>
<one-to-many class="pt.estgp.estgweb.domain.ProcessEvent"/>
</set>
<subclass name="pt.estgp.estgweb.domain.ProcessImpl" discriminator-value="ProcessImpl">
</subclass>
</class>
 
<class name="pt.estgp.estgweb.domain.ProcessEvent" table="process_event" abstract="true">
<meta attribute="extends">pt.estgp.estgweb.domain.OwnedDomainObject</meta>
<meta attribute="scope-class">public abstract</meta>
<id name="id" type="long">
<generator class="native"/>
</id>
<discriminator column="discrimitator"/>
<timestamp source="db" name="updateDate" unsaved-value="null"/>
<property name="openDate" type="timestamp"/>
<property name="acceptedDate" type="timestamp"/>
<property name="dispatchedDate" type="timestamp"/>
<property name="lastChangeDate" type="timestamp"/>
<property name="closeDate" type="timestamp"/>
 
<property name="nowState" type="string"/>
<property name="accepted" type="boolean"/>
<property name="destinationRole" type="string"/>
 
<property name="notes" type="text"/>
<property name="notesAccessLevel" type="string"/>
<property name="notesAccessIdentifiers" type="string"/>
<property name="notesAccessRoles" type="string"/>
 
<property name="notesToStarter" type="text"/>
 
 
 
<many-to-one name="process" column="process_id" class="pt.estgp.estgweb.domain.Process" lazy="no-proxy" outer-join="true" cascade="none"/>
 
<many-to-one name="previousEvent" column="previous_event_id" class="pt.estgp.estgweb.domain.ProcessEvent" lazy="no-proxy" outer-join="false" cascade="none"/>
<many-to-one name="nextEvent" column="next_event_id" class="pt.estgp.estgweb.domain.ProcessEvent" lazy="no-proxy" outer-join="false" cascade="delete"/>
<!-- é o owner <many-to-one name="destinatedPerson" column="dest_user_id" class="pt.estgp.estgweb.domain.User" lazy="no-proxy" outer-join="false" cascade="none"/>-->
<!--
Nao e necessario porque temos o preciousEvent e com isso sabemos a source person
<many-to-one name="sourcePerson" column="dest_user_id" class="pt.estgp.estgweb.domain.User" lazy="no-proxy" outer-join="false" cascade="none"/>
-->
<many-to-one name="owner" class="pt.estgp.estgweb.domain.GenericUser" lazy="no-proxy" outer-join="true"/>
<set name="files" cascade="none" lazy="true">
<key column="process_event_id"/>
<one-to-many class="pt.estgp.estgweb.domain.ProcessEventFile"/>
</set>
<subclass name="pt.estgp.estgweb.domain.ProcessEventImpl" discriminator-value="ProcessEventImpl">
</subclass>
</class>
 
<class name="pt.estgp.estgweb.domain.ProcessEventFile" table="process_event_file" abstract="true">
<meta attribute="extends">pt.estgp.estgweb.domain.OwnedDomainObject</meta>
<meta attribute="scope-class">public abstract</meta>
<id name="id" type="long">
<generator class="native"/>
</id>
<discriminator column="discrimitator"/>
<timestamp source="db" name="updateDate" unsaved-value="null"/>
 
<property name="name" type="string"/>
<property name="fileAccessLevel" type="string"/>
<property name="oldFileAccessLevel" type="string"/>
<property name="fileAccessIdentifiers" type="string"/>
<property name="fileAccessRoles" type="string"/>
 
<property name="importDate" type="timestamp"/>
 
<property name="repositoryStream" type="string"/>
<property name="notes" type="text"/>
 
<property name="ghost" type="boolean"/>
 
 
<many-to-one name="owner" class="pt.estgp.estgweb.domain.GenericUser" lazy="no-proxy" outer-join="true"/>
<many-to-one name="processEvent" column="process_event_id" class="pt.estgp.estgweb.domain.ProcessEvent" lazy="false" outer-join="true"/>
 
<subclass name="pt.estgp.estgweb.domain.ProcessEventFileImpl" discriminator-value="ProcessEventFileImpl">
</subclass>
</class>
</hibernate-mapping>
/impl/src/web/imgs/notedit.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/imgs/edit.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/imgs/home.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/imgs/process/rightProcess.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/imgs/process/actor.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/imgs/process/leftProcess.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:executable
+ *
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/yui/build/container/container-debug.js
5377,7 → 5377,7
// END BUILT-IN DOM EVENT HANDLERS //
 
/**
* Processes the showing of the Tooltip by setting the timeout delay
* sss the showing of the Tooltip by setting the timeout delay
* and offset of the Tooltip.
* @method doShow
* @param {DOMEvent} e The current DOM event
/impl/src/web/yui/build/container/container.js
5362,7 → 5362,7
// END BUILT-IN DOM EVENT HANDLERS //
 
/**
* Processes the showing of the Tooltip by setting the timeout delay
* sss the showing of the Tooltip by setting the timeout delay
* and offset of the Tooltip.
* @method doShow
* @param {DOMEvent} e The current DOM event
/impl/src/web/admin/profile/profilePersonalData.jsp
1,4 → 1,6
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.web.form.profile.ProfileForm" %>
<%@ page import="pt.estgp.estgweb.domain.StudentImpl" %>
<%@ page import="pt.estgp.estgweb.domain.TeacherImpl" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
23,6 → 25,7
}
request.setAttribute("fromAction", fromAction);
 
boolean regular = false;
//separator=${separator}
%>
<html:form action="/user/profile${fromAction}?${from}">
34,6 → 37,35
 
<baco:isAdmin>
<tr>
<th>TIPO DE UTILIZADOR</th>
<td>
<%
 
pt.estgp.estgweb.web.form.profile.ProfileForm pf = (pt.estgp.estgweb.web.form.profile.ProfileForm) request.getAttribute("ProfileForm");
if(pf.getUserView().getUser() instanceof pt.estgp.estgweb.domain.StudentImpl)
{
%>
CLASSE ESTUDANTE
<%
}
else if(pf.getUserView().getUser() instanceof pt.estgp.estgweb.domain.TeacherImpl)
{
%>
CLASSE PROFESSOR
<%
}
else
{
regular = true;
%>
<label class="warning">CLASSE NORMAL</label>
<%
}
 
%>
</td>
</tr>
<tr>
<th>
<bean:message key="profile.autoBlockMode"/>
</th>
71,12 → 103,14
</tr>
</baco:isAdmin>
<baco:isNotAdmin>
 
<tr>
<th>
<bean:message key="profile.siges.code"/>
</th>
<td>
<html:text styleClass="text" property="userView.code" maxlength="250" readonly="true"/>
 
</td>
</tr>
<tr>
113,7 → 147,22
<bean:message key="profile.siges.code"/>
</th>
<td>
<html:text styleClass="text" property="userView.code" maxlength="250"/>
<%
if(regular)
{
%>
<html:text styleClass="text" property="userView.code" maxlength="250" readonly="true"/> <br/>ESTE UTILIZADOR É NORMAL NAO TEM CODIGO SIGES
<%
}
else
{
%>
<html:text styleClass="text" property="userView.code" maxlength="250"/>
<%
}
%>
 
 
</td>
</tr>
<tr>
/impl/src/web/admin/courseunits/courseunit.jsp
3,6 → 3,7
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Collections" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
19,6 → 20,18
request.setAttribute("Courses", courseViews);
 
List<pt.estgp.estgweb.domain.views.UserView> teachers =(List<pt.estgp.estgweb.domain.views.UserView>) sm.execute(RequestUtils.getRequester(request, response), "LoadTeachers", args, names);
/*Collections.sort(teachers,new Comparator<pt.estgp.estgweb.domain.views.UserView>(){
 
@Override
public int compare(pt.estgp.estgweb.domain.views.UserView o1, pt.estgp.estgweb.domain.views.UserView o2) {
if(o1.getName()!=null && o2.getName() != null)
return o1.getName().compareTo(o2.getName());
if(o1.getName()==null)
return 1;
return -1;
}
 
});*/
request.setAttribute("Teachers", teachers);
%>
 
88,6 → 101,14
</html:select>
</td>
</tr>
<tr>
<th>
<bean:message key="courseunit.pathIntranet"/>
</th>
<td>
<html:text styleClass="text" readonly="true" property="courseUnitView.pathIntranet"/> (Para preencher gerar pastas nos serviços)
</td>
</tr>
 
<tr>
<th>
96,7 → 117,7
<td>
<html:select property="courseUnitView.responsableId">
<html:option value="0"></html:option>
<logic:iterate id="teacher" name="Teachers" type="pt.estgp.estgweb.domain.views.UserView">
<logic:iterate id="teacher" name="CourseUnitsForm" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<html:option value="${teacher.id}">(${teacher.code}) ${teacher.name}</html:option>
</logic:iterate>
</html:select>
160,29 → 181,41
<input type="button" value="<bean:message key="add"/>"
onclick="if(this.form.studentCode.value=='0' || this.form.studentCode.value==''){alert('Por favor coloque o numero de aluno antes de adicionar');}else{set(this.form,'addStudent');this.form.submit();}">
<logic:greaterThan name="CourseUnitView" property="studentsSize" value="0">
<table class="dataTable removeButton">
<table id="myTable" class="tablesorter dataTable removeButton">
<thead>
<tr>
<th>Código Siges</th>
<th>Username</th>
<th>Nome</th>
<th>Email</th>
<th>Telefone</th>
</tr>
</thead>
<tbody>
<logic:iterate id="userView" name="CourseUnitView" property="studentsOrderedByNumber" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<th>
<td>
${userView.code}
</th>
<th>
</td>
<td>
${userView.username}
</th>
<th>
</td>
<td>
${userView.name}
</th>
<th>
</td>
<td>
${userView.email}
</th>
<th>
${userView.address}
</th>
</td>
<td>
${userView.phonenumber}
</td>
<td><input type="button" class="removeButton"
onclick="CourseUnitsForm.id.value='${userView.code}';set(this.form,'removeStudent');this.form.submit();">
</td>
</tr>
</logic:iterate>
</tbody>
</table>
</logic:greaterThan>
</logic:greaterThan>
/impl/src/web/admin/data.jsp
40,7 → 40,7
java.util.Collections.sort(lista,new java.util.Comparator<pt.estgp.estgweb.domain.RepositoryFileVersion>()
{
public int compare(RepositoryFileVersion o1, RepositoryFileVersion o2) {
return (int) (o1.getSaveDate().getTime() - o2.getSaveDate().getTime());
return (int) (o2.getId() - o1.getId());
}
});
for(pt.estgp.estgweb.domain.RepositoryFileVersion version: lista)
/impl/src/web/admin/announcements/submitMessage.jsp
24,6 → 24,7
%>
 
 
<p class="warning">Atenção caro utilizador. Para este serviço enviar mensagens com sucesso os seus endereços de correio que definidos no seu perfil têm de ser válidos</p>
<html:form action="/user/submitMessage" enctype="multipart/form-data" onsubmit="this.form.text.value=myEditor.saveHTML()">
 
<input type="hidden" name="dispatch" value="sendMessage" >
/impl/src/web/css/style.css
843,6 → 843,7
color: white;
background-color:#f5911e;
padding-left: 10px;
vertical-align: top;
}
 
/*********************************************************************************/
1877,3 → 1878,125
margin:5px;
}
 
div.seccaoPool
{
background-color: #f5f3f9;
border:1px solid gray;
}
table.processPoll th.starterPool
{
background-color: #f9f8e3;
}
 
 
.processActor, .processActor td, .processActor th
{
width: 100%;
border: 0;
}
.processDocument
{
background-color: lightblue;
padding: 4px;
border: 1px solid gray;
}
.process td
{
text-align: center;
}
 
table.processActivity
{
border:0;
}
td.processActivityTail
{
border: 0; text-align: right;
}
td.processActivityArrow
{
border: 0; text-align: left;
}
td.processActivityName
{
border-left:0;
border-right: 0;
border-bottom: 1px solid #77B61E;
border-top: 1px solid #77B61E;
background-color: #9DF35D
 
}
 
.processesTable .OPEN
{
background-color: green;
}
 
.processesTable .TRANSITION
{
background-color: yellow;
}
 
.processesTable .CLOSED
{
background-color: red;
}
 
.processesTable .wait1
{
background-color: white;
text-align: right;
}
.processesTable .wait2
{
background-color: yellow;
text-align: right;
}
.processesTable .wait3
{
background-color: red;
text-align: right;
}
 
.eventNOT_ACCEPTED td, p.eventNOT_ACCEPTED
{
background-color: yellow;
font-size: 12pt;
}
.eventACCEPTED td, p.eventACCEPTED
{
font-size: 12pt;
background-color: green;
color: white;
}
.eventFINNISH_TRANSITATED td
{
background-color: orange;
}
.eventFINNISH_CLOSED td
{
background-color: red;
}
 
 
 
input.TRANSITAR_BTN
{
background-color: #fff9bc;color: #000000;
}
input.TRANSITAR_BTN:hover
{
 
background-color: yellow;color: black;
}
 
input.TERMINAR_BTN
{
background-color: #ff9489;color: white;
}
input.TERMINAR_BTN:hover
{
background-color: red;color: white;
}
 
 
/impl/src/web/css/intranet.css
1,4 → 1,20
 
td.icons img
{
height: 20px;
border: 3px outset lightsteelblue;
padding: 1px;
}
td.icons img:hover
{
background-color: lightsteelblue;
}
td.icons
{
width: 60px;
white-space: nowrap;
 
}
#headerIntranet td.links
{
/impl/src/web/js/jquery/desc.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquery/style.css
New file
0,0 → 1,39
/* tables */
table.tablesorter {
font-family:arial;
background-color: #CDCDCD;
margin:10px 0pt 15px;
font-size: 8pt;
width: 100%;
text-align: left;
}
table.tablesorter thead tr th, table.tablesorter tfoot tr th {
background-color: #e6EEEE;
border: 1px solid #FFF;
font-size: 8pt;
padding: 4px;
}
table.tablesorter thead tr .header {
background-image: url(bg.gif);
background-repeat: no-repeat;
background-position: center right;
cursor: pointer;
}
table.tablesorter tbody td {
color: #3D3D3D;
padding: 4px;
background-color: #FFF;
vertical-align: top;
}
table.tablesorter tbody tr.odd td {
background-color:#F0F0F6;
}
table.tablesorter thead tr .headerSortUp {
background-image: url(asc.gif);
}
table.tablesorter thead tr .headerSortDown {
background-image: url(desc.gif);
}
table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
background-color: #8dbdd8;
}
/impl/src/web/js/jquery/asc.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquery/bg.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquery.tablesorter.js
New file
0,0 → 1,1031
/*
*
* TableSorter 2.0 - Client-side table sorting with ease!
* Version 2.0.5b
* @requires jQuery v1.2.3
*
* Copyright (c) 2007 Christian Bach
* Examples and docs at: http://tablesorter.com
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/
/**
*
* @description Create a sortable table with multi-column sorting capabilitys
*
* @example $('table').tablesorter();
* @desc Create a simple tablesorter interface.
*
* @example $('table').tablesorter({ sortList:[[0,0],[1,0]] });
* @desc Create a tablesorter interface and sort on the first and secound column column headers.
*
* @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } });
*
* @desc Create a tablesorter interface and disableing the first and second column headers.
*
*
* @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } });
*
* @desc Create a tablesorter interface and set a column parser for the first
* and second column.
*
*
* @param Object
* settings An object literal containing key/value pairs to provide
* optional settings.
*
*
* @option String cssHeader (optional) A string of the class name to be appended
* to sortable tr elements in the thead of the table. Default value:
* "header"
*
* @option String cssAsc (optional) A string of the class name to be appended to
* sortable tr elements in the thead on a ascending sort. Default value:
* "headerSortUp"
*
* @option String cssDesc (optional) A string of the class name to be appended
* to sortable tr elements in the thead on a descending sort. Default
* value: "headerSortDown"
*
* @option String sortInitialOrder (optional) A string of the inital sorting
* order can be asc or desc. Default value: "asc"
*
* @option String sortMultisortKey (optional) A string of the multi-column sort
* key. Default value: "shiftKey"
*
* @option String textExtraction (optional) A string of the text-extraction
* method to use. For complex html structures inside td cell set this
* option to "complex", on large tables the complex option can be slow.
* Default value: "simple"
*
* @option Object headers (optional) An array containing the forces sorting
* rules. This option let's you specify a default sorting rule. Default
* value: null
*
* @option Array sortList (optional) An array containing the forces sorting
* rules. This option let's you specify a default sorting rule. Default
* value: null
*
* @option Array sortForce (optional) An array containing forced sorting rules.
* This option let's you specify a default sorting rule, which is
* prepended to user-selected rules. Default value: null
*
* @option Boolean sortLocaleCompare (optional) Boolean flag indicating whatever
* to use String.localeCampare method or not. Default set to true.
*
*
* @option Array sortAppend (optional) An array containing forced sorting rules.
* This option let's you specify a default sorting rule, which is
* appended to user-selected rules. Default value: null
*
* @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter
* should apply fixed widths to the table columns. This is usefull when
* using the pager companion plugin. This options requires the dimension
* jquery plugin. Default value: false
*
* @option Boolean cancelSelection (optional) Boolean flag indicating if
* tablesorter should cancel selection of the table headers text.
* Default value: true
*
* @option Boolean debug (optional) Boolean flag indicating if tablesorter
* should display debuging information usefull for development.
*
* @type jQuery
*
* @name tablesorter
*
* @cat Plugins/Tablesorter
*
* @author Christian Bach/christian.bach@polyester.se
*/
 
(function ($) {
$.extend({
tablesorter: new
function () {
 
var parsers = [],
widgets = [];
 
this.defaults = {
cssHeader: "header",
cssAsc: "headerSortUp",
cssDesc: "headerSortDown",
cssChildRow: "expand-child",
sortInitialOrder: "asc",
sortMultiSortKey: "shiftKey",
sortForce: null,
sortAppend: null,
sortLocaleCompare: true,
textExtraction: "simple",
parsers: {}, widgets: [],
widgetZebra: {
css: ["even", "odd"]
}, headers: {}, widthFixed: false,
cancelSelection: true,
sortList: [],
headerList: [],
dateFormat: "us",
decimal: '/\.|\,/g',
onRenderHeader: null,
selectorHeaders: 'thead th',
debug: false
};
 
/* debuging utils */
 
function benchmark(s, d) {
log(s + "," + (new Date().getTime() - d.getTime()) + "ms");
}
 
this.benchmark = benchmark;
 
function log(s) {
if (typeof console != "undefined" && typeof console.debug != "undefined") {
console.log(s);
} else {
alert(s);
}
}
 
/* parsers utils */
 
function buildParserCache(table, $headers) {
 
if (table.config.debug) {
var parsersDebug = "";
}
 
if (table.tBodies.length == 0) return; // In the case of empty tables
var rows = table.tBodies[0].rows;
 
if (rows[0]) {
 
var list = [],
cells = rows[0].cells,
l = cells.length;
 
for (var i = 0; i < l; i++) {
 
var p = false;
 
if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) {
 
p = getParserById($($headers[i]).metadata().sorter);
 
} else if ((table.config.headers[i] && table.config.headers[i].sorter)) {
 
p = getParserById(table.config.headers[i].sorter);
}
if (!p) {
 
p = detectParserForColumn(table, rows, -1, i);
}
 
if (table.config.debug) {
parsersDebug += "column:" + i + " parser:" + p.id + "\n";
}
 
list.push(p);
}
}
 
if (table.config.debug) {
log(parsersDebug);
}
 
return list;
};
 
function detectParserForColumn(table, rows, rowIndex, cellIndex) {
var l = parsers.length,
node = false,
nodeValue = false,
keepLooking = true;
while (nodeValue == '' && keepLooking) {
rowIndex++;
if (rows[rowIndex]) {
node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex);
nodeValue = trimAndGetNodeText(table.config, node);
if (table.config.debug) {
log('Checking if value was empty on row:' + rowIndex);
}
} else {
keepLooking = false;
}
}
for (var i = 1; i < l; i++) {
if (parsers[i].is(nodeValue, table, node)) {
return parsers[i];
}
}
// 0 is always the generic parser (text)
return parsers[0];
}
 
function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) {
return rows[rowIndex].cells[cellIndex];
}
 
function trimAndGetNodeText(config, node) {
return $.trim(getElementText(config, node));
}
 
function getParserById(name) {
var l = parsers.length;
for (var i = 0; i < l; i++) {
if (parsers[i].id.toLowerCase() == name.toLowerCase()) {
return parsers[i];
}
}
return false;
}
 
/* utils */
 
function buildCache(table) {
 
if (table.config.debug) {
var cacheTime = new Date();
}
 
var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0,
totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0,
parsers = table.config.parsers,
cache = {
row: [],
normalized: []
};
 
for (var i = 0; i < totalRows; ++i) {
 
/** Add the table data to main data array */
var c = $(table.tBodies[0].rows[i]),
cols = [];
 
// if this is a child row, add it to the last row's children and
// continue to the next row
if (c.hasClass(table.config.cssChildRow)) {
cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c);
// go to the next for loop
continue;
}
 
cache.row.push(c);
 
for (var j = 0; j < totalCells; ++j) {
cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j]));
}
 
cols.push(cache.normalized.length); // add position for rowCache
cache.normalized.push(cols);
cols = null;
};
 
if (table.config.debug) {
benchmark("Building cache for " + totalRows + " rows:", cacheTime);
}
 
return cache;
};
 
function getElementText(config, node) {
 
var text = "";
 
if (!node) return "";
 
if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false;
 
if (config.textExtraction == "simple") {
if (config.supportsTextContent) {
text = node.textContent;
} else {
if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
text = node.childNodes[0].innerHTML;
} else {
text = node.innerHTML;
}
}
} else {
if (typeof(config.textExtraction) == "function") {
text = config.textExtraction(node);
} else {
text = $(node).text();
}
}
return text;
}
 
function appendToTable(table, cache) {
 
if (table.config.debug) {
var appendTime = new Date()
}
 
var c = cache,
r = c.row,
n = c.normalized,
totalRows = n.length,
checkCell = (n[0].length - 1),
tableBody = $(table.tBodies[0]),
rows = [];
 
 
for (var i = 0; i < totalRows; i++) {
var pos = n[i][checkCell];
 
rows.push(r[pos]);
 
if (!table.config.appender) {
 
//var o = ;
var l = r[pos].length;
for (var j = 0; j < l; j++) {
tableBody[0].appendChild(r[pos][j]);
}
 
//
}
}
 
 
 
if (table.config.appender) {
 
table.config.appender(table, rows);
}
 
rows = null;
 
if (table.config.debug) {
benchmark("Rebuilt table:", appendTime);
}
 
// apply table widgets
applyWidget(table);
 
// trigger sortend
setTimeout(function () {
$(table).trigger("sortEnd");
}, 0);
 
};
 
function buildHeaders(table) {
 
if (table.config.debug) {
var time = new Date();
}
 
var meta = ($.metadata) ? true : false;
var header_index = computeTableHeaderCellIndexes(table);
 
$tableHeaders = $(table.config.selectorHeaders, table).each(function (index) {
 
this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex];
// this.column = index;
this.order = formatSortingOrder(table.config.sortInitialOrder);
this.count = this.order;
 
if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true;
if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index);
 
if (!this.sortDisabled) {
var $th = $(this).addClass(table.config.cssHeader);
if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th);
}
 
// add cell to headerList
table.config.headerList[index] = this;
});
 
if (table.config.debug) {
benchmark("Built headers:", time);
log($tableHeaders);
}
 
return $tableHeaders;
 
};
 
// from:
// http://www.javascripttoolbox.com/lib/table/examples.php
// http://www.javascripttoolbox.com/temp/table_cellindex.html
 
 
function computeTableHeaderCellIndexes(t) {
var matrix = [];
var lookup = {};
var thead = t.getElementsByTagName('THEAD')[0];
var trs = thead.getElementsByTagName('TR');
 
for (var i = 0; i < trs.length; i++) {
var cells = trs[i].cells;
for (var j = 0; j < cells.length; j++) {
var c = cells[j];
 
var rowIndex = c.parentNode.rowIndex;
var cellId = rowIndex + "-" + c.cellIndex;
var rowSpan = c.rowSpan || 1;
var colSpan = c.colSpan || 1
var firstAvailCol;
if (typeof(matrix[rowIndex]) == "undefined") {
matrix[rowIndex] = [];
}
// Find first available column in the first row
for (var k = 0; k < matrix[rowIndex].length + 1; k++) {
if (typeof(matrix[rowIndex][k]) == "undefined") {
firstAvailCol = k;
break;
}
}
lookup[cellId] = firstAvailCol;
for (var k = rowIndex; k < rowIndex + rowSpan; k++) {
if (typeof(matrix[k]) == "undefined") {
matrix[k] = [];
}
var matrixrow = matrix[k];
for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) {
matrixrow[l] = "x";
}
}
}
}
return lookup;
}
 
function checkCellColSpan(table, rows, row) {
var arr = [],
r = table.tHead.rows,
c = r[row].cells;
 
for (var i = 0; i < c.length; i++) {
var cell = c[i];
 
if (cell.colSpan > 1) {
arr = arr.concat(checkCellColSpan(table, headerArr, row++));
} else {
if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) {
arr.push(cell);
}
// headerArr[row] = (i+row);
}
}
return arr;
};
 
function checkHeaderMetadata(cell) {
if (($.metadata) && ($(cell).metadata().sorter === false)) {
return true;
};
return false;
}
 
function checkHeaderOptions(table, i) {
if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) {
return true;
};
return false;
}
function checkHeaderOptionsSortingLocked(table, i) {
if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder;
return false;
}
function applyWidget(table) {
var c = table.config.widgets;
var l = c.length;
for (var i = 0; i < l; i++) {
 
getWidgetById(c[i]).format(table);
}
 
}
 
function getWidgetById(name) {
var l = widgets.length;
for (var i = 0; i < l; i++) {
if (widgets[i].id.toLowerCase() == name.toLowerCase()) {
return widgets[i];
}
}
};
 
function formatSortingOrder(v) {
if (typeof(v) != "Number") {
return (v.toLowerCase() == "desc") ? 1 : 0;
} else {
return (v == 1) ? 1 : 0;
}
}
 
function isValueInArray(v, a) {
var l = a.length;
for (var i = 0; i < l; i++) {
if (a[i][0] == v) {
return true;
}
}
return false;
}
 
function setHeadersCss(table, $headers, list, css) {
// remove all header information
$headers.removeClass(css[0]).removeClass(css[1]);
 
var h = [];
$headers.each(function (offset) {
if (!this.sortDisabled) {
h[this.column] = $(this);
}
});
 
var l = list.length;
for (var i = 0; i < l; i++) {
h[list[i][0]].addClass(css[list[i][1]]);
}
}
 
function fixColumnWidth(table, $headers) {
var c = table.config;
if (c.widthFixed) {
var colgroup = $('<colgroup>');
$("tr:first td", table.tBodies[0]).each(function () {
colgroup.append($('<col>').css('width', $(this).width()));
});
$(table).prepend(colgroup);
};
}
 
function updateHeaderSortCount(table, sortList) {
var c = table.config,
l = sortList.length;
for (var i = 0; i < l; i++) {
var s = sortList[i],
o = c.headerList[s[0]];
o.count = s[1];
o.count++;
}
}
 
/* sorting methods */
 
function multisort(table, sortList, cache) {
 
if (table.config.debug) {
var sortTime = new Date();
}
 
var dynamicExp = "var sortWrapper = function(a,b) {",
l = sortList.length;
 
// TODO: inline functions.
for (var i = 0; i < l; i++) {
 
var c = sortList[i][0];
var order = sortList[i][1];
// var s = (getCachedSortType(table.config.parsers,c) == "text") ?
// ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ?
// "sortNumeric" : "sortNumericDesc");
// var s = (table.config.parsers[c].type == "text") ? ((order == 0)
// ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ?
// makeSortNumeric(c) : makeSortNumericDesc(c));
var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c));
var e = "e" + i;
 
dynamicExp += "var " + e + " = " + s; // + "(a[" + c + "],b[" + c
// + "]); ";
dynamicExp += "if(" + e + ") { return " + e + "; } ";
dynamicExp += "else { ";
 
}
 
// if value is the same keep orignal order
var orgOrderCol = cache.normalized[0].length - 1;
dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];";
 
for (var i = 0; i < l; i++) {
dynamicExp += "}; ";
}
 
dynamicExp += "return 0; ";
dynamicExp += "}; ";
 
if (table.config.debug) {
benchmark("Evaling expression:" + dynamicExp, new Date());
}
 
eval(dynamicExp);
 
cache.normalized.sort(sortWrapper);
 
if (table.config.debug) {
benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime);
}
 
return cache;
};
 
function makeSortFunction(type, direction, index) {
var a = "a[" + index + "]",
b = "b[" + index + "]";
if (type == 'text' && direction == 'asc') {
return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));";
} else if (type == 'text' && direction == 'desc') {
return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));";
} else if (type == 'numeric' && direction == 'asc') {
return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));";
} else if (type == 'numeric' && direction == 'desc') {
return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));";
}
};
 
function makeSortText(i) {
return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));";
};
 
function makeSortTextDesc(i) {
return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));";
};
 
function makeSortNumeric(i) {
return "a[" + i + "]-b[" + i + "];";
};
 
function makeSortNumericDesc(i) {
return "b[" + i + "]-a[" + i + "];";
};
 
function sortText(a, b) {
if (table.config.sortLocaleCompare) return a.localeCompare(b);
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
};
 
function sortTextDesc(a, b) {
if (table.config.sortLocaleCompare) return b.localeCompare(a);
return ((b < a) ? -1 : ((b > a) ? 1 : 0));
};
 
function sortNumeric(a, b) {
return a - b;
};
 
function sortNumericDesc(a, b) {
return b - a;
};
 
function getCachedSortType(parsers, i) {
return parsers[i].type;
}; /* public methods */
this.construct = function (settings) {
return this.each(function () {
// if no thead or tbody quit.
if (!this.tHead || !this.tBodies) return;
// declare
var $this, $document, $headers, cache, config, shiftDown = 0,
sortOrder;
// new blank config object
this.config = {};
// merge and extend.
config = $.extend(this.config, $.tablesorter.defaults, settings);
// store common expression for speed
$this = $(this);
// save the settings where they read
$.data(this, "tablesorter", config);
// build headers
$headers = buildHeaders(this);
// try to auto detect column type, and store in tables config
this.config.parsers = buildParserCache(this, $headers);
// build the cache for the tbody cells
cache = buildCache(this);
// get the css class names, could be done else where.
var sortCSS = [config.cssDesc, config.cssAsc];
// fixate columns if the users supplies the fixedWidth option
fixColumnWidth(this);
// apply event handling to headers
// this is to big, perhaps break it out?
$headers.click(
 
function (e) {
var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;
if (!this.sortDisabled && totalRows > 0) {
// Only call sortStart if sorting is
// enabled.
$this.trigger("sortStart");
// store exp, for speed
var $cell = $(this);
// get current column index
var i = this.column;
// get current column sort order
this.order = this.count++ % 2;
// always sort on the locked order.
if(this.lockedOrder) this.order = this.lockedOrder;
// user only whants to sort on one
// column
if (!e[config.sortMultiSortKey]) {
// flush the sort list
config.sortList = [];
if (config.sortForce != null) {
var a = config.sortForce;
for (var j = 0; j < a.length; j++) {
if (a[j][0] != i) {
config.sortList.push(a[j]);
}
}
}
// add column to sort list
config.sortList.push([i, this.order]);
// multi column sorting
} else {
// the user has clicked on an all
// ready sortet column.
if (isValueInArray(i, config.sortList)) {
// revers the sorting direction
// for all tables.
for (var j = 0; j < config.sortList.length; j++) {
var s = config.sortList[j],
o = config.headerList[s[0]];
if (s[0] == i) {
o.count = s[1];
o.count++;
s[1] = o.count % 2;
}
}
} else {
// add column to sort list array
config.sortList.push([i, this.order]);
}
};
setTimeout(function () {
// set css for headers
setHeadersCss($this[0], $headers, config.sortList, sortCSS);
appendToTable(
$this[0], multisort(
$this[0], config.sortList, cache)
);
}, 1);
// stop normal event by returning false
return false;
}
// cancel selection
}).mousedown(function () {
if (config.cancelSelection) {
this.onselectstart = function () {
return false
};
return false;
}
});
// apply easy methods that trigger binded events
$this.bind("update", function () {
var me = this;
setTimeout(function () {
// rebuild parsers.
me.config.parsers = buildParserCache(
me, $headers);
// rebuild the cache map
cache = buildCache(me);
}, 1);
}).bind("updateCell", function (e, cell) {
var config = this.config;
// get position from the dom.
var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex];
// update cache
cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format(
getElementText(config, cell), cell);
}).bind("sorton", function (e, list) {
$(this).trigger("sortStart");
config.sortList = list;
// update and store the sortlist
var sortList = config.sortList;
// update header count index
updateHeaderSortCount(this, sortList);
// set css for headers
setHeadersCss(this, $headers, sortList, sortCSS);
// sort the table and append it to the dom
appendToTable(this, multisort(this, sortList, cache));
}).bind("appendCache", function () {
appendToTable(this, cache);
}).bind("applyWidgetId", function (e, id) {
getWidgetById(id).format(this);
}).bind("applyWidgets", function () {
// apply widgets
applyWidget(this);
});
if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {
config.sortList = $(this).metadata().sortlist;
}
// if user has supplied a sort list to constructor.
if (config.sortList.length > 0) {
$this.trigger("sorton", [config.sortList]);
}
// apply widgets
applyWidget(this);
});
};
this.addParser = function (parser) {
var l = parsers.length,
a = true;
for (var i = 0; i < l; i++) {
if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) {
a = false;
}
}
if (a) {
parsers.push(parser);
};
};
this.addWidget = function (widget) {
widgets.push(widget);
};
this.formatFloat = function (s) {
var i = parseFloat(s);
return (isNaN(i)) ? 0 : i;
};
this.formatInt = function (s) {
var i = parseInt(s);
return (isNaN(i)) ? 0 : i;
};
this.isDigit = function (s, config) {
// replace all an wanted chars and match.
return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, '')));
};
this.clearTableBody = function (table) {
if ($.browser.msie) {
function empty() {
while (this.firstChild)
this.removeChild(this.firstChild);
}
empty.apply(table.tBodies[0]);
} else {
table.tBodies[0].innerHTML = "";
}
};
}
});
 
// extend plugin scope
$.fn.extend({
tablesorter: $.tablesorter.construct
});
 
// make shortcut
var ts = $.tablesorter;
 
// add default parsers
ts.addParser({
id: "text",
is: function (s) {
return true;
}, format: function (s) {
return $.trim(s.toLocaleLowerCase());
}, type: "text"
});
 
ts.addParser({
id: "digit",
is: function (s, table) {
var c = table.config;
return $.tablesorter.isDigit(s, c);
}, format: function (s) {
return $.tablesorter.formatFloat(s);
}, type: "numeric"
});
 
ts.addParser({
id: "currency",
is: function (s) {
return /^[£$€?.]/.test(s);
}, format: function (s) {
return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), ""));
}, type: "numeric"
});
 
ts.addParser({
id: "ipAddress",
is: function (s) {
return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);
}, format: function (s) {
var a = s.split("."),
r = "",
l = a.length;
for (var i = 0; i < l; i++) {
var item = a[i];
if (item.length == 2) {
r += "0" + item;
} else {
r += item;
}
}
return $.tablesorter.formatFloat(r);
}, type: "numeric"
});
 
ts.addParser({
id: "url",
is: function (s) {
return /^(https?|ftp|file):\/\/$/.test(s);
}, format: function (s) {
return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), ''));
}, type: "text"
});
 
ts.addParser({
id: "isoDate",
is: function (s) {
return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);
}, format: function (s) {
return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(
new RegExp(/-/g), "/")).getTime() : "0");
}, type: "numeric"
});
 
ts.addParser({
id: "percent",
is: function (s) {
return /\%$/.test($.trim(s));
}, format: function (s) {
return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), ""));
}, type: "numeric"
});
 
ts.addParser({
id: "usLongDate",
is: function (s) {
return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
}, format: function (s) {
return $.tablesorter.formatFloat(new Date(s).getTime());
}, type: "numeric"
});
 
ts.addParser({
id: "shortDate",
is: function (s) {
return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
}, format: function (s, table) {
var c = table.config;
s = s.replace(/\-/g, "/");
if (c.dateFormat == "us") {
// reformat the string in ISO format
s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
} else if (c.dateFormat == "uk") {
// reformat the string in ISO format
s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
} else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {
s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");
}
return $.tablesorter.formatFloat(new Date(s).getTime());
}, type: "numeric"
});
ts.addParser({
id: "time",
is: function (s) {
return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
}, format: function (s) {
return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime());
}, type: "numeric"
});
ts.addParser({
id: "metadata",
is: function (s) {
return false;
}, format: function (s, table, cell) {
var c = table.config,
p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;
return $(cell).metadata()[p];
}, type: "numeric"
});
// add default widgets
ts.addWidget({
id: "zebra",
format: function (table) {
if (table.config.debug) {
var time = new Date();
}
var $tr, row = -1,
odd;
// loop through the visible rows
$("tr:visible", table.tBodies[0]).each(function (i) {
$tr = $(this);
// style children rows the same way the parent
// row was styled
if (!$tr.hasClass(table.config.cssChildRow)) row++;
odd = (row % 2 == 0);
$tr.removeClass(
table.config.widgetZebra.css[odd ? 0 : 1]).addClass(
table.config.widgetZebra.css[odd ? 1 : 0])
});
if (table.config.debug) {
$.tablesorter.benchmark("Applying Zebra widget", time);
}
}
});
})(jQuery);
/impl/src/web/js/__jquery.tablesorter.zip
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+ application/octet-stream
/impl/src/web/js/jquery-latest.js
New file
0,0 → 1,154
/*!
* jQuery JavaScript Library v1.4.2
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Sat Feb 13 22:33:48 2010 -0500
*/
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
/impl/src/web/layout/scripts.jsp
13,6 → 13,12
<script type="text/javascript" src="<%=request.getContextPath()%>/js/functions.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/ajax.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/compactedPopup.js"></script>
 
 
<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/js/jquery/style.css"/>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-latest.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.tablesorter.js"></script>
 
<%
String link = (String) request.getAttribute(TopImageFilter.TOP_CSS);
if (link != null)
26,5 → 32,12
<script type="text/javascript" language="JavaScript">
var cal = new CalendarPopup();
 
//TABLE SORTER
$(document).ready(function()
{
$("#myTable").tablesorter();
 
}
);
 
</script>
/impl/src/web/layout/layoutWelcome.jsp
130,13 → 130,13
<th class="underline"><bean:message key="announcements"/></th>
</tr>
<tr>
<td>
<td style="vertical-align: top">
<!-- Destaques -->
<tiles:insert attribute="topnav"/>
<tiles:insert attribute="body" />
</td>
<td >&nbsp;&nbsp;&nbsp;</td>
<td>
<td style="vertical-align: top" >&nbsp;&nbsp;&nbsp;</td>
<td style="vertical-align: top">
<!-- Ultimas noticias -->
<tiles:insert attribute="navigationRight"/>
</td>
/impl/src/web/public/profile/profileHome.jsp
130,6 → 130,30
<%
}
%>
 
<%
if (ProfileForm.getUserView().getUser() instanceof Teacher)
{
%>
<tr>
<th>
<bean:message key="courseunit.responsable"/>
</th>
<td>
<logic:present name="ProfileForm" property="userView.responsableCourseUnits">
<ul>
<logic:iterate id="courseUnit" name="ProfileForm" property="userView.responsableCourseUnits">
<li>
(<bean:write name="courseUnit" property="importYear"/>) <html:link action="${user}/startLoadCourseUnit${fromAction}?courseUnitView.id=${courseUnit.id}"><bean:write name="courseUnit" property="name"/> (<bean:write name="courseUnit" property="code"/>)</html:link>
</li>
</logic:iterate>
</ul>
</logic:present>
</td>
</tr>
<%
}
%>
</table>
<%
if(ProfileForm.getUserView().getCreatorRecords() != null && ProfileForm.getUserView().getCreatorRecords().size() > 0)
/impl/src/web/public/courses/courseMenu.jsp
24,6 → 24,7
<li><html:link action="/startLoadMenuCourse?type=${CourseView.degree}&courseView.id=${CourseView.id}&content=casos"><bean:message key="course.menu.casos"/></html:link></li>
<li><html:link action="/startLoadMenuCourse?type=${CourseView.degree}&courseView.id=${CourseView.id}&content=parceiros"><bean:message key="course.menu.parceiros"/></html:link></li>
<li><html:link action="/startLoadMenuCourse?type=${CourseView.degree}&courseView.id=${CourseView.id}&content=faq"><bean:message key="course.menu.faq"/></html:link></li>
<li><html:link action="/startLoadMenuCourse?type=${CourseView.degree}&courseView.id=${CourseView.id}&content=publicacoes"><bean:message key="course.menu.publicacoes"/></html:link></li>
</ul>
</div>
</div>
/impl/src/web/user/courses/directedCoordinatedCourses.jsp
167,33 → 167,89
<logic:notEqual value="S2" name="CourseForm" property="semestre">
<li><h3><bean:message key="courseunit.semestre"/> 1</h3>
<ul>
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 1 - SEM PROGRAMA -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<logic:notEmpty name="courseView" property="courseUnitsWithNoProgramS1">
<li><h3 class="statusERROR"><bean:message key="course.units.no.program"/></h3>
<table class="dataTable">
 
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
$(document).ready(function()
{
$("#myTableS1NP${courseView.id}").tablesorter();
 
}
);
</script>
<table id="myTableS1NP${courseView.id}" class="dataTable tablesorter">
<thead>
<tr>
<th>Código</th>
<th>Unidade</th>
<th>Docente</th>
<td></td>
</tr>
</thead>
<tbody>
<nested:iterate id="courseUnitView" property="courseUnitsWithNoProgramS1" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<tr>
<td> <a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}">${courseUnitView.code}</td>
<td>${courseUnitView.code}</td>
<td>${courseUnitView.name}</td>
<td>${courseUnitView.teachersSnipet}</td>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
 
<td class="icons">
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/home.png"/></a>
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}"><img src="<%=request.getContextPath()%>/imgs/mime/pdf.gif"/></a>
 
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</logic:equal>
<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<baco:isTeacherOfCourseUnit courseUnitId="${courseUnitView.id}">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isTeacherOfCourseUnit>
</logic:notEqual>
</logic:equal>
</logic:equal>
</baco:isNotAdmin>
<baco:isAdmin>
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</baco:isAdmin>
</baco:isNotAdmin>
<baco:isAdmin>
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isAdmin>
</td>
</tr>
</nested:iterate>
</tbody>
</table>
</li>
</logic:notEmpty>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 1 - COM PROGRAMA INVALIDO -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++ -->
<logic:notEmpty name="courseView" property="courseUnitsWithProgramNotCheckedS1">
<%--<html:hidden property="courseUnitsWithProgramNotCheckedS1size"/>--%>
<li><h3 class="statusWARNING"><bean:message key="course.units.with.program.not.checked"/></h3>
<table class="dataTable">
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
$(document).ready(function()
{
$("#myTableS1PI${courseView.id}").tablesorter();
 
}
);
</script>
<table id="myTableS1PI${courseView.id}" class="dataTable tablesorter">
<thead>
<tr>
<td></td>
<th>Código</th>
<th>Unidade</th>
<th>Docente</th>
<td></td>
</tr>
</thead>
<tbody>
<nested:iterate id="courseUnitView" property="courseUnitsWithProgramNotCheckedS1" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<tr>
 
221,41 → 277,61
<nested:hidden property="id"/>
<nested:checkbox property="validProgram"/></td>
</baco:hasRole>
<td> <a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}">${courseUnitView.code}</td>
<td>
<baco:hasRole role="teacher">
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}">${courseUnitView.name}</a>
</baco:hasRole>
 
<baco:hasNotRole role="teacher">
<logic:equal value="true" name="courseUnitView" property="validProgram">
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}">${courseUnitView.name}</a>
</logic:equal>
<td>${courseUnitView.code}</td>
<td>${courseUnitView.name}</td>
<td>${courseUnitView.teachersSnipet}</td>
<td class="icons">
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/home.png"/></a>
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}"><img src="<%=request.getContextPath()%>/imgs/mime/pdf.gif"/></a>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
${courseUnitView.name}
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</logic:equal>
<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<baco:isTeacherOfCourseUnit courseUnitId="${courseUnitView.id}">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isTeacherOfCourseUnit>
</logic:notEqual>
</logic:equal>
</baco:hasNotRole>
</baco:isNotAdmin>
<baco:isAdmin>
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isAdmin>
</td>
<td>${courseUnitView.teachersSnipet}</td>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</logic:equal>
</logic:equal>
</baco:isNotAdmin>
<baco:isAdmin>
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</baco:isAdmin>
</tr>
</nested:iterate>
</table>
</tbody>
</table>
</li>
</logic:notEmpty>
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 1 - COM PROGRAMA VALIDO -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
 
<logic:notEmpty name="courseView" property="courseUnitsWithProgramCheckedS1">
<%--<html:hidden property="courseUnitsWithProgramCheckedS1size"/>--%>
<li><h3 class="statusOK"><bean:message key="course.units.with.program.checked"/></h3>
<table class="dataTable">
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
$(document).ready(function()
{
$("#myTableS1PV${courseView.id}").tablesorter();
 
}
);
</script>
<table id="myTableS1PV${courseView.id}" class="dataTable tablesorter">
<thead>
<tr>
<td></td>
<th>Código</th>
<th>Unidade</th>
<th>Docente</th>
<td></td>
</tr>
</thead>
<tbody>
<nested:iterate id="courseUnitView" property="courseUnitsWithProgramCheckedS1" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<tr>
<%--<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">--%>
270,9 → 346,7
<%--<nested:checkbox property="validProgram"/></td>--%>
<%--</logic:equal>--%>
<%--NOVO ROLE VALIDACAOO--%>
<baco:hasNotRole role="${courseView.validationRole}" >
<td></td>
</baco:hasNotRole>
 
<baco:hasNotRole role="${courseView.validationRole},courseValidatePrograms" >
<td></td>
</baco:hasNotRole>
284,60 → 358,128
<nested:hidden property="id"/>
<nested:checkbox property="validProgram"/></td>
</baco:hasRole>
<td> <a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}">${courseUnitView.code}</td>
<td><a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}">${courseUnitView.name}</a></td>
<td>${courseUnitView.code}</td>
<td>${courseUnitView.name}</td>
<td>${courseUnitView.teachersSnipet}</td>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
<td class="icons">
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/home.png"/></a>
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}"><img src="<%=request.getContextPath()%>/imgs/mime/pdf.gif"/></a>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</logic:equal>
<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<baco:isTeacherOfCourseUnit courseUnitId="${courseUnitView.id}">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isTeacherOfCourseUnit>
</logic:notEqual>
</logic:equal>
</logic:equal>
</baco:isNotAdmin>
<baco:isAdmin>
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</baco:isAdmin>
 
</baco:isNotAdmin>
<baco:isAdmin>
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isAdmin>
</td>
</tr>
</nested:iterate>
</table>
</tbody>
</table>
</li>
</logic:notEmpty>
</ul>
</li>
</logic:notEqual>
<li><input type="submit" value="<bean:message key="confirm"/>"></li>
 
 
<!-- +++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 2-->
<!-- +++++++++++++++++++++ -->
 
<logic:notEqual value="S1" name="CourseForm" property="semestre">
<li><h3><bean:message key="courseunit.semestre"/> 2</h3>
<ul>
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 2 - SEM PROGRAMA -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<logic:notEmpty name="courseView" property="courseUnitsWithNoProgramS2">
 
<li><h3 class="statusERROR"><bean:message key="course.units.no.program"/></h3>
<table class="dataTable">
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
$(document).ready(function()
{
$("#myTableS2NP${courseView.id}").tablesorter();
 
}
);
</script>
<table id="myTableS2NP${courseView.id}" class="dataTable tablesorter">
<thead>
<tr>
<th>Código</th>
<th>Unidade</th>
<th>Docente</th>
<td></td>
</tr>
</thead>
<tbody>
<nested:iterate id="courseUnitView" property="courseUnitsWithNoProgramS2" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<tr>
<td> <a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}">${courseUnitView.code}</td>
<td>${courseUnitView.code}</td>
<td>${courseUnitView.name}</td>
<td>${courseUnitView.teachersSnipet}</td>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
<td class="icons">
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/home.png"/></a>
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}"><img src="<%=request.getContextPath()%>/imgs/mime/pdf.gif"/></a>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</logic:equal>
<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<baco:isTeacherOfCourseUnit courseUnitId="${courseUnitView.id}">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isTeacherOfCourseUnit>
</logic:notEqual>
</logic:equal>
</logic:equal>
</baco:isNotAdmin>
<baco:isAdmin>
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</baco:isAdmin>
</baco:isNotAdmin>
<baco:isAdmin>
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isAdmin>
</td>
</tr>
</nested:iterate>
</tbody>
</table>
</li>
</logic:notEmpty>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 2 - COM PROGRAMA INVALIDO -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++ -->
<logic:notEmpty name="courseView" property="courseUnitsWithProgramNotCheckedS2">
<%--<html:hidden property="courseUnitsWithProgramNotCheckedS2size"/>--%>
<li><h3 class="statusWARNING"><bean:message key="course.units.with.program.not.checked"/></h3>
<table class="dataTable">
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
$(document).ready(function()
{
$("#myTableS2PI${courseView.id}").tablesorter();
 
}
);
</script>
<table id="myTableS2PI${courseView.id}" class="dataTable tablesorter">
<thead>
<tr>
<td></td>
<th>Código</th>
<th>Unidade</th>
<th>Docente</th>
<td></td>
</tr>
</thead>
<tbody>
<nested:iterate id="courseUnitView" property="courseUnitsWithProgramNotCheckedS2" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<tr>
<%--<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">--%>
357,41 → 499,61
<nested:hidden property="id"/>
<nested:checkbox property="validProgram"/></td>
</baco:hasRole>
<td><a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}">${courseUnitView.code}</a></td>
<td>
<baco:hasRole role="teacher">
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}">${courseUnitView.name}</a>
</baco:hasRole>
<td>${courseUnitView.code}</td>
<td>${courseUnitView.name}</td>
<td>${courseUnitView.teachersSnipet}</td>
 
<baco:hasNotRole role="teacher">
<logic:equal value="true" name="courseUnitView" property="validProgram">
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}">${courseUnitView.name}</a>
</logic:equal>
<td class="icons">
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/home.png"/></a>
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}"><img src="<%=request.getContextPath()%>/imgs/mime/pdf.gif"/></a>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
${courseUnitView.name}
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</logic:equal>
<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<baco:isTeacherOfCourseUnit courseUnitId="${courseUnitView.id}">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isTeacherOfCourseUnit>
</logic:notEqual>
</logic:equal>
</baco:hasNotRole>
</baco:isNotAdmin>
<baco:isAdmin>
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isAdmin>
</td>
<td>${courseUnitView.teachersSnipet}</td>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</logic:equal>
</logic:equal>
</baco:isNotAdmin>
<baco:isAdmin>
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</baco:isAdmin>
</tr>
</nested:iterate>
</tbody>
</table>
</li>
</logic:notEmpty>
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- CADEIRAS DO SEMESTRE 2 - COM PROGRAMA VALIDO -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++ -->
<logic:notEmpty name="courseView" property="courseUnitsWithProgramCheckedS2">
<%--<html:hidden property="courseUnitsWithProgramCheckedS2size"/>--%>
<li><h3 class="statusOK"><bean:message key="course.units.with.program.checked"/></h3>
<table class="dataTable">
<script type="text/javascript" language="JavaScript">
//TABLE SORTER
$(document).ready(function()
{
$("#myTableS2PV${courseView.id}").tablesorter();
 
}
);
</script>
<table id="myTableS2PV${courseView.id}" class="dataTable tablesorter">
<thead>
<tr>
<td></td>
<th>Código</th>
<th>Unidade</th>
<th>Docente</th>
<td></td>
</tr>
</thead>
<tbody>
<nested:iterate id="courseUnitView" property="courseUnitsWithProgramCheckedS2" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<tr>
<%--<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">--%>
411,21 → 573,31
<nested:hidden property="id"/>
<nested:checkbox property="validProgram"/></td>
</baco:hasRole>
<td><a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}">${courseUnitView.code}</a></td>
<td><a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}">${courseUnitView.name}</a></td>
<td>${courseUnitView.code}</td>
<td>${courseUnitView.name}</td>
<td>${courseUnitView.teachersSnipet}</td>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
<td class="icons">
<a href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?id=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/home.png"/></a>
<a href="<%=request.getContextPath()%>/repositoryStream/${courseUnitView.programStreamId}"><img src="<%=request.getContextPath()%>/imgs/mime/pdf.gif"/></a>
<baco:isNotAdmin>
<logic:equal value="false" name="courseUnitView" property="validProgram">
<logic:equal value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</logic:equal>
<logic:notEqual value="${courseView.coordinator.id}" name="UserSession" property="user.id">
<baco:isTeacherOfCourseUnit courseUnitId="${courseUnitView.id}">
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isTeacherOfCourseUnit>
</logic:notEqual>
</logic:equal>
</logic:equal>
</baco:isNotAdmin>
<baco:isAdmin>
<td>(<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><bean:message key="courseunit.edit.program"/></html:link>)</td>
</baco:isAdmin>
</baco:isNotAdmin>
<baco:isAdmin>
<html:link action="/startLoadCourseUnitProgram?courseUnitId=${courseUnitView.id}"><img src="<%=request.getContextPath()%>/imgs/edit.png"/></html:link>
</baco:isAdmin>
</td>
</tr>
</nested:iterate>
</tbody>
</table>
</li>
</logic:notEmpty>
/impl/src/web/user/courseunits/courseunitProgram.jsp
1,3 → 1,11
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager" %>
<%@ page import="pt.estgp.estgweb.domain.views.CourseUnitView" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
<%@ page import="com.sun.swing.internal.plaf.synth.resources.synth_sv" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="pt.estgp.estgweb.domain.Teacher" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
14,54 → 22,206
<div id="contentPane">
<html:errors/>
<jomm:messages/>
 
<%
IServiceManager sm = ServiceManager.getInstance();
 
List<pt.estgp.estgweb.domain.views.CourseUnitView> otherYearUnits;
otherYearUnits = new ArrayList<pt.estgp.estgweb.domain.views.CourseUnitView>();
try{
String[] names = new String[]{};
Object[] args = new Object[]{new Long(CourseUnitView.getId())};
otherYearUnits =
(List<pt.estgp.estgweb.domain.views.CourseUnitView>)
sm.execute(RequestUtils.getRequester(request, response), "LoadUnitOtherYearsWithProgram", args, names);
request.setAttribute("OtherYearUnits", otherYearUnits);
 
 
names = new String[]{};
args = new Object[]{};
List<Teacher> teachers = (List<Teacher>)
sm.execute(RequestUtils.getRequester(request, response), "LoadTeachers", args, names);
request.setAttribute("teachers", teachers);
}catch(Exception e)
{
System.err.print(e.toString());
e.printStackTrace();
}
 
 
 
 
%>
<div class="seccao">
<h2>
<bean:message key="courseunit.program"/>
</h2>
 
<%
boolean editCoordinatorPart = false;
boolean editTeacherPart = false;
pt.estgp.estgweb.domain.User u = UserSession.getUser();
if(u.isSuperuserOrAdmin())
{
editCoordinatorPart = true;
editTeacherPart = true;
}
else
{
if(u instanceof pt.estgp.estgweb.domain.Teacher)
{
pt.estgp.estgweb.domain.Teacher t = (pt.estgp.estgweb.domain.Teacher) u;
if(t.isTeacherOfCourseUnit(CourseUnitView.getId()))
{
editTeacherPart = true;
}
if(CourseUnitView.getCourseView().getCoordinator() != null && (t.getId() == CourseUnitView.getCourseView().getCoordinator().getId() || t.hasRole(CourseUnitView.getCourseView().getValidationRole())))
{
editCoordinatorPart = true;
}
 
}
}
%>
 
 
<html:form action="/courseUnitProgramController">
<input type="hidden" name="dispatch" value="saveProgram">
<html:hidden property="courseUnitId"/>
<html:hidden property="id"/>
<html:hidden property="courseUnitView.id"/>
 
 
<%
 
if(editCoordinatorPart)
{
%>
<div>
Importar programa a partir de outro ano
<select name="cloneFromUnitId">
<logic:iterate id="other" name="OtherYearUnits" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<option value="<%=other.getId()%>"><%=other.getImportYear()%> - <%=other.getSemestre()%></option>
</logic:iterate>
</select>
<input type="button" value="Clonar a partir deste programa" onclick="if(confirm('<bean:message key="courseunit.confirmaclonagem"/>')){set(form,'cloneProgram');form.submit()}"/>
</div>
 
 
 
 
 
 
 
 
 
 
<%
}
%>
<table>
<tr>
<td colspan="<%=otherYearUnits.size()%>"><bean:message key="courseunit.consultaroutros"/> </td>
</tr>
<tr>
<logic:iterate id="other" name="OtherYearUnits" type="pt.estgp.estgweb.domain.views.CourseUnitView">
<td>
<a href="<%=request.getContextPath()%>/repositoryStream/<%=other.getProgramStreamId()%>" target="_blank"> <%=other.getImportYear()%> - <%=other.getSemestre()%></a>
</td>
</logic:iterate>
 
</tr>
</table>
 
<table class="dataTable tableDisabled" width="100%">
 
<%--COORDENADOR--%>
<tr>
<th colspan="2">Dados alterados pelo Coordenador de curso</th>
</tr>
<%
 
<%
boolean editCoordinatorPart = false;
boolean editTeacherPart = false;
pt.estgp.estgweb.domain.User u = UserSession.getUser();
if(u.isSuperuserOrAdmin())
if(editCoordinatorPart)
{
editCoordinatorPart = true;
editTeacherPart = true;
}
else
{
if(u instanceof pt.estgp.estgweb.domain.Teacher)
{
pt.estgp.estgweb.domain.Teacher t = (pt.estgp.estgweb.domain.Teacher) u;
if(t.isTeacherOfCourseUnit(CourseUnitView.getId()))
{
editTeacherPart = true;
}
if(CourseUnitView.getCourseView().getCoordinator() != null && (t.getId() == CourseUnitView.getCourseView().getCoordinator().getId() || t.hasRole(CourseUnitView.getCourseView().getValidationRole())))
{
editCoordinatorPart = true;
}
%>
 
}
}
<%// DADOS DE UNIDADE //%>
 
if(editCoordinatorPart)
{
%>
<tr>
<th>
<bean:message key="courseunit.responsable"/>
</th>
<td>
<html:select property="courseUnitView.responsableId">
<html:option value="0"></html:option>
<logic:iterate id="teacher" name="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<html:option value="${teacher.id}">${teacher.name} (${teacher.code})</html:option>
</logic:iterate>
</html:select>
</td>
</tr>
<baco:isAdmin>
<tr>
<th>
<bean:message key="courseunit.teachers"/>
</th>
<td>
<logic:lessEqual value="0" name="CourseUnitView" property="id">
<i><bean:message key="courseunit.to.add.teachers.save.first"/></i>
</logic:lessEqual>
 
 
<html:select property="teacherId">
<logic:present name="CourseUnitProgramForm" property="teachers">
<logic:iterate id="teacher" name="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<jomm:option itemName="teacher" itemProperty="id" comparableObjectName="CourseUnitProgramForm"
comparableObjectProperty="teacherId">
${teacher.name} (${teacher.code})
</jomm:option>
</logic:iterate>
<input type="button" value="<bean:message key="add"/>"
onclick="set(this.form,'addTeacher');this.form.submit();">
</logic:present>
</html:select>
<logic:greaterThan name="CourseUnitView" property="teachersSize" value="0">
<table class="dataTable removeButton">
<logic:iterate id="userView" name="CourseUnitView" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<th>
${userView.code}
</th>
<th>
${userView.name}
</th>
<td><input type="button" class="removeButton"
onclick="CourseUnitProgramForm.id.value='${userView.id}';set(this.form,'removeTeacher');this.form.submit();">
</td>
</tr>
</logic:iterate>
</table>
</logic:greaterThan>
</td>
</tr>
</baco:isAdmin>
<baco:isNotAdmin>
<logic:iterate id="prof" name="CourseUnitView" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<th>
<bean:message key="courseunit.teachers"/>
</th>
<td>
${prof.name} (${prof.code})
</td>
</tr>
</logic:iterate>
</baco:isNotAdmin>
<%//TODO adicionar workflow e inicializações para a função addTeacher%>
 
 
 
 
 
 
<tr>
<td align="right"><bean:message key="courseunit.program.objectivos"/></td>
<td width="80%"><html:textarea property="courseUnitProgramView.courseUnitProgram.courseUnitProgramPart2.objectivos" style="width:100%;height:200px" /></td>
</tr>
128,6 → 288,24
{
%>
<tr>
<th>
<bean:message key="courseunit.responsable"/>
</th>
<td>
${CourseUnitView.responsableTeacher.name} (${CourseUnitView.responsableTeacher.code})
</td>
</tr>
<logic:iterate id="prof" name="CourseUnitView" property="teachers" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<th>
<bean:message key="courseunit.teachers"/>
</th>
<td>
${prof.name} (${prof.code})
</td>
</tr>
</logic:iterate>
<tr>
<td align="right"><bean:message key="courseunit.program.objectivos"/></td>
<td width="80%"><html:textarea disabled="true" property="courseUnitProgramView.courseUnitProgram.courseUnitProgramPart2.objectivos" style="width:100%;height:200px" /></td>
</tr>
315,7 → 493,7
<%--DOCENTE--%>
 
</baco:canManage>
<tr><td colspan="2"><html:submit><bean:message key="confirm"/></html:submit></td></tr>
<tr><td colspan="2"><input type="button" value="<bean:message key="confirm"/>" onclick="set(form,'saveProgram');form.submit()"/></td></tr>
 
</table>
 
/impl/src/web/user/courseunits/courseunit.jsp
144,9 → 144,9
</logic:present>
 
<logic:present name="CourseUnitView" property="programStreamId">
<baco:isAdmin>
<a href="<%=request.getContextPath()%>/admin/data.jsp?id=${CourseUnitView.programStreamId}"">Ver todas as versoes do programa</a>
</baco:isAdmin>
<baco:hasRole role="teacher,admin,all">
<a href="<%=request.getContextPath()%>/admin/data.jsp?id=${CourseUnitView.programStreamId}">Ver todas as versoes do programa</a>
</baco:hasRole>
</logic:present>
 
</p>
/impl/src/web/user/courseunits/students.jsp
33,13 → 33,26
<div id="contentIntranet">
<div id="contentPane">
<p><bean:message key="courseunit.students.count"/>: ${CourseUnitView.studentsSize}</p>
<table class="dataTable">
<table id="myTable" class="tablesorter dataTable">
<thead>
<tr>
<th><html:link action="${user}/startLoadCourseUnitStudents${fromAction}?courseUnitView.id=${CourseUnitView.id}&order=byNumber"><bean:message key="number"/></html:link></th>
<%/*<th><html:link action="${user}/startLoadCourseUnitStudents${fromAction}?courseUnitView.id=${CourseUnitView.id}&order=byNumber"><bean:message key="number"/></html:link></th>
<th><html:link action="${user}/startLoadCourseUnitStudents${fromAction}?courseUnitView.id=${CourseUnitView.id}&order=byName"><bean:message key="name"/></html:link></th>
*/%>
<th><bean:message key="number"/></th>
<th><bean:message key="name"/></th>
<th><bean:message key="user"/></th>
<th><bean:message key="email"/></th>
 
<baco:hasRole role="teacher">
<th><bean:message key="phone.number"/></th>
</baco:hasRole>
 
</tr>
</thead>
<tbody>
<logic:iterate id="student" name="students" type="pt.estgp.estgweb.domain.views.UserView">
<tr>
<td>
54,8 → 67,12
<td>
${student.safeEmail}
</td>
<baco:hasRole role="teacher">
<td>${student.phonenumber} </td>
</baco:hasRole>
</tr>
</logic:iterate>
</tbody>
</table>
</div>
</div>
/impl/src/web/user/processes/topnavOpenProcess.jsp
New file
0,0 → 1,13
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
 
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace("/user/listProcesses.do?target=watingForMe", "processes.list.processes");
topNav.addNavPlace(null, "processes.opening.process");
%>
 
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/processes/createMetaProcess.jsp
New file
0,0 → 1,16
<%--
Created by IntelliJ IDEA.
User: jorgemachado
Date: 13/01/14
Time: 09:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
 
</body>
</html>
/impl/src/web/user/processes/listMetaProcesses.jsp
New file
0,0 → 1,33
<%@ page import="jomm.dao.utils.HibernateUtils" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.web.UserSessionProxy" %>
<%@ page import="pt.estgp.estgweb.domain.UserSession" %>
<%@ page import="pt.estgp.estgweb.domain.MetaProcessImpl" %>
<%@ page import="java.util.List" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Listagem de MetaProcessos</title>
</head>
<body>
<%
HibernateUtils.getCurrentSession().beginTransaction();
List<MetaProcessImpl> metaProcesses = DaoFactory.getMetaProcessDaoImpl().findRoleMetaProcesses(UserSession.getUser().getRolesList());
HibernateUtils.getCurrentSession().getTransaction().commit();
request.setAttribute("metaProcesses",metaProcesses);
%>
<ul>
<logic:iterate id="meta" name="metaProcesses" type="pt.estgp.estgweb.domain.MetaProcessImpl">
<li><a href="<%=request.getContextPath()%>/user/startNewProcess.do?metaProcessId=${meta.id}">${meta.name}</a> - ${meta.description}</li>
</logic:iterate>
</ul>
 
 
</body>
</html>
/impl/src/web/user/processes/topnavListProcesses.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/startHome.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "processes.list.processes");
%>
 
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/processes/openProcess.jsp
New file
0,0 → 1,496
<%@ taglib prefix="logic" uri="http://jakarta.apache.org/struts/tags-logic" %>
<%@ taglib prefix="bean" uri="http://jakarta.apache.org/struts/tags-bean" %>
<%@ taglib prefix="html" uri="http://jakarta.apache.org/struts/tags-html" %>
<%@ page import="jomm.dao.utils.HibernateUtils" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.domain.*" %>
<%@ page import="java.util.*" %>
<%@ page import="pt.estgp.estgweb.utils.RoleManager" %>
<%@ page import="pt.estgp.estgweb.Globals" %>
<%@ page import="pt.estgp.estgweb.web.form.processes.ProcessEventForm" %>
<%@ page import="com.sun.org.apache.xalan.internal.xslt.Process" %>
<%@ page import="pt.estgp.estgweb.utils.StringsUtils" %>
<%@ page import="jomm.utils.FilesUtils" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<%--
Created by IntelliJ IDEA.
User: jorgemachado
Date: 13/01/14
Time: 09:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
long processId;
if(request.getAttribute("processId")!=null)
processId = (Long) request.getAttribute("processId");
else
processId = Long.parseLong(request.getParameter("id"));
HibernateUtils.getCurrentSession().beginTransaction();
 
ProcessImpl process = (ProcessImpl) DaoFactory.getProcessDaoImpl().get(processId);
if(process.getLastEvent().getDestinationRole() != null && UserSession.getUser().hasRole(process.getLastEvent().getDestinationRole()))
{
//ok
}
else if(!process.isInProcess(UserSession.getUser()) && !UserSession.getUser().isSuperuser() && !UserSession.getUser().hasRole(Globals.ROLE_PROCESSES_ADMIN))
{
response.sendError(401);
%>
<jsp:include page="/errors/401.jsp"/>
<%
return;
}
 
 
request.setAttribute("process",process);
 
if(!process.getLastEvent().isAccepted() &&
request.getParameter("acceptProcess") != null &&
request.getParameter("acceptProcess").equals("true") &&
((ProcessEventImpl)process.getLastEvent()).isTarget(UserSession.getUser()))
{
process.getLastEvent().setAcceptedDate(new Date());
process.getLastEvent().setNowState(ProcessEventImpl.ProcessEventState.ACCEPTED.name());
process.setLastChangeDate(new Date());
process.setNowState(ProcessImpl.ProcessState.TRANSITION.name());
process.getLastEvent().setLastChangeDate(new Date());
process.getLastEvent().setAccepted(true);
process.getLastEvent().setOwner(UserSession.getUser());
}
%>
<h1>${process.metaProcess.name} de (${process.owner.name})</h1>
 
<table class="dataTable processesTable">
<tr>
<th>Colocado a</th>
<th>Colocado à (dias)</th>
<th>Requisitante</th>
<th>Ultima modificação</th>
<th>Estado</th>
<th>Transições</th>
<th>Data de fecho</th>
 
</tr>
<tr>
<td>${process.openDate}</td>
 
<%
String level = "wait1";
long milis = System.currentTimeMillis() - process.getOpenDate().getTime();
int days = (int) (milis / 1000 / 3600 / 24);
if(days > 1 && days < 3)
{
level = "wait2";
}
else if(days >= 3 && days < 6)
{
level = "wait3";
}
%>
<td class="<%=level%>">
<%=days%>
</td>
<td>${process.owner.name}</td>
<td>${process.lastChangeDate}</td>
<td class="${process.nowState}"><bean:message key="process.state.${process.nowState}"/></td>
<td align="right"><%=process.getEvents().size()%></td>
<td>${process.closeDate}</td>
</tr>
</table>
<%
if(process.getNowState().equals(ProcessImpl.ProcessState.CLOSED.name()) &&
process.canReopen(UserSession.getUser()))
{
%>
<p class="eventNOT_ACCEPTED">Este processo poderá ser reaberto por si se assim o desejar</p>
<form action="<%=request.getContextPath()%>/user/processEventController.do" method="post">
<input type="hidden" name="id" value="<%=processId%>"/>
<input type="hidden" name="dispatch" value="reopenProcessEventPerson"/>
<table border="0">
<tr>
<td>
<table class="processActivity" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="processActivityTail"><img src="<%=request.getContextPath()%>/imgs/process/leftProcess.gif"/></td>
<td class="processActivityName">
<input type="submit" value="Reabrir Processo com transição para mim"/>
</td>
<td class="processActivityArrow"><img src="<%=request.getContextPath()%>/imgs/process/rightProcess.gif"/></td>
</tr>
</table>
</td>
<td>
<img src="<%=request.getContextPath()%>/imgs/process/actor.gif"/> ${UserSession.user.name}
</td>
</tr>
</table>
 
</form>
<%
}
if(!process.getLastEvent().isAccepted() &&
((ProcessEventImpl)process.getLastEvent()).isTarget(UserSession.getUser()))
{
%>
<p class="eventNOT_ACCEPTED">Este processo aguarda a sua intervenção</p>
<form action="<%=request.getContextPath()%>/user/openProcess.do" method="get">
<input type="hidden" name="id" value="<%=processId%>"/>
<input type="hidden" name="acceptProcess" value="true"/>
<table border="0">
<tr>
<td>
<table class="processActivity" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="processActivityTail"><img src="<%=request.getContextPath()%>/imgs/process/leftProcess.gif"/></td>
<td class="processActivityName">
<input type="submit" value="Aceitar Transição de Processo para mim"/>
</td>
<td class="processActivityArrow"><img src="<%=request.getContextPath()%>/imgs/process/rightProcess.gif"/></td>
</tr>
</table>
</td>
<td>
<img src="<%=request.getContextPath()%>/imgs/process/actor.gif"/> ${UserSession.user.name}
</td>
</tr>
</table>
 
</form>
<%
}
if(process.getLastEvent().isAccepted() &&
process.getLastEvent().getOwner().getId() == UserSession.getUser().getId() &&
process.getLastEvent().getDispatchedDate() == null)
{
%>
<p class="eventACCEPTED">Processo aceite por si (${UserSession.name}) para tratamento</p>
 
<html:form action="/user/processEventController" enctype="multipart/form-data">
 
<jsp:useBean id="ProcessEventForm" type="pt.estgp.estgweb.web.form.processes.ProcessEventForm" scope="request"/>
<%
ProcessEventForm.setProcessEvent((ProcessEventImpl) process.getLastEvent());
%>
<input type="hidden" name="dispatch"/>
<html:hidden property="processEvent.process.id"/>
<html:hidden property="processEvent.id"/>
 
<div class="seccao" style="background-color: #f5f3f9; border:1px solid gray;">
<h2>Intervenção no Processo</h2>
<p>No <b>Passo 1</b> preencha a sua intervenção no processo e no <b>Passo 2</b> despache o mesmo</p>
<div class="seccao">
<h3>Passo 1</h3>
<table width="100%" class="dataTable processPool">
<tr>
<th width="50%" class="servicePool">
<img src="<%=request.getContextPath()%>/imgs/process/actor.gif"/>
${process.lastEvent.owner.name}
</th>
<th width="50%" class="starterPool" style="background-color: #fff9bc">
<img src="<%=request.getContextPath()%>/imgs/process/actor.gif"/>
${process.owner.name}
</th>
</tr>
<tr>
<td class="servicePool">
<table style="width: 100%" class="dataTable">
<tr>
<th style="width: 20%">Notas Internas</th>
<td colspan="2"><html:textarea property="processEvent.notes" style="width: 100%; height: 200px"/></td>
</tr>
<tr>
<th>Nível de acesso das notas informativas internas</th>
<td colspan="2">
<html:select property="processEvent.notesAccessLevel">
<html:option value="ALL_EXCEPT_STARTER"><bean:message key="process.access.level.ALL_EXCEPT_STARTER"/></html:option>
<html:option value="ALL_IN_PROCESS"><bean:message key="process.access.level.ALL_IN_PROCESS"/></html:option>
<html:option value="OWNER"><bean:message key="process.access.level.OWNER"/></html:option>
<html:option value="FORWARD_EVENTS"><bean:message key="process.access.level.FORWARD_EVENTS"/></html:option>
<html:option value="BACKWARD_EVENTS"><bean:message key="process.access.level.BACKWARD_EVENTS"/></html:option>
</html:select>
</td>
</tr>
<tr><td colspan="3">-----</td></tr>
<tr>
<th>Adicionar Ficheiro ao Processo:</th>
<td>
<html:file property="file"/>
</td>
<td>
 
</td>
</tr>
<tr>
<th>Nível de acesso do ficheiro digital</th>
<td>
<html:select property="fileAccess">
<html:option value="ALL_EXCEPT_STARTER"><bean:message key="process.access.level.ALL_EXCEPT_STARTER"/></html:option>
<html:option value="ALL_IN_PROCESS"><bean:message key="process.access.level.ALL_IN_PROCESS"/></html:option>
<html:option value="OWNER"><bean:message key="process.access.level.OWNER"/></html:option>
<html:option value="FORWARD_EVENTS"><bean:message key="process.access.level.FORWARD_EVENTS"/></html:option>
<html:option value="BACKWARD_EVENTS"><bean:message key="process.access.level.BACKWARD_EVENTS"/></html:option>
</html:select>
</td>
<td>
<input type="button" value="Importar Ficheiro" onclick="set(form,'updateProcessEvent');this.form.submit();">
</td>
</tr>
</table>
 
</td>
<td valign="top" class="starterPool" style="background-color: #fff9bc">
<table style="width: 100%" class="dataTable">
<tr>
<th style="width: 20%">Notas a transmitir ao Requerente</th>
<td><html:textarea property="processEvent.notesToStarter" style="width: 100%; height: 200px"/></td>
</tr>
</table>
 
</td>
</tr>
<tr>
<td colspan="2">
<input type="button" value="Salvar informação sem transitar" onclick="set(form,'updateProcessEvent');this.form.submit();">
</td>
</tr>
</table>
</div>
<div class="seccao">
<h3>Passo 2</h3>
<p>Pode salvar a informação no Passo 1, sair e voltar aqui novamente para efectuar o Passo 2</p>
<table border="0" width="100%">
<tr>
<td>
<table>
<tr>
<th>
Papel do destinatário para transitar
</th>
<td>
<table class="processActivity" cellpadding="0" cellspacing="0">
<tr>
<td class="processActivityTail"><img src="<%=request.getContextPath()%>/imgs/process/leftProcess.gif"/></td>
<td class="processActivityName">
<html:select property="destinationRole">
<%
List<String> roles = StringsUtils.getStringsFromSerial(process.getMetaProcess().getPossibleTargets(),";");
request.setAttribute("roles",roles);
 
%>
<logic:iterate id="role" name="roles">
<html:option value="${role}"><bean:message key="user.role.${role}"/></html:option>
</logic:iterate>
<%
 
%>
</html:select>
 
</td>
<td class="processActivityArrow"><img src="<%=request.getContextPath()%>/imgs/process/rightProcess.gif"/></td>
</tr>
</table>
</td>
<td>
<input class="TRANSITAR_BTN" type="button" value="TRANSITAR" onclick="if(confirm('Tem a certeza que deseja transitar este processo para ' + this.form.destinationRole.options[this.form.destinationRole.selectedIndex].text + '?')){set(form,'transitProcessEventRole');this.form.submit();}"/>
</td>
</tr>
<%
if(process.getMetaProcess().getPossiblePersons() != null && process.getMetaProcess().getPossiblePersons().length() > 0)
{%>
<tr>
<th>
Pessoa especifica para transitar
</th>
<td>
<table class="processActivity" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="processActivityTail"><img src="<%=request.getContextPath()%>/imgs/process/leftProcess.gif"/></td>
<td class="processActivityName">
<html:select property="destinationPerson" style="width: 100%">
<%
List<String> people = StringsUtils.getStringsFromSerial(process.getMetaProcess().getPossiblePersons(),";");
request.setAttribute("people",people);
%>
<logic:iterate id="person" name="people">
<%
User u = DaoFactory.getUserDaoImpl().loadByUsername(person.toString());
request.setAttribute("user",u);
%>
<html:option value="${person}">${user.name} (${person})</html:option>
</logic:iterate>
<%
 
%>
</html:select>
 
</td>
<td class="processActivityArrow"><img src="<%=request.getContextPath()%>/imgs/process/rightProcess.gif"/></td>
</tr>
</table>
</td>
<td>
<input class="TRANSITAR_BTN" type="button" value="TRANSITAR" onclick="if(confirm('Tem a certeza que deseja transitar este processo para ' + this.form.destinationPerson.options[this.form.destinationPerson.selectedIndex].text + '?')){set(form,'transitProcessEventPerson');this.form.submit();}"/>
</td>
</tr>
<%}%>
</table>
</td>
<td style="white-space: nowrap">
Ou pode dar o processo como terminado neste momento <input class="TERMINAR_BTN" type="button" value="TERMINAR PROCESSO" onclick="if(confirm('Tem a certeza que deseja terminar este processo?')){set(form,'finnishProcessEvent');this.form.submit();}"/>
</td>
</tr>
 
</table>
</td>
</tr>
 
</table>
 
</div>
</div>
 
</html:form>
<br/>
<%
 
}
%>
<div class="seccao">
<h2>Transições</h2>
 
 
 
<table class="dataTable" style="width: 100%">
<tr>
<th>Estado</th>
<th>Colocado <br/>(1)</th>
<th>Aceite <br/>(2)</th>
<th>Despachado <br/>(3)</th>
<th>Para</th>
<th>Interveniente</th>
<th>Informação Interna</th>
<th>Informação ao Requisitante</th>
<th>Ficheiros associados</th>
</tr>
<%
List<ProcessEvent> eventos = new ArrayList<ProcessEvent>(process.getEvents());
Collections.sort(eventos,new Comparator<ProcessEvent>()
{
@Override
public int compare(ProcessEvent o1, ProcessEvent o2) {
return (int) (o2.getId() - o1.getId());
}
});
request.setAttribute("eventos",eventos);
%>
<logic:iterate id="event" name="eventos" type="pt.estgp.estgweb.domain.ProcessEvent">
<tr class="event${event.nowState}">
<td><bean:message key="process.event.state.${event.nowState}"/></td>
<td>${event.openDate}</td>
<td>${event.acceptedDate}</td>
<td>${event.closeDate}</td>
<logic:present name="event" property="destinationRole">
<td><bean:message key="user.role.${event.destinationRole}"/></td>
</logic:present>
<logic:notPresent name="event" property="destinationRole">
<td>${event.owner.name}</td>
</logic:notPresent>
<td>${event.owner.name}</td>
<td>
<%
ProcessEventImpl eventImpl = (ProcessEventImpl) HibernateUtils.getCurrentSession().get(ProcessEventImpl.class,event.getId());
if(eventImpl.canSeeNotes(UserSession.getUser()))
{
%>${event.notes}<%
}
else
{
%>Interditas<%
}
%>
 
</td>
<td>${event.notesToStarter}</td>
<td>
<%
if(event.getFiles() != null && event.getFiles().size() > 0)
{
List<ProcessEventFile> files = new ArrayList<ProcessEventFile>();
files.addAll(event.getFiles());
request.setAttribute("files",files);
Collections.sort(files,new Comparator<ProcessEventFile>(){
@Override
public int compare(ProcessEventFile o1, ProcessEventFile o2) {
return (int) (o2.getId() - o1.getId());
}
});
%>
<table style="width: 100%" cellspacing="0" cellpadding="0" border="0">
<logic:iterate id="file" name="files" type="pt.estgp.estgweb.domain.ProcessEventFileImpl">
<%
String extension = FilesUtils.getExtension(file.getName());
if(file.canSeeFile(UserSession.getUser()))
{
String style="";
if(file.isGhost())
{
style = " color:#D6D6D6 ";
}
%>
<tr>
<td style="border:0 ;border-bottom: 1px solid gray">
<%
if(file.canOpenCloseGhost(UserSession.getUser()))
{
String checked = file.isGhost() ? "":"checked=\"checked\"";
String url = "/user/processEventController.do?dispatch=";
if(file.isGhost())
url += "unsetGhostFileFromProcessEvent&fileId=";
else
url += "setGhostFileFromProcessEvent&fileId=";
url+=file.getId();
%>
<input type="checkbox" <%=checked%> onchange="window.location='<%=request.getContextPath()+url%>'"/>
<%
}
%>
 
</td>
<td style="border: 0;border-bottom: 1px solid gray"><img src="<%=request.getContextPath()%>/imgs/mime/<%=extension%>.gif"/></td>
<td valign="middle" style="text-align: left; padding: 3px; vertical-align: middle; border: 0;border-bottom: 1px solid gray; <%=style%>">
<%
if(!file.isGhost())
{
%>
<a style="<%=style%>" href="<%=request.getContextPath()%>/repositoryStream/${file.repositoryStream}">${file.name}</a>
<%
}
else
{
%>
${file.name} (Inacessivel)
<%
}
%>
</td>
 
</tr>
<%
}
%>
</logic:iterate>
 
</table>
<%
}
%>
</td>
</tr>
</logic:iterate>
</table>
</div>
 
<%
HibernateUtils.getCurrentSession().getTransaction().commit();
%>
/impl/src/web/user/processes/topnavNewProcess.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/proxy/layoutIntranetUtils/estgp/intranet/escola/utils.html", "intranet.separator.utils.back");
topNav.addNavPlace("/user/listMetaProcesses.do", "processes.list.meta.processes");
topNav.addNavPlace(null, "processes.new.process");
%>
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/processes/topnavListMetaProcesses.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/proxy/layoutIntranetUtils/estgp/intranet/escola/utils.html", "intranet.separator.utils.back");
topNav.addNavPlace(null, "processes.list.meta.processes");
%>
 
<jsp:include page="/layout/topnav.jsp"/>
/impl/src/web/user/processes/listProcesses.jsp
New file
0,0 → 1,163
<%@ taglib prefix="logic" uri="http://jakarta.apache.org/struts/tags-logic" %>
<%@ taglib prefix="html" uri="http://jakarta.apache.org/struts/tags-html" %>
<%@ taglib prefix="jomm" uri="/WEB-INF/tlds/jomm.tld" %>
<%@ taglib prefix="bean" uri="http://jakarta.apache.org/struts/tags-bean" %>
<%@ page import="jomm.dao.utils.HibernateUtils" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.domain.*" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="org.hibernate.Criteria" %>
<%@ page import="org.hibernate.criterion.Criterion" %>
<%@ page import="pt.estgp.estgweb.domain.Process" %>
<%@ page import="static org.hibernate.criterion.Restrictions.*" %>
<%@ page import="jomm.utils.DatesUtils" %>
<%@ page import="pt.estgp.estgweb.Globals" %>
<%--
Created by IntelliJ IDEA.
User: jorgemachado
Date: 13/01/14
Time: 09:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
 
<%
String target = request.getParameter("target");
request.setAttribute("target",target);
%>
<form action="<%=request.getContextPath()%>/user/listProcesses.do" method="get">
<table>
<tr>
<th>Filtragem</th>
<td>
<select name="target" onchange="this.form.submit()">
<%
if(UserSession.getUser().isSuperuser() || UserSession.getUser().hasRole(Globals.ROLE_PROCESSES_ADMIN))
{
%>
<option value="all" <%=target.equals("all")?"selected=\"selected\"":""%> >Todos</option>
<option value="allWaiting" <%=target.equals("allWaiting")?"selected=\"selected\"":""%> >Em Trânsito</option>
<option value="opened" <%=target.equals("opened")?"selected=\"selected\"":""%> >Abertos</option>
<option value="closed" <%=target.equals("closed")?"selected=\"selected\"":""%> >Fechados</option>
<%
}
%>
<option value="participation" <%=target.equals("participation")?"selected=\"selected\"":""%> >Com participação</option>
<option value="watingForMe" <%=target.equals("watingForMe")?"selected=\"selected\"":""%>>Aguardando por mim</option>
<option value="startedByMeOpened" <%=target.equals("startedByMeOpened")?"selected=\"selected\"":""%>>Iniciados por mim abertos</option>
<option value="watingForMeClosed" <%=target.equals("watingForMeClosed")?"selected=\"selected\"":""%>>Iniciados por mim já terminados</option>
</select>
</td>
</tr>
</table>
</form>
<%
HibernateUtils.getCurrentSession().beginTransaction();
 
 
try{
List<ProcessImpl> processes = new ArrayList<ProcessImpl>();
if(UserSession.getUser().isSuperuser() || UserSession.getUser().hasRole(Globals.ROLE_PROCESSES_ADMIN))
{
if(target.equals("all"))
{
processes = DaoFactory.getProcessDaoImpl().findAllImpls();
}
else if(target.equals("allWaiting"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesWaitingFor();
}
else if(target.equals("opened"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesOpened();
}
else if(target.equals("closed"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesClosed();
}
}
if(target.equals("participation"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesWithParticipation(UserSession.getUser());
}
else if(target.equals("watingForMe"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesWaitingFor(UserSession.getUser());
}
else if(target.equals("startedByMeOpened"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesStardedByUserNotClosed(UserSession.getUser());
}
else if(target.equals("watingForMeClosed"))
{
processes = DaoFactory.getProcessDaoImpl().getProcessesStardedByUserClosed(UserSession.getUser());
}
else if(target.equals("all") && UserSession.getUser().isSuperuser())
{
processes = DaoFactory.getProcessDaoImpl().findAllImpls();
}
request.setAttribute("processes",processes);
}catch(Exception e)
{
System.out.println(e);
e.printStackTrace();
}
 
%>
<table id="myTable" class="tablesorter dataTable processesTable">
<thead>
<tr>
<th>Tipo</th>
<th>Estado</th>
<th>Aberto</th>
<th>Ultima alteração</th>
<th>Iniciado por</th>
<th>Ultimo Interveniente</th>
<th>Dias (Parado)</th>
<th>Aguardando</th>
</tr>
</thead>
<tbody>
<logic:iterate id="process" name="processes" type="pt.estgp.estgweb.domain.ProcessImpl">
<tr>
<td><a href="<%=request.getContextPath()%>/user/openProcess.do?id=${process.id}">${process.metaProcess.name}</a></td>
<td class="${process.nowState}"><bean:message key="process.state.${process.nowState}"/></td>
<td>${process.openDate}</td>
<td>${process.lastChangeDate}</td>
<td>${process.owner.name}</td>
<td>${process.lastPersonEvent.name}</td>
 
<%
String level = "wait1";
long milis = System.currentTimeMillis() - process.getLastEvent().getOpenDate().getTime();
int days = (int) (milis / 1000 / 3600 / 24);
if(days > 1 && days < 3)
{
level = "wait2";
}
else if(days >= 3 && days < 6)
{
level = "wait3";
}
%>
<td class="<%=level%>" style="text-align: right">
<%=days%>
</td>
<logic:present name="process" property="lastEvent.destinationRole">
<td><bean:message key="user.role.${process.lastEvent.destinationRole}"/></td>
</logic:present>
<logic:notPresent name="process" property="lastEvent.destinationRole">
<td>${process.lastEvent.owner.name}</td>
</logic:notPresent>
</tr>
</logic:iterate>
</tbody>
 
</table>
<%
 
 
HibernateUtils.getCurrentSession().getTransaction().commit();
%>
/impl/src/web/user/processes/startMetaProcess.jsp
New file
0,0 → 1,120
<%@ page import="jomm.dao.utils.HibernateUtils" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.domain.MetaProcessImpl" %>
<%@ page import="java.util.List" %>
<%@ page import="pt.estgp.estgweb.domain.MetaProcess" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<jsp:useBean id="UserSession" type="pt.estgp.estgweb.domain.UserSession" scope="request"/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
long metaProcessId = Long.parseLong(request.getParameter("metaProcessId"));
HibernateUtils.getCurrentSession().beginTransaction();
MetaProcess metaProcess = DaoFactory.getMetaProcessDaoImpl().get(metaProcessId);
 
request.setAttribute("metaProcess",metaProcess);
%>
 
<h1>${metaProcess.name}</h1>
 
<div class="seccao">
<p>Caro ${UserSession.name} Está prestes a submeter um processo de <b>${metaProcess.name}</b></p>
 
<p>Para concretizar este pedido deverá fazer <i>download</i> do seguinte documento digital, preencher o mesmo com a informação requisitada e envia-lo por este formulário para que seja expedido para o serviço respectivo:</p>
<table class="dataTable process">
<tr>
<th>Remetente</th>
<th>Ficheiro Digital <br/>(descarregar e preencher)</th>
<th>Processo</th>
 
<th>Destinatário</th>
</tr>
<tr>
<td>
<table class="processActor" cellpadding="0" cellspacing="0">
<tr>
<th><img src="<%=request.getContextPath()%>/imgs/process/actor.gif"/></th>
</tr>
<tr>
<td>${UserSession.name}</td>
</tr>
</table>
 
</td>
 
<td>
<a class="processDocument" href="<%=request.getContextPath()%>/repositoryStream/${metaProcess.repositoryStream}">Documento Digital Modelo</a>
</td>
<td>
<table class="processActivity" cellpadding="0" cellspacing="0">
<tr>
<td class="processActivityTail"><img src="<%=request.getContextPath()%>/imgs/process/leftProcess.gif"/></td>
<td class="processActivityName">${metaProcess.name}</td>
<td class="processActivityArrow"><img src="<%=request.getContextPath()%>/imgs/process/rightProcess.gif"/></td>
</tr>
</table>
 
</td>
<td >
<table class="processActor" cellpadding="0" cellspacing="0">
<tr>
<th><img src="<%=request.getContextPath()%>/imgs/process/actor.gif"/></th>
</tr>
<tr>
<td>
<%
if(metaProcess.getTargetPerson() == null)
{
%>
<bean:message key="user.role.${metaProcess.targetRole}"/>
<%
}
else
{
%>
<bean:message key="user.role.${metaProcess.targetPerson.name}"/>
<%
}
%>
</td>
</tr>
</table>
</td>
</tr>
 
</table>
<p></p>
 
 
<html:form action="/user/processesController" enctype="multipart/form-data">
<input type="hidden" name="dispatch" value="submitNew">
<html:hidden property="metaProcessId" value="${metaProcess.id}"/>
<table class="form dataTable">
<tr>
<th align="right">Remetente</th>
<td>${UserSession.name}</td>
</tr>
<tr>
<th align="right">Carregue o ficheiro digital (<b>preenchido</b>) do seu disco para aqui</th>
<td><span class="processDocument"> <html:file property="file"/></span></td>
</tr>
<tr>
<th align="right" style="vertical-align: top">Coloque aqui um comentário se achar necessário</th>
<td><html:textarea style="width:500px;height:200px" property="notes"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="<bean:message key="confirm"/>"/></td>
</tr>
 
</table>
 
 
</html:form>
</div>
 
<%
HibernateUtils.getCurrentSession().getTransaction().commit();
%>
/impl/build.xml
485,6 → 485,21
</schemaexport>
</target>
 
<target name="generateUpdateHibernateSql" depends="build">
<taskdef name="schemaupdate"
classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask"
classpathref="pathToToolsLib" classpath="${build.dir.classes}"/>
 
<schemaupdate
properties="${jdbc.properties.build}/${jdbc.properties.filename}"
quiet="no"
text="no">
<fileset dir="${hbm.dir}">
<include name="**/*.hbm.xml"/>
</fileset>
</schemaupdate>
</target>
 
<target name="generateHibernateDomainObjects">
<replace dir="${hbm.dir}" value="">
<include name="**/*.hbm.xml"/>
/common/mail/mail.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream