var validationTimer;

var FormValidator = function(){
	/* Containers for remembering stuff */
	this.requiredElements = [];
	this.formValid;

	/* Validation callbacks */
	this.validateString = function(value){
		// Set up pattern and test the value
		var pattern = new RegExp('\\w+','i');
		return pattern.test(value);
	}
	
	this.validateEmail = function(value){
		// Set up pattern and test the value
		//var pattern = new RegExp('^[a-z0-9\+\-\.=_]+@([a-z]+\.){1,3}[a-z]{2,}$','i');
		var pattern = new RegExp('^[-!#$%&\'*+\\.\/0-9=?A-Z^_`{|}~]+@([-0-9A-Z]+\.)+([0-9A-Z]){2,4}$','i');
		return pattern.test(value);
	}
	
	this.validatePhone = function(value){
		// Strip whitespace
		value = value.replace(/\s/g,'');
		// Set up pattern and test the value
		var pattern = new RegExp('^(\\+(\\d{1,3}))?(\\d{7,})','g');
		return pattern.test(value);
	}

	/* Visuals callback */
	this.updateVisuals = function(valid,element){
		var message = jQuery(element).parent().children('.pleasecheck');
		if(valid){
			if(message.length>0){ jQuery(message).hide(300); }
			jQuery(element).removeClass('error marked');
		}else{
			if(message.length>0){
				jQuery(message).show(300);
			}else{
				var newmessage = jQuery('<span>')
					.addClass('pleasecheck')
					.text('Palun kontrolli!')
					.css('display','none');

				jQuery(element).parent().append(newmessage);
				jQuery(element).parent().children('.pleasecheck').show(300);
			}

			jQuery(element).addClass('error marked');
		}
	}

	/* Public methods */
	return {
		init: function(form){
			// Get required elements
			var requiredElements = jQuery('.required',jQuery(form));

			if(requiredElements.length > 0){
				disableSubmit = false;

				jQuery(requiredElements).each(function(index, element){
					if(jQuery(element).val() == ''){
						jQuery(element).addClass('error');
						disableSubmit = true;
					}
				});

				if(disableSubmit){
					jQuery('#submit').addClass('disabled').attr('disabled',true);
				}
			}

			// Add autocomplete off to text inputs
			$('input:text',jQuery(form)).attr('autocomplete','off');

			// Bind validation events to form elements which need it
			$('[class*=validate]',jQuery(form)).each(function(index,element){
				// Get the validation type we need on this element
				var className = $(element).attr('class');
				var validationClass = className.match(/validate-\w+/g);
				
				if(validationClass!=null){
					var validationType = validationClass[0].substr(9);
		
					// Bind blur event to every element that needs it
					$(element).bind('blur',{type:validationType},function(event){
						FormValidator.validate(event.data.type,this);
						return false;
					});
		
					// Bind keyup to text elements
					if($(element).is(':text,textarea')){
						$(element).bind('keyup',{type:validationType},function(event){
							if(jQuery.inArray(event.keyCode,[0,9,13,16,17,18,37,38,39,40]) != -1){ return false; }
		
							clearTimeout(validationTimer);
							var element = this;
		
							validationTimer = setTimeout(function(){
								FormValidator.validate(event.data.type,element);
							},500)
						});
					}
				}
			});
		
			// Bind focus events to input elements
			$('input,select,textarea',jQuery(form)).bind('focus',function(event){
				$(this).addClass('focus');
			}).bind('blur',function(event){
				$(this).removeClass('focus');
			});
		},

		validate: function(type,element){
			var validationCallback;

			switch(type){
				case 'email':
					validationCallback = validateEmail;
					break;
				case 'phone':
					validationCallback = validatePhone;
					break;
				case 'string':
				default:
					validationCallback = validateString;
					break;
			}

			var status = validationCallback(jQuery(element).val());
			updateVisuals(status,element);

			// Check if form is valid
			var form = jQuery(element).parents('form');
			formValid = true;

			var invalidElements = jQuery('.error',form);
			if(invalidElements.length>0){ formValid = false; }

			// Manage submit button
			if(formValid){
				jQuery('#submit').removeClass('disabled').removeAttr('disabled');
			}else{
				jQuery('#submit').addClass('disabled').attr('disabled',true);
			}
		}
	}
}();

jQuery(function($){
	// Set up form
	FormValidator.init('#contactform');
	FormValidator.init('#cvform');
	
	// Make print links work
	$('.print').bind('click',function(event){
		window.print();
		return false;
	})
})
