//*******************
// Form Constructor *
//*******************
function CS_Form(wrapper_id, obj_submit_button)
{
	// get id's
	this.wrapper_node	= document.getElementById(wrapper_id);
	this.form_node		= this.wrapper_node.getElementsByTagName('form')[0];
	this.div_nodes		= this.wrapper_node.getElementsByTagName('div');
	this.form_elements	= this.form_node.elements;
	this.submit_button	= obj_submit_button;
	
	// set strings
	this.label_class		= 'cs_form_label';
	this.feedback_class		= 'cs_feedback_info';
	this.validate_class		= 'cs_validate';
	this.error_class		= 'cs_error';
	
	// initialize form
	this.init();
}

//*********************
// Function init form *
//*********************
CS_Form.prototype.init = function()
{
	// get nodes
	for(var a=0;a<this.div_nodes.length;a++)
	{
		var div_node = this.div_nodes[a];
		
		// feedback node
		if(div_node.className == this.feedback_class)
		{
			this.feedback_node = div_node;
		}
	}
}

//**********************
// Function check form *
//**********************
CS_Form.prototype.check = function()
{
	var error = false;
	
	// get all elements
	for(var b=0;b<this.form_elements.length;b++)
	{
		var form_element = this.form_elements[b];
		
		// only if title attribute is found on non hidden field
		if(form_element.title && form_element.type != 'hidden')
		{
			// reset error class
			var label_node			= this.findLabel(form_element);
			label_node.className	= this.validate_class;
			
			// empty fields or starting with space
			if(!form_element.value || form_element.value.charAt(0) == ' ')
			{
				label_node.className = this.error_class;
				error = true;
			}
			
			// no value on select box
			else if(form_element.type == 'select-one' && form_element.value == 0)
			{
				label_node.className = this.error_class;
				error = true;
			}

			// postal code
			else if(form_element.title == 'postalcode')
			{
				if(form_element.value && !this.checkPostalcode(form_element))
				{
					label_node.className = this.error_class;
					error = true;
				}
			}
			
			// e-mail
			else if(form_element.title == 'email')
			{
				if(form_element.value && !this.checkEmail(form_element))
				{
					label_node.className = this.error_class;
					error = true;
				}
			}
			
			// phone, fax and mobile number
			else if(form_element.title == 'phonenumber' || form_element.title == 'faxnumber' || form_element.title == 'mobilenumber')
			{
				if(form_element.value && !this.checkPhone(form_element))
				{
					label_node.className = this.error_class;
					error = true;
				}
			}
			
			// bank number
			else if(form_element.title == 'banknumber')
			{
				if(form_element.value && !this.checkBankNr(form_element))
				{
					label_node.className = this.error_class;
					error = true;
				}
			}
			
			// float number
			else if(form_element.title == 'float')
			{
				if(form_element.value && !this.checkFloat(form_element))
				{
					label_node.className = this.error_class;
					error = true;
				}
			}
			
			// passwords
			else if(form_element.title == 'password' || form_element.title == 'password_1' || form_element.title == 'password_2')
			{
				if(form_element.title == 'password')
				{
					if(form_element.value && !this.checkPasswordLength(form_element))
					{
						label_node.className = this.error_class;
						error = true;
					}
				}
				else
				{
					if(form_element.value && !this.checkPassword())
					{
						label_node.className = this.error_class;
						error = true;
					}
				}		
			}
		}
	}
	
	// set error output
	if(error)
	{
		this.feedback_node.style.display = 'block';
		
		return false;
	}
	
	// submit form
	this.send();
}

//****************************
// Function find input label *
//****************************
CS_Form.prototype.findLabel = function(obj)
{
	var row_node	= obj.parentNode.parentNode;
	var div_nodes	= row_node.getElementsByTagName('div');
	var label_node	= null;
	
	for(var a=0;a<div_nodes.length;a++)
	{
		var div_node = div_nodes[a];
		
		if (div_node.className == this.label_class)
		{
			label_node	= div_node.getElementsByTagName('label')[0];
		}
	}
	
	return label_node;
}

//****************************
// Function check postalcode *
//****************************
CS_Form.prototype.checkPostalcode = function(strPostalcode)
{
	var validRegExp_1 = /^[1-9][0-9]{3} [a-z|A-Z]{2}$/;
	var validRegExp_2 = /^[1-9][0-9]{3}[a-z|A-Z]{2}$/;
	var strPostalcode = strPostalcode.value;
	if(strPostalcode.search(validRegExp_1) == -1 && strPostalcode.search(validRegExp_2) == -1) 
	{
		return false;
	} 
	return true; 
}

//**********************
// Function checkEmail *
//**********************
CS_Form.prototype.checkEmail = function(strEmail)
{
	var validRegExp = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	var strEmail = strEmail.value;
	
	if(strEmail.search(validRegExp) == -1) 
	{
		return false;
	} 
	return true; 
}

//**********************
// Function checkPhone *
//**********************
CS_Form.prototype.checkPhone = function(strPhone)
{
	var validChars = "0123456789";
	var character;

	for(var z=0;z<strPhone.value.length;z++) 
	{ 
		character = strPhone.value.charAt(z); 
		if(validChars.indexOf(character) == -1 || strPhone.value.length < 10) 
		{
			return false;
		}
	}
	return true;
}

//**********************
// Function checkFloat *
//**********************
CS_Form.prototype.checkFloat = function(str)
{
	var result = null;
	
	// For only positive whole numbers, including zero, uncomment the following:  
	//result = str.value.match(/^\d+$/);
	
	// For only positive decimal numbers, including zero, uncomment the following:  
	result = str.value.match(/^\d+(\.\d+)?$/);
	
	// For positive and negative decimal numbers, including zero, uncomment the following:  
	// result = str.value.match(/^-?\d+(\.\d+)?$/);
	
	// For positive and negative numbers, including zero, uncomment the following:  
	// result = str.value.match(/^-?\d+$/);
	
	return (result != null);
}

//***********************
// Function checkBankNr *
//***********************
CS_Form.prototype.checkBankNr = function(strBankNr)
{
	var validChars = "0123456789";
	var character;

	for(var z=0;z<strBankNr.value.length;z++) 
	{ 
		character = strBankNr.value.charAt(z); 
		if(validChars.indexOf(character) == -1 || strBankNr.value.length < 8) 
		{
			return false;
		}
	}
	return true;
}

//*************************
// Function checkPassword *
//*************************
CS_Form.prototype.checkPassword = function()
{
	// equal passwords with a minimum of 6 characters
	if((this.password_1.value != this.password_2.value)  || this.password_1.value.length < 6) 
	{
		return false;
	}

	return true;
}

//*******************************
// Function checkPasswordLength *
//*******************************
CS_Form.prototype.checkPasswordLength = function(strPassword)
{
	// minimum of 6 characters
	if(strPassword.value.length < 6) 
	{
		return false;
	}

	return true;
}

//****************
// Function send *
//****************
CS_Form.prototype.send = function()
{
	// disable submit button
	this.submit_button.disabled = true;
	
	// submit form
	this.form_node.submit();
}