// for automatic js validation of forms

function myFormValidator(a_form_name, a_module, a_action,a_iscallback)
{
	this.properties = $H({
		form_name: a_form_name,
		module: a_module,
		action: a_action,
		msg_checking: 'Checking...'
		});
	
	this.fields = $H();
	this.fields_parents = $H();
	
	this.workers = 1;
	this.workersform = true;
	this.lastvalidate = a_iscallback;
	//alert(this.properties.inspect());
	
	this.start = function()
	{
		//alert(this.fields.inspect());
		var a_this = this;
		this.fields.each( function(f)
		{
			
			//var field = $(f.value.get('name'));
			
			var fields = $(a_this.getProperty('form_name')).select('[name="'+f.value.get('name')+'"]');
			
			fields.each( function(field)
			{
				if (field)
				{
					//field.onblur = function() { formValidator.fieldOnBlurCallback(f.value.get('name')); };
					//field.onfocus = function() { formValidator.fieldOnFocusCallback(f.value.get('name')); };
					Event.observe(field, 'blur', a_this.fieldOnBlurCallback.bindAsEventListener(a_this) );
					Event.observe(field, 'mouseover', a_this.fieldOnFocusCallback.bindAsEventListener(a_this) );
					Event.observe(field, 'mouseout', a_this.fieldOnOutCallback.bindAsEventListener(a_this) );
				}
			});
			
			
			a_this.doFieldInit(f.value.get('name'));
			
		});
		if(this.lastvalidate == true)
		  Event.observe($(this.getProperty('form_name')), 'submit', a_this.onSubmitCallback.bindAsEventListener(a_this) );
		  
		//Event.observe($('step_one'), 'click', a_this.onSubmitCallback.bindAsEventListener(a_this));
		
		//$(formValidator.getProperty('form_name')).commit.onclick = function () { return formValidator.onSubmitCallback(); };
		
		//$(this.properties.get('form_name')).focusFirstElement();
	}
	
	
	
	this.setProperty = function(name, value)
	{
		this.properties.set(name, value);
	}
	
	this.getProperty = function(name)
	{
		//alert(this.properties.get(name));
		return this.properties.get(name);
	}
	
	this.addField = function(a_name, a_validators, has_error)
	{
		var a_status = 'not_yet_validated';
		if (has_error) a_status = 'error';
		this.fields.set(a_name, $H({ name: a_name, validators: a_validators, status: a_status, has_tooltip: false, tooltip_text:'' }) );
	}
	
	
	this.getFieldValue = function (field_name)
	{
		var field = $(field_name);
		
		if (field)
		{
			if (field.type!='radio') return $F(field_name);
		}

		var elements = document.forms[this.getProperty('form_name')].elements[field_name];
		var value = null;
			
		var i = 0;
		for (i=0;i<elements.length;i++)
		{
			if (elements[i].checked==true)
			{
				value = elements[i].value;
				break;
			}
		}
		return value;
	}
	
	
	this.addTooltipToField = function(a_name, tooltip_text)
	{
		this.fields.get(a_name).set('has_tooltip', true);
		this.fields.get(a_name).set('tooltip_text', tooltip_text);
	}
	
	this.showFieldTooltip = function(a_name)
	{
		//alert(a_name+' '+this.fields.get(a_name).inspect());
		if (!this.fields.get(a_name).get('has_tooltip')) return;
		//if (this.fields.get(a_name).get('status') == 'error') return;
		
		//alert($('tooltip_for_'+a_name).descendants()[0].inspect());
		var field = $('tooltip_for_'+a_name);
		var field_content = field.firstDescendant();
		field_content.innerHTML = this.fields.get(a_name).get('tooltip_text');
		field.show();
		
	}
	
	this.hideFieldTooltip = function(a_name)
	{
		//alert(a_name);
		if (!this.fields.get(a_name).get('has_tooltip')) return;
		var field = $('tooltip_for_'+a_name);
		field.hide();
	}
	
	
	this.setErrorForField = function(a_name, error_msg)
	{
		this.fields.get(a_name).set('status', 'error');
		this.fields.get(a_name).set('error_msg', error_msg);
		return false;
	}
	
	this.getStatus = function(a_name)
	{
		return this.fields.get(a_name).get('status');
	}
	
	this.setCheckingForField = function(a_name)
	{
		this.fields.get(a_name).set('status', 'checking');
		this.fields.get(a_name).set('error_msg', this.getProperty('msg_checking'));
		return false;
	}
	
	this.setOkForField = function(a_name)
	{
		//alert(a_name);
		this.fields.get(a_name).set('status', 'ok');
		return true;
	}
	
	
	
	this.doFieldInit = function(a_name)
	{
		this.fields_parents.set(a_name,a_name);
		this.fields.get(a_name).get('validators').each( function(validator)
		{
			//alert('window.js_validator_init_'+validator.get('name'));
			if(typeof eval('window.js_validator_init_'+validator.get('name')) == 'function')
			{
				eval('js_validator_init_'+validator.get('name')+'( a_name, validator.get("params"));')
			}
		});
		return true;
	}
	
	
	this.doCheckOnField = function(a_name)
	{
		var no_error = true;
			
		formValidator.setOkForField(a_name);
		
		this.fields.get(a_name).get('validators').each( function(validator)
		{
			if (no_error)
			{	   
				no_error = eval('js_validator_'+validator.get('name')+'( a_name, validator.get("params"));');
			}
		});
		this.afterCheckingFieldCallback(a_name);
		//alert(no_error);
		return no_error;
	}
	
	
	
	this.afterCheckingFieldCallback = function(a_name)
	{
		//alert('after checking'+a_name);
		var error_container_name = 'error_for_'+a_name;
		
		if (this.fields.get(a_name).get('status')!='ok')
		{
			$(error_container_name).innerHTML = this.fields.get(a_name).get('error_msg');
			if (isHidden(error_container_name))
			{
				//new Effect.Appear(error_container_name, {duration:0.2});
				$(error_container_name).show();
			}	
		}
		else
		{
			//new Effect.Fade(error_container_name, {duration:0.2});
			$(error_container_name).hide();
		}
	}
	
	this.onSubmitCallback = function(event)
	{
		var can_submit = true;
		var a_this = this;
		this.fields.each( function(field)
			{
				//if (!can_submit) return false;
				//alert(field.value.get('field_check_function'));
				if (field.value.get('status') != 'ok')
				if (field.value.get('status') != 'checking')
				{
					var res = a_this.doCheckOnField(field.value.get('name'));
					//alert(res);
					if (!res)
					{
						can_submit = false;
						//return false;
					}
				}
			});
		if (!can_submit) event.stop();
		return can_submit;
	}

	this.onStepOneCallback = function(event)
	{
		var can_submit = true;
		var a_this = this;
		var myFields = new Array("company","email","fname","lname","street","housenr","zip","city","phone","fax","cell_phone");
		
		if(!$('user_sex_company').checked)
			$('company').value = $('fname').value+" "+$('lname').value;  
		
		this.fields.each( function(field)
			{
				if (myFields.toString().indexOf(field.value.get('name')) !== -1)
				if (field.value.get('status') != 'ok')
				if (field.value.get('status') != 'checking')
				{
					var res = a_this.doCheckOnField(field.value.get('name'));
					if (!res)
					{
						can_submit = false;
					}
				}
			});
		if (!can_submit) event.stop();
		else
		{
			registrationPart('part_1_4','part_2_4');
  			fillDefaultData();
		}
	}

	this.onStepTwoCallback = function(event)
	{
		var myCheck = this.forStepTwoCheckTimes();
		if(!myCheck)
		{
			var can_submit = true;
			$('error_for_office_times').style.display = 'none';
		}
		else
		{
			var can_submit = false;
			$('error_for_office_times').style.display = 'block';
		}	
		var a_this = this;
		var myFields = new Array("office_name","office_emergency","office_street","office_zip","office_city","office_info","office_house","user_birthday","office_times");
		
		this.fields.each( function(field)
			{
				if (myFields.toString().indexOf(field.value.get('name')) !== -1)
				if (field.value.get('status') != 'ok')
				if (field.value.get('status') != 'checking')
				{
					var res = a_this.doCheckOnField(field.value.get('name'));
					if (!res)
					{
						can_submit = false;
					}
				}
			});
		if (!can_submit) event.stop();
		else
		{
			registrationPart('part_2_4','part_3_4');
		}
	}
	
	this.forStepTwoCheckTimes = function()
	{
		var set_error = true;
		for(i=0;i<=6;i++)
		{
			if($('user_office_times['+i+']').checked)
				set_error = false;
		}
		
		return set_error;
	}
	
	this.onCCStepOneCallback = function(event)
    {
        var can_submit = true;
        var a_this = this;
        var myFields = new Array("company","email","welcome");
        
        this.fields.each( function(field)
            {
                if (myFields.toString().indexOf(field.value.get('name')) !== -1)
                if (field.value.get('status') != 'ok')
                if (field.value.get('status') != 'checking')
                {
                    var res = a_this.doCheckOnField(field.value.get('name'));
                    if (!res)
                    {
                        can_submit = false;
                    }
                }
            });
        if (!can_submit) event.stop();
        else
        registrationPart('part_1_4','part_2_4');
    }
	
	this.onCCStepTwoCallback = function(event)
    {
        var myCheck = this.forStepTwoCheckTimes();
        if(!myCheck)
        {
            var can_submit = true;
            $('error_for_office_times').style.display = 'none';
        }
        else
        {
            var can_submit = false;
            $('error_for_office_times').style.display = 'block';
        }   
        var a_this = this;
        var myFields = new Array("office_name","office_emergency","office_street","office_zip","office_city","office_info","office_house","office_www","office_times");
        
        this.fields.each( function(field)
            {
                if (myFields.toString().indexOf(field.value.get('name')) !== -1)
                if (field.value.get('status') != 'ok')
                if (field.value.get('status') != 'checking')
                {
                    var res = a_this.doCheckOnField(field.value.get('name'));
                    if (!res)
                    {
                        can_submit = false;
                    }
                }
            });
        if (!can_submit) event.stop();
        else
        {
            registrationPart('part_2_4','part_3_4');
        }
    }
	
	this.onCCStepThreeCallback = function(event){
	    var can_submit = true;
        var a_this = this;
        var indexer = this.workers;
        var t_type  = this.workersform;
        
        var myFields = new Array("worker_fname_"+indexer,"worker_lname_"+indexer,"worker_position_"+indexer,"worker_email_"+indexer,"worker_phone_"+indexer);
        
        this.fields.each( function(field)
            {
                if (myFields.toString().indexOf(field.value.get('name')) !== -1)
                if (field.value.get('status') != 'ok')
                if (field.value.get('status') != 'checking')
                {
                    var res = a_this.doCheckOnField(field.value.get('name'));
                    if (!res)
                    {
                        can_submit = false;
                    }
                }
            });
        if (!can_submit) event.stop();
        else
        {
           if(t_type == true)
            registrationPart('part_3_4','part_4_4');
          else
            subcallpart(indexer);  
        }
	}
	
	this.onCCStepFourCallback = function(event)
    {
        var can_submit = true;
        var a_this = this;
        var myFields = new Array("cal_question_1","cal_answer_1");
        
        this.fields.each( function(field)
            {
                if (myFields.toString().indexOf(field.value.get('name')) !== -1)
                if (field.value.get('status') != 'ok')
                if (field.value.get('status') != 'checking')
                {
                    var res = a_this.doCheckOnField(field.value.get('name'));
                    if (!res)
                    {
                        can_submit = false;
                    }
                }
            });
        if (!can_submit) event.stop();
        else
        registrationPart('part_4_4','part_5_4');
    }
		
	this.fieldOnFocusCallback = function(event)
	{
		var field = event.element();
		var a_name = this.fields_parents.get(field.name);
		this.showFieldTooltip(a_name);	
		return true;
	}
	
	this.fieldOnBlurCallback = function(event)
	{
		//alert(event.element().inspect());
		
		var field = event.element();
		var a_name = this.fields_parents.get(field.name);
		//this.hideFieldTooltip(a_name);
		
		//this.fields.get(field.name).get('field_check_function')();
		this.doCheckOnField(a_name);
		return true;
	}
	
	this.fieldOnOutCallback = function(event)
	{
		var field = event.element();
		var a_name = this.fields_parents.get(field.name);
		this.hideFieldTooltip(a_name);
	}
}







