CrispStudio = Class.create();
CrispStudio.CPF = Class.create();
/* 
----------------------------------------------------------------------------------------- 
	Form validator
----------------------------------------------------------------------------------------- 
*/
CrispStudio.CPF.FormValidator = Class.create();
CrispStudio.CPF.FormValidator.prototype = {
	
	initialize : function(options)
	{
		this.formElement = $(options.form);
		this.inputElements = options.fieldlist.bindings;		
		this.compareElements = options.fieldlist.compare;		
		this.errorsTitle = options.errorsTitle;
		this.errorsItem = new Template(options.errorsItem);
		this.errorClass = options.errorClass;
		this.isSilent = options.isSilent;
		this.errorList = '';
		if (this.formElement)
		{
			Event.observe(this.formElement, 'submit', this.validate.bindAsEventListener(this));
		}
	},	
	
	validate : function(e)
	{	
		/* compare */
		if (this.compareElements)	
	    {
			for (var i = 0; i < this.compareElements.length; i++)
	    	{
				if (this.compareElements[i].field1 && 
					this.compareElements[i].field2 && 
					($F(this.compareElements[i].field1).length || 
					$F(this.compareElements[i].field2).length) && 
					$F(this.compareElements[i].field1) != $F(this.compareElements[i].field2))
				{
					this.addError(this.compareElements[i]);
				}
			}
		}
		/* regex */
		var fieldValue = '';
		for (var i = 0; i < this.inputElements.length; i++)
	    {
			if (this.inputElements[i].isFCK)
			{
				var oEditor = FCKeditorAPI.GetInstance(this.inputElements[i].field);
				fieldValue = oEditor.GetXHTML(true);
				if (!this.regexTest(this.inputElements[i].regex, fieldValue))
				{
					this.addError(this.inputElements[i]);
					//$(this.inputElements[i].field).addClassName(this.errorClass);
				}
			}
			else
			if ((this.inputElements[i].field && 
				!this.regexTest(this.inputElements[i].regex, $F(this.inputElements[i].field)))||
				(this.inputElements[i].field && $(this.inputElements[i].field).type == "checkbox" && 
				!$(this.inputElements[i].field).checked))
			{
				this.addError(this.inputElements[i]);
				$(this.inputElements[i].field).addClassName(this.errorClass);
			}
			else
			{
				$(this.inputElements[i].field).removeClassName(this.errorClass);
			}
		}		


		if (this.errorList != '')
		{
			if (!this.isSilent)
			{
				alert(this.errorsTitle + this.errorList);
			}
			this.errorList = '';
			Event.stop(e);
		}		
	},
	
	addError : function(element)
	{

		var errorText = element.errorText;
		if (errorText.blank() && !this.isSilent)
		{
			var tempElement = $$('label[for=' + element.field +']')[0];
			if (tempElement)
			{
				errorText = tempElement.firstChild.nodeValue.replace(':','');
			}
		}
		this.errorList += this.errorsItem.evaluate({errorName: errorText});
	},
	
	regexTest : function(regexText, testString)
	{
		var regex = new RegExp(regexText);
		return regex.test(testString);
	}
}
