/* FROM VALIDATION  :: jan 2008 :: yvba */
/*					   mar 2008 :: roku */

// config vars
var defaultLanguage 	= 'en';
var ajaxFile			= absCorrect + 'ajax.html'; // path of the ajax output file
var formName			= 'theForm'; // name of the html form
var defaultBorderStyle	= 'solid 1px; #ccc'; // border default  style
var errorBorderStyle	= 'solid 1px; #990000'; // border error style
var defaultColor		= '#666'; // font default color
var errorColor 			= '#990000'; // font error color
var defaultBackground 	= '#fff'; // default background color
var errorBackground 	= '#ffd2d2'; // error background color
var errorLayerMessage 	= true; // show erros in layer or in alert window ? true : false


// private vars
var FV;
var fvLang = '';
var errorArray = null;
var formObject = new Array();
var errorLang = new Object();


// set language for error handling
function fv_setLanguage(lang)
{
	if (lang != '') {
		fvLang = lang;	
	} else {
		fvLang = defaultLanguage;	
	}
	errorLang = fv_getLanguage();
}

// get all required fields
function fv_getRequiredFields()
{
	var elements = document.forms[formName].elements;
	
	for(var i=0; i<elements.length; i++) 
	{
		var curElement = elements[i];
		var isRequired = $(curElement).getAttribute("fv_required", 0);
		
		if (isRequired == 'true')
		{
			fv_init($(curElement));
		}
	} // end for
}

// get all required fields in a layer (grouped)
function fv_getRequiredGroup(layername)
{
	var layer = document.getElementById(layername);
	var elements = new Array();
	var txtfld = new Array();
			inputFlds = layer.getElementsByTagName('input');
			txtAreas = layer.getElementsByTagName('textarea');
		
	for (j=0; j<txtAreas.length; j++)
	{
		elements.push(txtAreas[j]);	
	}
	
	for (k=0; k<inputFlds.length; k++)
	{
		elements.push(inputFlds[k]);	
	}

	for(var i=0; i<elements.length; i++) 
	{
		var curElement = elements[i];
		var isRequired = curElement.getAttribute("fv_required", 0);
		
		if (isRequired == 'true')
		{
			fv_init(curElement);
		}
	} // end for
}

// init form validation
function fv_init(formElement)
{
	for (i=0; i<formObject.length; i++)
	{
		if (formObject[i].fieldname.name == formElement.name) return;	
	}
	
	txt    	= formElement.getAttribute("fv_response", 0);
	format 	= formElement.getAttribute("fv_format", 0);	
	minlen 	= formElement.getAttribute("fv_min_len", 0);
	maxlen 	= formElement.getAttribute("fv_max_len", 0);
	depends = formElement.getAttribute("fv_depends", 0);
	param 	= formElement.getAttribute("fv_param", 0);
	equals	= formElement.getAttribute("fv_equals", 0);
	depends_value = formElement.getAttribute("fv_depends_value", 0);
	depends_cond = formElement.getAttribute("fv_depends_condition", 0);
	FV = { fieldname: formElement, fieldtext: txt, fieldtype: format, minlength: minlen, maxlength: maxlen, depends: depends, depends_value: depends_value, depends_cond: depends_cond, param: param, equals: equals };
	fv_registerField(FV);	
}

// register required fields
function fv_registerField(fvObj)
{
	formObject.push(fvObj);
}

// validate form
function fv_validateForm()
{
	errorArray = new Array();
	return fv_validate(formObject);	
}

