function $$(id) {
	return document.getElementById(id)
}

var interface = {

	Info: {
		Versao: 	'0.0.1',
		Autor: 		'Roberto Rabadan',
		Email:		'roberto@rabadan.com.br'
	},

	pegarObj: function(obj) {
	  if(typeof obj=="undefined")obj=document
	  if(typeof obj=="string")obj=$$(obj)
	  return obj
	},

	tags: function(tagName) {
	  return document.getElementsByTagName(tagName)
	},

	novo: function(tagName,innerHTML) {
		var newTag=document.createElement(tagName)
		if(typeof innerHTML=="string")
		  newTag.innerHTML=innerHTML
		return newTag
	},

	inserirAntes: function(n,o){
	  o=interface.pegarObj(o)
	  o.parentNode.insertBefore(n,o)
	},

	substituir: function(n,o){
	  o=interface.pegarObj(o)
	  o.parentNode.replaceChild(n,o)
	},

	remover: function(o){
	  o=interface.pegarObj(o)
	  o.parentNode.removeChild(o)
	},

	removerClasse: function(o,className) {
	  o=interface.pegarObj(o)
	  var r=eval("/\\b"+className+"\\b/g")
	  o.className=o.className.replace(r,"")
	},

	/*
	Funcao que permite mudar a classe de um objeto ou
	array de objetos. Podem ser informadas até duas classes,
	e a funcao faz a variacao de uma pela outra. Caso
	seja informada apenas uma, a funcao se torna
	monodirecional aplicando sempre a classe informada. Ex.
		mudarClasse (['id-1','id-2','id-3',], 'classA', 'classB')
		mudarClasse ('id', 'classA', 'classB')
		mudarClasse ('id', 'classA') => aplica sempre a classe classA
	*/
	mudarClasse: function(id, classA, classB) {
		if (id instanceof Array)
			for (i=0; i<id.length; i++)
				mudar(id[i], classA, classB)
		else
			mudar(id, classA, classB)
		function mudar(id, classA, classB) {
			if (!classB)
				$$(id).className = classA
			else
				($$(id).className == classA) ? $$(id).className = classB : $$(id).className = classA
		}
	},

	/*
	Funcao que trabalha com Tabs e seus contextos, basta informar o numero da tab,
	usar no id da tab => id='tab-1' e no seu div de contexto => id='tab-contexto-1',
	informar tambem a classe de tab selecionada e nao selecionada (nome das classes).
	Ex.
		tabs('1', 'tab' 'selecionada', 'nao_selecionada')
	O Id dos seus elementos devem ser baseados no prefixo informado (ex. 'tab') sempre assim:
		tab => id="tab1" (1 é o número da tab)
		contexto => id="tab-contexto1"
	*/
	tabs: function(id, prefixo, cssAtivo, cssDesativo) {
		for (i=1; i < 100; i++) {
			if ($$(prefixo+i)) $$(prefixo+i).className = cssDesativo
			if ($$(prefixo+'-contexto'+i)) interface.display(prefixo+'-contexto'+i, 'none')
		}
		$$(prefixo+id).className = cssAtivo
		interface.display(prefixo+'-contexto'+id, 'block')
	},

	/*
	Funcao que inverte o display de um elemento a partir de seu id,
	permite receber apenas um id ou array de ids e/ou tambem o tipo de display css
	ou um array deles. Quando o parametro display css é informado, a funcao se torna
	monodirecional administrando apenas o display css informado. Ex.
		interface.display('id')
		interface.display('id', 'block')
		interface.display(['id-1', 'id-2'])
		interface.display(['id-1', 'id-2'], 'table')
		interface.display(['id-1', 'id-2'], ['table','inline'])
	*/
	display: function(id, d, o) {
		muda = function (id, d) {
			ob = $$(id).style, e = ob.display
			if (d) ob.display = d
			else
				e!='none' ? ob.display = 'none' : ob.display = ''
		}
		if (id instanceof Array && d instanceof Array)
			for (i=0; i<id.length; i++)	muda(id[i], d[i])
		else if (id instanceof Array)
			for (i=0; i<id.length; i++)	muda(id[i], d)
		else muda(id, d)
		if (o && o == 'overlay') interface.overlay()
	},

	/*
	Funcao que permite trabalhar elementos em colapse com o efeito de deslizamento
	Para usar a funcao basta apenas colocar as seguintes classes abaixo. Nao eh
	necessario chamar a funcao, pois ela eh carregada no init da pagina. Ex.

		<div class="colapse-titulo">
			<a href="javascript:void(0)" id="colapse-icone-1" class="contraido"></a> Título A
		</div>
		<div class="colapse-conteudo">
			<div>
				conteudo desejado
			</div>
		</div>

		O css abaixo é recomendado para uso inicial, podendo ser personalizado a vontade:
		.colapse-titulo {
			overflow:hidden;
			cursor:pointer;
		}
		.colapse-conteudo {
			visibility:hidden;
			height:0px;
			overflow:hidden;
			position:relative;
		}
		.colapse-conteudo_content {
			position:relative;
		}
	*/

	col_vars: {
		colapse_slideSpeed: 			10,
		colapse_timer: 					10,
		objectIdToSlideDown: 			false,
		colapse_activeId: 				false,
		colapse_slideInProgress: 		false
	},

	showHideContent: function(e,inputId) { // Apenas esconde o conteudo
		if(interface.col_vars.colapse_slideInProgress)return;
		interface.col_vars.colapse_slideInProgress = true;
		if(!inputId) inputId = this.id;
		inputId = inputId + '';
		var numericId = inputId.replace(/[^0-9]/g,'');
		var answerDiv = $$('colapse_a' + numericId);

		interface.col_vars.objectIdToSlideDown = false;

		if (!answerDiv.style.display || answerDiv.style.display == 'none') {
			if (interface.col_vars.colapse_activeId &&  interface.col_vars.colapse_activeId!=numericId) {
				interface.col_vars.objectIdToSlideDown = numericId;
				interface.slideContent(interface.col_vars.colapse_activeId,(interface.col_vars.colapse_slideSpeed*-1));
				interface.mudarClasse('colapse-icone-'+interface.col_vars.colapse_activeId, 'expandido', 'contraido')
				interface.mudarClasse('colapse-icone-'+numericId, 'expandido', 'contraido')
			} else {
				answerDiv.style.display = 'block';
				answerDiv.style.visibility = 'visible';
				interface.slideContent(numericId,interface.col_vars.colapse_slideSpeed);
				interface.mudarClasse('colapse-icone-'+numericId, 'expandido', 'contraido')
			}
		} else {
			interface.slideContent(numericId,(interface.col_vars.colapse_slideSpeed*-1));
			interface.col_vars.colapse_activeId = false;
			interface.mudarClasse('colapse-icone-'+numericId, 'expandido', 'contraido')
		}
	},

	slideContent: function(inputId,direction) {
		var obj =$$('colapse_a' + inputId);
		var contentObj = $$('colapse_ac' + inputId);
		height = obj.clientHeight;
		if (height==0) height = obj.offsetHeight;
		height = height + direction;
		rerunFunction = true;
		if (height>contentObj.offsetHeight) {
			height = contentObj.offsetHeight;
			rerunFunction = false;
		}
		if (height<=1) {
			height = 1;
			rerunFunction = false;
		}
		obj.style.height = height + 'px';
		var topPos = height - contentObj.offsetHeight;
		if (topPos>0) topPos=0;
		contentObj.style.top = topPos + 'px';
		if (rerunFunction)
			setTimeout('interface.slideContent(' + inputId + ',' + direction + ')',interface.col_vars.colapse_timer);
		else {
			if(height<=1){
				obj.style.display='none';
				if(interface.col_vars.objectIdToSlideDown && interface.col_vars.objectIdToSlideDown!=inputId){
					interface.display('colapse_a' + interface.col_vars.objectIdToSlideDown,'block');
					$$('colapse_a' + interface.col_vars.objectIdToSlideDown).style.visibility='visible';
					interface.slideContent(interface.col_vars.objectIdToSlideDown,interface.col_vars.colapse_slideSpeed);
				}else{
					interface.col_vars.colapse_slideInProgress = false;
				}
			}else{
				interface.col_vars.colapse_activeId = inputId;
				interface.col_vars.colapse_slideInProgress = false;
			}
		}
	},

	initShowHideDivs: function() {
		var divs = interface.tags('DIV');
		var divCounter = 1;
		for(var no=0;no<divs.length;no++){
			if(divs[no].className=='colapse-titulo'){
				divs[no].onclick = interface.showHideContent;
				divs[no].title = 'Clique aqui para expandir ou contrair esse item';
				divs[no].id = 'colapse_q'+divCounter;
				var answer = divs[no].nextSibling;
				while(answer && answer.tagName!='DIV'){
					answer = answer.nextSibling;
				}
				answer.id = 'colapse_a'+divCounter;
				contentDiv = answer.getElementsByTagName('DIV')[0];
				contentDiv.style.top = 0 - contentDiv.offsetHeight + 'px';
				contentDiv.className='colapse-conteudo_content';
				contentDiv.id = 'colapse_ac' + divCounter;
				answer.style.display='none';
				answer.style.height='1px';
				divCounter++;
			}
		}
	},

	/*
	Validacao de Formularios
	O parametro title é usado para gerar a pergunta do alert
	Ex. de uso <form method="post" onsubmit="return validaForm(this);">
	*/
	validaForm: function(f) {
		for(var i=0; i < f.length; i++)
			if (!f.elements[i].value) {
				alert("Por favor, preencha o campo " + f.elements[i].title)
				f.elements[i].focus()
				return false
			}
	},

	/*
	FUNCAO AJAX PARA CARREGAR CONTEUDOS DINAMICAMENTE
	-------------------------------------------------
	Exemplo de como chamar a funcao...
	proAjax(
					"pagina.php", 								// url
					"parametro1=22&parametro2=23",				// parametros (completos)
					"id", 										// id da div de retorno
					"block", 									// parametro css display da div de retorno (block/none/inline, etc)
					"sim",										// permitir retorno innerHTML (sim/nao)
					"id-loading",								// id do elemento loading
					"sim",										// utilizar alert ao finalizar procedimento (sim/nao)
					"A exclusao foi realizada com sucesso!"		// mensagem para o alert (se sim)
				);
	*/
	proAjax: function(
						url,
						parametros,
						div_retorno,
						display_retorno,
						innerHTML_retorno,
						loading,
						opcao_alert,
						msg_alert,
						callBack
					  ) {
		// Instanciando xmlhttp para trabalhar com ajax
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				xmlhttp = false;
			}
		}
		if  (!xmlhttp && typeof  XMLHttpRequest != 'undefined' ) {
			try  {
				xmlhttp = new  XMLHttpRequest();
			} catch  (e) {
				xmlhttp = false ;
			}
		}

		interface.overlay_transparent();
		interface.display(loading, 'block');
		xmlhttp.open("POST", url, "TRUE");
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
		xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
		xmlhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
		xmlhttp.setRequestHeader("Pragma", "no-cache");
		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4) {
				if (xmlhttp.status == 200) {
					retorno=xmlhttp.responseText
					interface.display(loading, 'none');
					interface.overlay_transparent();
					interface.display('div_modal_loading', 'none');
					interface.display(div_retorno, display_retorno);
					if (innerHTML_retorno == "sim") $$(div_retorno).innerHTML=retorno;
					if (opcao_alert == "sim") alert(msg_alert);
					if(callBack){
						callBack();
					}
				}
				else //a mensagem abaixo pode aparecer tbm se o site não estiver dentro de um servidor
					alert("Ocorreu um erro na sua solicitação(Erro:"+ xmlhttp.status +").\nPor favor, tente novamente dentro de alguns instantes!");
			}
		}
		xmlhttp.send(parametros);
	},

	exemploAjax: function(id) {
		interface.proAjax(
					"ajax.html",				 				// url
					"n=n", 										// parametros (completos)
					"ajax-exemplo",								// id da div de retorno
					"block", 									// parametro css display da div de retorno (block/none/inline, etc)
					"sim",										// permitir retorno innerHTML (sim/nao)
					"ajax-exemplo",								// id do elemento loading
					"nao",										// utilizar alert ao finalizar procedimento (sim/nao)
					"n"											// mensagem para o alert (se sim)
				);

	},

	/*
	Funcao que pode trabalhar em conjunto com caixas de dialogo modais,
	criando uma camada intermediaria opaca entre a caixa de dialogo e
	o conteudo da pagina
	*/
	overlay: function(display) {
		var showing = false;
		if($('#modal-overlay').css('display')=='none'){
			$('#modal-overlay').css('width',$(window).width());
			$('#modal-overlay').css('height',$('#geral').height()+50);
			$('#modal-overlay').show();
		}
		else{
			$('#modal-overlay').hide();
		}
		var s = interface.tags('SELECT')
		for(i=0; i < s.length; i++) {
			if(!s[i].id) s[i].id = Math.random()
			if(showing){
				interface.display(s[i].id, 'none')
			}
			else{
				if (display){
					interface.display(s[i].id, display)
				}
				else{
					interface.display(s[i].id, 'inline')
				}
			}
		}
	},

	/*
	Funcao que pode trabalhar em conjunto com caixas de dialogo modais,
	criando uma camada intermediaria transparente entre a caixa de dialogo e
	o conteudo da pagina
	*/
	overlay_transparent: function(display) {
		var showing = false;
		if($('#modal-overlay-transparent').css('display')=='none'){
			$('#modal-overlay-transparent').css('width',$(window).width());
			$('#modal-overlay-transparent').css('height',$('#geral').height()+50);
			$('#modal-overlay-transparent').show();
		}
		else{
			$('#modal-overlay-transparent').hide();
		}
		var s = interface.tags('SELECT')
		for(i=0; i < s.length; i++) {
			if(!s[i].id) s[i].id = Math.random()
			if(showing){
				interface.display(s[i].id, 'none')
			}
			else{
				if (display){
					interface.display(s[i].id, display)
				}
				else{
					interface.display(s[i].id, 'inline')
				}
			}
		}
	}

} // Fim interface


window.onload = interface.initShowHideDivs;