// Register class
var Forms	= {
	// required fields
	form:{
		register:{
			screenname:{
				required:true,
				listener:true,
				type:"text"
			},
			email:{
				required:true,
				listener:true,
				type:"email"
			},
			password:{
				required:true,
				listener:false,			
				type:"password"
			}			
		},
		login:{
			email:{
				required:true,
				listener:false,
				type:"email"
			},
			password:{
				required:true,
				listener:false,			
				type:"password"
			}			
		},
		contact:{
			to:{
				required:true,
				listener:false,
				type:"text"				
			},
			email:{
				required:true,
				listener:false,
				type:"email"
			},
			subject:{
				required:true,
				listener:false,			
				type:"text"
			},
			details:{
				required:true,
				listener:false,			
				type:"text"
			}			
		}		
	},
	
	// service
	services:{
		server:"",
		path:"services/",
		register:"register.wsdl.php",
		login:"login.wsdl.php",
		contact:"contact.wsdl.php"
	},
	
	// init
	init:function(instance)
	{
		// add listeners
		this.listener(instance);
	},
	
	// listener
	listener:function(instance)
	{
		for(prop in this.form[instance])
		{
			if(this.form[instance][prop].listener)
			{
				// attach listener
				$("#" + instance + " #" + prop).bind(
					'blur',
					function()
					{
						if($(this).val().length > 0)
						{
							var error		= false
							var instance 	= $(this).parents('form').attr('id')
							var prop 		= $(this).attr('id');
							var val			= $(this).val();
														
							if(prop == "email")
							{
								if(!Forms.email($(this).val()))
								{
									error	= true;
									Register.failed("invalid email format! you gotta have an at(@), a dot(.), a domain and an inbox to varify the email!!!")
								}
								else
								{
									$(this).css({border:"solid 1px #e7e6e6"})									
								}
							}

							if(!error)
							{
								var post		= {};
								post[instance]	= {};
								post[instance][prop]	= val;

								Forms.connect(instance, post, prop)								
							}
							else{
								Forms.errors([[instance, prop]])
							}
						}
					}
				)
			}
		}
	},	
	
	// process
	process:function(instance){
		var post		= {};
		post[instance]	= {};
		var err		= Array();
		for(prop in this.form[instance])
		{
			var error	= false;			
			var val		= $("#" + instance + " #" + prop).val();
			if(this.form[instance][prop].required)
			{
				// reset borders
				$("#" + instance + " #" + prop).css({border:"solid 1px #e7e6e6"})
				
				if(!val || val.length == 0){
					error = true;
				}
				else{
					if(this.form[instance][prop].type == "email")
					{
						if(!this.email(val))
						{
							error = true;
						}
					}
				}
			}
			!error ? post[instance][prop] = val : err.push([instance, prop]) ;
		}
		err.length > 0 ? this.errors(err) : this.connect(instance, post)
	},
	
	// errors
	errors:function(err)
	{
		for(prop in err)
		{
			$("#" + err[prop][0] + " #" + err[prop][1]).css({border:"solid 1px #cb6828"});
		}
	},

	// success
	success:function(arr)
	{
		for(prop in arr)
		{
			$("#" + arr[prop][0] + " #" + arr[prop][1]).css({border:"solid 1px #8ccb28"});
		}		
	},
	
	// transaction
	connect:function(instance, post, check)
	{		
		check ? post[instance]['check']= check : post[instance]['submit'] = "submit" ;
		post['instance']	= instance
		var service			= this.services.server + this.services.path + this.services[instance];
		$.ajax(
			{
				url:service,
				cache:false,
				data:post[instance],
				dataType:"json",
				type:"POST",
				success:function(response)
				{
					// for checking
					if(response.check)
					{
						switch(response.check)
						{
							case "okay":
								Forms.success([[post.instance, response.prop]]);
								Register.success()
							break;
							case "error":
								Forms.errors([[post.instance, response.prop]]);
								Register.failed(response.message)								
							break;
						}
					}
					// for submitting
					else
					{
						switch (post.instance)
						{
							case "register":
								response.success == true ? Register.confirm({email:post[instance].email, screenname:post[instance].screenname}) : Register.failed(response.message);
							break;
							case "login":
								response.success == true ? Login.success() : Login.failed(response.message);
							break;
							case "contact":
								response.success == true ? Contact.success(response.message) : Contact.failed(response.message);
							break;							
						}						
					}
				},
				error:function()
				{
					console.log("failed:" + service);
				}
			}
		);
	},
	
	email:function(check)
	{
		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
		return(regex.test(check))
	}
}