// check field properies
function fv_validate()
{
	if (errorLayerMessage && $('fv_errors')) $('fv_errors').style.display = 'none';	
	
	for (var o=0; o < formObject.length; o++)
	{
		var fvObj = formObject[o];
		
		fv_reSetStyle(fvObj.fieldname);		
		
		if(fvObj.depends)
		{
			dependObj = document.getElementsByName(fvObj.depends)[0];	
			
			if(fvObj.depends_cond == 'eq')
			{
				if(dependObj.value != fvObj.depends_value)
				{
					continue;
				}
			}
			else if(fvObj.depends_cond == 'neq')
			{
				if(dependObj.value == fvObj.depends_value)
				{
					continue;
				}
			}
			
			if(fvObj.fieldname.value == '')
			{
				errorArray.push(fvObj.fieldtext + ' ' + errorLang.alphanum);
			}
			
			continue;
		}
		
		if (fvObj.equals) //compare field value with parameter given fieldId
		{
			 equalObj = document.getElementById(fvObj.equals);
			 if (fvObj.fieldname.value != equalObj.value || fvObj.fieldname.value == '')
			 {
			 		errorArray.push(fvObj.fieldtext + ' ' + errorLang.equals);
					fv_setStyle(fvObj.fieldname);
			 }
		}
			
		switch(fvObj.fieldtype)
		{
			case 'numeric':
					var regex = /(^\d+$)|(^\d+\.\d+$)/;
					if (!regex.test(fvObj.fieldname.value))
					{
						errorArray.push(fvObj.fieldtext + ' ' + errorLang.numeric);	
						fv_setStyle(fvObj.fieldname);
					}
			break;
			case 'email':
					var mailRegEx  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,6})+$/;
					if (!mailRegEx.test(fvObj.fieldname.value))
					{
						errorArray.push(fvObj.fieldtext + ' ' + errorLang.email);
						fv_setStyle(fvObj.fieldname);
					}
			break;
			case 'database':
					// not ready at the moment
					//fv_checkDBValue(fvObj.fieldname.value, fvObj.param, fvObj.fieldtext, fvObj.fieldname);	
			break;
			case 'login':
				var mailRegEx  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,6})+$/;
				if (!mailRegEx.test(fvObj.fieldname.value))
				{
					errorArray.push(fvObj.fieldtext + ' ' + errorLang.email);
					fv_setStyle(fvObj.fieldname);
				}
				else 
				{
					fv_checkLogin(fvObj.fieldname.value, fvObj.param, fvObj.fieldtext, fvObj.fieldname);
				}
				break;
			
			// custom for waltermeier.com
			case 'productid':
					var pidRegEx = /^[A-Z]{4}\d{3}\.\d{3}$/;
					if (!pidRegEx.test(fvObj.fieldname.value))
					{
						errorArray.push(fvObj.fieldtext + ' enthät keinen gültigen Wert (im Format: KLCH123.456).');
						fv_setStyle(fvObj.fieldname);
					}
					else 
					{
						fv_checkDBValue(fvObj.fieldname.value, fvObj.param, fvObj.fieldtext, fvObj.fieldname);
					}
			break;
			
			case 'captcha':
				fv_checkCaptcha(fvObj.fieldname.value, fvObj.param, fvObj.fieldtext, fvObj.fieldname);
			break;
			
			case 'alphanum':
				var pidRegEx = /[a-zA-Z_0-9]/;
				if (!pidRegEx.test(fvObj.fieldname.value))
				{
					errorArray.push(fvObj.fieldtext + ' ' + errorLang.alphanum);
					fv_setStyle(fvObj.fieldname);
				}
			break;
			
			default:
				if (fvObj.fieldname.value == '')
				{
					errorArray.push(fvObj.fieldtext + ' ' + errorLang.alphanum);
					fv_setStyle(fvObj.fieldname);
				}
			break;		
		}
		
		if (fvObj.minlength)
		{
			var minLength = parseInt(fvObj.minlength);
			if (minLength > 0)
			{
				if (fvObj.fieldname.value.length < minLength)	
				{
					errorArray.push(fvObj.fieldtext + ' benötigt mindestens ' + fvObj.minlength + ' Zeichen.');
					fv_setStyle(fvObj.fieldname);
				}
			}
			continue;
		}
		
		if (fvObj.maxlength)
		{
			var maxLength = parseInt(fvObj.maxlength);
			if (maxLength > 0)
			{
				if (fvObj.fieldname.value.length > maxLength)	
				{
					errorArray.push(fvObj.fieldtext + ' darf nicht mehr als ' + fvObj.maxlength + ' Zeichen enthalten.');
					fv_setStyle(fvObj.fieldname);
				}
			}
			continue;
		}
	}
	
	return fv_getErrors(errorLayerMessage);
}

