﻿/* JS-File for input validation in forms */

var RSValidation = new Class(
{

	Implements: [Events, Options],
	
	options:
	{
		error_msg_title: 'Please enter the following information:\n',
		alert: true,
		field_default: {
			'required': false,
			'novalue': '',
			'type': 'text'
		},
		inlineerror: false
	},

	initialize: function(formname, options)
	{
		this.formObj = document.forms[formname];

		this.formObj.onsubmit = function(){
			return this.validateForm();
		}.bindWithEvent(this);

		this.fields = [];

		if (!options) options = [];
		this.options = $merge(this.options, options);

		// IE hat Probleme mit DOM
		if (Browser.Engine.trident)
		{
			this.options.inlineerror = false;
		}
	},

	addField: function(fieldname, fieldtitle, fieldobj)
	{
		if (!fieldobj) fieldobj = {};
		fieldobj.name = fieldname;
		fieldobj.title = fieldtitle;
		fieldobj.required = true;
		fieldobj.obj = this.formObj.elements[fieldname];
		if (!fieldobj.type)
		{
			fieldobj.type = fieldobj.obj.type;
		}
		if (this.options.inlineerror)
		{
			fieldobj.parentobj = fieldobj.obj.getParent();
			fieldobj.errormsg = new Element('p', { 'class':'error-message','styles':{ 'display':'none' }}).inject(fieldobj.parentobj);
		}
		fieldobj.obj.onblur = function(){this.validateItem(fieldobj)}.bindWithEvent(this,fieldobj);
		this.fields[this.fields.length] = $merge(this.field_default, fieldobj);
	},

	validateForm: function()
	{
		this.errormsg = [];
		this.error = false;
		this.fields.each(function(item, index){
			var checkIt = false;
			if (item.required)
			{
				if (item.iffield)
				{
					if (item.iffield.checked)
					{
						if (this.formObj.elements[item.iffield.field][item.iffield.checked].checked)
						{
							checkIt = true;
						}
					}
					else if (item.iffield.values)
					{
						var field_value = this.formObj.elements[item.iffield.field].options[this.formObj.elements[item.iffield.field].selectedIndex].text;
						if (item.iffield.values.indexOf(field_value) != -1)
						{
							checkIt = true;
						}
					}
				} else {
					checkIt = true;
				}
			}
			if (checkIt)
			{
				if (!this.validateItem(item))
				{
					this.error = true;
					this.errormsg[this.errormsg.length] = item.title;
				}
			}
		},this);

		if (this.error)
		{
			if (this.options.alert)
			{
				this.msg = '';
				this.errormsg.each(function(item, index){
					this.msg = this.msg + "\n* " + item;
				},this);
				alert (this.options.error_msg_title + this.msg);
			}
			return false;
		} else {
			return true;
		}
	},

	validateItem: function(item)
	{
		var valid = true;
		switch(item.type) {
			case 'select-one':
				if (item.obj.options[item.obj.selectedIndex].value) {
					value = item.obj.options[item.obj.selectedIndex].value.trim();
				} else {
					value = item.obj.options[item.obj.selectedIndex].text.trim();
				}
				if ((value == '' || value == item.novalue))
				{
					valid = false;
				}
			break;

			case 'textarea':
			case 'text':
				if (item.obj.value == '')
				{
					valid = false;
				}
			break;

			case 'radio':
				valid = false;
				
				for (var i=0; i<item.obj.length; i++)
				{
					if (item.obj[i].checked)
					{
						valid = true;
					}
				}
			break;

			case 'email':
				if (item.obj.value == '')
				{
					valid = false;
				}
			break;
		}

		if (this.options.inlineerror)
		{
			if (!valid)
			{
				item.parentobj.addClass('error');
				item.errormsg.set({'text':'Please check your input','styles':{'display':'block'}});
			} else {
				item.parentobj.removeClass('error');
				item.errormsg.set({'text':'','styles':{'display':'none'}});
			}
		}

		return valid;
	}

});