function js_validator_required(field_name, params)
{
	var value = formValidator.getFieldValue(field_name);
	if (value)
	{
		var field_length = value.length;
		if (field_length > 0)
		{
			return formValidator.setOkForField(field_name);
		}
	}
	return formValidator.setErrorForField(field_name, params.get('msg'));	
}


function js_validator_sfStringValidator(field_name, params)
{
	var field_length = $F(field_name).length;
	
	if (typeof params.get('min') != undefined)
	if (field_length > 0)
	if (field_length < params.get('min'))
	{
		return formValidator.setErrorForField(field_name, params.get('min_error'));	
	}
	
	if (typeof params.get('max') != undefined)
	if (field_length > params.get('max'))
	{
		return formValidator.setErrorForField(field_name, params.get('max_error'));	
	}
	
	return formValidator.setOkForField(field_name);
}


function js_validator_sfEmailValidator(field_name, params)
{
	var field_value = $F(field_name);
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (!filter.test(field_value))
	{
		return formValidator.setErrorForField(field_name, params.get('email_error'));
	}
	return formValidator.setOkForField(field_name);
}

function js_validator_sfRegexValidator(field_name, params)
{
	var field_value = $F(field_name);
	var filter  = /(.+)/;
	if(params.get('regex') == 'is_number')
		var filter  = /^([0-9]{0,})+$/;
	if(params.get('regex') == 'is_www')
		var filter  = /^([http:\/\/])/;
	if(params.get('regex') == 'is_phone')
		var filter  = /^([0-9\s\-\(\)\+]{0,})+$/;
	if(params.get('regex') == 'is_required_phone')
		var filter  = /^([0-9\s\-\(\)\+]{7,})+$/;
		
	if (!filter.test(field_value))
	{
		return formValidator.setErrorForField(field_name, params.get('match_error'));
	}
	return formValidator.setOkForField(field_name);
}

