/*
 * object: Sosign
 * - sosign website-related functions
 */
var Sosign = {
		
	/* initialization function */
	init: function(){
		var self = Sosign;
		
		/* setup ajax to be synchronous by default */
		$.ajaxSetup({async: false, global: true, cache: false});
		
		/* set on load functions */
		$(document).ready(self.load);
	},
	
	/*
	 * method: setLanguageSelectorHandler
	 * -> set language selector event handler
	 */
	setLanguageSelectorHandler: function(){
		
		/* set current language */
		$("#languageSelector select").val($("html").attr("lang"));
		
		/* set event handler */
		$("#languageSelector select").change(function(){

			var newLocation = $("head").find("link[rel='alternate']")
								.filter("[hreflang='"+$(this).val()+"']").attr("href");
			if(newLocation) {
				window.location = newLocation;
			}
		});
	},
	
	/*
	 * method: load
	 * -> functions to execute on page load
	 */
	load: function(){
		var self = Sosign;
		self.setLanguageSelectorHandler();
		
		self.language = $("html").attr("lang");
		
		/* set up the homepage slideshow */
		window.setInterval(function(){
			var imgContainer = $(".slideshow ul");
			
			imgContainer.animate({marginLeft: "-450px"},600,null, function(){
				imgContainer.find("li:first").add(imgContainer.find("li:first").next())
					.appendTo(imgContainer);
				imgContainer.css("margin-left", "");
			});
			
		},5000);
		
		/* set up ajax forms */
		$.getScript("js/jquery.form.js", function(){
			self.projectPlannerForm();
			self.contactForm();
		});	
		
		/* set up recaptcha if any */
		if($("#recaptcha").get(0)) {
			$.getScript("http://api.recaptcha.net/js/recaptcha_ajax.js", function(){
				Recaptcha.create("6LfYBAoAAAAAAM3ra7zvhithJGXU35M7Y_j_i9g2",
				"recaptcha", {
				   theme: "clean",
				   lang: $("html").attr("lang"),
				   callback: function(){}
				});
			});
		}	
	},
	
	/*
	 * method: projectPlannerForm
	 * -> set up project planner form
	 */
	projectPlannerForm: function(){
		$("#plannerForm").ajaxForm({
			dataType: "json",
			beforeSubmit: function(formData, formEl, options) {
				var self = Sosign;			
				var valid = self.validate(formEl);
				
				/* form doesn't validate, re-enable form */
				if(!valid) {
					$.scrollTo($(".invalid:first"), 500);
					return false;
				}
		},
			success:function(data){
			
				if(data.error) {
					var message = self.language=="fr"?"Une erreur s'est produite, veuillez réessayer plus tard.":"An error has occured please try again later.";
					alert(message);
					
				} else if(data.recaptchaError == "error") {
					Recaptcha.reload();
					Recaptcha.focus_response_field();
					
				} else if(data.success == "success") {
					$("#plannerForm").hide();
					var message = self.language == "fr"?"Votre message a bien &eacute;t&eacute; envoy&eacute;, merci. Nous vous r&eacute;pondrons sous peu.":"Your message has been sent, thank you. We will get back to you as soon as possible.";

					$("#projectPlanner").append("<div>"+message+"</div");
				}
			}
		});
	},
	
	/*
	 * method: contactForm
	 * -> set up contact form
	 */
	contactForm: function(){
		$("#contactForm").ajaxForm({
			dataType: "json",
			beforeSubmit: function(formData, formEl, options) {
				var self = Sosign;			
				var valid = self.validate(formEl);
				
				/* form doesn't validate, re-enable form */
				if(!valid) {
					$.scrollTo($(".invalid:first"), 500);
					return false;
				}
			},
			success:function(data){
				if(data.error) {
					var message = self.language=="fr"?"Une erreur s'est produite, veuillez réessayer plus tard.":"An error has occured please try again later.";
					alert(message);
					
				} else if(data.recaptchaError == "error") {
					Recaptcha.reload();
					Recaptcha.focus_response_field();
					
				} else if(data.success == "success") {
					$("#contactForm").hide();
					var message = self.language == "fr"?"Votre message a bien &eacute;t&eacute; envoy&eacute;, merci. Nous vous r&eacute;pondrons sous peu.":"Your message has been sent, thank you. We will get back to you as soon as possible.";
					$("#contact").append("<div>"+message+"</div");
				}
			}
		});
	},
	
	/*
	 * method: validate
	 * -> validate inputs values in a form
	 */
	validate: function(formEl) {
		var self = Sosign;
		var valid = true;
		
		$(formEl).find("span.invalid").each(function(){
			var checkedEl = false;
			var checked = false;
			if($(this).find(":checked").get(0)) {
				checked = true;
				checkedEl = $(this).find(":checked");
			}
			$(this).unwrap();
			
			if(checked) {
				checkedEl.attr("checked", true);
			}
		});
		$(formEl).find(".invalid").removeClass("invalid");
		
		/* required fields should be non empty */
		$(formEl).find(".required").each(function(){
			
			if($(this).is("[type='radio']")) {
				var name = $(this).attr("name");
				
				if(!$("[name='"+name+"']:checked").get(0)) {
					$(this).wrap($("<span></span>").addClass("invalid"));
					valid = false;
				}
			} else if($(this).is("[type='checkbox']")) {
				
				if(!$(this).is(":checked")) {
					$(this).wrap($("<span></span>").addClass("invalid"));
					valid = false;
				}
				
			} else {
				
				if($(this).val() == "" || !$(this).val()) {
					if($(this).is("select") && $.browser.msie) {
						$(this).wrap($("<span></span>").addClass("invalid"));
						
					} else {
						$(this).addClass("invalid");
					}
					valid = false;
				}
			}
		});
		
		/* email fields should be valid email addresses */
		$(formEl).find("#email").each(function(){
			
			if($(this).val() == "" || !$(this).val() || !self.validateEmail($(this).val())) {
				$(this).addClass("invalid");
				valid = false;
			}
		});
		
		/* email fields should be valid email addresses */
		$(formEl).find("#emailTips").each(function(){
			if($(this).val() != "" || $(this).val()) {
				if(!self.validateEmail($(this).val())) {
					$(this).addClass("invalid");
					valid = false;
				}
			}
		});
		
		
		/* if valid, process to submit; else abort */
		if(!valid) {
			$.scrollTo($(".invalid:first"), 500);
		}
		
		return valid;
	},
	
	/*
	 * function: validateEmail
	 * -> allow to validate email syntax
	 */
	validateEmail: function(email) {
		var pattern = /^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9+-]+(\.[a-z0-9+-]+)*(\.[a-z]{2,3})$/gi;
		return (email.search(pattern) == -1)?false:true;
	},
	/*
	 * function: show
	 * -> show a modal window with the map of the office
	 */
	show: function(lang) {
		var self = Sosign;
		if (lang == "fr") {
			pageToShow = "map.fr.html";
		} else {
			pageToShow = "map.en.html";
		}
		/* set parameters */
		var params = {
			ajax: pageToShow,
			onLoad:function(obj){
				$.scrollTo(".modalWindow", 500);
			},
			onHide: function(obj){
				obj.w.add("div.jqmOverlay:first").remove();
			}
		};
		/* create and show modal */
		var modalEl = $("<div></div>");
		modalEl.addClass("modalWindow")
			.appendTo($(document.body))
			.jqm(params).jqmShow();
		
		if(typeof($.scrollTo) == "function") {
			$.scrollTo(".modalWindow", 500);
		}
		return;
	}
	
};

/* initialize javascript functions */
Sosign.init();