/**
 * Project: STpl
 * File: validate.js
 *
 * Validação assíncrona de um formulário.
 *
 * @author Frederico Galvão <fredgalvao@gmail.com>
 * @Last-Modified: 02/09/2007 18:23
 * @Version: 1.1
 */





/**
 * Construtor.
 *
 * @param mixed objVld: objeto Validate;
 * @param string script: script que processará a validação e retornará o seu respectivo código xml.
 */
function ajaxValidate ( objVld, script )
{
	this.objVld  = objVld;
	this.pageXML = script;
	this.xmlHttp = createXmlHttpRequestObject();

	createLayerLoad ( );
}


/**
 * Valida o formulário.
 */
ajaxValidate.prototype.validate = function( )
{
	var dataPost = '';
	var hasError = false;
	var oXmlHttp = this.xmlHttp;
	var oObjVld  = this.objVld;

    try
	{
		var elemt;

		for ( var i = 0; i < this.objVld.formObj.length; i++ )
		{
			elemt = this.objVld.formObj.elements[i];

			if ( ( ( elemt.type == 'checkbox' ) || ( elemt.type == 'radio' ) ) && !elemt.checked ) {
				continue;
			}

			if ( i ) {
				dataPost += '&';
			}

			dataPost += elemt.name + '=' + elemt.value;
		}

	    oXmlHttp.open ( 'POST', this.pageXML, true );
		oXmlHttp.setRequestHeader ( 'Content-Type', 'application/x-www-form-urlencoded' );

		oXmlHttp.onreadystatechange = function ( )
		{
			if ( oXmlHttp.readyState == 1 ) {
				setLayerVisibility ( 'ajaxLoad', true );
			}
			else if ( oXmlHttp.readyState == 4 )
			{
				if (oXmlHttp.status == 200)
				{  
					var reply = oXmlHttp.responseXML;
					var arrErro = reply.getElementsByTagName('erro');

					setLayerVisibility ( 'ajaxLoad', false );

					if( arrErro.length )
					{
						var elemt, messg;
						var numError = 0;

						hasError = true;

						for ( var i = 0; i < arrErro.length; i++ )
						{
							var elemt = document.getElementById( arrErro[i].getElementsByTagName('elemento')[0].firstChild.data );
							var messg = arrErro[i].getElementsByTagName('mensagem')[0].firstChild.data;

							numError++;

							oObjVld.setStyleColor ( elemt, oObjVld.hexColorError );
							oObjVld.appendErrorMsg ( elemt, unescape( messg.replace(/\+/g, ' ') ) );

							elemt.onfocus = function()
							{
								var pai = this.parentNode;
								var child = pai.childNodes;
				
								vld.setStyleColor( this, oObjVld.hexColorPassed );
				
								for ( var j = 0; j < child.length; j++ ) {
									if( child[j].tagName == 'DIV' ) {
										pai.removeChild ( child[j] );
									}
								}
							}
						}
					}

					if( !hasError ) {
						oObjVld.formObj.submit();
					}
					else
					{
						var msgHeader = '';

					    msgHeader  = "----===x ERRO AO SUBMETER O FORMULÁRIO x===----\n\n"
					    msgHeader += "Foram encontrado(s) " + numError + " erro(s).\n";
					    msgHeader += "Corrija os campos que apresentaram problemas e \n";
					    msgHeader += "submeta novamente o formulário.\n\n";
					    msgHeader += "===================================\n\n"
				
						alert ( msgHeader );
					}
				}
				else {
					alert('Erro na leitura da resposta pelo servidor.');
				}
			}
		}

		oXmlHttp.send ( dataPost );
    }
	catch ( erro ) {
		alert( 'Erro: ' + erro.message );
	}
}
