/**
 * @author Davi R. Tavares
 * @author Rimenes Ribeiro
 */
 
Event.observe(window, 'load', function() {
	var campos; 

	if ($('cadastrar')) {
		
		// adicona um manipulador para cada multiAdd no fomulário
		campos = $('cadastrar').getElementsByClassName('multiadd');
	
		for (var index = 0; index < campos.length; index++) {
			multiAdd(campos[index].id);
		}

		// adicona um manipulador para cada multiSelect no fomulário
		campos = $('cadastrar').getElementsByClassName('multiselect');

		for (var index = 0; index < campos.length; index++) {
			multiSelect(campos[index].id);
		}

	}
});

/**
 * Manipula os eventos de um multiAdd
 */
var multiAdd = function(id){
	$$('table#'+id+' tbody tr td button.adicionar').invoke('observe', 'click', function(event){
		var campos = $('cadastrar').getElementsByClassName('ma');
		var aux = [];
		var $i = 0;

		//exclui os campos que não pertencem multiadd observado
		for (var i=0; i<campos.length; i++) {
			if (campos[i].up('table').id == id) {
				aux[$i]=campos[i];
				$i++;			
			}
		}
		
		campos = aux;
		
		var el  = Event.element(event);
		var tbody  = el.up('tbody');
		var conteudo = '<tr>';

		for (var i=0; i<campos.length; i++) {
			var nomeCampo = campos[i].name.sub('ignore_ma_','');

			//tratamento para campo input text
			if (campos[i].type.toLowerCase()=='text') {
				if (campos[i].value=='') {
					alert('Campo vazio');
					campos[i].focus();

					return;
				}

				var valor = campos[i].value;

				conteudo +='<td><input type="hidden" name="'+ nomeCampo +'[]" value="'+ valor +'" />'+ valor +'</td>';
				campos[i].value = '';
			}
			
			// tratamento para campo input hidden
			if (campos[i].type.toLowerCase()=='hidden') {
				var valor = campos[i].value;

				conteudo +='<td><input type="hidden" name="'+ nomeCampo +'[]" value="'+ valor +'" /></td>';
				campos[i].value = '';
			}

			// tratamento para campo select
			if (campos[i].tagName.toLowerCase()=='select') {
				if (campos[i].options[campos[i].selectedIndex].value == '') {
					alert('Selecione um item');
					campos[i].focus();

					return;
				}

				var valor = campos[i].value;
				var texto = campos[i].options[campos[i].selectedIndex].text;

				conteudo +='<td><input type="hidden" name="'+ nomeCampo +'[]" value="'+ valor +'" />'+ texto +'</td>';
				campos[i].selectedIndex = 0;				
			}
			
			campos[0].focus();
		}

		conteudo += '<td><img src="images/delete_multfield.gif" style="padding:1px 9px 1px 9px; cursor:pointer;" class="remover"></td></tr>';
		new Element.insert(tbody, conteudo);
		removeObserver(id);
	})

	removeObserver(id);
}

/**
 * Manipula os eventos de um multiSelect
 */
var multiSelect = function(id){
	$$('table#'+id+' tbody tr td button.adicionar').invoke('observe', 'click', function(event){
		var campos = $('cadastrar').getElementsByClassName('ms');
		var aux = [];
		var $i = 0;

		//exclui os campos que não pertencem multiselect observado
		for (var i=0; i<campos.length; i++) {
			if (campos[i].up('table').id == id) {
				aux[$i]=campos[i];
				$i++;			
			}
		}

		campos = aux;

		var el = Event.element(event);
		var tbody = el.up('tbody');
		var linha = '';
		var btRemover = '<td align="right"><img src="images/delete_multfield.gif" style="padding:1px 9px 1px 9px; cursor:pointer;" class="remover"></td>';

		for (var i=0; i<campos.length; i++) {
			var nomeCampo = campos[i].name.sub('ignore_ms_','');

			// tratamento para campo select
			if (campos[i].tagName.toLowerCase()=='select') {
				if (campos[i].selectedIndex == -1) {
					alert('Selecione um item');
					campos[i].focus();

					return;
				}

				var valores = campos[i].getValue(); 
				var j = valores.size();

				for (var l=0; l<campos[i].length; l++) {
					for (var k=0; k<j; k++) {
						if (campos[i].options[l].value == valores[k]) {
							var valor = valores[k];
							var texto = campos[i].options[l].text;

							linha +='<tr><td><input type="hidden" name="'+ nomeCampo +'[]" value="'+ valor +'" />'+ texto +'</td>' +
								btRemover +'</tr>';
							campos[i].selectedIndex = -1;
						}
					}
				}				
			}
		}

		new Element.insert(tbody, linha);
		removeObserver(id);
	})

	removeObserver(id);
}