// check if value allready exists in db
function fv_checkDBValue(inp, id, txt, fldname)
{	
	var ajax = new Ajax.Request(ajaxFile, { method:'post', 
											parameters: 'objects.product_id=' + inp + '&objects.id=' + id,
										  	onSuccess: function(transport) { fv_checkAjax(transport.responseText, txt, fldname); },
											onFailure: function(transport) { fv_ajaxFailure(transport.responseText, txt, fldname); },
											asynchronous: false
										  });
}

// check if value allready exists in db
function fv_checkCaptcha(ajaxFile, cpt, txt, input)
{	
	//alert('1:'+ajaxFile+' 2:'+cpt+' 3:'+txt+' 4:'+input);
	//return;
	var cpt = input.value;
	var ajaxFile = 'captcha.html';
	var ajax = new Ajax.Request(ajaxFile, { method:'post', 
											parameters: 'objects.captcha='+cpt,
										  	onSuccess: function(transport) { fv_checkAjaxCaptcha(transport.responseText, txt, input); },
											onFailure: function(transport) { fv_ajaxFailure(transport.responseText, txt, input); },
											asynchronous: false
										  });
}

//check if value allready exists in db
function fv_checkLogin(inp, id, txt, fldname)
{	
	var ajax = new Ajax.Request(ajaxFile, { method:'post', 
											parameters: 'personalizer.action=checkIfLoginAlreadyExists&personalizer.login=' + inp,
										  	onSuccess: function(transport) { fv_checkAjaxLogin(transport.responseText, txt, fldname); },
											onFailure: function(transport) { fv_ajaxFailure(transport.responseText, txt, fldname); },
											asynchronous: false
										  });
}

// ajax success handler
function fv_checkAjaxCaptcha(response, txt, fldname)
{
	var res = eval(response);
	if (!res)
	{
		errorArray.push(errorLang.captcha);
		fv_setStyle(fldname);
	}
}

//ajax success handler
function fv_checkAjaxLogin(response, txt, fldname)
{
	var res = eval(response);
	if (!res)
	{
		errorArray.push(txt + ' ' + errorLang.exists);
		fv_setStyle(fldname);
	}
}

// ajax success handler
function fv_checkAjax(response, txt, fldname)
{		
	var obj = eval('(' + response + ')');
	if (obj.productid != 'false')
	{
		errorArray.push(txt + errorLang.exists);
		fv_setStyle(fldname);
	}
}



// ajax failure handler 
function fv_ajaxFailure(response, txt, fldname)
{
	errorArray.push(errorLang.ajax);
	fv_setStyle(fldname);
}

// set default field style
function fv_setStyle(obj)
{
	obj.style.border = errorBorderStyle;
	obj.style.color  = errorColor;
	obj.style.background = errorBackground;
}

// set error field style
function fv_reSetStyle(obj)
{
	obj.style.border = defaultBorderStyle;
	obj.style.color  = defaultColor;
	obj.style.background = defaultBackground;
}

// show error message
function fv_getErrors(html)
{
	var errorMessage = '';
	var errors = '';
	
	for (var e=0; e < errorArray.length; e++)
	{
		errors += '- ' + errorArray[e] + '\n';
	}
	
	if (errorArray.length > 0)
	{
		errorMessage = '<strong>' + errorLang.main + '</strong>\n\n' + errors;
		
		if (html) 
		{
			if (!$('fv_errors'))
			{
				return false;
			}

			$('fv_errors').style.display = '';
			$('fv_errors').innerHTML = errorMessage.replace(/\n/g, "<br />");
		} else {
			alert(errorMessage);
		}
		
		errorArray = null;
		return false;
		
	} else {
		return true;
	}
}

