Event.observe(window, 'load', function() {
	
	if($('franchise')) {
		// focus first form element and reset form
		if(!$('errorneous'))
			Form.reset('franchise');
		else
			Franchise.validateForm.apply($('franchise'));
			
		Form.focusFirstElement('franchise');
		
		// register onchange events for all input fields in the form
		var inputs = $A(Form.getInputs('franchise'));
		inputs.each(function(el) {
			Event.observe(el, 'change', Franchise.validateField.bind(el, Franchise.showValidationStatus));
		});
		
		Event.observe('franchise', 'submit', Franchise.validateForm.bind($('franchise')));
	}
});

var Franchise = Object.extend({}, Franchise || {});

Franchise.validateForm = function(event) {
	if(event)
		Event.stop(event);
	
	// run validations on each field
	var inputs = Form.getInputs(this);
	var hasErrors = false;
	for(var i=0; i<inputs.length; i++)
	{
		var result = Franchise.validateField.apply(inputs[i], [Franchise.showValidationStatus]);
		if(!result)
			hasErrors = true;
	}
	
	if(hasErrors)
	{
		// found some errors
		// show 'form not valid message'
		return false;
	}
	else
	{
		// no errors found
		// submit the form
		this.submit();
	}
	
	return false;
}

Franchise.fieldStatus = {};

Franchise.validateField = function(onValidated) {
	// get validators from element's className
	// should be prefixed with v-
	
	var validators = this.className.match(/\bv-[\w-]+\b/g);
	if(!validators)
		return true;
	
	for(i = 0; i < validators.length; i++)
	{
		var name = validators[i].substr(2);
		var parsedName = name.split('-');
		var validatorName = parsedName[0];
		var params = parsedName.slice(1);
		
		if(Franchise.Validators[validatorName])
			var result = Franchise.Validators[validatorName](this, params);
			
		// -1 means the result is delayed, used for ajax validation of fields, 
		// and so on
		if(!result || result == -1)
			break;
	}
	// get the locale from the className of the body
	var locale = $$('body')[0].className;
	var message = Franchise.ValidationErrors[validatorName] ? Franchise.ValidationErrors[validatorName][locale] : '';
	
	// execute onValidated handler
	if(onValidated)
		onValidated(this, result, message);
	
	return result;
}

Franchise.showValidationStatus = function(el, status, message)
{
	$(el.parentNode).removeClassName('validation-ok');
	$(el.parentNode).removeClassName('validation-error');
	$(el.parentNode).removeClassName('validation-waiting');
	
	// assign a class to the parent <li> of the form
	if(status == true)
		$(el.parentNode).addClassName('validation-ok');
	else if(status == false)
		$(el.parentNode).addClassName('validation-error');
	else if(status == -1)
		$(el.parentNode).addClassName('validation-waiting');
	
	var messageElementId = el.id + '_message';
	
	// reset message field
	if($(messageElementId))
		$(messageElementId).update('');
	
	// show an error message if any
	if(typeof message != "undefined" && message != '' && status == false)
	{
		if(!$(messageElementId))
		{
			var html = '<span class="validation-message" id="'+messageElementId+'">'+message+'</span>';
			new Insertion.After(el, html);
		}
		else
		{
			$(messageElementId).update(message);
		}
	}
	
	Franchise.fieldStatus[el.id] = status;
}

Franchise.Validators = {
	/**
	 * BASIC VALIDATORS
	 */
	
	notempty: function(el)
	{
		return $F(el).match(/^\s*$/) ? false : true;
	},
	
	phone: function(el)
	{
		return $F(el).match(/^[0-9\s\-]+$/) ? true : false;
	},
	
	alpha: function(el)
	{
		return $F(el).match(/^[a-zA-Zа-яА-Я\s]+$/) ? true : false;
	},
	
	email: function(el)
	{
		var regex = /^[a-zA-Z][\w\.-_]*[a-zA-Z0-9_]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/;
		return $F(el).match(regex) ? true : false;
	},
	
	
	
	/**
	 * CUSTOM VALIDATORS
	 */
	recheck: function(el, params)
	{
		var other = $(params.shift());
		
		var result = $F(other) == $F(el);
		Franchise.showValidationStatus(other, result);
		return true;
	}	
}

Franchise.ValidationErrors = {
	'notempty': {
		'bg_BG': 'Това поле не може да бъде празно.',
		'en_US': 'This field cannot be left blank.'
	},
	'phone': {
		'bg_BG': 'Невалиден телефон.',
		'en_US': 'Invalid phone number.'
	},
	'alpha': {
		'bg_BG': 'Това поле приема само букви.',
		'en_US': 'This field accepts only alphabetic characters.'
	},
	'email': {
		'bg_BG': 'Моля, въведете валиден e-mail адрес (напр. john@company.com).',
		'en_US': 'Please, enter a valid e-mail address (eg. john@company.com).'
	}
}
