var statusArray	= [];

function validaCampo( campo, tipo, obrigatorio ) {	
	//alert( $('#' + campo ).attr('type'));
	
	var	reStr = "";
	var tipoArr = tipo.split("_");
	
	switch ( tipoArr[0] ) {
		case 'date':					/* data no formato AAAA-MM-DD */
					reStr = /^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])+$/;
					break;
		case 'hour':					/* hora */
					reStr = /^((0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]))$/;
					break;
		case 'email':					/* email */
					reStr = /^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i;
					break;
		case 'alpha':					/* alfanumérico */
					reStr = /^[a-z ._-]+$/i;
					break;
		case 'alphanum':			/* letras, numeros, espaço, hiffen, underscore e ponto */
					reStr = /^[a-z0-9 ._-]+$/i;
					break;
		case 'password':			/* letras, numeros, hiffen e underscore */
					reStr = /^[a-z0-9_-]+$/i;
					break;
		case 'number': 				/* apenas numeros */
					reStr = /^[0-9]+$/i;
					break;
        case 'phone':                 /* numeros de telefone válidos */
                    reStr = /^[0-9+]+$/i;
                    break
		case 'letternum':			/* letras, numeros e espaço apenas  */
					reStr = /^[a-z0-9 ]+$/i;
					break;
		case 'int':						/* numero intereiro */
					reStr = /^[-+]?\d+$/;
					break;
		case 'real':					/* numero decimal */
					reStr	= /^[-+]?\d*\.?\d+$/;
					break;
/*					
		case 'url':						/* url /
					reStr	= /^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i;
					break;

		case 'codpostal':			// código postal portugês no formato XXXX-XXX 
					reStr = /^([1-9][0-9][0-9][0-9][-][0-9][0-9][0-9])+$/;
					break;
*/		
		case 'min':
					reStr = '^.{'+tipoArr[1]+',}$';
					break;
					/*
					if($('#' + campo ).val().length < tipoArr[1])
					{
						$('#' + campo ).addClass('redbg');
						statusArray[ campo ] = false;
						return false;
					}
					break;
					*/
		default:							/* qualquer string */
					reStr = /.+/;
					break;
	}
	//alert( reStr );  
	switch( $('#' + campo ).attr('type') ) {
/*		case 'select':
					var dropdownIndex = $('#' + campo ).selectedIndex;
					if ( dropdownIndex >= 0 ) {
						var dropdownValue = $('#' + campo )[dropdownIndex].value;
	
						if ( dropdownValue != "" ) {
							statusFlag = true;
						} else {
							if ( obrigatorio ) {
								statusFlag = false;
							} else {
								statusFlag = true;
							}
						}
					} else {
						if ( obrigatorio ) {
							statusFlag = false;
						} else {
							statusFlag = true;
						}
					}
					break;*/
		default:
					if ( obrigatorio ) {
						statusFlag = RegExp(reStr).test($('#' + campo ).val());
					}
					else 
					{
						if ( $('#' + campo ).length == 0 || $('#' + campo ).val() == '') {
							statusFlag = true;
						} else {
                            //alert('validar '+campo+" len "+$('#' + campo ).length+' val '+$('#' + campo ).val());
//							statusFlag = $('#' + campo ).value.test( reStr );
							statusFlag = RegExp(reStr).test($('#' + campo ).val());
						}
					}
	} 
	
	if ( !statusFlag ) {
		$('#' + campo ).addClass('redbg');
		statusArray[ campo ] = false;
		return false;
	} else {
		if ( !statusArray[ campo ] ) {
			
			//$('#' + campo ).removeClass('redbg');
	
		}
		//statusArray[ campo ] = true;
		delete statusArray[ campo ];
		return true;
	}
}