function js_validator_sfCompareValidator(field_name, params)
{
	var field_value = $F(field_name);
	var field_to_check_value = $F(params.get('check'));
	
	if (field_to_check_value.length > 0)	
	if (field_to_check_value != field_value )
	{
		return formValidator.setErrorForField(field_name, params.get('compare_error'));
	}
	return formValidator.setOkForField(field_name);
}


function js_validator_sfPropelUniqueValidator(field_name, params)
{
	var field_value = $F(field_name);
	
	var parameters = $H();
	
	parameters.set('value_to_check', field_value);
	parameters.set('class', params.get('class'));
	parameters.set('column', params.get('column'));
	parameters = parameters.toQueryString();
	
	var ajax_params = new Object();
	ajax_params.parameters = parameters;
	
	ajax_params.onSuccess = function(response, json)
		{
			//alert(json.inspect());
			var exists = json[1];
			if (exists == 'true')
			{
				formValidator.setErrorForField(field_name, params.get('unique_error'));
			}
			else
			{
				formValidator.setOkForField(field_name);
			};
			formValidator.afterCheckingFieldCallback(field_name);
		};


	
	//alert(ajax_params.inspect());
	var ajax = new Ajax.Request('/misc/checkSfPropelUniqueValidator', ajax_params);
	
	return formValidator.setCheckingForField(field_name);
	
}

