/**
	* Submissao de valores ajax
	* @param array $opcoes Na forma:
	*	{url:'urlAjax', objDados:{val: var,.., varN: valN}, idContentor: 'idContRecebeHtml'[, opcionais]}
	*		url:
	*		objDados: {xpto:1, xpto2:2}
	*		funcRet: eventual funcao a efectuar processaento apos recepcao e insercao dos  dados no contentor, devera estar definida como:
  *       function funcRet(objContentor){
  *       }
	*		idContentorAjaxLoading: opcional, id do contentor k mostra img loading, se nao definido, o css nao e aplicado
	*		cssAjaxLoading: opcional, por defeito=ajax-loading
	*/
	function ajaxFuncsSubmit(opcoes){
		var cssAjaxLoading=(opcoes.cssAjaxLoading) ? opcoes.cssAjaxLoading : 'ajax-loading';
		if(opcoes.idContentorAjaxLoading)
			$(opcoes.idContentorAjaxLoading).addClass(cssAjaxLoading);
		var request=new Request(
										{	url:opcoes.url, method: 'post',
											onSuccess: function(ret) {
												//Repito aqui, ha problemas de scope com a var pois o scope desta func e o obj window
												var cssAjaxLoading=(opcoes.cssAjaxLoading) ? opcoes.cssAjaxLoading : 'ajax-loading';
												if(opcoes.idContentorAjaxLoading)
													$(opcoes.idContentorAjaxLoading).removeClass(cssAjaxLoading);
                        var elemT=new Element('span', {'html': ret});
                        $(opcoes.idContentor).empty();
                        $(opcoes.idContentor).adopt(elemT);
                        //$(opcoes.idContentor).set('html', ret);
                        if(opcoes.funcRet)
                          opcoes.funcRet($(opcoes.idContentor));
											}
										}
									);
		request.send({ data: opcoes.objDados });
	}


  /**
	* Submissao de valores ajax, com retorno em json
	* @param array $opcoes Na forma:
	*	{url:'urlAjax', objDados:{val: var,.., varN: valN}, funcRet: funcAInvocarNoRetorno[, opcionais]}
	*		url:
	*		objDados: {xpto:1, xpto2:2}
	*		funcRet: funcao a receber os dados, devera estar definida como: function funcRet(objRet){}
	*		idContentorAjaxLoading: opcional, id do contentor k mostra img loading, se nao definido, o css nao e aplicado
	*		cssAjaxLoading: opcional, por defeito=ajax-loading
	*/	
	function ajaxFuncsSubmitJSon(opcoes){
		var cssAjaxLoading=(opcoes.cssAjaxLoading) ? opcoes.cssAjaxLoading : 'ajax-loading';
		if(opcoes.idContentorAjaxLoading)
			$(opcoes.idContentorAjaxLoading).addClass(cssAjaxLoading);
		var request=new Request.JSON(
										{	url:opcoes.url, method: 'post',
											onSuccess: function(objRet) { 
												//repito aqui, ha problemas de scope com a var pis o scope desta func e o obj window
												var cssAjaxLoading=(opcoes.cssAjaxLoading) ? opcoes.cssAjaxLoading : 'ajax-loading';
												if(opcoes.idContentorAjaxLoading)
													$(opcoes.idContentorAjaxLoading).removeClass(cssAjaxLoading);
												opcoes.funcRet(objRet);
											},
                      onFailure: function(objRet) {
                        if(opcoes.idContentorAjaxLoading)
													$(opcoes.idContentorAjaxLoading).removeClass(cssAjaxLoading);
                      }
										}
									);
		request.send({ data: opcoes.objDados });
	}
	



	/**
	* Submissao de valores ajax, com retorno em json
	* @param array $opcoes Na forma:

	*		idForm ou objForm
	*		objDados: {xpto:1, xpto2:2} opcional
	*		funcRet: opcional, define uma funcao a invocar apos recepcao do retorno ajax
	*		idContentorAjaxLoading: opcional, id do contentor k mostra img loading, se nao definido, o css nao e aplicado
	*		cssAjaxLoading: opcional, por defeito=ajax-loading
	*/	
	function ajaxFuncsSubmitJSonForm(opcoes){
    var objForm=$(opcoes.form);
    var elems=objForm.getElements('input:not([type=submit]), select, textarea');
    var elem=0;
    var validacao=0;
    var funcRet=(opcoes.funcRet) ? opcoes.funcRet : 0;

    opcoes.url=objForm.action;
    if(!opcoes.idContentorAjaxLoading)
      opcoes.idContentorAjaxLoading=objForm.getProperty('idContentorAjaxLoading');
    if(!opcoes.cssAjaxLoading)
      opcoes.cssAjaxLoading=objForm.getProperty('cssAjaxLoading');
		if(!opcoes.objDados)
			opcoes.objDados={}
    var dadosValidacao={};
    dadosValidacao.validacoes={}
		for (i = 0; i < elems.length; i++){
      elem=elems[i];
      if(elem.getProperty('validar')){
        eval('validacao='+elem.getProperty('validar')+';');
        validacao.valor=elem.value;
        dadosValidacao.validacoes[elem.name]=validacao;
      }
      
    }
    opcoes.objDados=objForm.toQueryString()+'&'+$H(dadosValidacao).toQueryString();
    opcoes.funcRet=function(objRet){
                      objForm.getElements('.msgValidacao').each(function(el){el.dispose()});
                      if(objRet.css)
                        objForm.getElements('.'+objRet.css).each(function(el){el.removeClass(objRet.css)});
                      if(objRet.numErros==0){
                        if(!objForm.getProperty('idContentorFormConcluido'))
                          objForm.set('html', objRet.html);
                        else{
                          objForm.setStyle('display', 'none');
                          $(objForm.getProperty('idContentorFormConcluido')).setStyle('display', 'block');
                        }
                      }
                      else{
                        objRet.validacoes.each(
                          function(validacao){
                            if(!validacao.res){
                              //Se html estiver definido ou for diff de vazio
                              if(objRet.html){
                                //Se definido um id de contentor de retorno, a msg é colocada nele
                                if(objRet.idContentorHtml)
                                  $(objRet.idContentorHtml).set('html', validacao.msg);
                                else{
                                  //Cria um elemento de erro e coloca-o no fim do contentor do campo
                                  var objErro=new Element('span', {html: objRet.html, 'class': 'msgValidacao'});
                                  objErro.getElement('.msgValidacao').set('html', validacao.msg);
                                  $(objForm[validacao.nomeVar]).getParent().adopt(objErro);
                                }
                              }
                              //Se class definida, aplica ao campo especificado
                              if(objRet.css)
                                $(objForm[validacao.nomeVar]).addClass(objRet.css);
                              //Se javascript definido, executa-o
                              if(objRet.javascript)
                                eval(objRet.javascript);
                            }
                          }
                        );
                      }
                      if(funcRet)
                        funcRet(objRet);
                   };
		ajaxFuncsSubmitJSon(opcoes);	
	}



 /**
	* Submissao de valores ajax, com retorno em json
	* @param array $opcoes Na forma:

	*		idForm ou objForm
	*		objDados: {xpto:1, xpto2:2} opcional
	*		funcRet: opcional, define uma funcao a invocar apos recepcao do retorno ajax
	*		cssAjaxLoading: opcional, por defeito=ajax-loading
	*/
	function ajaxFuncsSubmitJSonFrm(opcoes){
    var objForm=$(opcoes.form);
    var elems=objForm.getElements('input:not([type=submit]), select, textarea');
    var elem=0;
    var funcRet=(opcoes.funcRet) ? opcoes.funcRet : 0;
    var elemAjaxLoading=objForm.getElement('[rel=ajax-loading]');

    opcoes.url=objForm.action;
    if(elemAjaxLoading)
      opcoes.idContentorAjaxLoading=elemAjaxLoading;
    if(!opcoes.cssAjaxLoading)
      opcoes.cssAjaxLoading=objForm.getProperty('cssAjaxLoading');
		if(!opcoes.objDados)
			opcoes.objDados={}
    opcoes.objDados=objForm.toQueryString();
    //Nota objret tem res(=0 erro =1 ok) e html
    opcoes.funcRet=function(objRet){
                      //var elemTmp=new Element('span', {html: objRet.html});
                      //Se funcRetGere=1 é da responsabilidade da funcRet remover ou alterar o form
                      if(!$defined(objRet.funcRetGere) || objRet.funcRetGere==0){
                        objForm.set('html', objRet.html);
                        /*
                        //Se erro, substitui o form existente com o actualizado
                        if(objRet.res==0){
                          elemTmp.getElement('form').replaces(objForm);
                          elemTmp.destroy();
                        }
                        else
                          //Se sucesso, substitui o obj form
                          elemTmp.replaces(objForm);
                          */
                      }
                      if(funcRet)
                        funcRet(objRet);
                   };
		ajaxFuncsSubmitJSon(opcoes);
	}