function validaForm ( formulario ) {
	var statusFlag = true;
	
	//$$( 'form[name='+formulario.name+'] [validar]').getProperty('id').each(function(el){
	$('input[validar]').each(function(el){
		//	if ($( el ).disabled) return;
		//alert($( this ).attr("obrigatorio"));
			if ( $( this ).css("display") != 'none' ) {
				if ( $( this ).attr("obrigatorio") != null && $( this ).attr("obrigatorio") == 'true' ) {
					required = true;
				} else {
					required = false;
				}
				
				var tiposArr = ($( this ).attr("validar")).split('|');
				
				for(index in tiposArr)
				{
					if ( !validaCampo( $(this).attr("id") , tiposArr[index] , required ) ) 
					{
						statusFlag = false;
					}
				}
			}
			//alert( el );
	});

//statusFlag = false;
	return statusFlag;
}

// -------------------------------------------------------------------

	function inverte( campo, nostr ) {
				//alert( campo+' - '+nostr );
		if ( nostr ) {
			var strVer			= '';
			var strEditar		= '';
		} else {			
			var strVer			= 'Ver';
			var strEditar		= 'Editar';
		}
		//alert( campo+strEditar+' : '+$(campo+strEditar).style.display );
		if ( $(campo+strEditar).style.display == invisivel ) {
			//alert( 'Visivel: '+campo+strEditar );
			$(campo+strVer).style.display = invisivel;
			$(campo+strEditar).style.display = visivel;
		} else {
			//alert( 'Invisivel: '+campo+strEditar );
			$(campo+strVer).style.display = visivel;
			$(campo+strEditar).style.display = invisivel;
		}
	} 		
	
	function showMenu( op, zona ) {
		if ( !aGravar && zona.length > 0 ) {
			if ( op && editar != visivel ) {
				$( zona+'Menu' ).style.display=visivel;
			} else {
				if ( editar == invisivel ) {
					$( zona+'Menu' ).style.display=invisivel;
				}
			}
		}
	}

	function gravaForm( formulario ) {
			aGravar = true;

			var f = $$( 'form[name='+formulario.name+']').getProperty('id');

			$( f[0] ).send({
				update: $('xpto'),
				//encoding: 'iso-8859-1',$("em").attr("title");

				onComplete: function() {
					updateTable( formulario.name );
				}
			}); 
		
			delete f;
			aGravar = false;
			editar	= invisivel;
			ver			= visivel;
	}
	
	function formOk( formulario ) {
		if ( validaForm( formulario ) ) {
			gravaForm( formulario );
		}
	}

	function submitOk( formulario ) {
		if ( validaForm( formulario ) ) {
			//var f = $$( 'form[name='+formulario.name+']').getProperty('id');
			//$( f[0] ).submit();
			formulario.submit();
		}
	}

	function updateTable( idTabela ) {
		//alert( idTabela );
		var url = URLModulo + "&op=edita&sec="+ idTabela +"&id="+idEvento;
		var log = $( idTabela+'Output' ).empty().addClass('ajax-loading');	

		new Ajax(url, {
			method: 'get',
			update: log,
			onComplete: function() {
				log.removeClass('ajax-loading');
			}
		}).request();
	}

// -------------------------------------------------------------------
// -------------------------------------------------------------------
// -------------------------------------------------------------------
// -------------------------------------------------------------------

function popitup(url) {
	newwindow=window.open(url,'name','location=no,height=200,width=800');
	/*
	newwindow.moveTo(window.getWidth() / 2, window.getHeight() / 2);
	alert( window.getWidth() / 2 );
	alert( window.getHeight() / 2 );
	*/
	if (window.focus) {newwindow.focus()}
	return false;
}


function print_r(input, _indent)
{
	if(typeof(_indent) == 'string') {
		var indent = _indent + ' ';
		var paren_indent = _indent + ' ';
	} else {	
		var indent = ' ';
		var paren_indent = '';
	}

	switch(typeof(input)) {
		case 'string':
			var output = "" + input + "\n";
			break;
		case 'boolean':
			var output = (input ? 'true' : 'false') + "\n";
			break;
		case 'object':
			var output = ((input.reverse) ? 'Array' : 'Object') + "\n";
			for(var i in input) {
				output += indent + "[" + i + "] => " + print_r(input[i], indent);
			}
			output += paren_indent + ")\n";	
		break;
	}
	return output;
}

// -------------------------------------------------------------------

var testa = 'teste'; //EM QUE ESCOPO EST� ESTA MINHA VARI�VEL GLOBAL? � FILHA DE QUEM A COITADA?