function js_validator_sfPropelUniqueAdminValidator(field_name, params)
{
	var field_value = $F(field_name);

	var parameters = $H();

	parameters.set('value_to_check', field_value);
	parameters.set('class', params.get('class'));
	parameters.set('column', params.get('column'));
	parameters = parameters.toQueryString();

	var ajax_params = new Object();
	ajax_params.parameters = parameters;

	ajax_params.onSuccess = function(response, json)
		{
			//alert(json.inspect());
			var exists = json[1];
			if (exists == 'true')
			{
				formValidator.setErrorForField(field_name, params.get('unique_error'));
			}
			else
			{
				formValidator.setOkForField(field_name);
			};
			formValidator.afterCheckingFieldCallback(field_name);
		};



	//alert(ajax_params.inspect());
	var ajax = new Ajax.Request('/admin.php/misc/checkSfPropelUniqueValidator', ajax_params);

	return formValidator.setCheckingForField(field_name);

}

function js_validator_init_CCMultiFieldDateValidator(field_name, params)
{
	formValidator.fields_parents.set(params.get('day_field'),field_name);
	formValidator.fields_parents.set(params.get('month_field'),field_name);
	formValidator.fields_parents.set(params.get('year_field'),field_name);
	
	Event.observe(params.get('day_field'), 'blur', formValidator.fieldOnBlurCallback.bindAsEventListener(formValidator) );
	Event.observe(params.get('day_field'), 'focus', formValidator.fieldOnFocusCallback.bindAsEventListener(formValidator) );
	Event.observe(params.get('month_field'), 'blur', formValidator.fieldOnBlurCallback.bindAsEventListener(formValidator) );
	Event.observe(params.get('month_field'), 'focus', formValidator.fieldOnFocusCallback.bindAsEventListener(formValidator) );
	Event.observe(params.get('year_field'), 'blur', formValidator.fieldOnBlurCallback.bindAsEventListener(formValidator) );
	Event.observe(params.get('year_field'), 'focus', formValidator.fieldOnFocusCallback.bindAsEventListener(formValidator) );
}


function js_validator_CCMultiFieldDateValidator(field_name, params)
{
	//return formValidator.setOkForField(field_name);
	var day = parseInt($F(params.get('day_field')));
	var month = parseInt($F(params.get('month_field')));
	var year = parseInt($F(params.get('year_field')));
	if (!(day>0)) day = 0;
	if (!(month>0)) month = 0;
	if (!(year>0)) year = 0;

	//alert(day+' '+month+' '+year);

	if (!day || !month || !year)
		return formValidator.setErrorForField(field_name, params.get('date_error'));
	
	var monthLength = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

	if (year/4 == parseInt(year/4))
		monthLength[1] = 29;

	if (day > monthLength[month-1])
	{
		day = monthLength[month-1];
		$(params.get('day_field')).selectedIndex = day-1;
	}

	var now = new Date();
	now = now.getTime();

	var dateToCheck = new Date();
	dateToCheck.setYear(year);
	dateToCheck.setMonth(month-1);
	dateToCheck.setDate(day);
	var checkDate = dateToCheck.getTime();

	var futureDate = (now < checkDate);
	var pastDate = (now > checkDate);
	
	if (!pastDate) return formValidator.setErrorForField(field_name, params.get('date_error'));

	return formValidator.setOkForField(field_name);
}
	
	



