/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&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&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&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&from=ServiceZone"/> |
<action path="/user/startCorrectAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=startCorrect&from=ServiceZone"/> |
<action path="/user/startScheduleAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=schedule&from=ServiceZone"/> |
<action path="/user/startEditScheduleAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=editSchedule&from=ServiceZone"/> |
<action path="/user/startCloneAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=clone&from=ServiceZone"/> |
<action path="/user/startEditAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=edit&from=ServiceZone"/> |
<action path="/user/startListAssessmentsFromServiceZone" forward="page.list.assessments.from.serviceZone"/> |
<action path="/user/startSubmitAssessmentFromServiceZone" forward="/user/assessmentsControllerFromServiceZone.do?dispatch=create&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 > </td> |
<td> |
<td style="vertical-align: top" > </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 |