function $m(quem){ return document.getElementById(quem);}

//pra fazer o bind (executar uma fun��o em determinado escopo no futuro)
A = function(enumerable) {
    var array = Array();
    
    for(var i = 0; i < enumerable.length; i++)
        array[i] = enumerable[i];
    
    return array;
};
//pra fazer o bind
Function.prototype.bind = function() {
    var __method = this, args = A(arguments), object = args.shift();
    return function() {
        return __method.apply(object, args.concat(A(arguments)));
    };
};
//pra n�o digitar os m�todos dom toooda vez
function criaTag(tag,classe,texto){
    elem = document.createElement(tag);
    if(classe!='' && classe!=null) {
        elem.setAttribute('class',classe);
        elem.className = classe; //IE sucks
    }
    if(texto!='' && texto!=null) elem.appendChild(document.createTextNode(texto));
    return elem;
}
//pra exibir os filhos de determinado n� objeto javascript
function printChilds(quem,dentro,event){
    //o this desta fun��o, por ela ter sido chamada via bind,
    //n�o cont�m a printChilds mas sim o objeto passado como
    //parametro do bind
    
    if(dentro.getAttribute('class').indexOf(' open')>0){
        dentro.removeChild(dentro.getElementsByTagName('ul')[0]);
        var classN = dentro.getAttribute('class').replace(' open','');
        dentro.setAttribute('class',classN);
    }else{ //exibo os filhos
        var childs = printObject(this[quem]);
        dentro.appendChild(childs);
        dentro.setAttribute('class', dentro.getAttribute('class') + " open")
    }
    if(window.event){ window.event.cancelBubble=true; /* IE sucks */}
    event.stopPropagation();
    
}
//O BIXO IMPORTANTE � ESTE ABAIXO
function printObject(objeto){
    var nome, tipo, valor, mais, len, li, ul, filhosqt, link;
    this.atual; //guardar� quem � o objeto atual
    ul = document.createElement('ul');
    //o primeiro li conter� o elemento
    li = criaTag('li','valor',objeto);
    ul.appendChild(li);
    for(obj in objeto){
        if(obj!="domConfig"){ //bug�o estranho no objeto chamado domConfig. tirei ele.
            atual = objeto[obj];
            try{
                li = criaTag('li',typeof(atual),"   ");
                link = criaTag('a','content','');
                //link.setAttribute('href','#');
                nome = criaTag('span','nome',obj);
                tipo = criaTag('span','tipo','(' + typeof(atual) + ')');
                valor = criaTag('span','valor','(' + atual + ')');
                
                if(typeof(atual)!='object' && typeof(atual)!='function'){
                    //numeros e strings.
                    li.appendChild(nome);
                    li.appendChild(valor);
                }else if(atual!=null){
                    //function, object e array                
                    link.appendChild(nome);
                    link.appendChild(tipo);
                    //o bind executa a fun��o printChilds no contexto do prim parametro (objeto)
                    link.onclick = printChilds.bind(objeto,obj,li); 
                    
                    li.setAttribute('class',typeof(atual) + ' pai');
                    li.className = typeof(atual) + ' pai'; //IE sucks               
                    
                    li.appendChild(link);
                }else{
                    //pra quem for null               
                    li.appendChild(nome);
                    li.appendChild(valor);  
                }
                ul.appendChild(li);
            }catch(e){}
        }
    }
    return ul;
}

function trocaHTML(onde,peloque){
    for(var i=0; i< onde.childNodes.length; i++){
        onde.removeChild(onde.childNodes[i]);
    }
    onde.appendChild(peloque);
}

function executaArvore(event){
    var objeto_carregar;    
    try{ objeto_carregar = eval($m("txtquem").value); } catch(e){}
    
    var $result = $m("result");
    if(objeto_carregar){
        
        trocaHTML($result,document.createTextNode('Carregando...'));
        trocaHTML($result, printObject(objeto_carregar));
    }else{
        trocaHTML($result,document.createTextNode('Objeto ' + $m("txtquem").value + ' n�o existe rap�.'));
    }
    return false;
}

