/**
 * @author Filip Michalowski / Fi Stockholm
 */
Namespace.create("ng.modules.emailForm");

ng.modules.emailForm.EmailForm = function () {

	//private variables:
	var moduleContainer;
	var moduleData;
	
	//private methods:
	
	var draw = function() {	
		
		initializeForm();
		
	};
		
	/**
	 * 
	 */
	var initializeForm = function() {
		
		var content = moduleContainer.find("div.content");
		form = moduleContainer.find("form");		
		form.find("input[name='emailfrom']").val("Enter email");
		form.find("input[name='emailto']").val("Enter email");
		
		//empty the e-mail input field on first click
		var emailinputs = form.find("input[name!='submitBt']");
		emailinputs.focus(function() {
			$(this).unbind();
			$(this).removeClass("textinputerror").addClass("textinput").val("");
		});
		
		// rollover/down states for submit button
		form.find("input[name='submitBt']").mouseover(function() {
			var src = $(this).attr("src");
			src = src.split("_out").join("_over");
			$(this).attr("src", src);
		});
		form.find("input[name='submitBt']").mouseout(function() {
			var src = $(this).attr("src");
			src = src.split("_over").join("_out");
			src = src.split("_down").join("_out");
			$(this).attr("src", src);
		});
		form.find("input[name='submitBt']").mousedown(function() {
			var src = $(this).attr("src");
			src = src.split("_over").join("_down");
			$(this).attr("src", src);
		});
		form.find("input[name='submitBt']").mouseup(function() {
			var src = $(this).attr("src");
			src = src.split("_down").join("_over");
			$(this).attr("src", src);
		});
				
		// submit event handler
		form.submit(function() {
			
			if (validateForm() === false) {				
				return false;
			} else {
				
			}
			
		  // capture *all* the fields in the
          // form and submit it via ajax.         
          var inputs = [];
          $(':input', this).each(function() {
            inputs.push(this.name + '=' + escape(this.value));
          })
		            
          // join our inputs using '&' to a query string
          jQuery.ajax({
		  	type: "GET",
            data: inputs.join('&'),
            url: this.action,
            timeout: 2000,
            error: function(r) {
				$(this).unbind();
				createErrorScreen(r);
            },
            success: function(r) {
				$(this).unbind();              
				createConfirmationScreen(r);
            }
          }) // checkout http://jquery.com/api for more syntax and options on this method.
          
          // re-test...
          // by default - we'll always return false so it doesn't redirect the user.
          return false;
        })
	};
	
	
	/**
	 * 
	 */
	var createConfirmationScreen = function(r) {
		form = moduleContainer.find("form");
		form.addClass("nodisplay");
		var screen = moduleContainer.find("div.confirmationScreen");
		

		if(typeof r == "string"){
			//screen.find("p.message").html(r);	
		}
		screen.removeClass("nodisplay");
		
		screen.find("a.ok").click( function() {
			$(this).unbind();		
			resetForm();
			screen.addClass("nodisplay");			
			form.removeClass("nodisplay");
		});
	}
	
	/**
	 * 
	 */
	var createErrorScreen = function(r) {
		form = moduleContainer.find("form");
		form.addClass("nodisplay");
		var screen = moduleContainer.find("div.errorScreen");
		
		if(typeof r == "string"){
			//screen.find("p.message").html(r);
		}
		screen.removeClass("nodisplay");
		
		// adds event listener for a "Try Again" button
		screen.find("a.tryAgain").click( function() {
			//console.log($(this));
			$(this).unbind();	
			resetForm();
			screen.addClass("nodisplay");				
			form.removeClass("nodisplay");
		});
	}
	
	var resetForm = function() {
		form.find("input[type!='hidden'][name!='formtype']").val("");
	};
	
	
	var validEmail = function(value) {
		// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
		return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
    };

	/**
	 * 
	 */
	var validateForm = function() {
		var recipientEmailInput = moduleContainer.find("input[name='emailto']");
		var recipientEmail = recipientEmailInput.val();
		
		var formValid = true;
		
		//if (recipientEmail === "" || recipientEmailInput.hasClass("textinputerror") || recipientEmail === "Enter email") {
		if (!validEmail(recipientEmail) || recipientEmailInput.hasClass("textinputerror")) {
			formValid = false;
			recipientEmailInput.removeClass("textinput").addClass("textinputerror").val("Enter email");
			
			recipientEmailInput.focus(function() {
				$(this).unbind();
				$(this).removeClass("textinputerror").addClass("textinput").val("");
			});
		};
		
		var senderEmailInput = moduleContainer.find("input[name='emailfrom']");
		var senderEmail = senderEmailInput.val();
		
		//if (senderEmail === "" || senderEmailInput.hasClass("textinputerror") || senderEmail === "Enter email") {
		if (!validEmail(senderEmail) || senderEmailInput.hasClass("textinputerror")) {
			formValid = false;
			senderEmailInput.removeClass("textinput").addClass("textinputerror").val("Enter email");
			
			senderEmailInput.focus(function() {
				$(this).unbind();
				$(this).removeClass("textinputerror").addClass("textinput").val("");
			});
		};		
				
		return formValid;
	}	

	//the returned object here will become ng.modules.emailForm.EmailForm:
	return  {
		
		// public
		
		init: function (container, data) {
			moduleContainer = container;
			moduleData = data;
			
			draw();
		}

	};
}(); // the parens here cause the anonymous function to execute and return


/**
 * Markup templates for the EmailForm
 */
ng.modules.emailForm.EmailFormTemplates = 
{
		
};