var Forms = {	
	Register:{
		// variables
		required:{
			email:{
				id:"Email",
				bind:true,
				callback:"Forms.Register.Email",
				empty:"Email",
				error:"Invalid email format"
			},
			password:{
				id:"Password",
				empty:"Password",				
				error:"Password's don't match"
			},
			passwordconfirm:{
				id:"PasswordConfirm",
				empty:"Confirm Password",
				error:"Password's don't match"
			},
			firstname:{
				id:"FirstName",
				empty:"First Name",
				error:"Please provide a first name"
			},
			lastname:{
				id:"LastName",
				empty:"Last Name",
				error:"Please provide a last name"
			}					
		},
		
		// methods
		Bind:function(service)
		{
			for(prop in this.required)
			{
				if(this.required[prop].bind)
				{
					var input		= "#" + this.required[prop].id;
					var callback	= this.required[prop].callback;
					$(input).attr({"callback":callback})
					$(input).bind(
						'blur',
						function()
						{
							var callback 	= $(this).attr("callback");
							var valid 		= eval(callback).apply(callback, [$(this)]);
							var parent 		= $(this).parent().children("span.result");
							valid ? parent.removeClass("error").addClass("success") : parent.removeClass("success").addClass("error");
							if(valid && !Forms.Register.noservice)
							{
								Forms.Register.Check("Email", $(this).val(), "Email");
							}
						}
					)
				}
			}
		},
		
		Process:function(form)
		{
			if(form == "LoginForm")
			{
				delete this.required['passwordconfirm'];
				delete this.required['firstname'];				
				delete this.required['lastname'];
			}
			var error	= false;
			var errors	= Array();
			// check if empty
			for(prop in this.required)
			{
				var input		= "#" + this.required[prop].id;
				var value		= $(input).val();
				var parent 		= $(input).parent().children("span.result");
				if(value.length > 1)
				{
					parent.removeClass("error").addClass("success");
				}
				else
				{
					errors.push("<a href=\"#\" onclick=\"$('#" + this.required[prop].id + "').focus();return false;\">" + this.required[prop].empty + "</a> is a required field");
					parent.removeClass("success").addClass("error");
				}
				
				
				
				// check email again
				if(this.required[prop].id == "Email")
				{
					var callback 	= $(input).attr("callback");
					var valid 		= eval(callback).apply(callback, [$(input)]);
					
					var parent 		= $(input).parent().children("span.result");
					valid ? parent.removeClass("error").addClass("success") : parent.removeClass("success").addClass("error");
					if(!valid)
					{
						error = true;
						errors.push("<a href=\"#\" onclick=\"$('#" + this.required[prop].id + "').focus();return false;\">" + this.required[prop].empty + "</a>:" + this.required[prop].error);
					}
				}
				if(this.required[prop].id == "Password" || this.required[prop].id == "PasswordConfirm")
				{
					if(form != "LoginForm")
					{
						var password	= $("#Password").val();
						var confirm		= $("#PasswordConfirm").val();
						if(password != confirm)
						{
							parent.removeClass("success").addClass("error");
							errors.push("<a href=\"#\" onclick=\"$('#" + this.required[prop].id + "').focus();return false;\">" + this.required[prop].empty + "</a>:" + this.required[prop].error);						
							error = true;
						}						
					}			
				}
			}
			
			if($(".error").length > 0){error = true;}
			if(!error)
			{
				$("#" + form).submit();
			}
			else
			{
				$("#Messages span").empty()
				for(var n = 0; n < errors.length; n++)
				{
					$("#Messages span").append("<p>" + errors[n] + "</p>");
				}
				$("#Messages").fadeIn();
			}
		},
		
		Email:function(obj)
		{
			var value	= $(obj).val();
			if(value.length > 0)
			{
				var regex = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i
				var parent = $(obj).parent().children("span.result");
				return regex.test(value);
			}
		},
			
		Country:function(select)
		{
			// country field
			var countryview = $("#CountryView");
			var country = $("#Country");			

			var option	= select.selectedIndex;
			var value	= select.value;
			
			var group	= select.options[option].parentNode.label;
			countryview.val(group);			
			country.val(group);
		},
		
		Check:function(type, value, string)
		{
			// call email wsdl
			var service	= "services/register.wsdl.php";
			var post = {
				check:type,
				value:value,
				string:string
			}
			
			$.ajax(
				{
					url:service,
					cache:false,
					data:post,
					dataType:"json",
					type:"POST",
					success:function(response)
					{
						if(response.check == "error")
						{
							$("#" + type).parent().children("span.result").removeClass("success").addClass("error");
							$("#Messages span").empty()
							$("#Messages span").append("<p>" + response.message + "</p>");
							$("#Messages").fadeIn();							
						}
					},
					error:function()
					{
						console.log("failed:" + service);
					}
				}
			);			
		}
	},
	
	Account:{
		// variables
		required:{
			AccountProfile:{
				email:{
					id:"Email",
					bind:true,
					callback:"Forms.Register.Email",
					empty:"Email",
					error:"Invalid email format"
				}
				/*,
				password:{
					id:"Password",
					empty:"Password",				
					error:"Password's don't match"
				},
				passwordconfirm:{
					id:"PasswordConfirm",
					empty:"Confirm Password",
					error:"Password's don't match"
				}
				*/				
			},
			AccountDetails:{
				
			},
			AccountAddress:{
				
			}
		},
				
		Edit:function(id)
		{
			$("#" + id + " .viewable").hide(1, function(){$("#" + id + " .editable").show();})
		},
		
		Cancel:function(id)
		{
			$("#" + id + " .editable").hide(1, function(){$("#" + id + " .viewable").show();})
		},		
		
		Process:function(id)
		{
			var error	= false;
			var errors	= Array();
			// check if empty
			for(prop in this.required[id])
			{
				var input		= "#" + this.required[id][prop].id;
				var value		= $(input).val();
				var parent 		= $(input).parent().children("span.result");
				if(value.length > 1)
				{
					parent.removeClass("error").addClass("success");
				}
				else
				{
					errors.push("<a href=\"#\" onclick=\"$('#" + this.required[id][prop].id + "').focus();return false;\">" + this.required[id][prop].empty + "</a> is a required field");
					parent.removeClass("success").addClass("error");
				}
				
				
				
				// check email again
				if(this.required[id][prop].id == "Email")
				{
					var callback 	= $(input).attr("callback");
					var valid 		= eval(callback).apply(callback, [$(input)]);
					
					var parent 		= $(input).parent().children("span.result");
					valid ? parent.removeClass("error").addClass("success") : parent.removeClass("success").addClass("error");
					if(!valid)
					{
						error = true;
						errors.push("<a href=\"#\" onclick=\"$('#" + this.required[id][prop].id + "').focus();return false;\">" + this.required[id][prop].empty + "</a>:" + this.required[id][prop].error);
					}
				}
			}
			
			if($(".error").length > 0){error = true;}
			if(!error)
			{
				$("#AccountForm #AccountFormType").val(id)
				$("#AccountForm").submit();
			}
			else
			{
				$("#Messages span").empty()
				for(var n = 0; n < errors.length; n++)
				{
					$("#Messages span").append("<p>" + errors[n] + "</p>");
				}
				$("#Messages").fadeIn();
			}			
		}		
	},
	
	LoginFail:function()
	{
		$("#Messages span").empty();
		$("#Messages span").append("<p>your login details are incorrect</p>");
		$("#Messages").fadeIn();			
	},	
	
	Find:{
		// variables
		required:{
			searchtext:{
				id:"SearchText",
				string:"can we help you find something"
			}			
		},
		
		Process:function(form)
		{
			var error	= false;
			var errors	= Array();
			// check if empty
			for(prop in this.required)
			{
				var input		= "#" + this.required[prop].id;
				var value		= $(input).val();
				
				if(value.length > 1 && value != this.required[prop].string)
				{
					$("#" + form).submit();
				}
				else
				{
					$(input).addClass("error");
				}
			}					
		}
	}
}