var current_kplus_form = null;

function MultipartForm()
{
	var form_id;
	var fieldsets;
	var current_fieldset = 0;
	var validations = new Object();
	
	this.init = function( id )
	{
		form_id = id;
		$(form_id)['handler'] = this;
		current_kplus_form = $(form_id);
		
		// Get all fieldsets
		fieldsets = $(form_id).getElementsByTagName('FIELDSET');
		
		// If more than one, add 'Prev' & 'Next' buttons
		if ( fieldsets.length>1 )
		{
			new Insertion.Before($('submit_button'),'<input id="prev_button" type="button" value="<- Назад" /><input id="next_button" type="button" value="Дальше ->" />')
			Event.observe('prev_button','click',this.on_prev);
			Event.observe('next_button','click',this.on_next);
		}
		
		// Add handler to a form
		$(form_id).onsubmit=this.on_submit;
				
		// Hide all non-current fieldsets
		for( var i=1; i<fieldsets.length; i++ )
			fieldsets[i].style.display = 'none';
			
		_render();
	}
	
	this.validate_current_fieldset = function()
	{		
		this.hide_validation_errors();

		var f = fieldsets[current_fieldset];
		var i;
		var validation_errors = new Array();
	
		var inputs = f.getElementsByTagName('INPUT');
		for(i=0;i<inputs.length;i++)
		{
			var v = inputs[i].id
			if(v && validations[v])
			{
				switch(validations[v].type)
				{
					case 'not_empty':
						if (!this.validate_not_empty( inputs[i] ))
						{
							validation_errors.push(validations[v].error_message);
							this.higlight_invalid_label(v);
						}
						break;
					case 'email':
						if (!this.validate_email( inputs[i] ))
						{
							validation_errors.push(validations[v].error_message);
							this.higlight_invalid_label(v);
						}
						break;
					case 'number':
						if (!this.validate_number( inputs[i] ))
						{
							validation_errors.push(validations[v].error_message);
							this.higlight_invalid_label(v);
						}
						break;
					case 'date':
						if (!this.validate_date( inputs[i] ))
						{
							validation_errors.push(validations[v].error_message);
							this.higlight_invalid_label(v);
						}
						break;
				}
			}
		}
		
		var inputs = f.getElementsByTagName('TEXTAREA');
		for(i=0;i<inputs.length;i++)
		{
			var v = inputs[i].id
			if(v && validations[v])
			{
				switch(validations[v].type)
				{
					case 'not_empty':
						if (!this.validate_not_empty( inputs[i] ))
						{
							validation_errors.push(validations[v].error_message);
							this.higlight_invalid_label(v);
						}
						break;
				}
			}
		}
		
		var inputs = f.getElementsByTagName('SELECT');
		for(i=0;i<inputs.length;i++)
		{
			var v = inputs[i].id
			if(v && validations[v])
			{
				$(v).addClassName('invalid');
				switch(validations[v].type)
				{
					case 'selected':
						if (!this.validate_selected( inputs[i] ))
						{
							validation_errors.push(validations[v].error_message);
							this.higlight_invalid_label(v);
						}
						break;
				}
			}
		}
		
		if ( validation_errors.length==0 )
			return true;
		
		this.show_validation_errors(validation_errors);
		return false;
	}
	
	this.on_prev = function(e)
	{		
		with(current_kplus_form.handler)
		{
			hide_validation_errors();
			var i;
			if ( current_fieldset==0 )
				return;
		
			current_fieldset--;
			
			_render();
		}
	}
	
	this.on_next = function(e)
	{	
		with( current_kplus_form.handler )
		{
				
			if (!validate_current_fieldset())
				return;
		
			if ( current_fieldset==fieldsets.length-1 )
				return;
			
			current_fieldset++;
		
			_render();
		}
	}
	
	this.on_submit = function()
	{
		with( this.handler )
		{
			return validate_current_fieldset();
		}
	}
	
	this.add_validation = function(id,type,error_message)
	{
		validations[id] = {type: type, error_message: error_message}
	}
	
	this.hide_validation_errors = function()
	{
		if ( $('validation_errors') )
			Element.remove($('validation_errors'));
		var invalid = document.getElementsByClassName('invalid');
		for(var i=0;i<invalid.length;i++)
			invalid[i].removeClassName('invalid');
		this.clear_invalid_highlights();
	}
	
	this.higlight_invalid_label = function(id)
	{
		var labels = document.getElementsByTagName('LABEL');
		for(var i=0;i<labels.length;i++)
			if ( labels[i].htmlFor==id )
			{
				Element.addClassName(labels[i],'invalid');
				return;
			}
	}
	
	this.clear_invalid_highlights = function()
	{
		var labels = document.getElementsByTagName('LABEL');
		for(var i=0;i<labels.length;i++)
			Element.removeClassName(labels[i],'invalid');
	}
	
	this.show_validation_errors = function( errors )
	{
		if ( !$('validation_errors') )
			new Insertion.Before(form_id,'<ul id="validation_errors"></ul>');
		for(var i=0; i<errors.length; i++ )
			new Insertion.Bottom('validation_errors','<li>'+errors[i]+'</li>');
	}
	
	this.validate_not_empty = function( field )
	{
		if ( !field.value || field.value.length==0 )
			return false;
		return true;
	}
	
	this.validate_email = function( field )
	{
		var emailReg = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
		var regex = new RegExp(emailReg);
		return regex.test(field.value);
	}
	
	this.validate_number = function( field )
	{
		return !isNaN(parseInt(field.value));
	}
	
	this.validate_date = function( field )
	{
		return field.value.match("^[0-9]+\\\.[0-9]+\\\.[0-9]+$");
	}
	
	// Validate that something is selected from a select list
	this.validate_selected = function( field )
	{
		return field.options[field.selectedIndex].value!='';
	}
	
	// Renders current fieldset and buttons
	function _render()
	{
		for( var i=0; i<fieldsets.length; i++ )
			if ( current_fieldset==i )
				fieldsets[i].style.display = 'block';
			else
				fieldsets[i].style.display = 'none';
		
		if ( $('prev_button') )
			if ( current_fieldset==0 )
				$('prev_button').disabled = true;
			else
				$('prev_button').disabled = false;
				
		if ( $('next_button') )
			if ( current_fieldset==fieldsets.length-1 )
				$('next_button').disabled = true;
			else
				$('next_button').disabled = false;
		
		if ( current_fieldset==fieldsets.length-1 )
			$('submit_button').disabled = false;
		else
			$('submit_button').disabled = true;
	}
}