/**
 * Remove os itens de um multiAdd/multiSelect
 */
var removeObserver = function(id){
	$$('table#'+id +' tbody tr td img.remover').invoke('observe', 'click', function(event) {
		var el  = Event.element(event);
		var tr  = el.up('tr');
		if (tr)
			tr.remove();
		Event.stop(event);
	});
}

//Funções do multifield
function multifieldAdicionar(idCampo, nrLinhas) {
	nrLnhas = (typeof nrLinhas == "undefined") ? 1 : nrLinhas;
	if(nrLinhas > 1){
		for(var i=0; i<nrLinhas; i++){
			multifieldAdicionar(idCampo, 1)
		}
		return;
	}
	var c = $(idCampo);
	var matriz = c.tBodies[0].rows[0];
	var novo = matriz.cloneNode(true);

	var ctSelectsMatriz = matriz.getElementsByTagName("select");
	var ctSelectsNovo = novo.getElementsByTagName("select");
	
	for(var i=0; i < ctSelectsMatriz.length; i++){
		ctSelectsNovo[i].selectedIndex = ctSelectsMatriz[i].selectedIndex;
	}

	c.tBodies[1].appendChild(novo);
	
}

function multifieldRemover(idCampo, obj) {
	var c = $(idCampo);
	var linha = obj.parentNode;
	c.tBodies[1].removeChild(linha);

	if (c.tBodies[1].rows.length == 0)
		multifieldAdicionar(idCampo);
}

// Funcções do componente multiple 

/**
 * Adiciona um item a lista
 */
function adicItemLista(campoOrigem, lista) {
	// recebe nomes dos objetos, procura pelas suas referências
	o = $(campoOrigem);
	l = $(lista);

	if (o.value == "") return;

	// cria novo <option>
	var op = document.createElement("option");
	op.text = o.value;

	// adiciona
	try {
		l.add(op, null);
	}
	catch (e) {
		l.add(op); // IE
	}

	o.value = "";
	o.focus();
}

/**
 * Remove um item da lista 
 */
function remItemSelecLista(lista) {
	l = $(lista);

	if (l.length == 0)
		alert("Nenhum item para ser removido.");

	for (i = l.length - 1; i >= 0; i--)
		if (l.options[i].selected)
			l.remove(i);
}

/**
 * Seleciona todos os itens da lista
 */
function selecTudoLista(lista) {
	l = $(lista);

	for (i = 0; i < l.length; i++)
		 l.options[i].selected = true;
}

/**
 * Move item da lista para cima.
 */
function selecMoveCima(lista) {
	var el = $(lista);
	var i = el.selectedIndex;

	if (i <= 0) return;

	var x = i - 1;
	var temp = el.options[i];
	var temp2 = el.removeChild(el.options[x]);
	el.insertBefore(temp2, el.options[i]);
	
	contaTodos(lista);
}

function contaTodos(lista){
	// Desta forma fica muito lento para grandes quantidades
	// Melhorar o algorítimo qndo for possível 
	var op = $(lista);
	var op = op.options;
	
	for(i=op.length-1;i>=0;i--){
		var aux = op[i].innerHTML;
		var indice = aux.indexOf(" - ");
		
		// altera o número e o traço caso já exista exista um
		if( (indice > 0) && (indice < 5)  ){
			var spl = aux.split(" - ");
			aux = i+1+" - ";
			for(j=1;j<spl.length;j++){
				aux += spl[j];
			} 
		} else {
			aux = i+1+" - "+aux;
		}
		op[i].innerHTML = aux;
	}	
}

/**
 * Move item da lista para baixo.
 */
function selecMoveBaixo(lista) {
	var el = $(lista);
	var i = el.selectedIndex;

	if (i >= el.length - 1) return;

	var x = i + 1;
	var temp = el.options[i];
	var temp2 = el.removeChild(el.options[x]);
	el.insertBefore(temp2, el.options[i]);
	
	contaTodos(lista);
}
