diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/AnoLetivo.js b/ieducar/modules/DynamicInput/Assets/Javascripts/AnoLetivo.js
new file mode 100644
index 0000000..611b7ae
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/AnoLetivo.js
@@ -0,0 +1,45 @@
+(function($){
+ $(document).ready(function(){
+
+ var $escolaField = getElementFor('escola');
+ var $anoLetivoField = getElementFor('ano');
+
+ var handleGetAnoEscolares = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($anoLetivoField, selectOptions, "Selecione um ano escolar");
+ }
+
+ var updateAnoEscolares = function(){
+ resetSelect($anoLetivoField);
+
+ if ($escolaField.val() && $escolaField.is(':enabled')) {
+ $anoLetivoField.children().first().html('Aguarde carregando...');
+
+ var data = {
+ escola_id : $escolaField.attr('value'),
+ };
+
+ $j("input[name='situacoes_ano_letivo']").each(function(index, input){
+ data['situacao_' + $j(input).val()] = true;
+ });
+
+ var urlForGetAnosEscolares = getResourceUrlBuilder.buildUrl('/module/DynamicInput/AnoLetivo',
+ 'anos_letivos', data);
+
+ var options = {
+ url : urlForGetAnosEscolares,
+ dataType : 'json',
+ success : handleGetAnoEscolares
+ };
+
+ getResources(options);
+ }
+
+ $anoLetivoField.change();
+ };
+
+ // bind onchange event
+ $escolaField.change(updateAnoEscolares);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Biblioteca.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Biblioteca.js
new file mode 100644
index 0000000..e47ba97
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Biblioteca.js
@@ -0,0 +1,36 @@
+(function($){
+ $(document).ready(function(){
+ var $escolaField = getElementFor('escola');
+ var $bibliotecaField = getElementFor('biblioteca');
+
+ var handleGetBibliotecas = function(resources) {
+ var selectOptions = xmlResourcesToSelectOptions(resources, 'query', 'cod_biblioteca');
+ updateSelect($bibliotecaField, selectOptions, "Selecione uma biblioteca");
+ }
+
+ var updateBibliotecas = function(){
+ resetSelect($bibliotecaField);
+
+ if ($escolaField.val() && $escolaField.is(':enabled')) {
+ $bibliotecaField.children().first().html('Aguarde carregando...');
+
+ var urlForGetBibliotecas = getResourceUrlBuilder.buildUrl('educar_biblioteca_xml.php', '', {
+ esc : $escolaField.attr('value') });
+
+ var options = {
+ url : urlForGetBibliotecas,
+ dataType : 'xml',
+ success : handleGetBibliotecas
+ };
+
+ getResources(options);
+ }
+
+ $bibliotecaField.change();
+ };
+
+ // bind onchange event
+ $escolaField.change(updateBibliotecas);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaFonte.js b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaFonte.js
new file mode 100644
index 0000000..e7601d8
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaFonte.js
@@ -0,0 +1,36 @@
+(function($){
+ $(document).ready(function(){
+ var $bibliotecaField = getElementFor('biblioteca');
+ var $fonteField = getElementFor('fonte');
+
+ var handleGetFontes = function(resources) {
+ var selectOptions = xmlResourcesToSelectOptions(resources, 'query', 'cod_fonte');
+ updateSelect($fonteField, selectOptions, "Selecione uma fonte");
+ }
+
+ var updateFontes = function(){
+ resetSelect($fonteField);
+
+ if ($bibliotecaField.val() && $bibliotecaField.is(':enabled')) {
+ $fonteField.children().first().html('Aguarde carregando...');
+
+ var urlForGetFontes = getResourceUrlBuilder.buildUrl('educar_fonte_xml.php', '', {
+ bib : $bibliotecaField.attr('value') });
+
+ var options = {
+ url : urlForGetFontes,
+ dataType : 'xml',
+ success : handleGetFontes
+ };
+
+ getResources(options);
+ }
+
+ $fonteField.change();
+ };
+
+ // bind onchange event
+ $bibliotecaField.change(updateFontes);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaSituacao.js b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaSituacao.js
new file mode 100644
index 0000000..edd1cea
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaSituacao.js
@@ -0,0 +1,36 @@
+(function($){
+ $(document).ready(function(){
+ var $bibliotecaField = getElementFor('biblioteca');
+ var $situacaoField = getElementFor('situacao');
+
+ var handleGetSituacoes = function(resources) {
+ var selectOptions = xmlResourcesToSelectOptions(resources, 'query', 'cod_situacao');
+ updateSelect($situacaoField, selectOptions, "Selecione uma situação");
+ }
+
+ var updateSituacoes = function(){
+ resetSelect($situacaoField);
+
+ if ($bibliotecaField.val() && $bibliotecaField.is(':enabled')) {
+ $situacaoField.children().first().html('Aguarde carregando...');
+
+ var urlForGetSituacoes = getResourceUrlBuilder.buildUrl('educar_situacao_xml.php', '', {
+ bib : $bibliotecaField.attr('value') });
+
+ var options = {
+ url : urlForGetSituacoes,
+ dataType : 'xml',
+ success : handleGetSituacoes
+ };
+
+ getResources(options);
+ }
+
+ $situacaoField.change();
+ };
+
+ // bind onchange event
+ $bibliotecaField.change(updateSituacoes);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaTipoCliente.js b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaTipoCliente.js
new file mode 100644
index 0000000..076f253
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaTipoCliente.js
@@ -0,0 +1,37 @@
+(function($){
+ $(document).ready(function(){
+ var $bibliotecaField = getElementFor('biblioteca');
+ var $tipoClienteField = getElementFor('cliente_tipo');
+
+ var handleGetTiposCliente = function(resources) {
+ var selectOptions = xmlResourcesToSelectOptions(resources, 'query', 'cod_cliente_tipo');
+ updateSelect($tipoClienteField, selectOptions, "Selecione um tipo de cliente");
+ }
+
+ var updateTiposCliente = function(){
+ resetSelect($tipoClienteField);
+
+ if ($bibliotecaField.val() && $bibliotecaField.is(':enabled')) {
+ $tipoClienteField.children().first().html('Aguarde carregando...');
+
+ var path = '/intranet/educar_cliente_tipo_xml.php';
+ var urlForGetTipoCliente = getResourceUrlBuilder.buildUrl(path, '', {
+ bib : $bibliotecaField.attr('value') });
+
+ var options = {
+ url : urlForGetTipoCliente,
+ dataType : 'xml',
+ success : handleGetTiposCliente
+ };
+
+ getResources(options);
+ }
+
+ $tipoClienteField.change();
+ };
+
+ // bind onchange event
+ $bibliotecaField.change(updateTiposCliente);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaTipoExemplar.js b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaTipoExemplar.js
new file mode 100644
index 0000000..4ff896c
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/BibliotecaTipoExemplar.js
@@ -0,0 +1,40 @@
+(function($){
+ $(document).ready(function(){
+ var $bibliotecaField = getElementFor('biblioteca');
+ var $tipoExemplarField = getElementFor('exemplar_tipo');
+
+ var handleGetTiposExemplar = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($tipoExemplarField, selectOptions, "Selecione um tipo de exemplar");
+ }
+
+ var updateTiposExemplar = function(){
+ resetSelect($tipoExemplarField);
+
+ if ($bibliotecaField.val() && $bibliotecaField.is(':enabled')) {
+ $tipoExemplarField.children().first().html('Aguarde carregando...');
+
+ var data = {
+ resource : 'tipos_exemplar',
+ biblioteca_id : $bibliotecaField.attr('value')
+ };
+
+ var urlForGetTipoExemplar = getResourceUrlBuilder.buildUrl('/module/DynamicInput/TipoExemplar',
+ 'tipos_exemplar', data);
+ var options = {
+ url : urlForGetTipoExemplar,
+ dataType : 'json',
+ success : handleGetTiposExemplar
+ };
+
+ getResources(options);
+ }
+
+ $tipoExemplarField.change();
+ };
+
+ // bind onchange event
+ $bibliotecaField.change(updateTiposExemplar);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/ComponenteCurricular.js b/ieducar/modules/DynamicInput/Assets/Javascripts/ComponenteCurricular.js
new file mode 100644
index 0000000..7d2deb2
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/ComponenteCurricular.js
@@ -0,0 +1,44 @@
+(function($){
+ $(document).ready(function(){
+
+ var $anoField = getElementFor('ano');
+ var $turmaField = getElementFor('turma');
+ var $componenteCurricularField = getElementFor('componente_curricular');
+
+ var handleGetComponentesCurriculares = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($componenteCurricularField, selectOptions, "Selecione um componente curricular");
+ }
+
+ var updateComponentesCurriculares = function(){
+ resetSelect($componenteCurricularField);
+
+ if ($anoField.val() && $turmaField.val() && $turmaField.is(':enabled')) {
+ $componenteCurricularField.children().first().html('Aguarde carregando...');
+
+ var data = {
+ ano : $anoField.attr('value'),
+ turma_id : $turmaField.attr('value')
+ };
+
+ var urlForGetComponentesCurriculares = getResourceUrlBuilder.buildUrl(
+ '/module/DynamicInput/componenteCurricular', 'componentesCurriculares', data
+ );
+
+ var options = {
+ url : urlForGetComponentesCurriculares,
+ dataType : 'json',
+ success : handleGetComponentesCurriculares
+ };
+
+ getResources(options);
+ }
+
+ $componenteCurricularField.change();
+ };
+
+ // bind onchange event
+ $turmaField.change(updateComponentesCurriculares);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Curso.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Curso.js
new file mode 100644
index 0000000..93924b9
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Curso.js
@@ -0,0 +1,39 @@
+(function($){
+ $(document).ready(function(){
+ var $instituicaoField = getElementFor('instituicao');
+ var $escolaField = getElementFor('escola');
+ var $cursoField = getElementFor('curso');
+
+ var handleGetCursos = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($cursoField, selectOptions, "Selecione um curso");
+ }
+
+ var updateCursos = function(){
+ resetSelect($cursoField);
+
+ if ($instituicaoField.val() && $escolaField.val() && $escolaField.is(':enabled')) {
+ $cursoField.children().first().html('Aguarde carregando...');
+
+ var urlForGetCursos = getResourceUrlBuilder.buildUrl('/module/DynamicInput/Curso', 'cursos', {
+ escola_id : $escolaField.attr('value'),
+ instituicao_id : $instituicaoField.attr('value'),
+ });
+
+ var options = {
+ url : urlForGetCursos,
+ dataType : 'json',
+ success : handleGetCursos
+ };
+
+ getResources(options);
+ }
+
+ $cursoField.change();
+ };
+
+ // bind onchange event
+ $escolaField.change(updateCursos);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/DynamicInput.js b/ieducar/modules/DynamicInput/Assets/Javascripts/DynamicInput.js
new file mode 100644
index 0000000..5b07cd1
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/DynamicInput.js
@@ -0,0 +1,92 @@
+function updateSelect($targetElement, options, emptyOptionHtml) {
+ $targetElement.children().not('[value=""]').remove();
+
+ $j.each(options, function(index, value){
+ $j(value).appendTo($targetElement);
+ });
+
+ if (options.length > 0) {
+ $targetElement.removeAttr('disabled');
+ $targetElement.children('[value=""]').first().html(emptyOptionHtml || "Selecione uma opção");
+ }
+ else
+ $targetElement.children(':first').html('Sem opções');
+}
+
+
+function resetSelect($targetElement) {
+ $targetElement.children().not('[value=""]').remove();
+ $targetElement.children().first().attr('checked', 'checked');
+ //$targetElement.attr('disabled', 'disabled');
+}
+
+
+function xmlResourcesToSelectOptions(resources, parentNodeName, nodeIdAttrName, nodeValueAttrName) {
+ var options = [];
+
+ $j.each($j(resources).find(parentNodeName).children(), function(index, value){
+ var $value = $j(value);
+ var text;
+
+ var $option = $j(' ');
+ $option.attr('value', $value.attr(nodeIdAttrName));
+
+ if (typeof nodeValueAttrName != 'undefined')
+ text = safeCapitalize($value.attr(nodeValueAttrName));
+ else
+ text = safeCapitalize($value.text());
+
+ $option.html(text);
+ options.push($option);
+ });
+
+ return options;
+}
+
+
+function jsonResourcesToSelectOptions(resources) {
+ var options = [];
+
+ $j.each(resources, function(id, value) {
+
+ // como arrays com chave numerica são ordenados pela chave pode-se enviar
+ // arrays como { __123 : 'value a', __111 : 'value b'} com a chave iniciando com '__'
+ // para que seja respeitado a posição dos elementos da lista e não pela chave
+ // assim o '__' do inicio do id será removido antes de usa-lo.
+
+ if (id.indexOf && id.substr && id.indexOf('__') == 0)
+ id = id.substr(2);
+
+ options.push($j(' ').attr('value', id).html(safeCapitalize(value)));
+ });
+
+ return options;
+}
+
+
+function getFirstDefined(attrIdNames) {
+ if (! $j.isArray(attrIdNames))
+ attrIdNames = [attrIdNames];
+
+ var $element = undefined;
+
+ $j.each(attrIdNames, function(index, attIdName){
+ $element = $j(buildId(attIdName));
+
+ if ($element.length > 0)
+ return false;
+ });
+
+ return $element;
+}
+
+function getElementFor(entityName) {
+ var $element = getFirstDefined([entityName + "_id" ,
+ "ref_cod_" + entityName,
+ "ref_ref_cod_" + entityName,
+ entityName]);
+ if ($element == undefined)
+ safeLog("Elemento não definido para '" + entityName + "'");
+
+ return $element;
+}
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Escola.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Escola.js
new file mode 100644
index 0000000..30ff3a1
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Escola.js
@@ -0,0 +1,36 @@
+(function($){
+ $(document).ready(function(){
+ var $instituicaoField = getElementFor('instituicao');
+ var $escolaField = getElementFor('escola');
+
+ var handleGetEscolas = function(resources) {
+ var selectOptions = xmlResourcesToSelectOptions(resources, 'query', 'cod_escola');
+ updateSelect($escolaField, selectOptions, "Selecione uma escola");
+ }
+
+ var updateEscolas = function(){
+ resetSelect($escolaField);
+
+ if ($instituicaoField.val() && $instituicaoField.is(':enabled')) {
+ $escolaField.children().first().html('Aguarde carregando...');
+
+ var urlForGetEscolas = getResourceUrlBuilder.buildUrl('educar_escola_xml2.php', '', {
+ ins : $instituicaoField.attr('value') });
+
+ var options = {
+ url : urlForGetEscolas,
+ dataType : 'xml',
+ success : handleGetEscolas
+ };
+
+ getResources(options);
+ }
+
+ $escolaField.change();
+ };
+
+ // bind onchange event
+ $instituicaoField.change(updateEscolas);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Etapa.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Etapa.js
new file mode 100644
index 0000000..fddc4e4
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Etapa.js
@@ -0,0 +1,47 @@
+(function($){
+ $(document).ready(function(){
+
+ var $anoField = getElementFor('ano');
+ var $escolaField = getElementFor('escola');
+ var $cursoField = getElementFor('curso');
+ var $turmaField = getElementFor('turma');
+ var $etapaField = getElementFor('etapa');
+
+ var handleGetEtapas = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($etapaField, selectOptions, "Selecione uma etapa");
+ }
+
+ var updateEtapas = function(){
+ resetSelect($etapaField);
+
+ if ($anoField.val() && $escolaField.val() && $cursoField.val() && $turmaField.val() && $turmaField.is(':enabled')) {
+ $etapaField.children().first().html('Aguarde carregando...');
+
+ var data = {
+ ano : $anoField.attr('value'),
+ escola_id : $escolaField.attr('value'),
+ curso_id : $cursoField.attr('value'),
+ turma_id : $turmaField.attr('value')
+ };
+
+ var urlForGetEtapas = getResourceUrlBuilder.buildUrl('/module/DynamicInput/Etapa',
+ 'etapas', data);
+
+ var options = {
+ url : urlForGetEtapas,
+ dataType : 'json',
+ success : handleGetEtapas
+ };
+
+ getResources(options);
+ }
+
+ $etapaField.change();
+ };
+
+ // bind onchange event
+ $turmaField.change(updateEtapas);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Matricula.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Matricula.js
new file mode 100644
index 0000000..382f7fd
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Matricula.js
@@ -0,0 +1,43 @@
+(function($){
+ $(document).ready(function(){
+
+ var $anoField = getElementFor('ano');
+ var $turmaField = getElementFor('turma');
+ var $matriculaField = getElementFor('matricula');
+
+ var handleGetMatriculas = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($matriculaField, selectOptions, "Selecione uma matricula");
+ }
+
+ var updateMatriculas = function(){
+ resetSelect($matriculaField);
+
+ if ($anoField.val() && $turmaField.val() && $turmaField.is(':enabled')) {
+ $matriculaField.children().first().html('Aguarde carregando...');
+
+ var data = {
+ ano : $anoField.attr('value'),
+ turma_id : $turmaField.attr('value')
+ };
+
+ var urlForGetMatriculas = getResourceUrlBuilder.buildUrl('/module/DynamicInput/Matricula',
+ 'matriculas', data);
+
+ var options = {
+ url : urlForGetMatriculas,
+ dataType : 'json',
+ success : handleGetMatriculas
+ };
+
+ getResources(options);
+ }
+
+ $matriculaField.change();
+ };
+
+ // bind onchange event
+ $turmaField.change(updateMatriculas);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Serie.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Serie.js
new file mode 100644
index 0000000..97422c7
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Serie.js
@@ -0,0 +1,41 @@
+(function($){
+ $(document).ready(function(){
+
+ // serie search expect an id for escola
+ var $escolaField = getElementFor('escola');
+
+ var $cursoField = getElementFor('curso');
+ var $serieField = getElementFor('serie');
+
+ var handleGetSeries = function(resources) {
+ var selectOptions = xmlResourcesToSelectOptions(resources, 'query', 'cod_serie');
+ updateSelect($serieField, selectOptions, "Selecione uma série");
+ }
+
+ var updateSeries = function(){
+ resetSelect($serieField);
+
+ if ($escolaField.val() && $cursoField.val() && $cursoField.is(':enabled')) {
+ $serieField.children().first().html('Aguarde carregando...');
+
+ var urlForGetSeries = getResourceUrlBuilder.buildUrl('educar_escola_curso_serie_xml.php', '', {
+ esc : $escolaField.attr('value'),
+ cur : $cursoField.attr('value') });
+
+ var options = {
+ url : urlForGetSeries,
+ dataType : 'xml',
+ success : handleGetSeries
+ };
+
+ getResources(options);
+ }
+
+ $serieField.change();
+ };
+
+ // bind onchange event
+ $cursoField.change(updateSeries);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Assets/Javascripts/Turma.js b/ieducar/modules/DynamicInput/Assets/Javascripts/Turma.js
new file mode 100644
index 0000000..5c74822
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Assets/Javascripts/Turma.js
@@ -0,0 +1,44 @@
+(function($){
+ $(document).ready(function(){
+
+ // turma search expect an id for escola
+ var $instituicaoField = getElementFor('instituicao');
+ var $escolaField = getElementFor('escola');
+
+ var $serieField = getElementFor('serie');
+ var $turmaField = getElementFor('turma');
+
+ var handleGetTurmas = function(response) {
+ var selectOptions = jsonResourcesToSelectOptions(response['options']);
+ updateSelect($turmaField, selectOptions, "Selecione uma turma");
+ }
+
+ var updateTurmas = function(){
+ resetSelect($turmaField);
+
+ if ($instituicaoField.val() && $escolaField.val() && $serieField.val() && $serieField.is(':enabled')) {
+ $turmaField.children().first().html('Aguarde carregando...');
+
+ var urlForGetTurmas = getResourceUrlBuilder.buildUrl('/module/DynamicInput/turma', 'turmas', {
+ instituicao_id : $instituicaoField.attr('value'),
+ escola_id : $escolaField.attr('value'),
+ serie_id : $serieField.attr('value')
+ });
+
+ var options = {
+ url : urlForGetTurmas,
+ dataType : 'json',
+ success : handleGetTurmas
+ };
+
+ getResources(options);
+ }
+
+ $turmaField.change();
+ };
+
+ // bind onchange event
+ $serieField.change(updateTurmas);
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/DynamicInput/Views/AnoLetivoController.php b/ieducar/modules/DynamicInput/Views/AnoLetivoController.php
new file mode 100644
index 0000000..045434f
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/AnoLetivoController.php
@@ -0,0 +1,89 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+
+/**
+ * AnoLetivoController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class AnoLetivoController extends ApiCoreController
+{
+
+ protected function canGetAnosLetivos() {
+ return $this->validatesId('escola');
+ }
+
+ protected function filtroSituacao() {
+ $tiposSituacao = array('nao_iniciado' => 0, 'em_andamento' => 1, 'finalizado' => 2);
+ $situacaoIn = array();
+
+ foreach ($tiposSituacao as $nome => $flag) {
+ if ($this->getRequest()->{"situacao_$nome"} == true)
+ $situacaoIn[] = $flag;
+ }
+
+ return (empty($situacaoIn) ? '' : 'and andamento in ('. implode(',', $situacaoIn) . ')');
+ }
+
+ protected function getAnosLetivos() {
+ if ($this->canGetAnosLetivos()) {
+ $params = array($this->getRequest()->escola_id);
+ $sql = "select ano from pmieducar.escola_ano_letivo as al where ref_cod_escola = $1
+ and ativo = 1 {$this->filtroSituacao()} order by ano desc";
+
+ $records = $this->fetchPreparedQuery($sql, $params);
+ $options = array();
+
+ foreach ($records as $record)
+ $options[$record['ano']] = $record['ano'];
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'anos_letivos'))
+ $this->appendResponse($this->getAnosLetivos());
+ else
+ $this->notImplementedOperationError();
+ }
+}
diff --git a/ieducar/modules/DynamicInput/Views/ComponenteCurricularController.php b/ieducar/modules/DynamicInput/Views/ComponenteCurricularController.php
new file mode 100644
index 0000000..6a45b3b
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/ComponenteCurricularController.php
@@ -0,0 +1,109 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+require_once 'Portabilis/Business/Professor.php';
+
+/**
+ * ComponenteCurricularController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class ComponenteCurricularController extends ApiCoreController
+{
+
+ protected function canGetComponentesCurriculares() {
+ return $this->validatesId('escola') &&
+ $this->validatesId('turma') &&
+ $this->validatesPresenceOf('ano');
+ }
+
+ protected function getComponentesCurriculares() {
+ if ($this->canGetComponentesCurriculares()) {
+
+ $userId = $this->getSession()->id_pessoa;
+ $instituicaoId = $this->getRequest()->instituicao_id;
+ $turmaId = $this->getRequest()->turma_id;
+ $ano = $this->getRequest()->ano;
+
+ $isProfessor = Portabilis_Business_Professor::isProfessor($instituicaoId, $userId);
+
+ if ($isProfessor) {
+ $componentesCurriculares = Portabilis_Business_Professor::componentesCurricularesAlocado(
+ $turmaId, $ano, $userId
+ );
+ }
+
+ else {
+ $sql = "select cc.id, cc.nome
+ from pmieducar.turma, modules.componente_curricular_turma as cct, modules.componente_curricular as cc,
+ pmieducar.escola_ano_letivo as al where turma.cod_turma = $1 and cct.turma_id = turma.cod_turma and
+ cct.escola_id = turma.ref_ref_cod_escola and cct.componente_curricular_id = cc.id and al.ano = $2
+ and cct.escola_id = al.ref_cod_escola";
+
+ $componentesCurriculares = $this->fetchPreparedQuery($sql, array($turmaId, $ano));
+
+ if (count($ComponentesCurriculares) < 1) {
+ $sql = "select cc.id, cc.nome from
+ pmieducar.turma as t, pmieducar.escola_serie_disciplina as esd, modules.componente_curricular
+ as cc, pmieducar.escola_ano_letivo as al where t.cod_turma = $1 and esd.ref_ref_cod_escola =
+ t.ref_ref_cod_escola and esd.ref_ref_cod_serie = t.ref_ref_cod_serie and esd.ref_cod_disciplina =
+ cc.id and al.ano = $2 and esd.ref_ref_cod_escola = al.ref_cod_escola and t.ativo = 1 and
+ esd.ativo = 1 and al.ativo = 1";
+
+ $componentesCurriculares = $this->fetchPreparedQuery($sql, array($turmaId, $ano));
+ }
+ }
+
+ $options = array();
+ foreach ($componentesCurriculares as $componenteCurricular)
+ $options['__' . $componenteCurricular['id']] = $this->toUtf8($componenteCurricular['nome']);
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'componentesCurriculares'))
+ $this->appendResponse($this->getComponentesCurriculares());
+ else
+ $this->notImplementedOperationError();
+ }
+}
diff --git a/ieducar/modules/DynamicInput/Views/CursoController.php b/ieducar/modules/DynamicInput/Views/CursoController.php
new file mode 100644
index 0000000..aaf2bef
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/CursoController.php
@@ -0,0 +1,90 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+require_once 'Portabilis/Business/Professor.php';
+
+/**
+ * CursoController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class CursoController extends ApiCoreController
+{
+
+ protected function canGetCursos() {
+ return $this->validatesId('instituicao') &&
+ $this->validatesId('escola');
+ }
+
+ protected function getCursos() {
+ if ($this->canGetCursos()) {
+ $userId = $this->getSession()->id_pessoa;
+ $instituicaoId = $this->getRequest()->instituicao_id;
+ $escolaId = $this->getRequest()->escola_id;
+
+ $isProfessor = Portabilis_Business_Professor::isProfessor($instituicaoId, $userId);
+
+ if ($isProfessor)
+ $cursos = Portabilis_Business_Professor::cursosAlocado($instituicaoId, $escolaId, $userId);
+
+ else {
+ $sql = "select c.cod_curso as id, c.nm_curso as nome FROM pmieducar.curso c,
+ pmieducar.escola_curso ec WHERE ec.ref_cod_escola = $1 AND ec.ref_cod_curso =
+ c.cod_curso AND ec.ativo = 1 AND c.ativo = 1 ORDER BY c.nm_curso ASC";
+
+ $cursos = $this->fetchPreparedQuery($sql, $escolaId);
+ }
+
+ $options = array();
+ foreach ($cursos as $curso)
+ $options['__' . $curso['id']] = $this->toUtf8($curso['nome']);
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'cursos'))
+ $this->appendResponse($this->getCursos());
+ else
+ $this->notImplementedOperationError();
+ }
+}
\ No newline at end of file
diff --git a/ieducar/modules/DynamicInput/Views/EtapaController.php b/ieducar/modules/DynamicInput/Views/EtapaController.php
new file mode 100644
index 0000000..20062b6
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/EtapaController.php
@@ -0,0 +1,99 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+#require_once 'intranet/include/pmieducar/clsPmieducarEtapa.inc.php';
+
+/**
+ * EtapaController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class EtapaController extends ApiCoreController
+{
+
+ protected function canGetEtapas() {
+ return $this->validatesId('escola') &&
+ $this->validatesId('curso') &&
+ $this->validatesId('turma') &&
+ $this->validatesPresenceOf('ano');
+ }
+
+ protected function getEtapas() {
+ if ($this->canGetEtapas()) {
+ $cursoId = $this->getRequest()->curso_id;
+
+ $sql = "select padrao_ano_escolar from pmieducar.curso where cod_curso = $1 and ativo = 1";
+ $padraoAnoLetivo = $this->fetchPreparedQuery($sql, array($cursoId), true, 'first-field');
+
+ if ($padraoAnoLetivo == 1) {
+ $escolaId = $this->getRequest()->escola_id;
+ $ano = $this->getRequest()->ano;
+
+ $sql = "select padrao.sequencial as etapa, modulo.nm_tipo as nome from pmieducar.ano_letivo_modulo
+ as padrao, pmieducar.modulo where padrao.ref_ano = $1 and padrao.ref_ref_cod_escola = $2
+ and padrao.ref_cod_modulo = modulo.cod_modulo and modulo.ativo = 1 order by padrao.sequencial";
+
+ $etapas = $this->fetchPreparedQuery($sql, array($ano, $escolaId));
+ }
+
+ else {
+ $sql = "select turma.sequencial as etapa, modulo.nm_tipo as nome from pmieducar.turma_modulo as turma,
+ pmieducar.modulo where turma.ref_cod_turma = $1 and turma.ref_cod_modulo = modulo.cod_modulo
+ and modulo.ativo = 1 order by turma.sequencial";
+
+ $etapas = $this->fetchPreparedQuery($sql, $this->getRequest()->turma_id);
+ }
+
+ $options = array();
+ foreach ($etapas as $etapa)
+ $options['__' . $etapa['etapa']] = $etapa['etapa'] . 'º ' . $this->toUtf8($etapa['nome']);
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'etapas'))
+ $this->appendResponse($this->getEtapas());
+ else
+ $this->notImplementedOperationError();
+ }
+}
diff --git a/ieducar/modules/DynamicInput/Views/MatriculaController.php b/ieducar/modules/DynamicInput/Views/MatriculaController.php
new file mode 100644
index 0000000..9ebf2a7
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/MatriculaController.php
@@ -0,0 +1,109 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+require_once 'intranet/include/pmieducar/clsPmieducarMatricula.inc.php';
+
+/**
+ * MatriculaController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class MatriculaController extends ApiCoreController
+{
+
+ protected function canGetMatriculas() {
+ return $this->validatesId('turma') &&
+ $this->validatesPresenceOf('ano');
+ }
+
+ protected function getMatriculas() {
+ if ($this->canGetMatriculas()) {
+ $matriculas = new clsPmieducarMatricula();
+ $matriculas->setOrderby('nome ASC, cod_matricula');
+ $matriculas = $matriculas->lista(NULL,
+ NULL,
+ $this->getRequest()->escola_id,
+ $this->getRequest()->serie_id,
+ NULL,
+ NULL,
+ $this->getRequest()->aluno_id,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ $ativo = 1,
+ $this->getRequest()->ano,
+ NULL,
+ $this->getRequest()->instituicao_id,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ $this->getRequest()->curso_id,
+ NULL,
+ $this->getRequest()->matricula_id,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ $this->getRequest()->turma_id);
+
+ $options = array();
+
+ foreach ($matriculas as $matricula)
+ $options['__' . $matricula['cod_matricula']] = $this->toUtf8($matricula['nome']);
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'matriculas'))
+ $this->appendResponse($this->getMatriculas());
+ else
+ $this->notImplementedOperationError();
+ }
+}
diff --git a/ieducar/modules/DynamicInput/Views/TipoExemplarController.php b/ieducar/modules/DynamicInput/Views/TipoExemplarController.php
new file mode 100644
index 0000000..f2d9e6b
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/TipoExemplarController.php
@@ -0,0 +1,84 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+require_once 'Biblioteca/Model/TipoExemplarDataMapper.php';
+
+/**
+ * TipoExemplarController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class TipoExemplarController extends ApiCoreController
+{
+ protected $_dataMapper = 'Biblioteca_Model_TipoExemplarDataMapper';
+
+ protected function canGetTiposExemplar() {
+ return $this->validatesId('biblioteca');
+ }
+
+ protected function getTiposExemplar() {
+ if ($this->canGetTiposExemplar()) {
+ $columns = array('cod_exemplar_tipo', 'nm_tipo');
+
+ $where = array('ref_cod_biblioteca' => $this->getRequest()->biblioteca_id,
+ 'ativo' => '1');
+
+ $records = $this->getDataMapper()->findAll($columns,
+ $where,
+ $orderBy = array('nm_tipo' => 'ASC'),
+ $addColumnIdIfNotSet = false);
+
+ $options = array();
+
+ foreach ($records as $record)
+ $options[$record->cod_exemplar_tipo] = $record->nm_tipo;
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'tipos_exemplar'))
+ $this->appendResponse($this->getTiposExemplar());
+ else
+ $this->notImplementedOperationError();
+ }
+}
diff --git a/ieducar/modules/DynamicInput/Views/TurmaController.php b/ieducar/modules/DynamicInput/Views/TurmaController.php
new file mode 100644
index 0000000..a35c5ae
--- /dev/null
+++ b/ieducar/modules/DynamicInput/Views/TurmaController.php
@@ -0,0 +1,92 @@
+
+ *
+ * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
+ * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
+ * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
+ * qualquer versão posterior.
+ *
+ * Este programa é distribuído na expectativa de que seja útil, porém, SEM
+ * NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
+ * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
+ * do GNU para mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
+ * com este programa; se não, escreva para a Free Software Foundation, Inc., no
+ * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Arquivo disponível desde a versão ?
+ * @version $Id$
+ */
+
+require_once 'lib/Portabilis/Controller/ApiCoreController.php';
+require_once 'Portabilis/Business/Professor.php';
+
+/**
+ * CursoController class.
+ *
+ * @author Lucas D'Avila
+ * @category i-Educar
+ * @license @@license@@
+ * @package Avaliacao
+ * @subpackage Modules
+ * @since Classe disponível desde a versão 1.1.0
+ * @version @@package_version@@
+ */
+class TurmaController extends ApiCoreController
+{
+
+ protected function canGetTurmas() {
+ return $this->validatesId('instituicao') &&
+ $this->validatesId('escola') &&
+ $this->validatesId('serie');
+ }
+
+ protected function getTurmas() {
+ if ($this->canGetTurmas()) {
+ $userId = $this->getSession()->id_pessoa;
+ $instituicaoId = $this->getRequest()->instituicao_id;
+ $escolaId = $this->getRequest()->escola_id;
+ $serieId = $this->getRequest()->serie_id;
+
+ $isProfessor = Portabilis_Business_Professor::isProfessor($instituicaoId, $userId);
+
+ if ($isProfessor)
+ $turmas = Portabilis_Business_Professor::turmasAlocado($escolaId, $serieId, $userId);
+
+ else {
+ $sql = "select cod_turma as id, nm_turma as nome from pmieducar.turma where ref_ref_cod_escola = $1
+ and (ref_ref_cod_serie = $2 or ref_ref_cod_serie_mult = $2) and ativo = 1 and
+ visivel != 'f' order by nm_turma asc";
+
+ $turmas = $this->fetchPreparedQuery($sql, array($escolaId, $serieId));
+ }
+
+ $options = array();
+ foreach ($turmas as $turma)
+ $options['__' . $turma['id']] = $this->toUtf8($turma['nome']);
+
+ return array('options' => $options);
+ }
+ }
+
+ public function Gerar() {
+ if ($this->isRequestFor('get', 'turmas'))
+ $this->appendResponse($this->getTurmas());
+ else
+ $this->notImplementedOperationError();
+ }
+}
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Images/loading.gif b/ieducar/modules/Portabilis/Assets/Images/loading.gif
new file mode 100644
index 0000000..2fd2bc4
Binary files /dev/null and b/ieducar/modules/Portabilis/Assets/Images/loading.gif differ
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/ClientApi.js b/ieducar/modules/Portabilis/Assets/Javascripts/ClientApi.js
new file mode 100644
index 0000000..23c2835
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/ClientApi.js
@@ -0,0 +1,117 @@
+var resourceUrlBuilder = {
+ buildUrl : function(urlBase, vars){
+
+ _vars = '';
+ for(varName in vars){
+ _vars += '&'+varName+'='+vars[varName];
+ }
+ return urlBase + '?' + _vars;
+ }
+};
+
+var getResourceUrlBuilder = {
+ buildUrl : function(urlBase, resourceName, additionalVars){
+ var vars = {
+ oper : 'get'
+ };
+
+ if (resourceName)
+ vars.resource = resourceName;
+
+ if (additionalVars)
+ vars = $j.extend(vars, additionalVars);
+
+ return resourceUrlBuilder.buildUrl(urlBase, vars);
+ }
+};
+
+var postResourceUrlBuilder = {
+ buildUrl : function(urlBase, resourceName, additionalVars){
+
+ var vars = {
+ oper : 'post'
+ };
+
+ if (resourceName)
+ vars.resource = resourceName;
+
+ if (additionalVars)
+ vars = $j.extend(vars, additionalVars);
+
+ return resourceUrlBuilder.buildUrl(urlBase, vars);
+ }
+};
+
+var putResourceUrlBuilder = {
+ buildUrl : function(urlBase, resourceName, additionalVars){
+
+ var vars = {
+ oper : 'put'
+ };
+
+ if (resourceName)
+ vars.resource = resourceName;
+
+ if (additionalVars)
+ vars = $j.extend(vars, additionalVars);
+
+ return resourceUrlBuilder.buildUrl(urlBase, vars);
+ }
+};
+
+var deleteResourceUrlBuilder = {
+ buildUrl : function(urlBase, resourceName, additionalVars){
+
+ var vars = {
+ oper : 'delete'
+ };
+
+ if (resourceName)
+ vars.resource = resourceName;
+
+ if (additionalVars)
+ vars = $j.extend(vars, additionalVars);
+
+ return resourceUrlBuilder.buildUrl(urlBase, vars);
+ }
+};
+
+var handleErrorOnGetResource = function(response){
+ alert('Erro ao obter recurso, detalhes:' + response.responseText);
+ safeLog(response);
+};
+
+var handleErrorOnPostResource = function(response){
+ handleMessages([{type : 'error', msg : 'Erro ao alterar recurso, detalhes:' + response.responseText}], '');
+ safeLog(response);
+};
+
+var handleErrorOnPutResource = function(response){
+ handleMessages([{type : 'error', msg : 'Erro ao alterar recurso, detalhes:' + response.responseText}], '');
+ safeLog(response);
+};
+
+function handleErrorOnDeleteResource(response){
+ handleMessages([{type : 'error', msg : 'Erro ao remover recurso, detalhes:' + response.responseText}], '');
+ safeLog(response);
+}
+
+var getResource = function(options, errorCallback) {
+ $j.ajax(options).error(errorCallback || handleErrorOnGetResource);
+};
+
+var getResources = function(options, errorCallback) {
+ getResource(options, errorCallback);
+};
+
+var postResource = function(options, errorCallback){
+ $j.ajax(options).error(errorCallback || handleErrorOnPostResource);
+};
+
+var putResource = function(options, errorCallback){
+ $j.ajax(options).error(errorCallback || handleErrorOnPutResource);
+};
+
+function deleteResource(options, errorCallback){
+ $j.ajax(options).error(errorCallback || handleErrorOnDeleteResource);
+}
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/MultipleSearch.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/MultipleSearch.js
new file mode 100644
index 0000000..ee73b10
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/MultipleSearch.js
@@ -0,0 +1,60 @@
+// multiple search input
+
+var defaultChosenOptions = {
+ no_results_text: "Sem resultados"
+};
+
+var defaultMultipleSearchOptions = {
+ // options that cannot be overwritten
+
+ get : function(optionName) { return optionsUtils.get(this, optionName) },
+ mergeWith : function(options) {
+ options = optionsUtils.merge(this, options);
+ options.chosenOptions = optionsUtils.merge(defaultChosenOptions, options.chosenOptions);
+
+ return options;
+ },
+
+ // options that must be overwritten
+ objectName : undefined,
+ attrName : undefined,
+ searchPath : undefined,
+
+ // options that can be overwritten
+ placeholder : safeUtf8Decode('Selecione as opções')
+};
+
+var multipleSearch = {
+ setup : function(options) {
+ options = defaultMultipleSearchOptions.mergeWith(options);
+ options.chosenOptions.url = options.get('searchPath');
+
+ var attrName = options.get('attrName');
+ if (attrName) { attrName = '_' + attrName; }
+
+ var $input = $j(buildId(options.get('objectName') + attrName));
+
+ // fixups for chosen
+ $input.attr('multiple', '');
+ $input.attr('data-placeholder', options.get('placeholder'));
+
+ // jquery scope
+ $input.chosen(options.get('chosenOptions'), multipleSearch.handleSearch);
+
+ // fixup to API receive all ids
+ $j("#deficiencias").attr('name', $j("#deficiencias").attr('name') + '[]');
+ }
+};
+
+var multipleSearchHelper = {
+ setup : function(objectName, attrName, searchPath, searchResourceOptions) {
+ var defaultOptions = {
+ searchPath : searchPath,
+ objectName : objectName,
+ attrName : attrName
+ };
+
+ var options = optionsUtils.merge(defaultOptions, searchResourceOptions);
+ multipleSearch.setup(options);
+ }
+};
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/MultipleSearchAjax.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/MultipleSearchAjax.js
new file mode 100644
index 0000000..99560aa
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/MultipleSearchAjax.js
@@ -0,0 +1,71 @@
+// multiple search ajax input
+
+var defaultAjaxChosenOptions = {
+ minTermLength : 1,
+ type: 'GET',
+ dataType: 'json',
+ url: '',
+ jsonTermKey: 'query'
+};
+
+
+var defaultMultipleSearchAjaxOptions = {
+ // options that cannot be overwritten
+
+ get : function(optionName) { return optionsUtils.get(this, optionName) },
+ mergeWith : function(options) {
+ options = optionsUtils.merge(this, options);
+ options.ajaxChosenOptions = optionsUtils.merge(defaultAjaxChosenOptions, options.ajaxChosenOptions);
+
+ return options;
+ },
+
+ // options that must be overwritten
+ objectName : undefined,
+ attrName : undefined,
+ searchPath : undefined
+};
+
+
+var multipleSearchAjax = {
+ handleSearch : function(dataResponse) {
+ var results = [];
+
+ $j.each(dataResponse.result, function (value, label) {
+ results.push({ value: value, text: label });
+ });
+
+ return results;
+ },
+
+ setup : function(options) {
+ options = defaultMultipleSearchAjaxOptions.mergeWith(options);
+ options.ajaxChosenOptions.url = options.get('searchPath');
+
+ var attrName = options.get('attrName');
+ if (attrName) { attrName = '_' + attrName; }
+
+ var $input = $j(buildId(options.get('objectName') + attrName));
+
+ // fixups for chosen
+ //$input.css('width', '430px');
+ $input.attr('multiple', '');
+
+ $input.ajaxChosen(options.get('ajaxChosenOptions'), multipleSearchAjax.handleSearch);
+ }
+};
+
+var multipleSearchAjaxHelper = {
+ setup : function(objectName, attrName, searchPath, searchResourceOptions) {
+ var defaultOptions = {
+ searchPath : searchPath,
+ objectName : objectName,
+ attrName : attrName
+ };
+
+ var options = optionsUtils.merge(defaultOptions, searchResourceOptions);
+ multipleSearchAjax.setup(options);
+ }
+};
+
+// # TODO implementar 'load' options
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/Resource/SimpleSearchAluno.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/Resource/SimpleSearchAluno.js
new file mode 100644
index 0000000..040b4ca
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/Resource/SimpleSearchAluno.js
@@ -0,0 +1,19 @@
+var simpleSearchAlunoOptions = {
+
+ params : {
+ escola_id : function() {
+ return $j('#ref_cod_escola').val()
+ },
+
+ },
+
+ canSearch : function() {
+
+ if (! $j('#ref_cod_escola').val()) {
+ alert('Selecione uma escola.');
+ return false;
+ }
+
+ return true;
+ }
+};
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/Resource/SimpleSearchMatricula.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/Resource/SimpleSearchMatricula.js
new file mode 100644
index 0000000..5572f3a
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/Resource/SimpleSearchMatricula.js
@@ -0,0 +1,27 @@
+var simpleSearchMatriculaOptions = {
+
+ params : {
+ escola_id : function() {
+ return $j('#ref_cod_escola').val()
+ },
+
+ ano : function() {
+ return $j('#ano').val()
+ }
+ },
+
+ canSearch : function() {
+
+ if (! $j('#ano').val()) {
+ alert('Informe o ano.');
+ return false;
+ }
+
+ if (! $j('#ref_cod_escola').val()) {
+ alert('Selecione uma escola.');
+ return false;
+ }
+
+ return true;
+ }
+};
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/SimpleSearch.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/SimpleSearch.js
new file mode 100644
index 0000000..08e61e3
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Inputs/SimpleSearch.js
@@ -0,0 +1,151 @@
+// simple search input
+
+var defaultJQueryAutocompleteOptions = {
+ minLength : 1,
+ autoFocus : true,
+ source : function(request, response) { return simpleSearch.search(this.element, request, response) },
+ select : function(event, ui) { return simpleSearch.handleSelect(event, ui) }
+
+ // options that can be overwritten
+ // change : function (event, ui) {},
+ // close : function (event, ui) {},
+};
+
+
+var defaultSimpleSearchOptions = {
+ // options that cannot be overwritten
+
+ get : function(optionName) { return optionsUtils.get(this, optionName) },
+ mergeWith : function(options) {
+ options = optionsUtils.merge(this, options);
+ options.autocompleteOptions = optionsUtils.merge(defaultJQueryAutocompleteOptions, options.autocompleteOptions);
+
+ return options;
+ },
+
+ // options that must be overwritten
+ objectName : undefined,
+ attrName : undefined,
+ searchPath : undefined,
+
+ // options that can be overwritten
+ placeholder : 'Informe um valor',
+
+ // additional search params to send to api
+ params : {},
+
+ // #TODO implementar validacao dependencia
+ // elements that presence is required to do the search
+ // requiresPresenceOf : [ /* $j('#someElement') */ ],
+
+ canSearch : function() { return true; }
+};
+
+
+var simpleSearch = {
+
+ /* API returns result as {value : label, value2, label2}
+ but jquery autocomplete, expects [{value : label}, {value : label}]
+ */
+ fixResult : function(result) {
+ var fixed = [];
+
+ $j.each(result, function(value, label) {
+ fixed.push({ value : value, label : label})
+ });
+
+ return fixed;
+ },
+
+ search : function(element, request, response) {
+ var $element = $j(element);
+
+ if ($element.data('simple-search-options').canSearch()) {
+ var hiddenInputId = $element.data('hidden-input-id');
+ var searchPath = $element.data('simple-search-options').searchPath;
+ var params = { query : request.term };
+
+ // inject additional params
+ $j.each($element.data('simple-search-options').params, function(name, value) {
+ params[name] = typeof value == 'function' ? value() : value;
+ });
+
+ // clear the hidden id, because it will be set when the user select another result.
+ $j(hiddenInputId).val('');
+
+ $j.get(searchPath, params, function(dataResponse) {
+ simpleSearch.handleSearch(dataResponse, response);
+ });
+ }
+ },
+
+ handleSearch : function(dataResponse, response) {
+ handleMessages(dataResponse['msgs']);
+
+ if (dataResponse.result) {
+ response(simpleSearch.fixResult(dataResponse.result));
+ }
+ },
+
+ handleSelect : function(event, ui) {
+ var $element = $j(event.target);
+ var hiddenInputId = $element.data('hidden-input-id');
+
+ $element.val(ui.item.label);
+ $j(hiddenInputId).val(ui.item.value);
+
+ return false;
+ },
+
+ /* limpa o texto dos inputs simple search, cujo hidden id é obrigatorio porem está vazio,
+ para que ao tentar gravar o formulário o campo de texto obrigatório (e vazio) seja validado
+ isto ocorre quando é informado qualquer valor, sem selecionar um resultado. */
+ fixupRequiredFieldsValidation : function() {
+ $j('input[type=hidden].simple-search-id.obrigatorio').each(function(index, element){
+ var $element = $j(element);
+
+ if (! $element.val())
+ $j(buildId($element.data('for'))).val('');
+ });
+ },
+
+ setup : function(options) {
+ options = defaultSimpleSearchOptions.mergeWith(options);
+
+ var attrName = options.get('attrName');
+ if (attrName) { attrName = '_' + attrName; }
+
+ var inputId = buildId(options.get('objectName') + attrName);
+ var hiddenInputId = buildId(options.get('objectName') + '_id');
+
+ var $input = $j(inputId);
+ var $hiddenInput = $j(hiddenInputId);
+
+ $input.data('simple-search-options', options);
+ $input.data('hidden-input-id', $hiddenInput);
+
+ $input.attr('placeholder', options.get('placeholder'));
+
+ $hiddenInput.addClass('simple-search-id');
+ $hiddenInput.attr('data-for', $input.attr('id'));
+
+ if ($input.hasClass('obrigatorio'))
+ $hiddenInput.addClass('obrigatorio required');
+
+ $input.autocomplete(options.get('autocompleteOptions'));
+ }
+};
+
+
+var simpleSearchHelper = {
+ setup : function(objectName, attrName, searchPath, searchResourceOptions) {
+ var defaultOptions = {
+ searchPath : searchPath,
+ objectName : objectName,
+ attrName : attrName
+ };
+
+ var options = optionsUtils.merge(defaultOptions, searchResourceOptions);
+ simpleSearch.setup(options);
+ }
+};
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Process.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Process.js
new file mode 100644
index 0000000..4968cdb
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Process.js
@@ -0,0 +1,262 @@
+// metodos e variaveis acessiveis por outros modulos
+
+
+// #TODO migrar para opcoes todas variaveis / funcoes subescritas nos scripts de cada controlador/action.
+var processOptions = {
+
+ // options that can be overwritten in child
+
+ validatesResourcesAfterSearch : true,
+};
+
+function removeImgLoadingFor($targetElement) {
+ $targetElement.siblings('img').remove();
+}
+
+
+function appendImgLoadingTo($targetElement) {
+ if ($targetElement.siblings('img').length < 1);
+ $j(' ').appendTo($targetElement.parent());
+}
+
+
+function beforeChangeResource($resourceElement) {
+ if ($resourceElement.is(':checkbox'))
+ $j('.disable-on-apply-changes').attr('disabled', 'disabled');
+
+ appendImgLoadingTo($resourceElement);
+}
+
+function afterChangeResource($resourceElement) {
+ if ($resourceElement.is(':checkbox'))
+ $resourceElement.attr('checked', false);
+
+ removeImgLoadingFor($resourceElement);
+ $j('.disable-on-apply-changes').removeAttr('disabled');
+
+ // change value of execute action button
+ $j('input.execute-action').val(POST_LABEL);
+ $j('input.delete').val(DELETE_LABEL);
+}
+
+function getFirstCheckboxChecked($targetElement) {
+ var $firstChecked = $j('input.'+RESOURCE_NAME+':checked:first');
+
+ if ($firstChecked.length < 1) {
+ handleMessages([{type : 'error', msg : 'Selecione algum '+RESOURCE_NAME+'.'}], $targetElement, true);
+ $firstChecked = undefined;
+ }
+
+ return $firstChecked;
+}
+
+function clearSearchResult() {
+ $navActions.html('');
+ $tableSearchDetails.children().remove();
+ $resultTable.children().fadeOut('fast').remove();
+
+ $j('.disable-on-search').attr('disabled', 'disabled');
+ $j('.hide-on-search').hide();
+ $j('.disable-on-apply-changes').removeAttr('disabled');
+}
+
+
+function showSearchForm(event) {
+ clearSearchResult()
+
+ $formFilter.fadeIn('fast', function() {
+ $(this).show()
+ });
+
+ //$actionButton.val(POST_LABEL);
+}
+
+// called before search resources
+function canSearch(){
+ return true;
+}
+
+
+function showNextSelectionButton() {
+}
+
+
+// vars
+
+var $formFilter = $j('#formcadastro');
+var $submitButton = $j('#botao_busca');
+
+var $tableSearchDetails = $j('').attr('id', 'search-details')
+ .addClass('styled')
+ .addClass('horizontal-expand')
+ .addClass('center')
+ .hide()
+ .prependTo($formFilter.parent());
+
+var $navActions = $j('
').attr('id', 'nav-actions');
+$navActions.insertAfter($tableSearchDetails);
+
+var $resultTable = $j('#form_resultado .tablelistagem').addClass('horizontal-expand');
+
+
+// metodos e variaveis não acessiveis por outros modulos
+
+(function($) {
+ $(document).ready(function() {
+ // prepare result table
+ $resultTable.children().remove();
+
+
+ // add action bars
+ $('
').attr('id', 'first-bar-action')
+ .attr('class', 'bar-action hide-on-search')
+ .prependTo($resultTable.parent());
+
+ $('
').attr('id', 'second-bar-action')
+ .attr('class', 'bar-action hide-on-search')
+ .appendTo($resultTable.parent());
+
+ var $barActions = $('.bar-action').hide();
+
+ $(' ').appendTo($barActions);
+
+ $(' ').val(POST_LABEL).appendTo($barActions);
+
+ $(' ').val(DELETE_LABEL).appendTo($barActions);
+
+ var $selectAllButton = $barActions.find('input.select-all');
+ var $actionButton = $barActions.find('input.execute-action');
+ var $deleteButton = $barActions.find('input.delete');
+
+ // add resource options table
+ var $resourceOptionsTable = $('#resource-options');
+ $resourceOptionsTable.find('tr:even').addClass('even');
+ $resourceOptionsTable.hide().prependTo($formFilter.parent());
+
+ // add orientations about search
+ $('
').html(SEARCH_ORIENTATION)
+ .addClass('center')
+ .attr('id', 'orientation-search')
+ .appendTo($resultTable.parent());
+
+ // before search changes
+ $('.disable-on-search').attr('disabled', 'disabled');
+ $('.hide-on-search').hide();
+
+
+ // functions, callbacks
+
+ function showNewSearchButton() {
+ $navActions.html(
+ $("Nova consulta ")
+ .bind('click', showSearchForm)
+ .attr('style', 'text-decoration: underline')
+ );
+ }
+
+ function showNewSearchActions() {
+ showNewSearchButton();
+ showNextSelectionButton();
+
+ $('.disable-on-search').removeAttr('disabled');
+ $('.hide-on-search').show();
+ }
+
+ // config search form
+ var searchOptions = {
+ url : '',
+ dataType : 'json',
+ success : _handleSearch,
+ error : handleSearchError
+ };
+
+ $formFilter.ajaxForm(searchOptions);
+
+
+ // submit button callbacks
+ var onClickSearchEvent = function(event) {
+ if (validatesPresenseOfValueInRequiredFields() && canSearch()) {
+ searchOptions.url = getResourceUrlBuilder.buildUrl(API_URL_BASE, RESOURCES_NAME, {});
+
+ if (window.history && window.history.pushState)
+ window.history.pushState('', '', getResourceUrlBuilder.buildUrl(PAGE_URL_BASE, RESOURCES_NAME));
+
+ $resultTable.children().fadeOut('fast').remove();
+
+ $formFilter.submit();
+ $formFilter.fadeOut('fast');
+ $navActions
+ .html('Aguarde, carregando...')
+ .attr('style', 'text-align:center;')
+ .unbind('click');
+ }
+ };
+
+
+ function _setTableSearchDetails(dataDetails) {
+ setTableSearchDetails($tableSearchDetails, dataDetails);
+ }
+
+
+ function _handleSearch(dataResponse) {
+ showNewSearchActions();
+
+ try{
+ handleMessages(dataResponse.msgs);
+ var resources = dataResponse[RESOURCES_NAME];
+
+ if(processOptions.validatesResourcesAfterSearch && ! $.isArray(resources)) {
+ $(' ')
+ .html('O(a)s '+ RESOURCES_NAME +' não poderam ser recuperado(a)s, verifique as mensagens de erro ou tente recarregar .')
+ .addClass('center')
+ .appendTo($(' ').appendTo($resultTable));
+ }
+ else if (processOptions.validatesResourcesAfterSearch && resources.length < 1) {
+ $(' ')
+ .html('Busca de '+ RESOURCES_NAME +' sem resultados.')
+ .addClass('center')
+ .appendTo($(' ').appendTo($resultTable));
+ }
+ else {
+ _setTableSearchDetails(dataResponse['details']);
+ handleSearch($resultTable, dataResponse);
+ }
+ }
+ catch(error) {
+ showNewSearchActions();
+
+ handleMessages([{type : 'error', msg : 'Ocorreu um erro ao exibir o recurso '+ RESOURCES_NAME +', por favor tente novamente, detalhes: ' + error}], '');
+
+ safeLog('Error details:');
+ safeLog(error);
+
+ safeLog('dataResponse details:');
+ safeLog(dataResponse);
+
+ throw error;
+ }
+ }
+
+
+ function handleSearchError(response) {
+ showNewSearchButton();
+
+ handleMessages([{type : 'error', msg : 'Ocorreu um erro ao carregar o recurso '+ RESOURCES_NAME +', por favor tente novamente, detalhes:' + response.responseText}], '');
+
+ safeLog('response details:');
+ safeLog(response);
+ }
+
+ $submitButton.val('Carregar');
+ $submitButton.attr('onclick', '');
+
+ // bind events
+ $submitButton.click(onClickSearchEvent);
+
+ onClickSelectAllEvent ? $selectAllButton.click(onClickSelectAllEvent) : $selectAllButton.hide();
+ onClickActionEvent ? $actionButton.click(onClickActionEvent) : $actionButton.hide();
+ onClickDeleteEvent ? $deleteButton.click(onClickDeleteEvent) : $deleteButton.hide();
+
+ fixupFieldsWidth();
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Resource.js b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Resource.js
new file mode 100644
index 0000000..fe49aec
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Frontend/Resource.js
@@ -0,0 +1,223 @@
+// metodos e variaveis acessiveis por outros modulos
+
+var $submitButton = $j('#btn_enviar');
+var $deleteButton = $j('.botaolistagem[value=" Excluir "]');
+
+var resource = {
+ // options that cannot be overwritten
+
+ get : function(optionName) { return optionsUtils.get(this, optionName) },
+
+ url : function(id) {
+ var url = window.location.href.split("?")[0]
+
+ if (id != undefined)
+ url += '?id=' + id;
+
+ return url;
+ },
+
+ isNew : function() { return this.id() == undefined },
+
+ id : function(){
+ var id;
+
+ if (window.location.search.indexOf('id=') > -1) {
+ id = window.location.search.split('id=');
+ id = id[id.length - 1];
+ }
+
+ return id;
+ }
+};
+
+var resourceOptions = {
+ // options that cannot be overwritten in child
+
+ get : function(optionName) { return optionsUtils.get(this, optionName) },
+
+ // options that can be overwritten in child
+
+ form : $j('#formcadastro'),
+
+ apiUrlBase : function() { return '/module/Api/' + resourceOptions.get('name')() },
+
+ name : function() {
+ var name = window.location.pathname.split('/');
+ name = name[name.length - 1];
+
+ return name.toLowerCase();
+ },
+
+ handlePost : function(dataResponse) {
+ },
+
+ _handlePost : function(dataResponse) {
+ if (dataResponse.id) {
+ if (window.history && window.history.pushState)
+ window.history.pushState('', '', window.location.href.split("?")[0] + "?id=" + dataResponse.id);
+ }
+
+ resourceOptions.handlePost(dataResponse);
+ },
+
+ handlePut : function(dataResponse) {
+ },
+
+
+ handleGet : function(dataResponse) {
+ throw new Error('The function resourceOptions.handleGet must be overwritten!');
+ },
+
+
+ handleEnable : function(dataResponse) {
+ handleMessages(dataResponse.msgs);
+ $resourceNotice.slideUp('fast');
+ $submitButton.removeAttr('disabled').show();
+ $deleteButton.removeAttr('disabled').show();
+ },
+
+
+ handleDelete : function(dataResponse) {
+ handleMessages(dataResponse.msgs);
+ // reload resource
+ resourceOptions.getResource(resource.id());
+ },
+
+ getResource : function(id) {
+ var additionalVars = {
+ id : id
+ };
+
+ var options = {
+ url : getResourceUrlBuilder.buildUrl(resourceOptions.apiUrlBase(), resourceOptions.get('name')(), additionalVars),
+ dataType : 'json',
+ success : this.handleGet
+ };
+
+ getResource(options);
+ },
+
+ deleteResource : function() {
+ if (confirm(stringUtils.toUtf8('Confirma remoção do cadastro?'))) {
+ var additionalVars = {
+ id : resource.id()
+ };
+
+ var options = {
+ url : deleteResourceUrlBuilder.buildUrl(resourceOptions.apiUrlBase(), resourceOptions.get('name')(), additionalVars),
+ dataType : 'json',
+ success : resourceOptions.handleDelete
+ };
+
+ deleteResource(options);
+ }
+ },
+
+ enable : function() {
+ if (confirm(stringUtils.toUtf8('Confirma reativação do cadastro?'))) {
+ var additionalVars = {
+ id : resource.id(),
+ oper : 'enable'
+ };
+
+ var options = {
+ url : postResourceUrlBuilder.buildUrl(resourceOptions.apiUrlBase(), resourceOptions.get('name')(), additionalVars),
+ dataType : 'json',
+ success : resourceOptions.handleEnable
+ };
+
+ postResource(options);
+ }
+ }
+};
+
+
+// metodos e variaveis não acessiveis por outros modulos
+
+(function($) {
+ $(document).ready(function() {
+
+ // config resource form
+ var submitOptions = {
+ url : '',
+ dataType : 'json',
+ success : handleSuccess,
+ error : handleError
+ };
+
+ resourceOptions.form.ajaxForm(submitOptions);
+
+
+ // submit button callbacks
+ var submitForm = function(event) {
+ if (validationUtils.validatesFields()) {
+ var urlBuilder;
+ var additionalVars = {};
+
+ if (resource.isNew())
+ urlBuilder = postResourceUrlBuilder;
+ else {
+ urlBuilder = putResourceUrlBuilder;
+ additionalVars.id = resource.id();
+ }
+
+ submitOptions.url = urlBuilder.buildUrl(resourceOptions.get('apiUrlBase')(),
+ resourceOptions.get('name')(),
+ additionalVars);
+
+ resourceOptions.form.submit();
+ }
+ };
+
+
+ function handleSuccess(dataResponse) {
+ try {
+ handleMessages(dataResponse.msgs, 'btn_enviar');
+
+ if(! dataResponse.any_error_msg && ! dataResponse[resourceOptions.get('name')()] && ! dataResponse.id)
+ throw new Error('A API não retornou o recurso nem seu id.');
+
+ if (resource.isNew())
+ resourceOptions.get('_handlePost')(dataResponse);
+ else
+ resourceOptions.get('handlePut')(dataResponse);
+ }
+ catch(error) {
+ handleMessages([{type : 'error', msg : 'Erro ao realizar operação, por favor tente novamente, detalhes: ' + error}], '');
+
+ safeLog('Error details:');
+ safeLog(error);
+
+ safeLog('dataResponse details:');
+ safeLog(dataResponse);
+
+ throw error;
+ }
+ }
+
+
+ function handleError(response) {
+ handleMessages([{type : 'error', msg : 'Erro ao realizar operação, por favor tente novamente, detalhes:' + response.responseText}], '');
+
+ safeLog('response details:');
+ safeLog(response);
+ }
+
+ $submitButton.val('Gravar');
+ $deleteButton.hide().attr('disabled', 'disabled');
+
+ // unbind events
+ $submitButton.removeAttr('onclick');
+ $deleteButton.removeAttr('onclick');
+ resourceOptions.form.removeAttr('onsubmit');
+
+ // bind events
+ $submitButton.click(submitForm);
+ $deleteButton.click(resourceOptions.deleteResource);
+
+ if (! resource.isNew())
+ resourceOptions.getResource(resource.id());
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Utils.js b/ieducar/modules/Portabilis/Assets/Javascripts/Utils.js
new file mode 100644
index 0000000..43a6e61
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Utils.js
@@ -0,0 +1,291 @@
+
+// jquery utils
+
+function buildId(id) {
+ return typeof(id) == 'string' && id.length > 0 && id[0] != '#' ? '#' + id : id;
+}
+
+
+// console utils
+
+function safeLog(value) {
+ if(typeof(console) != 'undefined' && typeof(console.log) == 'function')
+ console.log(value);
+}
+
+
+// form utils
+
+var formUtils = {
+ submit : function(form) {
+
+ if (form == undefined)
+ form = $j('form:first');
+
+ form.removeAttr('onsubmit');
+
+ if (validationUtils.validatesFields())
+ form.submit();
+ }
+};
+
+function fixupFieldsWidth(additionalFields, force){
+ if (! $j(document).data('fixed-fields-width') || force) {
+ var maxWidth = 0;
+ var $fields = $j('form select');
+
+ if (additionalFields)
+ $j.merge($fields, additionalFields);
+
+ //get maxWidh
+ $j.each($fields, function(index, field){
+ $field = $j(field);
+ if ($field.outerWidth() > maxWidth)
+ maxWidth = $field.outerWidth();
+ });
+
+ //set maxWidth
+ $j.each($fields, function(index, field){
+ $j(field).width(maxWidth);
+ });
+
+ $j(document).data('fixed-fields-width', true);
+ }
+ else
+ safeLog('fixupFieldsWidth already called, skipping!');
+};
+
+
+// options (hash) utils
+
+var optionsUtils = {
+ get : function(options, optionName) {
+ var value = options[optionName];
+
+ if (typeof value == 'undefined')
+ throw new Error("Option '" + optionName + "' not defined in simpleSearchOptions.");
+
+ return value;
+ },
+
+ merge : function(defaultOptions, options) {
+ if (typeof options == 'undefined')
+ options = {};
+
+ return $j.extend({}, defaultOptions, options);
+ }
+};
+
+// key-value object (hash) utils
+
+var objectUtils = {
+ length : function(hash) {
+ return Object.getOwnPropertyNames(hash).length;
+ },
+
+ join : function(object, glue, separator) {
+ if (glue == undefined)
+ glue = '=';
+
+ if (separator == undefined)
+ separator = ' ';
+
+ return $j.map(Object.getOwnPropertyNames(object), function(k) { return [k, object[k]].join(glue) }).join(separator)
+ }
+};
+
+// window utils
+
+var windowUtils = {
+
+ // open a new window, for more information see developer.mozilla.org/en-US/docs/DOM/window.open
+ open : function(url, name, options) {
+ var defaultOptions = {
+ name : 'new_window',
+ options : {}
+ };
+
+ var defaultWindowOptions = {
+ top : 0,
+ left : 0,
+ height : $j(window).height(),
+ width : $j(window).width(),
+
+ resizable : 'yes',
+ scrollbars : 'yes',
+
+ menubar : 'no',
+ toolbar : 'no',
+ location : 'no',
+ personalbar : 'no',
+ status : 'no'
+ };
+
+ options = optionsUtils.merge(defaultOptions, options);
+ options.options = optionsUtils.merge(defaultWindowOptions, options.options);
+
+ window.open(url, options.name, objectUtils.join(options.options)).focus();
+ }
+};
+
+// string utils
+
+var stringUtils = {
+ toUtf8 : function(s) {
+ try {
+ s = decodeURIComponent(escape(s));
+ }
+ catch(e) {
+ safeLog('Erro ao decodificar string utf8: ' + s);
+ }
+
+ return s;
+ }
+};
+
+// #TODO migrar restante funcoes string utils para hash stringUtils / migrar referencias a estas.
+
+function safeToUpperCase(value) {
+ if (typeof(value) == 'string')
+ value = value.toUpperCase();
+
+ return value;
+}
+
+
+function safeToLowerCase(value) {
+ if (typeof(value) == 'string')
+ value = value.toLowerCase();
+
+ return value;
+}
+
+
+function safeCapitalize(value) {
+ if (typeof(value) == 'string') {
+ value = value.toLowerCase();
+ var words = value.split(' ');
+
+ $j.each(words, function(index, word){
+ words[index] = word.substr(0, 1).toUpperCase() + word.substr(1);
+ });
+
+ value = words.join(' ');
+ }
+
+ return value;
+}
+
+
+function safeSort(values) {
+ try{
+ var sortedValues = values.sort(function(a, b) {
+ if (typeof(a) == 'string' && typeof(b) == 'string')
+ var isGreaterThan = a.toLowerCase() > b.toLowerCase();
+ else
+ var isGreaterThan = a > b;
+
+ return isGreaterThan ? 1 : -1;
+ });
+ return sortedValues;
+ }
+ catch(e) {
+ safeLog('Erro ao ordenar valores: ' + e);
+ safeLog(values);
+ return values;
+ }
+}
+
+
+function safeUtf8Decode(s) {
+ return stringUtils.toUtf8(s);
+}
+
+// feedback messages
+
+// #TODO migrar todas referencias de "handleMessages([{type*" para "messageUtils."
+
+var messageUtils = {
+ error : function(msg, targetId) {
+ handleMessages([{type : 'error', msg : safeUtf8Decode(msg)}], targetId);
+ },
+
+ success : function(msg, targetId) {
+ handleMessages([{type : 'success', msg : safeUtf8Decode(msg)}], targetId);
+ },
+
+ notice : function(msg, targetId) {
+ handleMessages([{type : 'notice', msg : safeUtf8Decode(msg)}], targetId);
+ }
+};
+
+function handleMessages(messages, targetId, useDelayClassRemoval) {
+
+ var $feedbackMessages = $j('#feedback-messages');
+ var hasErrorMessages = false;
+ var hasSuccessMessages = false;
+ var hasNoticeMessages = false;
+ var delayClassRemoval = 20000;
+
+ var $targetElement = buildId(targetId);
+ var $targetElement = $j($targetElement);
+
+ for (var i = 0; i < messages.length; i++) {
+ if (messages[i].type == 'success')
+ var delay = 5000;
+ else if (messages[i].type != 'error')
+ var delay = 10000;
+ else
+ var delay = 20000;
+
+ $j('
').hide()
+ .addClass(messages[i].type)
+ .html(safeUtf8Decode(messages[i].msg))
+ .appendTo($feedbackMessages)
+ .fadeIn()
+ .delay(delay)
+ .fadeOut(function() { $j(this).remove() })
+ .data('target_id', targetId);
+
+ if (! hasErrorMessages && messages[i].type == 'error')
+ hasErrorMessages = true;
+ else if(! hasSuccessMessages && messages[i].type == 'success')
+ hasSuccessMessages = true;
+ else if(! hasNoticeMessages && messages[i].type == 'notice')
+ hasNoticeMessages = true;
+ }
+
+ if($targetElement) {
+ if (hasErrorMessages) {
+ $targetElement.addClass('error').removeClass('success').removeClass('notice');
+ $targetElement.first().focus();
+ }
+
+ else if (hasSuccessMessages)
+ $targetElement.addClass('success').removeClass('error').removeClass('notice');
+
+ else if (hasNoticeMessages)
+ $targetElement.addClass('notice').removeClass('error').removeClass('sucess');
+
+ else
+ $targetElement.removeClass('success').removeClass('error').removeClass('notice');
+
+ if (useDelayClassRemoval) {
+ window.setTimeout(function() {
+ $targetElement.removeClass('success').removeClass('error').removeClass('notice');
+ }, delayClassRemoval);
+ }
+ }
+}
+
+
+// when page is ready
+
+(function($) {
+ $(document).ready(function() {
+
+ // add div for feedback messages
+ $j('
').attr('id', 'feedback-messages').appendTo($j('form').last().parent());
+
+ }); // ready
+})(jQuery);
diff --git a/ieducar/modules/Portabilis/Assets/Javascripts/Validator.js b/ieducar/modules/Portabilis/Assets/Javascripts/Validator.js
new file mode 100644
index 0000000..3c42025
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Javascripts/Validator.js
@@ -0,0 +1,102 @@
+
+// #TODO rename this file to Validation.js and move functions validates* to object validationUtils
+
+var validationUtils = {
+ validatesDate : function(date) {
+ return /(((0[1-9]|[12][0-9])\/(02))|((0[1-9]|[12][0-9]|(30))\/(0[4689]|(11)))|((0[1-9]|[12][0-9]|3[01])\/(0[13578]|(10)|(12))))\/[1-2][0-9]{3}/.test(date);
+ },
+
+ validatesDateFields : function() {
+ var allValid = true;
+ var fields = $j("input[id^='data_'][value!=''], input[id^='dt_'][value!='']");
+
+ $j.each(fields, function(index, field) {
+ allValid = validationUtils.validatesDate(field.value);
+ });
+
+ if (! allValid)
+ messageUtils.error('Informe a data corretamente.', fields.first());
+
+ return allValid;
+ },
+
+ validatesFields : function (){
+ return validatesPresenseOfValueInRequiredFields() &&
+ validationUtils.validatesDateFields();
+ }
+};
+
+function validatesPresenseOfValueInRequiredFields(additionalFields, exceptFields) {
+ var $emptyFields = [];
+ requiredFields = document.getElementsByClassName('obrigatorio');
+
+ if (additionalFields)
+ requiredFields = $j.merge(requiredFields, additionalFields);
+
+ if (typeof(simpleSearch) != 'undefined' && typeof(simpleSearch.fixupRequiredFieldsValidation) == 'function')
+ simpleSearch.fixupRequiredFieldsValidation();
+
+ for (var i = 0; i < requiredFields.length; i++) {
+ var $requiredField = $j(requiredFields[i]);
+
+ if ($requiredField.length > 0 &&
+ /*$requiredField.css('display') != 'none' &&*/
+ $requiredField.is(':visible') &&
+ $requiredField.is(':enabled') &&
+ $requiredField.val() == '' &&
+ $j.inArray($requiredField[0], exceptFields) < 0) {
+
+ $emptyFields.push($requiredField);
+
+ if (! $requiredField.hasClass('error'))
+ $requiredField.addClass('error');
+ }
+ else if ($requiredField.length > 0)
+ $requiredField.removeClass('error');
+ }
+
+ if ($emptyFields.length == 0)
+ return true;
+
+ alert('Preencha os campos obrigat\u00F3rios, antes de continuar.');
+ $emptyFields.first().focus();
+ return false;
+}
+
+
+function validatesIfValueIsInSet(value, targetId, set) {
+ if (objectUtils.length(set) > 0 && set[value] == undefined) {
+ var s = [];
+
+ $j.each(set, function(index, value) {
+ s.push(value);
+ });
+
+ s = safeSort(s);
+ messageUtils.error('Informe um valor que pertença ao conjunto: ' + s.join(', '), targetId);
+
+ return false;
+ }
+
+ return true;
+}
+
+
+function validatesIfValueIsNumeric(value, targetId) {
+ if (! $j.isNumeric(value)) {
+ messageUtils.error('Informe um numero válido.', targetId);
+ return false;
+ }
+
+ return true;
+}
+
+
+function validatesIfNumericValueIsInRange(value, targetId, initialRange, finalRange) {
+ if (! $j.isNumeric(value) || value < initialRange || value > finalRange) {
+ messageUtils.error('Informe um valor entre ' + initialRange + ' e ' + finalRange, targetId);
+ return false;
+ }
+
+ return true;
+}
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/AjaxChosen/ajax-chosen.js b/ieducar/modules/Portabilis/Assets/Plugins/AjaxChosen/ajax-chosen.js
new file mode 100644
index 0000000..63d220c
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Plugins/AjaxChosen/ajax-chosen.js
@@ -0,0 +1,125 @@
+// Generated by CoffeeScript 1.4.0
+
+(function($) {
+ return $.fn.ajaxChosen = function(settings, callback, chosenOptions) {
+ var chosenXhr, defaultOptions, options, select;
+ if (settings == null) {
+ settings = {};
+ }
+ if (callback == null) {
+ callback = {};
+ }
+ if (chosenOptions == null) {
+ chosenOptions = function() {};
+ }
+ defaultOptions = {
+ minTermLength: 3,
+ afterTypeDelay: 500,
+ jsonTermKey: "term",
+ keepTypingMsg: "Keep typing...",
+ lookingForMsg: "Looking for"
+ };
+ select = this;
+ chosenXhr = null;
+ options = $.extend({}, defaultOptions, $(select).data(), settings);
+ this.chosen(chosenOptions ? chosenOptions : {});
+ return this.each(function() {
+ return $(this).next('.chzn-container').find(".search-field > input, .chzn-search > input").bind('keyup', function() {
+ var field, msg, success, untrimmed_val, val;
+ untrimmed_val = $(this).attr('value');
+ val = $.trim($(this).attr('value'));
+ msg = val.length < options.minTermLength ? options.keepTypingMsg : options.lookingForMsg + (" '" + val + "'");
+ select.next('.chzn-container').find('.no-results').text(msg);
+ if (val === $(this).data('prevVal')) {
+ return false;
+ }
+ $(this).data('prevVal', val);
+ if (this.timer) {
+ clearTimeout(this.timer);
+ }
+ if (val.length < options.minTermLength) {
+ return false;
+ }
+ field = $(this);
+ if (!(options.data != null)) {
+ options.data = {};
+ }
+ options.data[options.jsonTermKey] = val;
+ if (options.dataCallback != null) {
+ options.data = options.dataCallback(options.data);
+ }
+ success = options.success;
+ options.success = function(data) {
+ var items, nbItems, selected_values;
+ if (!(data != null)) {
+ return;
+ }
+ selected_values = [];
+ select.find('option').each(function() {
+ if (!$(this).is(":selected")) {
+ return $(this).remove();
+ } else {
+ return selected_values.push($(this).val() + "-" + $(this).text());
+ }
+ });
+ select.find('optgroup:empty').each(function() {
+ return $(this).remove();
+ });
+ items = callback(data);
+ nbItems = 0;
+ $.each(items, function(i, element) {
+ var group, text, value;
+ nbItems++;
+ if (element.group) {
+ group = select.find("optgroup[label='" + element.text + "']");
+ if (!group.size()) {
+ group = $(" ");
+ }
+ group.attr('label', element.text).appendTo(select);
+ return $.each(element.items, function(i, element) {
+ var text, value;
+ if (typeof element === "string") {
+ value = i;
+ text = element;
+ } else {
+ value = element.value;
+ text = element.text;
+ }
+ if ($.inArray(value + "-" + text, selected_values) === -1) {
+ return $(" ").attr('value', value).html(text).appendTo(group);
+ }
+ });
+ } else {
+ if (typeof element === "string") {
+ value = i;
+ text = element;
+ } else {
+ value = element.value;
+ text = element.text;
+ }
+ if ($.inArray(value + "-" + text, selected_values) === -1) {
+ return $(" ").attr('value', value).html(text).appendTo(select);
+ }
+ }
+ });
+ if (nbItems) {
+ select.trigger("liszt:updated");
+ } else {
+ select.data().chosen.no_results_clear();
+ select.data().chosen.no_results(field.attr('value'));
+ }
+ if (success != null) {
+ success(data);
+ }
+ return field.attr('value', untrimmed_val);
+ };
+ return this.timer = setTimeout(function() {
+ if (chosenXhr) {
+ chosenXhr.abort();
+ }
+ return chosenXhr = $.ajax(options);
+ }, options.afterTypeDelay);
+ });
+ });
+ };
+})(jQuery);
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/AjaxChosen/ajax-chosen.min.js b/ieducar/modules/Portabilis/Assets/Plugins/AjaxChosen/ajax-chosen.min.js
new file mode 100644
index 0000000..a22aac0
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Plugins/AjaxChosen/ajax-chosen.min.js
@@ -0,0 +1,17 @@
+
+(function($){return $.fn.ajaxChosen=function(settings,callback,chosenOptions){var chosenXhr,defaultOptions,options,select;if(settings==null){settings={};}
+if(callback==null){callback={};}
+if(chosenOptions==null){chosenOptions=function(){};}
+defaultOptions={minTermLength:3,afterTypeDelay:500,jsonTermKey:"term",keepTypingMsg:"Keep typing...",lookingForMsg:"Looking for"};select=this;chosenXhr=null;options=$.extend({},defaultOptions,$(select).data(),settings);this.chosen(chosenOptions?chosenOptions:{});return this.each(function(){return $(this).next('.chzn-container').find(".search-field > input, .chzn-search > input").bind('keyup',function(){var field,msg,success,untrimmed_val,val;untrimmed_val=$(this).attr('value');val=$.trim($(this).attr('value'));msg=val.length ");}
+group.attr('label',element.text).appendTo(select);return $.each(element.items,function(i,element){var text,value;if(typeof element==="string"){value=i;text=element;}else{value=element.value;text=element.text;}
+if($.inArray(value+"-"+text,selected_values)===-1){return $(" ").attr('value',value).html(text).appendTo(group);}});}else{if(typeof element==="string"){value=i;text=element;}else{value=element.value;text=element.text;}
+if($.inArray(value+"-"+text,selected_values)===-1){return $(" ").attr('value',value).html(text).appendTo(select);}}});if(nbItems){select.trigger("liszt:updated");}else{select.data().chosen.no_results_clear();select.data().chosen.no_results(field.attr('value'));}
+if(success!=null){success(data);}
+return field.attr('value',untrimmed_val);};return this.timer=setTimeout(function(){if(chosenXhr){chosenXhr.abort();}
+return chosenXhr=$.ajax(options);},options.afterTypeDelay);});});};})(jQuery);
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/Chosen/LICENSE.md b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/LICENSE.md
new file mode 100644
index 0000000..80109bb
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/LICENSE.md
@@ -0,0 +1,24 @@
+# Chosen, a Select Box Enhancer for jQuery and Protoype
+## by Patrick Filler for [Harvest](http://getharvest.com)
+
+Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
+
+Copyright (c) 2011 by Harvest
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen-sprite.png b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen-sprite.png
new file mode 100644
index 0000000..3611ae4
Binary files /dev/null and b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen-sprite.png differ
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen-sprite@2x.png b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen-sprite@2x.png
new file mode 100644
index 0000000..ffe4d7d
Binary files /dev/null and b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen-sprite@2x.png differ
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen.css b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen.css
new file mode 100644
index 0000000..8f6db26
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen.css
@@ -0,0 +1,413 @@
+/* @group Base */
+.chzn-container {
+ font-size: 13px;
+ position: relative;
+ display: inline-block;
+ zoom: 1;
+ *display: inline;
+}
+.chzn-container .chzn-drop {
+ background: #fff;
+ border: 1px solid #aaa;
+ border-top: 0;
+ position: absolute;
+ top: 29px;
+ left: 0;
+ -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+ -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
+ box-shadow : 0 4px 5px rgba(0,0,0,.15);
+ z-index: 1010;
+}
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+ background-color: #ffffff;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+ background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ -webkit-border-radius: 5px;
+ -moz-border-radius : 5px;
+ border-radius : 5px;
+ -moz-background-clip : padding;
+ -webkit-background-clip: padding-box;
+ background-clip : padding-box;
+ border: 1px solid #aaaaaa;
+ -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+ -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+ box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ position: relative;
+ height: 23px;
+ line-height: 24px;
+ padding: 0 0 0 8px;
+ color: #444444;
+ text-decoration: none;
+}
+.chzn-container-single .chzn-default {
+ color: #999;
+}
+.chzn-container-single .chzn-single span {
+ margin-right: 26px;
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ -o-text-overflow: ellipsis;
+ -ms-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+ display: block;
+ position: absolute;
+ right: 26px;
+ top: 6px;
+ width: 12px;
+ height: 12px;
+ font-size: 1px;
+ background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+ background-position: -42px -10px;
+}
+.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+ background-position: -42px -10px;
+}
+.chzn-container-single .chzn-single div {
+ position: absolute;
+ right: 0;
+ top: 0;
+ display: block;
+ height: 100%;
+ width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+ background: url('chosen-sprite.png') no-repeat 0px 2px;
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+.chzn-container-single .chzn-search {
+ padding: 3px 4px;
+ position: relative;
+ margin: 0;
+ white-space: nowrap;
+ z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+ background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+ margin: 1px 0;
+ padding: 4px 20px 4px 5px;
+ outline: 0;
+ border: 1px solid #aaa;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+.chzn-container-single .chzn-drop {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius : 0 0 4px 4px;
+ border-radius : 0 0 4px 4px;
+ -moz-background-clip : padding;
+ -webkit-background-clip: padding-box;
+ background-clip : padding-box;
+}
+/* @end */
+
+.chzn-container-single-nosearch .chzn-search input {
+ position: absolute;
+ left: -9000px;
+}
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+ background-color: #fff;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+ border: 1px solid #aaa;
+ margin: 0;
+ padding: 0;
+ cursor: text;
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ position: relative;
+}
+.chzn-container-multi .chzn-choices li {
+ float: left;
+ list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+ white-space: nowrap;
+ margin: 0;
+ padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+ color: #666;
+ background: transparent !important;
+ border: 0 !important;
+ font-family: sans-serif;
+ font-size: 100%;
+ height: 15px;
+ padding: 5px;
+ margin: 1px 0;
+ outline: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow : none;
+ box-shadow : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+ color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+ -webkit-border-radius: 3px;
+ -moz-border-radius : 3px;
+ border-radius : 3px;
+ -moz-background-clip : padding;
+ -webkit-background-clip: padding-box;
+ background-clip : padding-box;
+ background-color: #e4e4e4;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ color: #333;
+ border: 1px solid #aaaaaa;
+ line-height: 13px;
+ padding: 3px 20px 3px 5px;
+ margin: 3px 0 3px 5px;
+ position: relative;
+ cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
+ background-color: #e4e4e4;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ color: #666;
+ border: 1px solid #cccccc;
+ padding-right: 5px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+ background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+ display: block;
+ position: absolute;
+ right: 3px;
+ top: 4px;
+ width: 12px;
+ height: 12px;
+ font-size: 1px;
+ background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+ background-position: -42px -10px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+ background-position: -42px -10px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+ margin: 0 4px 4px 0;
+ max-height: 240px;
+ padding: 0 0 0 4px;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.chzn-container-multi .chzn-results {
+ margin: -1px 0 0;
+ padding: 0;
+}
+.chzn-container .chzn-results li {
+ display: none;
+ line-height: 15px;
+ padding: 5px 6px;
+ margin: 0;
+ list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+ cursor: pointer;
+ display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+ background-color: #3875d7;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+ background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+ background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+ background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+ background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+ color: #fff;
+}
+.chzn-container .chzn-results li em {
+ background: #feffde;
+ font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+ background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+ background: #f4f4f4;
+ display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+ cursor: default;
+ color: #999;
+ font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+ padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+ display: none;
+}
+.chzn-container .chzn-results-scroll {
+ background: white;
+ margin: 0 4px;
+ position: absolute;
+ text-align: center;
+ width: 321px; /* This should by dynamic with js */
+ z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+ display: inline-block;
+ height: 17px;
+ text-indent: -5000px;
+ width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+ bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+ background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+ background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active */
+.chzn-container-active .chzn-single {
+ -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+ -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
+ box-shadow : 0 0 5px rgba(0,0,0,.3);
+ border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-single-with-drop {
+ border: 1px solid #aaa;
+ -webkit-box-shadow: 0 1px 0 #fff inset;
+ -moz-box-shadow : 0 1px 0 #fff inset;
+ box-shadow : 0 1px 0 #fff inset;
+ background-color: #eee;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+ background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+ background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+ background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+ background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+ -webkit-border-bottom-left-radius : 0;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-bottomleft : 0;
+ -moz-border-radius-bottomright: 0;
+ border-bottom-left-radius : 0;
+ border-bottom-right-radius: 0;
+}
+.chzn-container-active .chzn-single-with-drop div {
+ background: transparent;
+ border-left: none;
+}
+.chzn-container-active .chzn-single-with-drop div b {
+ background-position: -18px 2px;
+}
+.chzn-container-active .chzn-choices {
+ -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+ -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
+ box-shadow : 0 0 5px rgba(0,0,0,.3);
+ border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+ color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+ cursor: default;
+ opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+ cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+ cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+ left: 26px;
+ right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
+.chzn-rtl .chzn-search input {
+ background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+ padding: 4px 5px 4px 20px;
+ direction: rtl;
+}
+.chzn-container-single.chzn-rtl .chzn-single div b {
+ background-position: 6px 2px;
+}
+.chzn-container-single.chzn-rtl .chzn-single-with-drop div b {
+ background-position: -12px 2px;
+}
+/* @end */
+
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
+ .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
+ background-image: url('chosen-sprite@2x.png') !important;
+ background-repeat: no-repeat !important;
+ background-size: 52px 37px !important;
+ }
+}
+/* @end */
diff --git a/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen.jquery.min.js b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen.jquery.min.js
new file mode 100644
index 0000000..0b6d1ff
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Plugins/Chosen/chosen.jquery.min.js
@@ -0,0 +1,10 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+//
+// Version 0.9.11
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+(function(){var e;e=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return e.nodeName.toUpperCase()==="OPTGROUP"?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,n,r,i,s,o;t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,children:0,disabled:e.disabled}),s=e.childNodes,o=[];for(r=0,i=s.length;r"+e.html+"")},e.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.keyup_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale();switch(t){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:e.preventDefault();if(this.results_showing)return this.result_select(e);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},e.prototype.generate_field_id=function(){var e;return e=this.generate_random_id(),this.form_field.id=e,e},e.prototype.generate_random_char=function(){var e,t,n;return e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",n=Math.floor(Math.random()*e.length),t=e.substring(n,n+1)},e}(),t.AbstractChosen=e}.call(this),function(){var e,t,n,r,i={}.hasOwnProperty,s=function(e,t){function r(){this.constructor=e}for(var n in t)i.call(t,n)&&(e[n]=t[n]);return r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype,e};r=this,e=jQuery,e.fn.extend({chosen:function(n){return e.browser.msie&&(e.browser.version==="6.0"||e.browser.version==="7.0"&&document.documentMode===7)?this:this.each(function(r){var i;i=e(this);if(!i.hasClass("chzn-done"))return i.data("chosen",new t(this,n))})}}),t=function(t){function i(){return i.__super__.constructor.apply(this,arguments)}return s(i,t),i.prototype.setup=function(){return this.form_field_jq=e(this.form_field),this.current_value=this.form_field_jq.val(),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},i.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},i.prototype.set_up_html=function(){var t,r,i,s,o,u;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/[^\w]/g,"_"):this.generate_field_id(),this.container_id+="_chzn",t=["chzn-container"],t.push("chzn-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&t.push(this.form_field.className),this.is_rtl&&t.push("chzn-rtl"),this.f_width=this.form_field_jq.outerWidth(),i={id:this.container_id,"class":t.join(" "),style:"width: "+this.f_width+"px;",title:this.form_field.title},r=e("
",i),this.is_multiple?r.html(''):r.html(''+this.default_text+'
'),this.form_field_jq.hide().after(r),this.container=e("#"+this.container_id),this.dropdown=this.container.find("div.chzn-drop").first(),s=this.container.height(),o=this.f_width-n(this.dropdown),this.dropdown.css({width:o+"px",top:s+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),u=o-n(this.search_container)-n(this.search_field),this.search_field.css({width:u+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},i.prototype.register_observers=function(){var e=this;return this.container.mousedown(function(t){return e.container_mousedown(t)}),this.container.mouseup(function(t){return e.container_mouseup(t)}),this.container.mouseenter(function(t){return e.mouse_enter(t)}),this.container.mouseleave(function(t){return e.mouse_leave(t)}),this.search_results.mouseup(function(t){return e.search_results_mouseup(t)}),this.search_results.mouseover(function(t){return e.search_results_mouseover(t)}),this.search_results.mouseout(function(t){return e.search_results_mouseout(t)}),this.form_field_jq.bind("liszt:updated",function(t){return e.results_update_field(t)}),this.form_field_jq.bind("liszt:activate",function(t){return e.activate_field(t)}),this.form_field_jq.bind("liszt:open",function(t){return e.container_mousedown(t)}),this.search_field.blur(function(t){return e.input_blur(t)}),this.search_field.keyup(function(t){return e.keyup_checker(t)}),this.search_field.keydown(function(t){return e.keydown_checker(t)}),this.search_field.focus(function(t){return e.input_focus(t)}),this.is_multiple?this.search_choices.click(function(t){return e.choices_click(t)}):this.container.click(function(e){return e.preventDefault()})},i.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},i.prototype.container_mousedown=function(t){var n;if(!this.is_disabled)return n=t!=null?e(t.target).hasClass("search-choice-close"):!1,t&&t.type==="mousedown"&&!this.results_showing&&t.preventDefault(),!this.pending_destroy_click&&!n?(this.active_field?!this.is_multiple&&t&&(e(t.target)[0]===this.selected_item[0]||e(t.target).parents("a.chzn-single").length)&&(t.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),e(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},i.prototype.container_mouseup=function(e){if(e.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(e)},i.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},i.prototype.close_field=function(){return e(document).unbind("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},i.prototype.activate_field=function(){return this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},i.prototype.test_active_click=function(t){return e(t.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},i.prototype.results_build=function(){var e,t,n,i,s;this.parsing=!0,this.results_data=r.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.addClass("chzn-default").find("span").text(this.default_text),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),e="",s=this.results_data;for(n=0,i=s.length;n'+e("
").text(t.label).html()+"")},i.prototype.result_do_highlight=function(e){var t,n,r,i,s;if(e.length){this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClass("highlighted"),r=parseInt(this.search_results.css("maxHeight"),10),s=this.search_results.scrollTop(),i=r+s,n=this.result_highlight.position().top+this.search_results.scrollTop(),t=n+this.result_highlight.outerHeight();if(t>=i)return this.search_results.scrollTop(t-r>0?t-r:0);if(n'+t.html+" ":r=''+t.html+' ',this.search_container.before(r),i=e("#"+n).find("a").first(),i.click(function(e){return s.choice_destroy_link_click(e)}))},i.prototype.choice_destroy_link_click=function(t){return t.preventDefault(),this.is_disabled?t.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(e(t.target)))},i.prototype.choice_destroy=function(e){if(this.result_deselect(e.attr("rel")))return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),e.parents("li").first().remove(),this.search_field_scale()},i.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.is_multiple||this.selected_item.addClass("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},i.prototype.results_reset_cleanup=function(){return this.current_value=this.form_field_jq.val(),this.selected_item.find("abbr").remove()},i.prototype.result_select=function(e){var t,n,r,i;if(this.result_highlight)return t=this.result_highlight,n=t.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(t):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=t,this.selected_item.removeClass("chzn-default")),t.addClass("result-selected"),i=n.substr(n.lastIndexOf("_")+1),r=this.results_data[i],r.selected=!0,this.form_field.options[r.options_index].selected=!0,this.is_multiple?this.choice_build(r):(this.selected_item.find("span").first().text(r.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!e.metaKey&&!e.ctrlKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field_jq.val()!==this.current_value)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[r.options_index].value}),this.current_value=this.form_field_jq.val(),this.search_field_scale()},i.prototype.result_activate=function(e){return e.addClass("active-result")},i.prototype.result_deactivate=function(e){return e.removeClass("active-result")},i.prototype.result_deselect=function(t){var n,r;return r=this.results_data[t],this.form_field.options[r.options_index].disabled?!1:(r.selected=!1,this.form_field.options[r.options_index].selected=!1,n=e("#"+this.container_id+"_o_"+t),n.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[r.options_index].value}),this.search_field_scale(),!0)},i.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after(' ')},i.prototype.winnow_results=function(){var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;this.no_results_clear(),f=0,l=this.search_field.val()===this.default_text?"":e("
").text(e.trim(this.search_field.val())).html(),o=this.search_contains?"":"^",s=new RegExp(o+l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),p=new RegExp(l.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),y=this.results_data;for(d=0,m=y.length;d=0||n.html.indexOf("[")===0)){i=n.html.replace(/\[|\]/g,"").split(" ");if(i.length)for(v=0,g=i.length;v"+n.html.substr(c+l.length),h=h.substr(0,c)+""+h.substr(c)):h=n.html,u.html(h),this.result_activate(u),n.group_array_index!=null&&e("#"+this.results_data[n.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&a===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(u))}}return f<1&&l.length?this.no_results(l):this.winnow_results_set_highlight()},i.prototype.winnow_results_clear=function(){var t,n,r,i,s;this.search_field.val(""),n=this.search_results.find("li"),s=[];for(r=0,i=n.length;r'+this.results_none_found+' " "'),n.find("span").first().html(t),this.search_results.append(n)},i.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},i.prototype.keydown_arrow=function(){var t,n;this.result_highlight?this.results_showing&&(n=this.result_highlight.nextAll("li.active-result").first(),n&&this.result_do_highlight(n)):(t=this.search_results.find("li.active-result").first(),t&&this.result_do_highlight(e(t)));if(!this.results_showing)return this.results_show()},i.prototype.keyup_arrow=function(){var e;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return e=this.result_highlight.prevAll("li.active-result"),e.length?this.result_do_highlight(e.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},i.prototype.keydown_backstroke=function(){var e;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke();e=this.search_container.siblings("li.search-choice").last();if(e.length&&!e.hasClass("search-choice-disabled"))return this.pending_backstroke=e,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")},i.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},i.prototype.keydown_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale(),t!==8&&this.pending_backstroke&&this.clear_backstroke();switch(t){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},i.prototype.search_field_scale=function(){var t,n,r,i,s,o,u,a,f;if(this.is_multiple){r=0,u=0,s="position:absolute; left: -1000px; top: -1000px; display:none;",o=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(a=0,f=o.length;a ",{style:s}),n.text(this.search_field.val()),e("body").append(n),u=n.width()+25,n.remove(),u>this.f_width-10&&(u=this.f_width-10),this.search_field.css({width:u+"px"}),t=this.container.height(),this.dropdown.css({top:t+"px"})}},i.prototype.generate_random_id=function(){var t;t="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(e("#"+t).length>0)t+=this.generate_random_char();return t},i}(AbstractChosen),r.Chosen=t,n=function(e){var t;return t=e.outerWidth()-e.width()},r.get_side_border_padding=n}.call(this);
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend.css b/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend.css
new file mode 100644
index 0000000..c27ed3a
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend.css
@@ -0,0 +1,18 @@
+/* portabilis style */
+
+#nav-actions a {
+ margin-right: 10px;
+}
+
+/* feedback messages utils */
+
+#feedback-messages {
+ position: fixed;
+ bottom: 0px;
+ background-color: #fff;
+}
+
+#feedback-messages p {
+ margin: 2px 2px 0px 2px;
+ padding: 4px;
+}
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend/Process.css b/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend/Process.css
new file mode 100644
index 0000000..f415207
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend/Process.css
@@ -0,0 +1,20 @@
+/* fixups ieducar */
+table#tablenum1 {
+ border: 0px;
+}
+
+td.formdktd {
+ background-color: #fff;
+}
+
+#form_resultado {
+ margin-bottom: 70px;
+}
+
+tr.rodape {
+ display: none;
+}
+
+#corpo {
+ margin: 0
+}
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend/Resource.css b/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend/Resource.css
new file mode 100644
index 0000000..9c05be7
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Stylesheets/Frontend/Resource.css
@@ -0,0 +1,14 @@
+.resource-notice {
+ display: block;
+ padding: 5px;
+ margin: 2px;
+}
+
+.right-top-notice {
+ float: right;
+ padding: 5px;
+ position: absolute;
+ right: 0;
+ top: 24px;
+ margin-right: 10px;
+}
\ No newline at end of file
diff --git a/ieducar/modules/Portabilis/Assets/Version.php b/ieducar/modules/Portabilis/Assets/Version.php
new file mode 100644
index 0000000..a59de28
--- /dev/null
+++ b/ieducar/modules/Portabilis/Assets/Version.php
@@ -0,0 +1,10 @@
+
--
libgit2 0.21.2