var FormValidation = {
	characterCount:function(obj,update,count){
		if(obj.value.length <= count){
			document.getElementById(update).innerHTML = count - (obj.value.length);	
			return true;		
		}		
	},
	copyToBilling:function(obj){
		var frm = obj.form;
		for(i=0;i<frm.elements.length;i++){
			var old_id = frm.elements[i].id;
			if (old_id.match('_ship')) {
				var id = old_id.substr(0,old_id.length-5) + '_bill';
				if (document.getElementById(id)) {
					document.getElementById(id).value = (obj.checked) ? frm.elements[i].value : document.getElementById(id).value;
					document.getElementById(id).disabled = obj.checked;
				}
			}
		}		
	},
	buildError:function(obj,err){
		$(obj).after('<br id="error_break_'+obj.getAttribute('id')+'" class="error_break" /><div id="error_'+obj.getAttribute('id')+'" class="form_error">'+err+'</div>');
	},
	removeError:function(obj){
		$('#error_break_'+obj.getAttribute('id')).remove();
		$('#error_'+obj.getAttribute('id')).remove();
	},
	validInteger:function(txt){
		var pattern = /^\d+$/;
		return pattern.test(txt);
	},
	validEmail:function(txt){
		var pattern = /^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/i;
		return pattern.test(txt);
	},
	validZipCode:function(txt){
		var pattern = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
		return pattern.test(txt);
	},
	validPhone:function(txt){
		var pattern = /^((\+\d{1,3}(.|-| )?\(?\d\)?(.|-| )?\d{1,5})|(\(?\d{2,6}\)?))(.|-| )?(\d{3,4})(.|-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
		return pattern.test(txt);
	},
	validField:function(obj){
		var no_error = true;

		FormValidation.removeError(obj);
		
		obj.style.borderWidth = obj.style.borderColor = obj.style.borderStyle = '';
		obj.style.color = 'black';
		
		if(!obj.disabled){
			if(obj.value == '' || (obj.type == 'checkbox' && obj.checked == false)){
				if(obj.getAttribute('required') && obj.getAttribute('required') != 'false'){
					FormValidation.buildError(obj,obj.getAttribute('label') + ' is required.');
					no_error = false;
					obj.style.border = '2px solid red';
				}
			}
			else{
				switch(obj.getAttribute('validationType')){
					case 'int':
						if(!FormValidation.validInteger(obj.value)){
							FormValidation.buildError(obj,'Please enter a valid whole number.');
							no_error = false;
							obj.style.border = '2px solid red';
							obj.style.color = 'red';
						}
						break;
					case 'float':
						if(isNaN(obj.value)){
							FormValidation.buildError(obj,'Please enter a valid number.');
							no_error = false;
							obj.style.border = '2px solid red';
							obj.style.color = 'red';
						}
						break;
					case 'email':
						if(!FormValidation.validEmail(obj.value)){
							FormValidation.buildError(obj,'Please enter a valid E-mail Address.');
							no_error = false;
							obj.style.border = '2px solid red';
							obj.style.color = 'red';
						}
						break;
					case 'zipcode':
						if(!FormValidation.validZipCode(obj.value)){
							FormValidation.buildError(obj,'Please enter a valid Zip Code.');
							no_error = false;
							obj.style.border = '2px solid red';
							obj.style.color = 'red';
						}
						break;
					case 'phone':
						if(!FormValidation.validPhone(obj.value)){
							FormValidation.buildError(obj,'Please enter a valid Phone Number.');
							no_error = false;
							obj.style.border = '2px solid red';
							obj.style.color = 'red';
						}
						break;
					case 'match':
						if(obj.getAttribute('matchField')){
							var el2 = document.getElementById(obj.getAttribute('matchField'));
							if(obj.value != el2.value){
								FormValidation.buildError(obj,obj.getAttribute('label') + ' is not the same as ' + el2.getAttribute('label'));
								no_error = false;
								obj.style.border = '2px solid red';
								obj.style.color = 'red';
								el2.style.border = '2px solid red';
								el2.style.color = 'red';
							}
						}
						break;
				}
				if(obj.getAttribute('minlength')){
					if(obj.value.length < obj.getAttribute('minlength')){
						FormValidation.buildError(obj,obj.getAttribute('label') + ' must be at least ' + obj.getAttribute('minlength') + ' characters long.');
						no_error = false;
						obj.style.border = '2px solid red';
						obj.style.color = 'red';
					}
				}
			}
		}
		return no_error;
	},
	validateForm:function(frm,submit){
		submit = (submit === undefined) ? true : submit;
		var has_error = false;
		for(i=0;i<frm.elements.length;i++){
			if(!FormValidation.validField(frm.elements[i])){
				has_error = true;
			}			
		}
		if(!has_error && submit){
			frm.submit();
		}
		else{
			return !has_error;
		}
	}
};