var	Contact	= {
	// display objects	
	form:"contact",
	display:"contact-message",
	message:"message",
	// show
	show:function()
	{
		form	= "#" + this.form;
		$(form).fadeIn('slow');
	},
	// hide
	hide:function()
	{
		form	= "#" + this.form;
		$(form).fadeIn('slow');
	},		
	// success
	success:function(msg)
	{
		form	= "#" + this.form;
		display	= "#" + this.display;
		message	= "." + this.message;
		$(form).hide();
		$(message).html(msg);
		$(display).attr(
			{
				"class":"success"
			}
		)
		$(display + " h1").text("Success!")
		$(display).slideDown('slow');		
	},
	//failed
	failed:function(msg)
	{
		display	= "#" + this.display;
		message	= "." + this.message;
		$(message).html(msg);
		$(display).slideDown('slow');
	}
}

var	Login	= {
	// display objects	
	form:"login",
	display:"login-error",
	message:"message",
	url:"dashboard.php",
	// show
	show:function()
	{
		form	= "#" + this.form;
		$(form).fadeIn('slow');
	},
	// hide
	hide:function()
	{
		form	= "#" + this.form;
		$(form).fadeIn('slow');
	},		
	// success
	success:function()
	{
		window.location = "dashboard.php";
	},
	//failed
	failed:function(msg)
	{
		display	= "#" + this.display;
		message	= "." + this.message;
		$(message).text(msg);
		$(display).slideDown('slow');
	}
}

var	Register	= {
	// display objects
	form:"register",
	display:"register-error",
	message:"message",
	// service
	services:{
		server:"",
		path:"services/",
		email:"email.wsdl.php"
	},
	// hide
	hide:function()
	{
		form	= "#" + this.form;
		$(form).hide();
	},	
	// confirm
	confirm:function(post)
	{
		post.type	= "confirm";
		// call email wsdl
		var service	= this.services.server + this.services.path + this.services.email;
		$.ajax(
			{
				url:service,
				cache:false,
				data:post,
				dataType:"json",
				type:"POST",
				success:function(response)
				{
					// show the message
					form	= "#" + Register.form;
					message	= "." + Register.message;				
					$(form + " fieldset").hide();
					$(form + " " + message).hide();
					$(form + " " + message).html(response.message);					
					$(form + " " + message).show('slow');					
				},
				error:function()
				{
					console.log("failed:" + service);
				}
			}
		);
				
	},
	// success
	success:function()
	{
		display	= "#" + this.display;
		$(display).slideUp('slow');
	},
	// failed
	failed:function(msg)
	{
		display	= "#" + this.display;
		message	= "." + this.message;
		$(display + " " + message).text(msg);
		$(display).slideDown('slow');
	}
}

var Confirm	= {
	// service
	services:{
		server:"",
		path:"services/",
		email:"email.wsdl.php"
	},	
	broadcaster:"broadcaster",
	// hash	
	hash:"",

	// check
	check:function()
	{
		this.hash	= window.location.search.slice(1, window.location.search.length)

		var post	= {
			hash:this.hash
		}

		// call email wsdl
		var service	= this.services.server + this.services.path + this.services.email;
		$.ajax(
			{
				url:service,
				cache:false,
				data:post,
				dataType:"json",
				type:"POST",
				success:function(response)
				{
					var broadcaster	= "#" + Confirm.broadcaster;
					$(broadcaster).addClass(response.style)
					$(broadcaster + " h1").html(response.title);
					$(broadcaster).append(response.message);
					
					$(broadcaster).fadeIn('slow');
					if(response.success == "okay")
					{
						Login.show();
						Register.hide();
					}
				},
				error:function()
				{
					var broadcaster	= "#" + Confirm.broadcaster;
					$(broadcaster).addClass('error')
					$(broadcaster + " h1").html("busted!");
					$(broadcaster).append("<p>stop messing with the url!</p><p>register and we will send you a proper link via email!</p>");
					
					$(broadcaster).fadeIn('slow');
										
					console.log("failed:" + service);
				}
			}
		);
	}	
}
