
var Defisante = {
	
	/*
	 * function: init
	 * -> initialize Defisante application
	 */
	init: function() {
		var self = Defisante;
		
		/* set javasctipt to be executed on page load */
		$(document).ready(Defisante.onLoad);
		
		/* setup ajax to be synchronous by default */
		$.ajaxSetup({async: false, global: true, cache: false,
			beforeSend: function(){
				var loadingEl = $("#workingIndicator");
	
				if(loadingEl.css("display") != "block" && $("#adminMenu").get(0)) {
					loadingEl.css("display", "block");
				}
			}
		});
		
		/* load cookie plugin */
		$.getScript("js/jquery/jquery.cookie.js", function(){

			/* load language file using cookie value */
			self.language = $.cookie("language")?$.cookie("language"):"fr";
			
			/* if in admin, set language to fr */
			if(window.location.toString().indexOf("/admin") != -1) {
				self.language = "fr";
			}
			
			$.getJSON("lang/lang."+self.language+".json", function(data){
				self.langVars = data;
			});
		});
		/* parse URL variables */
		self.urlVars = self.utils.getUrlVars(window.location.toString());
	},
	
	/*
	 * function: onLoad
	 *
	 * -> To be called when DOM is ready (page load)
	 */
	onLoad: function() {
		var self = Defisante;
		
		/* check if cotesante page should be available*/
		self.coteSante.checkCoteSantePage();
		
		/* initialize tables in /coteSante */
		self.coteSante.initEnonces();
		
		/* add a working indicator depending on context */
		self.setWorkingIndicator();
		
		/* fill dropdowns */
		self.forms.allDropDowns();
		
		/* add dataTable plugin if there is a table in page */
		self.initTables();
	
		/* set function on logout link if present */
		self.users.setLogoutLink();
		
		/* initialisation for login form in /authentication */
		self.users.loginForm();
		
		/* initialisation for subscription form (step 0) in /authentication */
		self.users.subscribeForm();
		
		/* initialization for subscribe - step 1 */
		self.users.subscribeFormStep1();
		
		/* initialization for subscribe - step 2 */
		self.users.subscribeFormStep2();  
		
		/* initialization for subscribe - step 3 */
		self.users.subscribeFormStep3();
		
		/* initialisation for /myData page */
		self.users.initMyData();
		
		/* initialisation for /myFamily and subscription - step 3 pages */
		self.families.initMyFamily();
		
		/* initialisation for /myTeams and subscription step 3 page - teams */
		self.teams.initMyTeams();
		
		/* Display pending teams */
		self.teams.displayPendingTeams();
		
		/* setup admin login form */
		self.administrators.loginForm();
		
		/* initialisation for /admin/addCoupon */
		self.users.subscriberAddCoupon();
		
		/* add date pickers to forms */
		self.forms.addDatePicker();
		
		/* initialize report tabs */
		self.reports.initReports();
		
		/* init draw form */
		self.draw.initDraw();
		
		/* redirect to active survey if necessary */
		self.surveys.activeSurvey();

		/* statistics for cote santé */
		self.coteSante.statisticsCoteSante();
		
		
	},
	
	/*
	 * method: setWorkingIndicator
	 * -> add working indicator ("Please wait.." right-top red DIV) in the back office
	 */
	setWorkingIndicator: function() {
		var self = Defisante;
		
		/* check we are in the back office */
		if($("#adminMenu").get(0)) {
			
			/* add working indicator for ajax requests in administration */
			$("<div>Patientez...</div>").attr("id", "workingIndicator")
				.css("display", "none")
				.appendTo($("body"))
				.ajaxStop(function(){
					var loadingEl = this;
					$(loadingEl).css("display", "none");
				});
		}
	},
	
	/*
	 * method: initTables
	 * -> initialize all tables configured in "Defisante.tables" object and using the dataTable plugin
	 */
	initTables: function() {
		var self = Defisante;
		
		if($("table").get(0)) {
			
			/* initialize dataTable plugin on relevant tables */
			$.each(self.tables, function(i, fct){fct();});
			
			/* set "Export" buttons */
			self.setExportButtons();
		}
	},
	
	/*
	 * function: setExportButtons
	 * -> for the CSV export buttons
	 */	
	setExportButtons: function(){
		var self = Defisante;
		
		$("#subscribersTable, #drawResultTable, #statisticsObjectivesTable, #statisticsRegionTable, #statisticsGroupTable").each(function(){
			var table = this;
			
			/* change iframe src to make the trigger CSV file download */
			$(table).find(".exportButton").click(function(){
				
				/* build export URL */
				var exportUrl = table.dataTable.options.resource;
				exportUrl = table.dataTable.options.filter(exportUrl);
				exportUrl += "&csv=1";

				
				/* set this url to iframe */
				$("#csvExport").attr("src", exportUrl);
			});
		});
		
		$("#getCSVTrackingData").click(function(){
			var dspM34IdValue = $("#groupRegionId").val();
			dspM34IdValue = dspM34IdValue==null?"":dspM34IdValue;

			/* set this url to iframe */
			var srcToSend = "php/tracking.php?action=getCSVTrackingData&campaingId="+$("#trackingCampagnes").val();
			srcToSend += "&from="+$("#trackingFromDate").val();
			srcToSend += "&to="+$("#trackToDate").val();
			srcToSend += "&sex="+$("#sex").val();
			srcToSend += "&subscriptionType="+$("#subscriptionType").val();
			srcToSend += "&dspM34Id="+dspM34IdValue;
			$("#csvExport").attr("src", srcToSend);
		});
	},
	
	/*
	 * object: users
	 * -> users-related functions
	 */
	users: {

		/*
		 * function: subscribeStep0
		 * -> authenticate
		 */
		subscribeStep0: function(data, formEl) {
			var self = Defisante;
			self.forms.enableForm(formEl);
			
			/* remove possible previous error */
			$("#subscribeBoxError").empty().hide();
			
			/* no error, proceed to step 1 */
			if(data.success === ""){
				if(data.invited) {
					window.location = "subscribeStep1?id="+data.invited;
					
				} else {
					window.location = "subscribeStep1";
				}
			
			/* an error has occured, display it */
			} else if(data.error){
				$("#subscribeBoxError").show().html(data.error);
			}
		},
		/*
		 * function: getSessionData
		 * -> return the session data stored from the subscription page 0 (authentication)
		 */
		getSessionData: function(){
			var self = Defisante;
			var url = "php/users.php?action=getSessionData";
			url += self.urlVars.id?"&id="+self.urlVars.id:"";
			
			$.getJSON(url, function(formData){
				$("#firstName").val(formData.firstName);
				$("#lastName").val(formData.lastName);
				$("#email").val(formData.email);
				$("#language").val(formData.language);
				
				if(formData.zipCode){
					$("#zipCodeFirst").val(formData.zipCode.substring(0,3));
					$("#zipCodeSecond").val(formData.zipCode.substring(3,6));
					self.users.getNamesFromPostalCode();
				}
				
				if(formData.streetName) {
					$("#streetNameText").val(formData.streetName);
				}
				
				if(formData.streetNumber) {
					$("#streetNumber").val(formData.streetNumber);
				}
				
				if(formData.appNumber) {
					$("#apartment").val(formData.appNumber);
				}
				
				if(formData.city) {
					$("#cityNameSelect").val(formData.city);
				}
				
				if(formData.csssM34Id) {
					$("#csssM34Id").val(formData.csssM34Id);
				}
				
				if(formData.dspM34Id) {
					$("#dspM34Id").val(formData.dspM34Id);
				}
				
				if(formData.arrondM34Id) {
					$("#arrondM34Id").val(formData.arrondM34Id);
				}
				
				if(formData.municipaliteM34Id) {
					$("#municipaliteM34Id").val(formData.municipaliteM34Id);
				}

				if(formData.sex) {

					if(formData.sex == "M") {
						$("#sexMale").attr("checked", true);
						
					} else if(formData.sex == "F") {
						$("#sexFemale").attr("checked", true);
					}
				}
				
				/* zipcode is set and id has been passed, so it is an invitation; disable some inputs */
				if(self.urlVars.id && formData.sex && formData.zipCode) {
					$("#streetNameText, #streetNumber, #cityNameSelect, #cityNameText, #csssM34Id, #dspM34Id, #arrondM34Id, #municipaliteM34Id, [name='zipCode[]'], #apartment")
						.attr("disabled", true);
				}
			});
		},
		/*
		 * function: getCurrentProvince
		 * -> return the current province selected in step1 
		 */
		getCurrentProvince: function(){
			var self = Defisante;
			var url = "php/users.php?action=getCurrentProvince";
			var province = "";
			
			$.getJSON(url, function(data){
				province = data.province;
			});
			return province;
		},
		/*
		 * function: addChoices
		 * -> add choices  
		 */
		addChoices: function(){
			var self = Defisante;
			var url = "php/choices.php?action=choices";
			var choiceId;
			var choiceDescription;
			var choice;
			var div;
			var label;
			
			/* fill the form with the choices */
			$.getJSON(url, function(data){
				$.each(data.data, function(i,v){
					choiceId = v.id;
					choiceDescription = v.description;
					div = $("<div></div>");
					label = $("<label class=\"large\">"+ choiceDescription +"</label>");
					choice = $("<input class=\"checkbox\" type=\"checkbox\" value=\"" + choiceId + "\" id=\"choice"+choiceId+"\" name=\"choices[]\"/>");
					div.append(choice);
					div.append(label);
					$("#choicesDiv").append(div);
				});
			});	
		},
		/*
		 * function: addOptIns
		 * -> add addOptIns  
		 */
		addOptIns: function(){
			var self = Defisante;
			var url = "php/optIns.php?action=optIns";
			var choiceId ;
			var choiceDescription;
			var choice;
			var div ;
			var label;
			var href;
			
			/* fill the form with the choices */
			$.getJSON(url, function(data){
				$.each(data.data, function(i,v){
					choiceId = v.id;
					choiceDescription = v.description;
					div = $("<div></div>");
					href = $("<a href=\"" + v.policiesHyperlink + "\" target=\"_blank\">" + v.policiesHyperlinkText + "</a>");
					label = $("<label class=\"large\">"+ choiceDescription +"</label>");
					label.append(href);
					choice = $("<input class=\"checkbox\" type=\"checkbox\" value=\"" + choiceId + "\" id=\"optIn"+choiceId+"\" name=\"optIns[]\"/>");
					div.append(choice);
					div.append(label);
					$("#optInsDiv").append(div);
				});
			});			
		},
		/*
		 * function: addObjectivesDiv
		 * -> add objectives in the subscription step 1 
		 */
		addObjectivesDiv: function(){
			var self = Defisante;
			
			/* fill the form with the choices */
			$.getJSON("php/objectives.php?action=objectivesAndGroups", function(data){
				
				$.each(data.data, function(i,v){
					var mandatory = (v.mandatory == "1")?" *":"";
					var fieldSet = $("<fieldset></fieldset>").append(
						$("<h3></h3>").append(v.title+mandatory)
						
					).append(
						$("<p></p>").append(v.explication)
					);

					$.each(v.objectives, function(j,value){
						var div = $("<div></div>");
						var label = $("<label for=\"objective"+v.id+value.id+ "\">"+ value.objectiveTitle +"</label>");
						var required = "";
						
						if (v.type == "radio") {
							required = (v.mandatory == "1")?" required":"";
						
						} else {
							required = (v.mandatory == "1")?" requireOne":"";
						}
						var choice = $("<input class=\""+ v.type + required + "\" type=\""+v.type+"\" value=\"" + value.id + "\" id=\"objective"+v.id+value.id+"\" name=\"objectives[]\"/>");
						fieldSet.append(
							div.append(choice).append(label)
						);
					});
					
					$("#objectivesDiv").append(fieldSet);
					
					/* add error message */
					$("#objectivesDiv").find("label:last").after(
						"<span style=\"display:none\" class=\"myDataErrorMessage\">"+self.langVars.myDataErrorWellnessGoal+"</span>"
					);
				});
				
			});			
		},

		/* 
		 * function: getUserData
		 * Get the user data from the database and put in the MyData Form 
		 */
		getUserData: function(){
			var self = Defisante;

			/* get user data from database */
			$.getJSON("php/users.php?action=getUserData", function(data){
				
				if(!data.error) {
					data = data.data;
					
					/* fill form */
					self.forms.fillForm("#myData", data);
					
					/* take care of postal code */
					$("#zipCodeFirst").val(data.zipcode.substring(0,3));
					$("#zipCodeSecond").val(data.zipcode.substring(3,6));
					self.users.getNamesFromPostalCode();
					
					/* take care of city (text input) */
					if($("#cityNameText").is(".required") && data.city) {
						$("#cityNameText").val(data.city);
					}
					
					/* take care of  phone Numbers*/
					$.each(["dayPhone", "eveningPhone", "cellPhone"], function(i, v){
						$("#"+v+"1").val(data[v].substring(0,3));
						$("#"+v+"2").val(data[v].substring(3,6));
						$("#"+v+"3").val(data[v].substring(6,10));
					});
					
					/* take care of  the objectives*/
					$.each(data.objectives, function(i, v){
						$.each($("input[name=objectives[]]"), function(j,value) {
							if (value.value==v.objective) {
								value.checked = true;
							}	
						});
					});
				}
			});
		},		
		
		/*
		 * function: subscribeStep1
		 * -> method executed after the subscribeStep1 is done
		 */
		subscribeStep1: function(data, formEl) {
			var self = Defisante;
			
			if(data.success === ""){
				window.location = "subscribeStep2";
			}
			/* an error has occured, display it */
			if(data.error){
				self.forms.enableForm(formEl);
				self.modal.error(self.langVars.genericErrorTitle, self.langVars.genericErrorMessage+": "+data.error);
			}
		},
		
		/*
		 * function: subscribeStep2
		 * -> method executed after the subscribeStep2 is done
		 */
		subscribeStep2: function(data, formEl) {
			var self = Defisante;
			try {
				if(data.success == ""){
					window.location = "subscribeStep3";
				}
				
				/* an error has occured, display it */
				if(data.error){
					self.modal.error(self.langVars.genericErrorTitle, self.langVars.genericErrorMessage+": "+data.error);
					$("#subscribeFormStep2").find("input[type='submit']").attr("disabled",false);
					self.forms.enableForm(formEl);
				}
			} catch(e) {
				alert(e);
			}
		},
		
		/*
		 * function: myData
		 * -> handle myData resource response
		 */
		myData: function(data, formEl) {
			var self = Defisante;
			self.forms.enableForm(formEl);
			
			if(data.error){
				/* an error has occured, display it */
				self.modal.error(self.langVars.genericErrorTitle, self.langVars.genericErrorMessage+": "+data.error);
				
			} else {
				self.modal.alert(self.langVars.infoTitle, self.langVars.dataModifiedMessage);
			}
		},
		
		/*
		 * function: loginError
		 * -> handle login errors
		 */
		loginError: function(ajaxObj, textStatus, errorThrown) {
			var self = Defisante;
			
			/* display error box */
			$("#loginBoxError").show().html(textStatus+": "+errorThrown);
		},
			
		/*
		 * function: loginForm
		 * -> ajaxify login form (on login page)
		 */
		loginForm: function(){
			var self = Defisante;

			if($("#loginForm").get(0)) {
				/* get the redirection if there is one */
				var url = window.location.href.split("?");
				var redirection = "";
				if (url[1] != undefined) {
					var urlVar = url[1].split("=");
					
					if (urlVar[0] == "p") {
						redirection = urlVar[1];
					} else {
						redirection = "";
					}
				}

				/* set email value if exists */
				var emailValue = self.urlVars.e;
				
				if(emailValue) {
					$("#loginForm").find("#email").addClass("green").val(emailValue);
				}
				
				$("#loginForm").ajaxForm({
					dataType: "json",
					beforeSubmit: function(formData, formEl, options) {
						var self = Defisante;			
						var valid = self.forms.validate(formEl);
						
						/* form doesn't validate, re-enable form */
						if(!valid) {
							$.scrollTo($(".invalid:first"), 500);
							return false;
						
						} else {
							
							/* replace the password field */
							var password = formEl.find("#password").val();
							$(formEl).find("input#password").removeAttr("name");
							$(formEl).find("input#hiddenPassword").remove();
							
							/* add an hidden input with sha256 password to be submitted */
							$(formEl).append(
								$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
									.css("display", "none")
									.val(self.utils.sha256(password))
							);
							
							/* submit form */
							options.beforeSubmit = "";
							$(formEl).ajaxSubmit(options);
							return false;
						}
					},
					success:function(data, formEl) {
						var self = Defisante;
						
						try {
							self.forms.enableForm(formEl);
							
							/* an error has occured, display it */
							if(data.error){
								$("#loginBoxError").html(data.error).show();
								
							} else {
								if (redirection != "") {
									window.location = redirection;
									
								} else {
									if (data.extendedPeriod == 1) {
										window.location = data.pageToGo;
										
									} else if (data.coteSante == 0) {
										window.location = "coteSante";
										
									} else if (data.survey == 0) {
										window.location = "survey";
										
									} else {
										window.location.reload(true);
									}
								}
							}
						} catch(e) {
							alert(e);
						}
					}, 
					error: self.users.loginError
				});
				$("#loginForm").find("input[type='submit']").attr('disabled',false);
			}
		},
		/*
		 * function: subscribeNow
		 * -> Put the cursor in the field first name(in green) in the subscription page
		 */
		subscribeNow: function(){
			var self = Defisante;
			$("#firstName").addClass("green").focus();
		},
		
		/*
		 * function: subscribeForm
		 * -> ajaxify subscription form(on login page)
		 */
		subscribeForm: function(){
			var self = Defisante;
			
			if($("#subscribeForm").get(0)) {
				$("#subscribeForm").ajaxForm({
					dataType: "json",
					beforeSubmit: function(formData, formEl, options) {
						var valid = self.forms.validate(formEl);
						valid = self.forms.validatePostalCode($(formEl).find(".zipCode"))?valid:false;
						
						if(!valid) {
							$.scrollTo($(".invalid:first"), 500);
							return false;
						
						} else {
							return true;
						}
					},
					success:self.users.subscribeStep0, 
					error: self.users.loginError
				});
			}
		},
		
		/*
		 * function: subscribeFormStep1
		 * -> ajaxify subscription form step 1 and assign the methods to get the city and street names
		 */		
		subscribeFormStep1: function(){
			var self = Defisante;
			if($("#subscribeFormStep1").get(0)) {
					
				/* if id has been passed, add it to form action */
				if(self.urlVars.id) {
					$("#subscribeFormStep1").attr("action", $("#subscribeFormStep1").attr("action")+"&id="+self.urlVars.id);
				}
				self.users.addObjectivesDiv();
				
				$("#subscribeFormStep1").ajaxForm({
					dataType: "json",
					beforeSubmit: function(formData, formEl, options) {
						
						try {
							/* validate required fields */
							var valid = self.forms.validate(formEl);
							
							/* validate postal code */
							valid = self.forms.validatePostalCode($(formEl).find(".zipCode"))?valid:false;
							
							/* validate email confirmation */
							valid = self.forms.confirmEmail(
									$(formEl).find("#email"),
									$(formEl).find("#confirmationEmail")
							)?valid:false;
							
							/* validate password confirmation */
							valid = self.forms.confirmPassword(
									$(formEl).find("#password"),
									$(formEl).find("#confirmationPassword")
							)?valid:false;
							
							/* validate province */
							valid = self.forms.validateProvince(
									$("#zipCodeFirst").val()+$("#zipCodeSecond").val(),
									$("#province").val()
							)?valid:false;
							
							/* form doesn't validate, re-enable form */
							if(!valid) {
								$.scrollTo($(".invalid:first"), 500);
								return false;
							
							} else {
								
								/* convert password in sha256 */
								var password = formEl.find("#password").val();
								$(formEl).find("input#password").removeAttr("name");
								$(formEl).find("input#hiddenPassword").remove();
								
								/* add an hidden input with encode password to be submitted */
								$(formEl).append(
									$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
									.css("display", "none")
									.val(self.utils.sha256(password))
								);
								
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
						
						} catch(e) {
							alert(e);
						}
					},
					success:self.users.subscribeStep1, 
					error: self.users.loginError
				});
				
				/* Assign the method for getting the names of city and street */
				self.users.getNamesFromPostalCode();
				
				$("#zipCodeFirst, #zipCodeSecond").blur(function () {
					self.users.getNamesFromPostalCode();
			    });
				
				self.users.getSessionData();
				
				/* update telus dropdown values when cellphone provider is changed */
				$("#cellPhoneProviderId").change(function(){
					self.users.getTelusOption();
				});
				
				/* update telus dropdown values when emplyer is changed */
				$("#employerId").change(function(){
					self.users.getTelusOption();
				});
				
				/* set "province" value to "Québec" by default */
				/*$("#province").val("QC");*/
			}
		},
		/*
		 * function: subscribeFormStep2
		 * -> ajaxify subscription form step 2
		 */		
		subscribeFormStep2: function(){
			var self = Defisante;
			
			if($("#subscribeFormStep2").get(0)) {
				var currentProvince = self.users.getCurrentProvince();
	
				$("#subscribeFormStep2").ajaxForm({
					dataType: "json",
					beforeSubmit: function(formData, formEl, options){
							self.forms.disableForm(formEl);
						
							var valid = self.forms.validate(formEl);
							
							/*check if the user selected igaoption yes */
							var igaSelectedYes = $("[name=igaKit]:checked").val();
							/*check the iga number store*/
							var igaNumber = $("#igaHidNo").val();
							
							if (igaNumber === "" && igaSelectedYes==1) {							
								$("#igaBtnOpen").wrap($("<span></span>").addClass("invalid"));
								valid=false;
								$.scrollTo($(".invalid:first"), 500);
							}
							
							/* check if there is more than 3 selected choices */
							var choicesSelected = $("[name=choices[]]:checked");
							if (choicesSelected.length>3) {
								$.each(choicesSelected, function(i,v){
									if($(this).is(":checked")) {
										$(this).wrap($("<span></span>").addClass("invalid"));
									}
								});
								valid = false;
							}
							
							if(!valid) {
								formEl.find("input[type='submit']").attr("disabled", false);
								self.forms.enableForm(formEl);
							}
							return valid;
					},
					success:self.users.subscribeStep2,
					error: self.users.loginError
				});
				self.users.addChoices();
				self.users.addOptIns();
				$("#eType").hide();
				$("#eAddress").hide();
				
				/* check the province to show the IGA kit*/
				if ((currentProvince != "QC") && (currentProvince != "NB")) {
					$("#kitYes").removeClass("required");
					$("#kitNo").removeClass("required");
					$("#igaKitDiv").hide();
				}
				/* when desjardins is checked, display desjardins type dropdown */
				$("#desjardins").click(function(){
					
					if ($("#desjardins").is(":checked")) {
						$("#eType").show();
						
					} else {
						$("#eType").hide();
						$("#eAddress").hide();
					}
						
				});
				
				/* if employee Type is "hors québec", show a textarea */
				$("#employeeType").change(function() {
					
					if ($("#employeeType").val() == "2"){
						$("#eAddress").show();
						
					} else {
						$("#eAddress").hide();
					}
				});
				
				/* bind click event on IGA radios */
				$("#kitYes").click(function() {
					$("#igaKit").load("php/igaWidget.php?lang="+self.language);
					$("#igaKit").show();
				});
				
				$("#kitNo").click(function() {
					$("#igaKit").hide();			
				});
			}
		},
		/*
		 * function: subscribeFormStep2
		 * -> ajaxify subscription form step 3
		 */		
		subscribeFormStep3: function(){
			var self = Defisante;
			
			if($("#subscribeStep3Form").get(0)) {
				$.getJSON("php/users.php?action=checkDateRange", function(data){
					if (data.validDate == "0") {
						$("#subscribeStep3Form").remove();
					} else {
						var img = new Image();
						var userId = "";
						var IGAStore = "";
						$.getJSON("php/users.php?action=getUserIGA", function(data){
							userId = data.userId;
							IGAStore = data.IGAStore;
						});
						/* check if the user has chosen an iga store */
						if (IGAStore !== null) {
							var srcIGAImage = "php/iga.php?resource=pixel&id="+userId+"&m="+IGAStore+"&q=1";
							$(img).attr("src", srcIGAImage);
							$(img).attr("width", "0");
							$(img).attr("height", "0");
							$(img).css("display","none");
							$(img).css("width",0);
							$(img).css("height",0);
							/* add the image to the form in step 3 */
							$("#subscribeStep3Form").append(img);
						}
						
						/* form to submit families */
						$("#subscribeStep3Form").ajaxForm({
							dataType: "json",
							success:function(data){
								if(data.error) {
									self.modal.error(self.langVars.genericErrorTitle, self.langVars.genericErrorMessage, function(){}, function(){});
								
								} else {
									self.modal.alert(self.langVars.subscriptionCompletedTitle, self.langVars.finishSubmitMessage, function(){
										$.getJSON("php/users.php?action=email", function(data){
												top.location = self.language=="en"?"http://www.530healthandwellnesschallenge.ca/":"http://www.defisante530equilibre.ca/";
										});
											
									});
								}
								
							}, 
							error: self.users.loginError
						});
					}
				});
			}
		},
		/*
		 * function: getNamesFromPostalCode
		 * -> method to get the city and street names according to the postal code
		 */			
		getNamesFromPostalCode: function(){
			var self = Defisante;
			
			/* get the current postal code value */
			var postalCode = $("#zipCodeFirst").val().toUpperCase() + $("#zipCodeSecond").val().toUpperCase();
			
			/* if postal code is set, request the M34 resource to get city and steet */
			if(postalCode !== "") {
				$.getJSON("php/users.php?action=getNamesFromPostalCode&postalCode="+postalCode, function(data){
					
					/* postal code has been found */
					if (data.province !== "") {
						
						/* set values for province */
						$("#province").val(data.province);
						
						/* add an option for each city available */
						$("#cityNameSelect").empty();
						
						$.each(data.cities, function(i,v){
							$("<option></option>").html(v)
								.attr("value", v)
								.appendTo("#cityNameSelect");
						});
						
						/* hide text fields, show dropdowns */
						$("#cityNameText").attr("disabled", true)
							.removeClass("required")
							.hide();
						
						$("#cityNameSelect").attr("disabled", false)
							.addClass("required")
							.show();
						
						/* add  csss and dsp id */
						$("#csssM34Id").val(data.csssM34Id);
						$("#dspM34Id").val(data.dspM34Id);
						
						/* "arrondissement" and "municipalité" are set to the first value available */
						$("#arrondM34Id").val(data.arrondM34Id[$("#cityNameSelect").val()]);
						$("#municipaliteM34Id").val(data.municipaliteM34Id[$("#cityNameSelect").val()]);
						
						/* set event on city select to change the "arrondissement" and "municipalité" values */
						$("#cityNameSelect").change(function(){
							$("#arrondM34Id").val(data.arrondM34Id[$(this).val()]);
							$("#municipaliteM34Id").val(data.municipaliteM34Id[$(this).val()]);
						});
						
						/* set province to "QC" and prevent province to be changed */
						$("#province").bind("focus",function(){$(this).blur();})
							.bind("mousedown",function(){$(this).blur();})
							.bind("dblclick",function(){$(this).blur();})
							.bind("change", function(){$(this).val("QC").blur();});
	
					} else {
						
						/* hide dropdowns, show text fields */
						$("#cityNameSelect").attr("disabled", true)
							.removeClass("required")
							.hide();
						
						$("#cityNameText, #province").attr("disabled", false)
							.addClass("required")
							.show(); 
						
						$("#province").unbind("focus").unbind("mousedown").unbind("change");
					}
				});	
			} else {
				
				/* for paper subscription */
				if($("#subscriberAddCoupon").get(0)) {

					$.getJSON("php/users.php?action=cities", function(data){
					
						var selectContent = "";
						
						data = data.data;
						
						/* add an option for each city available */
						$.each(data, function(i,v){
							selectContent += "<option value=\""+v.id+"\">"+v.name+"</option>\n";
						});
						
						$("#cityNameSelect").empty().html(selectContent);
						
						/* hide text fields, show dropdowns */
						$("#cityNameText").attr("disabled", true)
							.removeClass("required")
							.hide();
						
						$("#cityNameSelect").attr("disabled", false)
						.addClass("required")
						.show();
					});
				}
			}
		},
		
		/*
		 * method: initMyData
		 */
		initMyData: function() {
			var self = Defisante;
			
			if($("#myData").get(0)) {
				/*adding the objectives from DB */
				self.users.addObjectivesDiv();
				
				$("#cellPhoneProviderId").change(function(){
					self.users.getTelusOption();
				  });
				$("#employerId").change(function(){
					self.users.getTelusOption();
				  });
				self.users.myDataForm();
				self.users.getUserData();
			}
		},
		
		/*
		 * function: myDataForm
		 * -> ajaxify myData Form and assign the methods to get the city and street names
		 */		
		myDataForm: function(){
			var self = Defisante;
			
			/* ajaxify form */
			$("#myData").ajaxForm({
				dataType: "json",
				beforeSubmit: function(formData, formEl, options){

					try {
						var valid = self.forms.validate(formEl);
						
						valid = self.forms.validatePostalCode($(formEl).find(".zipCode"))?valid:false;
						
						if($(formEl).find("#password").val() && $(formEl).find("#password").val() !== "") {
							
							valid = self.forms.confirmPassword(
									$(formEl).find("#password"),
									$(formEl).find("#confirmationPassword")
							)?valid:false;
						}
						/* form doesn't validate, re-enable form */
						if(!valid) {
							$.scrollTo($(".invalid:first"), 500);
							return false;
						
						} else {
							
							/* convert password in sha256 */
							var password = formEl.find("#password").val();
							if(password && password !== "") {
								$(formEl).find("input#password").removeAttr("name");
								$(formEl).find("input#hiddenPassword").remove();
								
								/* add an hidden input with encode password to be submitted */
								$(formEl).append(
									$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
									.css("display", "none")
									.val(self.utils.sha256(password))
								);
							}
							
							
							/* submit form */
							options.beforeSubmit = "";
							$(formEl).ajaxSubmit(options);
							return false;
						}
					
					} catch(e) {
						alert(e);
					}
				},
				success:self.users.myData, 
				error: self.users.myData
			});
			
			/* retrieve city and street based on postal code */
			self.users.getNamesFromPostalCode();
			
			/* on blur, retrieve city and street based on postal code */
			$("#zipCodeFirst, #zipCodeSecond").blur(function () {
				self.users.getNamesFromPostalCode();
		    });
			
			/* disable the email field */
			$("#email").attr("disabled", true);
			
			/* print button */
			$("#printMyData").click(function(){
				self.modal.show("printConfirmation");
			});
				
		},
		/*
		 * function: printConfirmation
		 * -> Print the confirmation page in Mydata interface
		 */		
		printConfirmation : function()  {
			var self = Defisante;
			$("#printConfirmation").jqprint();
		},
		/*
		 * function: fbs_click
		 * -> click event on the facebook button
		 */					
		fbs_click : function() {
			var self = Defisante;
			var url_fb = location.href;
			var title_fb = "Moi, je relève le Défi Santé 5/30 Équilibre !";
			window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(url_fb)+'&t='+encodeURIComponent(title_fb),'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		},
		
		/*
		 * function: getTelusOption
		 * -> 
		 */
		getTelusOption: function() {
			var self = Defisante;
			var cellPhoneNumber = $("#cellPhone1").val() + $("#cellPhone2").val() + $("#cellPhone3").val() ;
			var cellPhoneProvider = $("#cellPhoneProviderId").val();
			var employer = $("#employerId").val();
			
			/*if the user selected telus as cell phone provider*/
			if((cellPhoneProvider == "0") && (cellPhoneNumber !== "")) {
				$.getJSON("php/users.php?action=telus", function(formData){
					if (formData.telus == "1") {
						$("#telusOptionContainerCellPhone").show();
					} 
				});
			} else {
				$("#telusOptionContainerCellPhone").hide();
			}
			
			/* if the user selected telus as phone and as employer*/
			if((cellPhoneProvider == "0") && (employer == "18") && (cellPhoneNumber !== "")) {
				$.getJSON("php/users.php?action=telus", function(formData){
					/*if the telus return more than 10000 */
					if (formData.telus == "0") {
						$("#telusOptionContainer").show();
					} 
				});
				
			} else {
				$("#telusOptionContainer").hide();
			}
		},
		
		/*
		 * function: setLogoutLink
		 * -> set the log out link to allow user to logout
		 */
		setLogoutLink: function(){
			var self = Defisante;
			if($("#logout").get(0)) {
				$("#logout").attr("href", "javascript:Defisante.users.logout();");
			}
		},
		
		/*
		 * function: logout
		 * -> logout a user
		 */
		logout: function() {
			var self = Defisante;
			$.getJSON("php/users.php?action=logout", function(){
				var url = self.language=="en"?"http://www.530healthandwellnesschallenge.ca/":"http://www.defisante530equilibre.ca/"; 
				top.location = self.language=="en"?"http://www.530healthandwellnesschallenge.ca/":"http://www.defisante530equilibre.ca/";
			});
		},
		
		/*
		 * function: finishLater
		 * -> click event for the button FinishLater in the survey
		 */
		finishLater: function(){
			var self = Defisante;
			self.modal.alert(self.langVars.subscriptionCompletedTitle, self.langVars.finishLaterMessage, function(){
				$.getJSON("php/users.php?action=email", function(data){
					top.location = self.language=="en"?"http://www.530healthandwellnesschallenge.ca/":"http://www.defisante530equilibre.ca/";	
				});
			});
			return;
		},
		
		/* function: getSubscriberData
		 * Get the user data from the database and put in the editSubscribers Form 
		 */
		getSubscriberData: function(id){
			var self = Defisante;
			/*adding the objectives from DB */
			self.users.addObjectivesDiv();
			/* get user data from database */
			$.getJSON("php/users.php?action=getSubscriberData&id="+id, function(data){
				
				if(!data.error) {
					data = data.data;
					/* fill form */
					self.forms.fillForm("#editSubscriber", data);
					
					/* take care of postal code */
					$("#zipCodeFirst").val(data.zipcode.substring(0,3));
					$("#zipCodeSecond").val(data.zipcode.substring(3,6));
					self.users.getNamesFromPostalCode();
					
					/* take care of  phone Numbers*/
					$.each(["dayPhone", "eveningPhone", "cellPhone"], function(i, v){
						$("#"+v+"1").val(data[v].substring(0,3));
						$("#"+v+"2").val(data[v].substring(3,6));
						$("#"+v+"3").val(data[v].substring(6,10));
					});
					$("#userId").val(id);
					$("#confirmationEmail").val(data.email);
					
					/* take care of  the objectives*/
					$.each(data.objectives, function(i, v){
						$.each($("input[name=objectives[]]"), function(j,value) {
							if (value.value==v.objective) {
								value.checked = true;
							}	
						});
					});
				}
			});
		},		
		
		/* function: editSubscriber
		 * Set the form editsubscriber modal window 
		 */
		editSubscriber: function(id){
			var self = Defisante;
			self.modal.show("editSubscriber");
			
			/* set the form */
			self.forms.allDropDowns();
			$("#resetPasswordButton").click(function(){
				self.modal.confirm(self.langVars.confirmMessageResetPassword, function(){
					
					$.getJSON("php/users.php?action=resetUserPassword&id="+id, function(data){
						self.modal.alert(self.langVars.passwordLabel, self.langVars.messageResetPasswordSended);
					});
					
				},function(){return true;});
			  });
			
			$("#cellPhoneProviderId").change(function(){
				self.users.getTelusOption();
			  });
			$("#employerId").change(function(){
				self.users.getTelusOption();
			  });
			$("#zipCodeFirst, #zipCodeSecond").blur(function () {
				self.users.getNamesFromPostalCode();
		    });
			/* End for setting the form*/
			
			/* ajaxify form */
			$("#editSubscriber").ajaxForm({
				dataType: "json",
				beforeSubmit: function(formData, formEl, options){

					try {
						var valid = self.forms.validate(formEl);
						
						valid = self.forms.validatePostalCode($(formEl).find(".zipCode"))?valid:false;
						
						/* form doesn't validate, re-enable form */
						if(!valid) {
							$.scrollTo($(".invalid:first"), 500);
							return false;
						
						} else {
							
							/* convert password in sha256 */
							var password = formEl.find("#password").val();
							if(password && password !== "") {
								$(formEl).find("input#password").removeAttr("name");
								$(formEl).find("input#hiddenPassword").remove();
								
								/* add an hidden input with encode password to be submitted */
								$(formEl).append(
									$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
									.css("display", "none")
									.val(self.utils.sha256(password))
								);
							}
							
							
							/* submit form */
							options.beforeSubmit = "";
							$(formEl).ajaxSubmit(options);
							return false;
						}
					
					} catch(e) {
						alert(e);
					}
				},
				success: function() {
					window.location.reload(true);
				}, 
				error: self.users.myData
			});
			
			self.users.getSubscriberData(id);
			
		},
		
		/* function: viewSubscriber
		 * view subscriber information in a modal window
		 */
		viewSubscriber: function(id){
			var self = Defisante;
			self.modal.show("editSubscriber");
			
			/* set the form */
			self.forms.allDropDowns();
			
			$("#cellPhoneProviderId").change(function(){
				self.users.getTelusOption();
			  });
			$("#zipCodeFirst, #zipCodeSecond").blur(function () {
				self.users.getNamesFromPostalCode();
		    });
			/* End for setting the form*/
			self.users.getSubscriberData(id);
			
			/* disable all inputs */
			$("#editSubscriber").find("input, select").attr("disabled", true);
			$("#editSubscriber").find("input[type='button'], input[type='submit'], input[type='reset'], button").css("display", "none");
			
			/* hide confirmation  email */
			$("#editSubscriber").find("#confirmationEmail").parents("div:first").css("display", "none");
			
			/* hide password */
			$("#editSubscriber").find("#resetPasswordButton").parents("div:first").css("display", "none");
		},
		
		/* function: addSubscriber
		 * Set the form addSubscriber modal window 
		 */
		addSubscriber: function(id){
			var self = Defisante;
			self.modal.show('newSubscriber');
			
			/* set the form */
			self.forms.allDropDowns();
			
			$("#zipCodeFirst, #zipCodeSecond").blur(function () {
				self.users.getNamesFromPostalCode();
		    });
			self.users.addObjectivesDiv();
			/* End for setting the form*/
			
			/* ajaxify form */
			$("#newSubscriber").ajaxForm({
				dataType: "json",
				beforeSubmit: function(formData, formEl, options){

					try {
						var valid = self.forms.validate(formEl);
						
						valid = self.forms.validatePostalCode($(formEl).find(".zipCode"))?valid:false;
						
						if ($("#email").val() !== "") {
							valid = self.forms.confirmEmail(
									$(formEl).find("#email"),
									$(formEl).find("#confirmationEmail")
							)?valid:false;
						}
						
						/* form doesn't validate, re-enable form */
						if(!valid) {
							$.scrollTo($(".invalid:first"), 500);
							return false;
						
						} else {
							/* submit form */
							options.beforeSubmit = "";
							$(formEl).ajaxSubmit(options);
							return false;
						}
					
					} catch(e) {
						alert(e);
					}
				},
				success: function(data) {
					if(data.error){
						$(".modalError").show().html(data.error);
					} else {
						window.location.reload(true);
					}
				}, 
				error: self.users.myData
			});
		},

		/* function: subscriberAddCoupon
		 * Set the form subscriberAddCoupon window 
		 */
		subscriberAddCoupon: function(id){
			var self = Defisante;
			
			if($("#subscriberAddCoupon").get(0)) {
				self.users.addObjectivesDiv();
				
				/* update values regarding postal code */
				$("#zipCodeFirst, #zipCodeSecond").blur(function () {
					self.users.getNamesFromPostalCode();
			    });
				
				/* ajaxify form */
				$("#subscriberAddCoupon").ajaxForm({
					dataType: "json",
					beforeSubmit: function(formData, formEl, options){
	
						try {
							/* remove the required from objectives */
							var removeRequiredObjectifs = $("#objectivesDiv").find("input").removeClass("required");
							
							var valid = self.forms.validate(formEl);
							
							valid = self.forms.validatePostalCode($(formEl).find(".zipCode"))?valid:false;
							
							if ($("#email").val() !== "") {
								valid = self.forms.confirmEmail(
										$(formEl).find("#email"),
										$(formEl).find("#confirmationEmail")
								)?valid:false;
							}
							
							/* form doesn't validate, re-enable form */
							if(!valid) {
								$.scrollTo($(".invalid:first"), 500);
								return false;
							
							} else {					
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
						
						} catch(e) {
							alert(e);
						}
					},
					success: function() {
						window.location.reload(true);
						/* reset the form */
						$("#subscriberAddCoupon")[0].reset();
					}, 
					error: self.users.myData
				});
				
				/* fill with all the cities */
				$.getJSON("php/users.php?action=cities", function(data){
					selectContent = "";
					data = data.data;
					/* add an option for each city available */
					$.each(data, function(i,v){
						selectContent += "<option value=\""+v.id+"\">"+v.name+"</option>\n";
					});
					
					/* add content to <select/> element */
					$("#cityNameSelect").empty().html(selectContent);
					
					/* hide text fields, show dropdowns */
					$("#cityNameText").attr("disabled", true)
						.removeClass("required")
						.hide();
					
					$("#cityNameSelect").attr("disabled", false)
						.addClass("required")
						.show();
				});
				
				/*get the first postal code when a city is selected */
				$("#cityNameSelect").change(function(){
					
					$.getJSON("php/users.php?action=getPostalCodeFromCity&city="+$("#cityNameSelect").val(), function(data){
						$("#zipCodeFirst").val(data.POSTAL_CODE.substring(0,3));
						$("#zipCodeSecond").val(data.POSTAL_CODE.substring(3,6));
					});
				});
			}
		},
		
		/*
		 * function: changeLanguage
		 */
		changeLanguage: function(lang) {
			var self = Defisante;
			$.getJSON("php/users.php?action=language&lang="+lang, function(data){
				window.location = window.location.toString().replace(/[?&]*lang=[^&]*/gi, "");
			});
		}
	},
	
	/*
	 * object: administrators
	 * 
	 * -> include administrators related functions
	 */
	administrators: {
		
		/*
		 * function: beforeSubmit
		 * -> handle data processing for the login form before submission
		 */
		beforeSubmit: function(formData, formEl, options) {
			var self = Defisante;
			
			try {
				
				/* Initialize variable valid as true */
				var valid = true;
				
				/* Assign new value of valid, valid may be changed to false if the form does not validate */
				valid = self.forms.validate(formEl);
	
				/* get clear password value and prevent it to be submitted */
				var password = formEl.find("#password").val();
				if (password){
					$(formEl).find("input#password").removeAttr("name");
					$(formEl).find("input#hiddenPassword").remove();
					
					/* add an hidden input with encode password to be submitted */
					$(formEl).append(
						$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
							.css("display", "none")
							.val(self.utils.sha256(password))
					);
				}	
				
				/* form doesn't validate, re-enable form */
				if(!valid) {
					$.scrollTo($(".invalid:first"), 500);
					return false;
				}			
				
				/* hide possible previously displayed error */
				$("#loginBoxError").hide();			
				
				/* submit form */
				options.beforeSubmit = "";
				$(formEl).ajaxSubmit(options);
				
				return false;
			} catch(e) {
				alert(e);
				return false;
			}
		},
		
		/*
		 * function: adminAuthenticate
		 * -> authenticate administrator
		 */
		adminAuthenticate: function(data, formEl) {
			var self = Defisante;
			self.forms.enableForm(formEl);
						
			/* an error has occured, display it */
			if(data.error){
				$("#loginBoxError").show().html(data.error);
				
			} else if(data.success == "1"){
				window.location = "subscribers";
				
			/* if administrator is external, redirect to paper subscription */
			} else if(data.success === "2") {
				window.location = "mcsManager";
			} else if(data.success === "") {
				window.location = "subscriberAddCoupon";
			}
		},
		/*
		 * function: authenticate
		 * -> 
		 */		
		authenticate: function(data, formEl) {
			var self = Defisante;
			self.forms.enableForm(formEl);
						
			/* an error has occured, display it */
			if(data.error){
				$("#loginBoxError").show().html(data.error);
			} else {
				window.location = "myData";
			}
			
		},
		
		/*
		 * function: loginError
		 * -> handle login errors
		 */
		loginError: function(ajaxObj, textStatus, errorThrown) {
			var self = Defisante;
			
			/* display error box */
			$("#loginBoxError").show().html(textStatus+": "+errorThrown);
		},
		
		/*
		 * function: loginForm
		 * -> ajaxify login form (on login page)
		 */
		loginForm: function(){
			var self = Defisante;
			
			/* check the form input data and process the form */
			$("#adminLoginForm").ajaxForm({
				dataType: "json",
				beforeSubmit: self.administrators.beforeSubmit,
				success: self.administrators.adminAuthenticate,
				error: self.administrators.loginError
			});
		},
				
		/*
		 * function: logout
		 * -> log out an administrator
		 */
		logout: function(){
			var self = Defisante;
			
			$.post("php/administrators.php?action=logout", "",function(data){
				window.location.reload(true);
			});
		},

		/*
		 * function: deleteAdministrators
		 * -> allow to delete administrators
		 */
		deleteAdministrators: function(){
			var self = Defisante;
			
			if(!$("#administratorsTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmAdminDeletionMessage,
				function(){
					var adminIds = [];
					
					/* gather team members */
					$("#administratorsTable").find(":checked").each(function(){
						adminIds.push($(this).val());
					});
					
					$.ajax({
						url: "php/administrators.php?action=delete&ids="+adminIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
						
							if(data.error) {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							
							} else {
								self.modal.alert(self.langVars.adminDeletionMessage, self.langVars.adminDeletionMessage);
								$("#administratorsTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},
		/*
		 * function: deleteEmployers
		 * -> allow to delete administrators
		 */
		deleteEmployers: function(){
			var self = Defisante;
			
			if(!$("#employersTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmEmployerDeletionMessage,
				function(){
					var employersIds = [];
					
					/* gather employers members */
					$("#employersTable").find(":checked").each(function(){
						employersIds.push($(this).val());
					});
					
					$.ajax({
						url: "php/employers.php?action=delete&ids="+employersIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
							if(data.error) {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							
							} else {
								self.modal.alert(self.langVars.employerDeletionMessage, self.langVars.employerDeletionMessage);
								$("#employersTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},
		/*
		 * function: deleteCampaigns
		 * -> allow to delete administrators
		 */
		deleteCampaigns: function(){
			var self = Defisante;
			
			if(!$("#campaignsTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmCampaignDeletionMessage,
				function(){
					var campaignsIds = [];
					
					/* gather employers members */
					$("#campaignsTable").find(":checked").each(function(){
						campaignsIds.push($(this).val());
					});

					$.ajax({
						url: "php/campaigns.php?action=delete&ids="+campaignsIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
							if(data.error) {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							
							} else {
								self.modal.alert(self.langVars.campaignDeletionMessage, self.langVars.campaignDeletionMessage);
								$("#campaignsTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},
		/*
		 * function: deleteChoices
		 * -> allow to delete Choices
		 */
		deleteChoices: function(){
			var self = Defisante;
			
			if(!$("#choicesTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmChoiceDeletionMessage,
				function(){
					var choicesIds = [];
					
					/* gather employers members */
					$("#choicesTable").find(":checked").each(function(){
						choicesIds.push($(this).val());
					});

					$.ajax({
						url: "php/choices.php?action=delete&ids="+choicesIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
							if(data.error) {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							
							} else {
								self.modal.alert(self.langVars.choicesDeletionMessage, self.langVars.choicesDeletionMessage);
								$("#choicesTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},

		/*
		 * function: deleteChoices
		 * -> allow to delete Choices
		 */
		deleteOptIns: function(){
			var self = Defisante;
			
			if(!$("#optInsTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmOptInsDeletionMessage,
				function(){
					var choicesIds = [];
					
					/* gather employers members */
					$("#optInsTable").find(":checked").each(function(){
						choicesIds.push($(this).val());
					});

					$.ajax({
						url: "php/optIns.php?action=delete&ids="+choicesIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
							if(data.error) {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							
							} else {
								self.modal.alert(self.langVars.choicesDeletionMessage, self.langVars.choicesDeletionMessage);
								$("#optInsTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},
		/*
		 * function: deleteObjectiveGroup
		 * -> allow to delete ObjectiveGroup
		 */
		deleteObjectiveGroup: function(){
			var self = Defisante;
			
			if(!$("#objectiveGroupsTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmObjectiveGroupDeletionMessage,
				function(){
					var objectiveGroupIds = [];
					
					/* gather employers members */
					$("#objectiveGroupsTable").find(":checked").each(function(){
						objectiveGroupIds.push($(this).val());
					});

					$.ajax({
						url: "php/objectivegroups.php?action=delete&ids="+objectiveGroupIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
							if(data.error) {
								if (data.error.substring(0,9) == "ORA-02292") {
									self.modal.error(self.langVars.genericErrorTitle, "Erreur: Un groupe doit être vide (ne doit pas contenir d'énoncé) pour pouvoir être supprimé");
								} else {
									self.modal.error(self.langVars.genericErrorTitle, data.error);
								}
							
							} else {
								self.modal.alert(self.langVars.objectiveGroupDeletionMessage, self.langVars.objectiveGroupDeletionMessage);
								$("#objectiveGroupsTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},
		/*
		 * function: deleteObjective
		 * -> allow to delete Objective
		 */
		deleteObjective: function(){
			var self = Defisante;
			
			if(!$("#objectivesTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(self.langVars.confirmObjectiveDeletionMessage, function(){
				var objectiveIds = [];
				
				/* gather employers members */
				$("#objectivesTable").find(":checked").each(function(){
					objectiveIds.push($(this).val());
				});

				$.ajax({
					url: "php/objectives.php?action=delete&ids="+objectiveIds.join(","),
					type: "delete",
					async: true,
					dataType: "json",
					success: function(data) {
						if(data.error) {
							if (data.error.substring(0,9) == "ORA-02292") {
								self.modal.error(self.langVars.genericErrorTitle, "Erreur: Un objectif doit être vide (ne doit pas être associé à des résultats d'utilisateurs) pour pouvoir être supprimé");
							} else {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							}
						
						} else {
							self.modal.alert(self.langVars.objectiveDeletionMessage, self.langVars.objectiveDeletionMessage);
							$("#objectivesTable").get(0).reloadData();
						}
					}
				});
			}, 
			function(){}
			);
		}
	},
		
	/*
	 * object: surveys
	 * -> surveys related functions
	 */		
	surveys: {
		/*
		 * function: addAnswerRow
		 * -> add a new row allowing user to add an answer to a question
		 */
		addAnswerRow: function(inputEl){
			var self = Defisante;
			var trEl = $(inputEl).parents("tr:first");
			var newTrEl = $("<tr></tr>").insertAfter(trEl).html(trEl.html());
			
			var newTextId = newTrEl.find("input[type='text']:first").attr("id");
			var questionId = newTextId.split("-");
			newTrEl.find("input[type='button']:second").removeAttr("disabled");
			newTrEl.find("input[type='text']:first").val("");
			newTrEl.find("input[type='text']:first").attr("id",questionId[0]);
			newTrEl.find("input[type='text']:first").removeAttr("onblur");
			newTrEl.find("#"+questionId[0]).blur(function(){
				Defisante.surveys.addAnswer(questionId[0]);
			});
			
			newTrEl.find("input[type='hidden']:first").val("");
			return;
		},
		
		removeAnswerRow: function(inputEl,id){
			var self = Defisante;
			self.modal.confirm(self.langVars.confirmDeleteAnswer, function(){
				$(inputEl).parents("tr:first").remove();
				$.getJSON("php/surveys.php?action=deleteAnswer&answerId="+id,function(data){
				});
				
			},function(){return true;});
		},
		
		addAnswer: function(questionId){
			var self = Defisante;
			var value = $("#"+questionId).val();
			if (value !== "") {
				$.getJSON("php/surveys.php?action=addAnswer&questionId="+questionId+"&value="+value,function(data){
					var newId = data.SURVEYANSWERS - 1;
					$("#"+questionId).removeAttr("onblur");
					$("#"+questionId).attr("id",questionId+"-"+newId);
					newId = questionId+"-"+newId;
					$("#"+newId).unbind();
					$("#"+newId).blur(function(){
						Defisante.surveys.editAnswer(newId);
					});
				});
			}
		},
		
		editAnswer: function(id){
			var self = Defisante;
			var totalId = id;
			totalIdResult = totalId.split("-");
			var answerId = totalIdResult[1];
			var value = $("#"+id).val();
			$.getJSON("php/surveys.php?action=editAnswer&answerId="+answerId+"&value="+value,function(data){
				
			});
		},
		
		/*
		 * method: activeSurvey
		 * -> display active survey if any and if user didn't already fill it
		 */
		activeSurvey: function() {
			var self = Defisante;
			
			if($("#surveyMainContainer").get(0)){

				$.getJSON("php/surveys.php?action=activeSurvey", function(formData){
					
					/*check for an active survey */
					if (formData.survey == "none") {
						window.location = "myData";
						
					} else {
						
						/* check if the user has already filled an active survey */
						if (formData.survey == 1) {
							window.location = "myData";
							
						} else {
							var surveyMainContainerForm = new Form("#surveyMainContainer", formData, "");
							
							$("#completeLater").click(function(){
								window.location = "myData";
							});
						}
					}
				});
			}
		}
	},
	
	/*
	 * object: tables
	 * -> data table functions in Defi Sante
	 */
	tables: {
		
		/*
		 * function: subscribersTable
		 * -> conf object for "subscribers" table (administration - internal)
		 */
		subscribersTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/users.php?action=getSubscribers",

				/* table properties */
				orderBy: "subscriptionDate", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "subscribers",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"id": "ID",
					"lastName":  self.langVars.lastNameLabel,
					"firstName":  self.langVars.firstNameLabel,
					"email": self.langVars.emailLabel,
					"subscriptionDate": "Date d'inscription",
					"dayPhone": "Téléphone (jour)"
				},
				
				replacers: {
					"lastName": function(rowData) {
						return "<a href=\"javascript:Defisante.users.editSubscriber('"+rowData.id+"');\">"+rowData.lastName+"</a>";
					}
					
				},
				functions:{},
				
				filter: function(url){
					url += $("#searchSubscriber").val()?"&searchSubscriber="+$("#searchSubscriber").val():"";
					url += $("#searchCouponTypeId").val()?"&searchCouponTypeId="+$("#searchCouponTypeId").val():"";
					url += $("#receiveEmailIga").is(":checked")?"&receiveEmailIga=1":"";
					url += $("#receiveEmailScc").is(":checked")?"&receiveEmailScc=1":"";
					url += $("#subscribersCampagnes").val()?"&campagneId="+$("#subscribersCampagnes").val():"";
					url += $("#employeeType").val()?"&employeeType="+$("#employeeType").val():"";
					url += $("#searchByEmployer").val()?"&searchByEmployer="+$("#searchByEmployer").val():"";
					url += $("#startDate").val()?"&startDate="+$("#startDate").val():"";
					url += $("#endDate").val()?"&endDate="+$("#endDate").val():"";
					return url;
				},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#subscribersTable";
			var subscribersTable = new DataTable(tableId, options);
			return subscribersTable;
		},
		
		/*
		 * function: familyTable
		 * -> conf object for "family members" table
		 */
		 familyTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/families.php?action=familyMembers",

				/* table properties */
				orderBy: "chief", desc:1, display: -1,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "family",
				
				/* enable/disable sorting */
				sort: $("#subscribeStep3Form").get(0)?false:true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"firstName":  self.langVars.firstNameLabel,
					"lastName":  self.langVars.lastNameLabel,
					"yearOfBirth": self.langVars.birhdayYearLabel,
					"chief": self.langVars.statusLabel
				},
				
				replacers: {
					"chief": function(rowData) {
						var value = "";
						switch(rowData.chief) {
							case "true":	value = self.langVars.familyChiefLabel; break;
							case "false":	value = self.langVars.teamMemberLabel; break;
							default:		value = self.langVars.teamMemberLabel; break;
						}
						return value;
					},
					
					"checkbox": function(rowData) {
						if(rowData.chief != "true" && !$("#familyTable").is(".readonly")) {
							return "<input type=\"checkbox\" id=\"familyMember_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
						}
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#familyTable";
			var familyTable = new DataTable(tableId, options);
			return familyTable;
		},
		
		/*
		 * function: teamTable
		 * -> conf object for "team members" table
		 */
		teamTable: function(id) {
			
			if(!id || id === null || id === undefined) { return; }
			
			var self = Defisante;
			id = id.toString();
			
			var options = {
				/* resource to get data */
				resource: "php/teams.php?action=teamMembers&id="+id,

				/* table properties */
				orderBy: "chief", desc:1, display: -1,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "team"+id,
				
				/* enable disable sorting */
				sort: $("#subscribeStep3Form").get(0)?false:true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"firstName":  self.langVars.firstNameLabel,
					"lastName":  self.langVars.lastNameLabel,
					"email": self.langVars.emailLabel,
					"chief":  self.langVars.statusLabel
				},
				
				replacers: {
					"chief": function(rowData) {
						var value = "";
						switch(rowData.chief) {
							case "true":	value = self.langVars.teamChiefLabel; break;
							case "pending":	value = self.langVars.teamPendingLabel; break;
							case "member":	value = self.langVars.teamMemberLabel; break;
							default:		value = self.langVars.teamMemberLabel; break;
						}
						return value;
					},
					
					"checkbox": function(rowData) {
						if(rowData.chief != "true" && !$("#teamTable_"+id).is(".readonly")) {
							return "<input type=\"checkbox\" id=\"teamMember_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
						}
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#teamTable_"+id;
			var teamTable = new DataTable(tableId, options);
			return teamTable;
		},
		
		/*
		 * function: pendingTeamTable
		 * -> conf object for "pending teams" table (myTeams)
		 */
		pendingTeamTable: function(id) {
			
			if(!id || id === null || id === undefined) { return; }
			
			var self = Defisante;
			id = id.toString();
			
			var options = {
				/* resource to get data */
				resource: "php/teams.php?action=pendingTeamMembers&id="+id,

				/* table properties */
				orderBy: "chief", desc:1, display: -1,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "pendingTeam"+id,
				
				/* enable disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"firstName":  self.langVars.firstNameLabel,
					"lastName":  self.langVars.lastNameLabel,
					"email": self.langVars.emailLabel,
					"chief":  self.langVars.statusLabel
				},
				
				replacers: {
					"chief": function(rowData) {
						var value = "";
						
						switch(rowData.chief) {
							case "true":	value = self.langVars.teamChiefLabel; break;
							case "member":	value = self.langVars.teamMemberLabel; break;
							default:		value = self.langVars.teamMemberLabel; break;
						}
						return value;
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#pendingTeamTable_"+id;
			var teamTable = new DataTable(tableId, options);
			return teamTable;
		},
		
		/*
		 * function: drawResultTable
		 * -> conf object for "drawResult" table (administration - internal)
		 */
		drawResultTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/draw.php?action=getSessionResults",

				/* table properties */
				orderBy: "lastName", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "drawResult",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"id": "ID",
					"lastName":  self.langVars.lastNameLabel,
					"firstName":  self.langVars.firstNameLabel,
					"address": "Adresse",
					"DSP" : "Région (DSP)",
					"dayPhone": "Téléphone (jour)",
					"eveningPhone": "Téléphone (soir)",
					"email": self.langVars.emailLabel,
					"years" : "Âge"

				},
				
				replacers: {
					"id": function(rowData) {
						return "<a href=\"javascript:Defisante.users.viewSubscriber('"+rowData.id+"');\">"+rowData.id+"</a>";
					}
				},
				functions:{
				},
				
				filter: function(url){
					url += $("#searchSubscriber").val()?"&searchSubscriber="+$("#searchSubscriber").val():"";
					url += $("#searchCouponTypeId").val()?"&searchCouponTypeId="+$("#searchCouponTypeId").val():"";
					return url;
				},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#drawResultTable";
			var drawResultTable = new DataTable(tableId, options);
			return drawResultTable;
		},

		/*
		 * function: administratorsTable
		 */
		 administratorsTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/administrators.php?action=administrators",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "administrators",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"lastName":  self.langVars.lastNameLabel,
					"firstName":  self.langVars.firstNameLabel,
					"email": self.langVars.emailLabel,
					"internal": self.langVars.administratorTypeLabel,
					"enabled": "Actif"
				},
				
				replacers: {
					"internal": function(rowData) {
						return rowData.internal == "1"?self.langVars.internalLabel:self.langVars.externalLabel;
					},

					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"lastName": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editAdministrator?id="+rowData.id+"');\">"+rowData.lastName+"</a>";
					},
					"enabled": function(rowData) {
						return rowData.enabled == "1"?"Oui":"Non";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#administratorsTable";
			var administratorsTable = new DataTable(tableId, options);
			return administratorsTable;
		},
		
		/*
		 * function: employersTable
		 */
		employersTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/employers.php?action=allEmployers",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "employersTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"nameEn":  self.langVars.nameEnLabel,
					"nameFr":  self.langVars.nameFrLabel,
					"disabled":  self.langVars.activeLabel
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"nameEn": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editEmployer?id="+rowData.id+"');\">"+rowData.nameEn+"</a>";
					},
					"nameFr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editEmployer?id="+rowData.id+"');\">"+rowData.nameFr+"</a>";
					},
					"disabled": function(rowData) {
						if(1 - rowData.disabled) return self.langVars.Yes; else return self.langVars.No;
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#employersTable";
			var employersTable = new DataTable(tableId, options);
			return employersTable;
		},
		/*
		 * function: objectivesTable
		 */
		objectivesTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/objectives.php?action=allObjectives",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "objectivesTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"titre_en":  self.langVars.titleEnLabel,
					"titre_fr":  self.langVars.titleFrLabel,
					"HTML_fr": "HTML Français",
					"HTML_en": "HTML Anglais"
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"titre_en": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editObjective?id="+rowData.id+"');\">"+rowData.titre_en+"</a>";
					},
					"titre_fr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editObjective?id="+rowData.id+"');\">"+rowData.titre_fr+"</a>";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#objectivesTable";
			var objectivesTable = new DataTable(tableId, options);
			return objectivesTable;
		},
		/*
		 * function: campaignsTable
		 */
		campaignsTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/campaigns.php?action=allCampaigns",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "objectivesTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"description": "Description",
					"name": "Name",
					"date_debut":  self.langVars.startDateLabel,
					"date_fin":  self.langVars.endDateLabel
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"name": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editCampaign?id="+rowData.id+"');\">"+rowData.name+"</a>";
					},
					"description": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editCampaign?id="+rowData.id+"');\">"+rowData.description+"</a>";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#campaignsTable";
			var campaignsTable = new DataTable(tableId, options);
			return campaignsTable;
		},
		/*
		 * function: choicesTable
		 */
		choicesTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/choices.php?action=allChoices",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "objectivesTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"descriptionEn": "Description En",
					"descriptionFr": "Description Fr",
					"creationDate": "Date de création",
					"modificationDate": "Date de modification",
					"active": "Actif"
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"descriptionEn": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editChoice?id="+rowData.id+"');\">"+rowData.descriptionEn+"</a>";
					},
					"descriptionFr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editChoice?id="+rowData.id+"');\">"+rowData.descriptionFr+"</a>";
					},
					"active": function(rowData) {
						return rowData.active == "1"? "Oui":"Non";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#choicesTable";
			var choicesTable = new DataTable(tableId, options);
			return choicesTable;
		},
		/*
		 * function: optInsTable
		 */
		optInsTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/optIns.php?action=allOptIns",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "objectivesTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"descriptionEn": "Description (anglais)",
					"descriptionFr": "Description (Français)",
					"creationDate": "Date de création",
					"modificationDate": "Date de modification",
					"active": "Actif"
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"descriptionEn": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editOptIns?id="+rowData.id+"');\">"+rowData.descriptionEn+"</a>";
					},
					"descriptionFr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editOptIns?id="+rowData.id+"');\">"+rowData.descriptionFr+"</a>";
					},
					"active": function(rowData) {
						return rowData.active == "1"? "Oui":"Non";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#optInsTable";
			var optInsTable = new DataTable(tableId, options);
			return optInsTable;
		},
		/*
		 * function: objectivesTable
		 */
		objectiveGroupsTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/objectiveGroups.php?action=allObjectiveGroups",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "objectiveGroupsTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"nom": "Nom",
					"type": "type",
					"titre_en":  self.langVars.titleEnLabel,
					"titre_fr":  self.langVars.titleFrLabel,
					"mandatory": "Obligatoire"
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"nom": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editObjectiveGroup?id="+rowData.id+"');\">"+rowData.nom+"</a>";
					},
					"titre_en": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editObjectiveGroup?id="+rowData.id+"');\">"+rowData.titre_en+"</a>";
					},
					"titre_fr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editObjectiveGroup?id="+rowData.id+"');\">"+rowData.titre_fr+"</a>";
					},
					"mandatory": function(rowData) {
						return rowData.mandatory == "1"? "Oui":"Non";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#objectiveGroupsTable";
			var objectiveGroupsTable = new DataTable(tableId, options);
			return objectiveGroupsTable;
		},
		/*
		 * function: coteSanteTable
		 */
		coteSanteTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/coteSanteGroup.php?action=allCoteSanteGroups",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "coteSanteTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"nameFr": "Nom (Français)",
					"nameEn": "Nom (Anglais)",
					"name": "Campagne"
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"nameFr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editCoteSante?id="+rowData.id+"');\">"+rowData.nameFr+"</a>";
					},
					"nameEn": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editCoteSante?id="+rowData.id+"');\">"+rowData.nameEn+"</a>";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#coteSanteTable";
			var coteSanteTable = new DataTable(tableId, options);
			return coteSanteTable;
		},
		/*
		 * function: coteSanteEnonceTable
		 */
		coteSanteEnonceTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/coteSanteEnonce.php?action=allCoteSanteEnonces&coteSanteGroupId="+$("#id").val(),

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "coteSanteEnonceTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"id": "ID",
					"enonceFr": "Énoncé (Français)",
					"enonceEn": "Énoncé (Anglais)"
				},
				
				replacers: {
					"checkbox": function(rowData) {
						return "<input type=\"checkbox\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
					},
					"enonceFr": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editCoteSanteEnonce?id="+rowData.id+"');\">"+rowData.enonceFr+"</a>";
					},
					"enonceEn": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editCoteSanteEnonce?id="+rowData.id+"');\">"+rowData.enonceEn+"</a>";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#coteSanteEnonceTable";
			var coteSanteEnonceTable = new DataTable(tableId, options);
			return coteSanteEnonceTable;
		},
		/*
		 * function: enoncesTable
		 */
		enoncesTable: function() {
			var self = Defisante;
			var options = {
				/* resource to get data */
				resource: "php/coteSanteEnonce.php?action=enoncesSelected",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "enoncesTable",
				
				/* enable/disable sorting */
				sort: false,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"enonce": ""
				},
				
				replacers: {
					"checkbox": function(rowData) {
						if(rowData.checked == "1") {
							return "<input type=\"checkbox\" name=\"enonces[]\" checked=\"checked\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
						
						} else {
							return "<input type=\"checkbox\" name=\"enonces[]\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
						}
					},
					"enonce": function(rowData) {
						var content = "<span id=\"enonceText_"+rowData.id+"\" class=\"enonceTooltip\">"+rowData.enonce+"</span>";
						content += "<div id=\"enonceTooltip_"+rowData.id+"\" style=\"display:none;\"><span style=\"font-weight: normal\">"+rowData.explanation+"</span></div>";
						return content;
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#enoncesTable";
			var enoncesTable = new DataTable(tableId, options);
			return enoncesTable;
		},
		/*
		 * function: coteSanteEnonceTable
		 */
		enoncesTableNotSelected: function() {
			var self = Defisante;
			var options = {
				/* resource to get data */
				resource: "php/coteSanteEnonce.php?action=enoncesNotSelected",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "enoncesTableNotSelected",
				
				/* enable/disable sorting */
				sort: false,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"checkbox": "",
					"enonce": ""
				},
				
				replacers: {
					"checkbox": function(rowData) {
						if(rowData.checked == "1") {
							return "<input type=\"checkbox\" name=\"enonces[]\" checked=\"checked\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
						
						} else {
							return "<input type=\"checkbox\" name=\"enonces[]\" id=\"admin_"+rowData.id+"\" value=\""+rowData.id+"\"/>";
						}
					},
					"enonce": function(rowData) {
						var content = "<span id=\"enonceText_"+rowData.id+"\" class=\"enonceTooltip\">"+rowData.enonce+"</span>";
						content += "<div id=\"enonceTooltip_"+rowData.id+"\" style=\"display:none;\"><span style=\"font-weight: normal\">"+rowData.explanation+"</span></div>";
						return content;
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#enoncesTableNotSelected";
			var enoncesTableNotSelected = new DataTable(tableId, options);
			return enoncesTableNotSelected;
		},

		/*
		 * function: statisticsRegionTable
		 * -> handle #statisticsRegionTable
		 */
		statisticsRegionTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/statistics.php?action=dsps&outOfQuebec=1",

				/* table properties */
				orderBy: "name", desc:0, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "administrators",
				
				/* enable/disable sorting */
				sort: false,
				hideFirstColumn: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"id": "<strong>ID</strong>",
					"name": "<strong>Région (DSP)</strong>",
					"subscribers": "<strong>Participants</strong>",
					"percent": "<strong>% d'inscrits</strong>"
				},
				
				replacers: {
					id: function(rowData) {
						if(rowData.id == "99") {
							return "<strong>ID</strong></td><td id=\"horsQuebec\" colspan=\"3\"></td></tr><tr><td>"+rowData.id;
							
						} else {
							return rowData.id;
						}
					},
					percent: function(rowData){
						return (rowData.percent.toString().charAt(0) == ",")?"0"+rowData.percent:rowData.percent;
					}
				},
				functions:{},
				filter: function(url) {
					url += $("#regionFromDate").val()?"&fromDate="+$("#regionFromDate").val():"";
					url += $("#regionToDate").val()?"&toDate="+$("#regionToDate").val():"";
					url += $("#regionCampagnes").val()?"&campagneId="+$("#regionCampagnes").val():"";
					return url;
				},
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					var ids = [];
					
					$("#statisticsRegionTable tbody").find("tr").find("td:first").each(function(){
						if(parseInt($(this).text(), 10) !== 99 && !isNaN(parseInt($(this).text(), 10))) {
							ids.push($(this).text());
						}
					});
					
					self.utils.addTotal("#statisticsRegionTable", ids, "#horsQuebec");
					return true;
				}
			};
			
			var tableId = "#statisticsRegionTable";
			var statisticsRegionTable = new DataTable(tableId, options);
			return statisticsRegionTable;
		},
		
		/*
		 * function: statisticsObjectivesTable
		 * -> handle #statisticsObjectivesTable
		 */
		statisticsObjectivesTable: function() {
			var self = Defisante;
			
			var options = {
				/* resource to get data */
				resource: "php/statistics.php?action=groupObjectives",

				/* table properties */
				orderBy: "id", desc:0, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "objectives",
				
				/* enable/disable sorting */
				sort: false,
				hideFirstColumn: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"id": "<strong>ID</strong>",
					"name": "<strong>Objectifs</strong>",
					"subscribers": "<strong>Participants</strong>",
					"percent": "<strong>% d'inscrits</strong>"
				},
				
				replacers: {
					id: function(rowData){
						if(rowData.subscribers == "NA") {
							return "<strong>ID</strong></td><td id=\"objectivesDelimiter_"+rowData.id.toString()+"\" colspan=\"3\"><strong>"+rowData.name+"</strong></td></tr><tr style=\"display: none\" class=\"delimiter\"><td>"+rowData.id;
						
						} else {
							return rowData.id.toString();
						}
					},
					percent: function(rowData){
						var percent = (rowData.percent.toString().charAt(0) == ",")?"0"+rowData.percent:rowData.percent;
						return percent;
					}
				},
				functions:{},
				filter: function(url) {
					url += $("#objectivesFromDate").val()?"&fromDate="+$("#objectivesFromDate").val():"";
					url += $("#objectivesToDate").val()?"&toDate="+$("#objectivesToDate").val():"";
					url += $("#objectivesCampagnes").val()?"&campagneId="+$("#objectivesCampagnes").val():"";
					
					return url;
				},
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					
					/* find the ids of rows that sould be calculated */
					$("#statisticsObjectivesTable tr.delimiter").each(function(){
						var ids = [];
						var el = $(this);
						while(el.get(0) && !el.next().is(".delimiter") && !el.next().next().is(".delimiter")) {
							el = el.next();
							ids.push(el.find("td:first").text());
						}
						if(el.next().get(0)) {
							self.utils.addTotal("#statisticsObjectivesTable", ids, "#"+el.next().find("td:first").next().attr("id"));
						
						} else {
							self.utils.addTotal("#statisticsObjectivesTable", ids);
						}
					});
					return true;
				}
			};
			
			var tableId = "#statisticsObjectivesTable";
			var statisticsObjectivesTable = new DataTable(tableId, options);
			return statisticsObjectivesTable;
		},

		/*
		 * function: statisticsGroupTable
		 * -> 
		 */
		statisticsGroupTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/statistics.php?action=group",

				/* table properties */
				orderBy: "id", desc:0, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "group",
				
				/* enable/disable sorting */
				sort: false,
				hideFirstColumn: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"id": "<strong>ID</strong>",
					"name": "<strong>Groupes</strong>",
					"subscribers": "<strong>Participants</strong>",
					"percent": "<strong>% d'inscrits</strong>"
				},
				
				replacers: {
					id: function(rowData){
						var groupName = false;
						var tdId = "";
						
						switch(rowData.id.toString()) {
							case "1": groupName = "Sexe"; tdId = "groupSexRow"; break;
							case "3": groupName = "Moyen d'inscription"; tdId = "groupSubscriptionMethodRow"; break;
							case "5": groupName = "Type d'inscription"; tdId = "groupSubscriptionTypeRow"; break;
							case "9": groupName = "Chefs d'équipes et familles"; tdId = "groupChiefsRow"; break;
							case "13": groupName = "Ont demandé des courriels"; tdId = "groupEmailsRow"; break;
							case "15": groupName = "Langue"; tdId = "groupLanguageRow"; break;
							default: groupName = false; break;
						}

						if(groupName) {
							return "<strong>ID</strong></td><td colspan=\"3\" id=\""+tdId+"\"><strong>"+groupName+"</strong></td></tr><tr><td style=\"display:none\">"+rowData.id;
						
						} else {
							return rowData.id.toString();
						}
					},
					percent: function(rowData){
						return (rowData.percent.toString().charAt(0) == ",")?"0"+rowData.percent:((rowData.percent === ""?"0":rowData.percent));
					}
				},
				functions:{},
				filter: function(url) {
					url += $("#groupFromDate").val()?"&fromDate="+$("#groupFromDate").val():"";
					url += $("#groupToDate").val()?"&toDate="+$("#groupToDate").val():"";
					url += $("#groupFromAges").val()?"&fromAge="+$("#groupFromAges").val():"";
					url += $("#groupToAges").val()?"&toAge="+$("#groupToAges").val():"";
					url += $("#groupRegionId").val()?"&dspM34Id="+$("#groupRegionId").val():"";
					url += $("#groupCity").val()?"&city="+$("#groupCity").val():"";
					url += $("#groupCsssId").val()?"&csssM34Id="+$("#groupCsssId").val():"";
					url += $("#groupCampagnes").val()?"&campagneId="+$("#groupCampagnes").val():"";
					return url;
				},
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					self.utils.addTotal("#statisticsGroupTable", ["1","2"], "#groupSubscriptionMethodRow");
					self.utils.addTotal("#statisticsGroupTable", ["3","4"], "#groupSubscriptionTypeRow");
					self.utils.addTotal("#statisticsGroupTable", ["5","6","7","8"], "#groupChiefsRow");
					self.utils.addTotal("#statisticsGroupTable", ["9","10","11","12"], "#groupEmailsRow");
					self.utils.addTotal("#statisticsGroupTable", ["13","14"], "#groupLanguageRow");
					self.utils.addTotal("#statisticsGroupTable", ["15","16"]);
				}
			};
			
			var tableId = "#statisticsGroupTable";
			var statisticsGroupTable = new DataTable(tableId, options);
			return statisticsGroupTable;
		},
		/*
		 * function: surveysTable
		 */
		surveysTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/surveys.php?action=surveys",

				/* table properties */
				orderBy: "id", desc:1, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "surveysTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"name":  "Nom",
					"startDate":  "Début",
					"endDate": "Fin",
					"campagneId":  "Campagne",
					"results": ""
				},
				
				replacers: {

					"name": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editSurvey?id="+rowData.id+"');\">"+rowData.name+"</a>";
					},
					"results": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('viewSurvey?id="+rowData.id+"');\">Voir les résultats</a>";
					},
					"campagneId": function(rowData) {
						return rowData.campaignName;
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#surveysTable";
			var surveysTable = new DataTable(tableId, options);
			return surveysTable;
		},
		/*
		 * function: surveyQuestionsTable
		 * -> 
		 */
		surveyQuestionsTable: function(surveyId) {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/surveys.php?action=surveyQuestions&surveyId="+(surveyId?surveyId:""),

				/* table properties */
				orderBy: "", desc:0, display: -1,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "surveyQuestions",
				
				/* enable/disable sorting */
				sort: false,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"type": "Type",
					"text":  "Questions",
					"answers":  "Réponses"
				},
				
				replacers: {
					"type": function(rowData) {
						var type = "";
						
						switch(rowData.type) {
							case "text": type = "Champ texte"; break;
							case "dropdown": type = "Menu déroulant"; break;
							case "checkgroup": type = "Réponses multiples"; break;
						}
						return type;
					},
					"text": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editQuestion?id="+rowData.id+"');\">"+rowData.text+"</a>";
					},
					
					"answers": function(rowData) {
						var row = 0;
						var concatenatedAnswers = "<table class=\"answersTable\"><tbody>";
						$.each(rowData.answers, function(i, answer){
							concatenatedAnswers += "<tr>";
							concatenatedAnswers += "<td><input type=\"text\" class=\"required\" name=\"answers["+rowData.id+"][]\" value=\""+answer.label+"\" id=\""+rowData.id+"-"+answer.id+"\" onblur=\"Defisante.surveys.editAnswer('"+rowData.id+"-"+answer.id+"')\"/>";
							concatenatedAnswers += "<input type=\"hidden\" style=\"display:none\" name=\"answerIds["+rowData.id+"][]\" value=\""+answer.id+"\"/></a></td>";
							if (row == 0) {
								concatenatedAnswers += "<td><input type=\"button\" disabled=\"disabled\" onclick=\"Defisante.surveys.removeAnswerRow(this);\" value=\"-\"/></a></td>";
							} else {
								concatenatedAnswers += "<td><input type=\"button\" onclick=\"Defisante.surveys.removeAnswerRow(this,"+answer.id+");\" value=\"-\"/></a></td>";
							}
							concatenatedAnswers += "<td><input type=\"button\" onclick=\"Defisante.surveys.addAnswerRow(this);\" value=\"+\"/></a></td>";
							concatenatedAnswers += "</tr>";
							row = row+1;
						});
						if ((rowData.type !== "text") && (row == 0)) {
							concatenatedAnswers += "<tr>";
							concatenatedAnswers += "<td><input type=\"text\" class=\"required\" name=\"answers["+rowData.id+"][]\" value=\"\" id=\""+rowData.id+"\" onblur=\"Defisante.surveys.addAnswer("+rowData.id+")\"/>";
							concatenatedAnswers += "<input type=\"hidden\" style=\"display:none\" name=\"answerIds["+rowData.id+"][]\" value=\"\"/></a></td>";
							concatenatedAnswers += "<td><input type=\"button\" disabled=\"disabled\" onclick=\"Defisante.surveys.removeAnswerRow(this);\" value=\"-\"/></a></td>";
							concatenatedAnswers += "<td><input type=\"button\" onclick=\"Defisante.surveys.addAnswerRow(this);\" value=\"+\"/></a></td>";
							concatenatedAnswers += "</tr>";
						}
						concatenatedAnswers += "</tbody></table>";
						return concatenatedAnswers;
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#surveyQuestionsTable";
			var surveyQuestionsTable = new DataTable(tableId, options);
			return surveyQuestionsTable;
		},
		/*
		 * function: mcsManagerTable
		 */
		mcsManagerTable: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/mcs.php?action=getMCSData",

				/* table properties */
				orderBy: "week", desc:0, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "mcsManagerTable",
				
				/* enable/disable sorting */
				sort: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"week":  "week",
					"servings": Defisante.langVars.servingsGoalLabel,
					"exercise": Defisante.langVars.exerciseGoalLabel,
					"balance":  Defisante.langVars.wellnessGoalLabel
				},
				
				replacers: {
					"week": function(rowData) {
						return "<a href=\"javascript:Defisante.modal.show('editMCSWeek?id="+rowData.id+"');\">"+self.langVars.mcsWeek + " " + rowData.week+"</a>";
					},
					"balance": function(rowData) {
						return rowData.balance == 1? "yes": "no";
					}
				},
				functions:{},
				
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#mcsManagerTable";
			var mcsManagerTable = new DataTable(tableId, options);
			return mcsManagerTable;
		},
		/*
		 * function: trackingStatisticTable1
		 */
		trackingStatisticTable1: function() {
			var self = Defisante;

			var options = {
				/* resource to get data */
				resource: "php/tracking.php?action=getStats1&campaingId="+$("#trackingCampagnes").val(),

				orderBy: "id", desc:0, display: 20,
				currentPage: 1, totalPages: 0, totalRecords: 0,
				
				/* tag used to generate ids unique to the table */
				tag: "group",
				
				/* enable/disable sorting */
				sort: false,
				hideFirstColumn: true,
				
				/* correspondance between database columns name and displayed names */
				columns: {
					"id": "<strong>ID</strong>",
					"name": "<strong>Statistic</strong>",
					"subscribers": "<strong>Participants</strong>",
					"percent": "<strong>% d'inscrits</strong>"
				},
				
				replacers: {
					percent: function(rowData){
						return (rowData.percent.toString().charAt(0) == ",")?"0"+rowData.percent:((rowData.percent === ""?"0":rowData.percent));
					},
					subscribers: function(rowData) {
						return rowData.subscribers == 0?"0":rowData.subscribers; 
					} 
				},
				functions:{},
				filter: function(url) {
					url += $("#trackingFromDate").val()?"&fromDate="+$("#trackingFromDate").val():"";
					url += $("#trackingToDate").val()?"&toDate="+$("#trackingToDate").val():"";
					url += $("#groupRegionId").val()?"&dspM34Id="+$("#groupRegionId").val():"";
					url += $("#sex").val()?"&sex="+$("#sex").val():"";
					url += $("#subscriptionType").val()?"&subscriptionType="+$("#subscriptionType").val():"";
					return url;
				},
				onSort: function(){
					return true;
				},
				onDisplay: function(){
					return true;
				}
			};
			
			var tableId = "#trackingStatisticTable1";
			var statisticsGroupTable = new DataTable(tableId, options);
			return statisticsGroupTable;
		}
	},
	
	/*
	 * object: tabs
	 * -> tabs-related functions
	 */
	tabs: {
		
		/* 
		 * function: show
		 * -> show a HTML block
		 */
		show: function(blockEl, linkEl) {
			var self = Defisante;
			$(".tabElement").hide();
			var tableEl = $(blockEl).find("table:first");

			if(!tableEl.is(".loaded") && tableEl.is(".noLoad")) {
				tableEl.addClass("loaded").each(function(){ if(this.reloadData){this.reloadData();} });
			}
			$(blockEl).show();
		},
		
		/* 
		 * function: toggleTabs
		 * -> set current tab as selected and de-select any other selected tab
		 */
		toggleTabs: function(aEl) {
			var self = Defisante;
			$(".tabSelected").removeClass("tabSelected");
			$(aEl).addClass("tabSelected");
		}
	},
	/*
	 * object: modal
	 * -> modal-related functions
	 */
	modal: {
		
		/* 
		 * function: alert
		 * -> display a modal message 
		 */
		alert: function(title, content, onLoad, onHide) {
			var self = Defisante;
			var params = {
				ajax: "alert",
				onLoad: function(obj){
					obj.w.find(".modalTitle").html(title);
					if(content === "") {
						obj.w.find(".modalSuccess").css("display", "none").empty();
						
					} else {
						obj.w.find(".modalSuccess").css("display", "block").html(content);
					}
					
					$.scrollTo(".modalWindow", 500);
					if(onLoad) {
						onLoad(obj);
					}
				},
				onHide: function(obj){
					if(onHide) {
						onHide(obj);
					}
					obj.w.add("div.jqmOverlay:first").remove();
				}
			};
			var modalEl = $("<div></div>");
			
			if($("div.jqmOverlay").get(0)) {
				
				if($("div.jqmOverlay").get(0)) {
					params.overlayClass = "jqmOverlay2";
					params.onHide = function(obj){obj.w.add("div.jqmOverlay2").remove();};
					modalEl.addClass("jqmdAbove2");
					
				} else {
					params.overlayClass = "jqmOverlay";
					params.onHide = function(obj){obj.w.add("div.jqmOverlay").remove();};
					modalEl.addClass("jqmdAbove");
				}
				
			} else {
				params.onHide = function(obj){obj.w.add("div.jqmOverlay").remove();};
			}
			
			modalEl.addClass("modalWindow")
				.appendTo($(document.body))
				.jqm(params).jqmShow();
			
			if(typeof($.scrollTo) == "function") {
				$.scrollTo(".modalWindow", 500);
			}
			
		},
		
		/* 
		 * function: error
		 * -> display a modal message wuth the error in Red 
		 */
		error: function(title, content, onLoad, onHide) {
			var self = Defisante;
			var params = {
				ajax: "error",
				onLoad: function(obj){
					obj.w.find(".modalTitle").html(title);
					obj.w.find(".modalError").css("display", "block").html(content);
					$.scrollTo(".modalWindow", 500);
					if(onLoad) {
						onLoad(obj);
					}
				},
				onHide: function(obj){
					if(onHide) {
						onHide(obj);
					}
					obj.w.add("div.jqmOverlay:first").remove();
				}
			};
			var modalEl = $("<div></div>");
			modalEl.addClass("modalWindow")
				.appendTo($(document.body))
				.jqm(params).jqmShow();
			
			if(typeof($.scrollTo) == "function") {
				$.scrollTo(".modalWindow", 500);
			}
		},
		
		/* 
		 * function: confirm
		 * -> display a modal confirmation dialog (yes/no) 
		 */
		confirm: function(content, callbackYes, callbackNo) {
			var self = Defisante;
			var modalEl = $("<div></div>");
			
			/* set default to callback if not passed */
			callbackYes = callbackYes?callbackYes:function(){};
			callbackNo = callbackNo?callbackNo:function(){};
			
			/* set parameters */
			var params = {
				ajax: "confirm",
				onLoad:function(obj){
					obj.w.find(".modalTitle").html("Confirmation");
					obj.w.find(".modalContent").html(content);
					obj.w.find(".yesButton").click(function(){
						callbackYes();
						obj.w.jqmHide();
					});
					obj.w.find(".noButton").click(function(){
						callbackNo();
						obj.w.jqmHide();
					});
					$.scrollTo(".modalWindow", 500);
				},
				onHide: function(obj){
					obj.w.add("div.jqmOverlay:first").remove();
				}
			};
			
			/* show modal */
			modalEl.addClass("modalWindow")
				.appendTo($(document.body))
				.jqm(params).jqmShow();
			
			/* scroll to modal */
			if(typeof($.scrollTo) == "function") {
				$.scrollTo(".modalWindow", 500);
			}
		},
		
		/*
		 * function: show
		 * -> show a modal window with given title and HTML content
		 */
		show: function(htmlContentResource, params) {
			var self = Defisante;
			
			/* extract resource name */
			var resourceName = htmlContentResource.split("?");
			resourceName = resourceName[0];
			
			/* add default values to params object */
			params = params?params:(self.modal.params[resourceName]?self.modal.params[resourceName]:{});
			/* copy params object */
			var paramsCopy = self.utils.copyObj(params);
			params.ajax = htmlContentResource;
			params.modal = true;
			
			params.onHide = function(obj){
				
				/* execute custom onHide function if set */
				if(paramsCopy.onHide) {
					paramsCopy.onHide(obj);
				}
				
				/* remove overlay */
				obj.w.add("div.jqmOverlay:first").remove();
				
				/* if a data table is present, reload its data */
				$("table").each(function(){
					if(this.reloadData) {
						this.reloadData();
					}
				});
			};
			params.onLoad = params.onLoad?params.onLoad:function(obj){};
			
			/* check if an id has been passed */
			var urlVars = self.utils.getUrlVars(htmlContentResource);
			
			/* pass id to onLoad function */
			if(urlVars.id) {
				
				/* make a deep copy of object */
				params = self.utils.copyObj(params);
				var params2 = self.utils.copyObj(params);
				var currentOnload = function(){params2.onLoad.apply(this, arguments);};

				params.onLoad = function(obj) {
					currentOnload(obj, urlVars.id);
				};
			}
			
			/* 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;
		},
		
		/*
		 * function: hide
		 * -> hide a modal window
		hide: function(modalEl) {
			var self = Defisante;
			modalEl.add("div.jqmOverlay:first").remove();
		},
		
		/*
		 * function: handleResponse
		 * -> default handling for ajax form submit responses
		 */
		handleResponse: function(formEl, successEl, errorEl, data) {
			var self = Defisante;
			
			formEl.hide();
			if(data.success) {
				successEl.show();
				
			} else if(data.error) {
				errorEl.append(": "+data.error);
				errorEl.show();
				
			} else {
				successEl.show();
			}

			$.scrollTo($("#modalWindow"), 500);
			self.forms.enableForm(formEl);
		},
		
		/*
		 * object: params
		 * -> params for modal windows (name after the content resource name)
		 */
		params: {
			
			/* 
			 * object: forgotPassword
			 * -> handle the input data in forgotPassword form 
			*/
			forgotPassword: {
				
				/* handle the click event after the forgotPassword opened*/
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#forgotPasswordForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					/* validate email input from the user */
					var emailVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function() {
						
							/* validate email input from the user */
							emailVal = $(formEl).find(".required").val();
							if(self.utils.validateEmail(emailVal)){
								return true;
								
							} else {
								var emailInput = $(formEl).find("#email");
								$(emailInput).addClass("invalid");
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			
			/*
			 * object: survey
			 * -> parameters for survey modal
			 */
			survey: {
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#survey");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");
			
					/* ajaxify form */
					formEl.ajaxForm({
						dataType: "json",
						beforeSubmit: function(){
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							if(!valid) {
								self.forms.enableForm(formEl);
							}
							return valid;
						},
						
						success: function(data){
							self.forms.enableForm(formEl);
							formEl.hide();
							
							if(data.success) {
								successEl.show();
								
							} else if(data.error) {
								errorEl.append(": "+data.error);
								successEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* handle ajax error */
						error: function(data){
							formEl.hide();
							successEl.show();
						}
					});
				}
			},
			
			/* 
			 * object: addFamily
			 * -> configuration object for addFamily modal
			*/
			addFamily: {
				
				/* handle the click event after the forgotPassword opened*/
				onLoad: function(obj){
					
					/* create Defisante object to inherit its data and functions*/
					var self = Defisante;
					var formEl = $(obj.w).find("form#addFamilyForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function() {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();

							} else {
								successEl.show();
							}
							self.families.displayFamily();
							
							/* check if there is a cote Sante option available to redirect to it */
							$.getJSON("php/users.php?action=checkCoteSanteOption",function(data){
								if(data == "1") {
									window.location = "coteSante";
								}
							});

						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* pre-fill last name */
					$.getJSON("php/users.php?action=lastName",function(data){
						
						if(data.lastName) {
							formEl.find("#familyName").val(data.lastName);
						}
					});
				}
			},
			
			/* 
			 * object: addFamilyMember
			 * -> handle addFamilyMember form
			*/
			addFamilyMember: {
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addFamilyMemberForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					self.forms.fillDropdown(".years");
					
					/* ajaxify form */
					formEl.ajaxForm({
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function() {
						var self = Defisante;
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);

							if(!valid) {
								self.forms.enableForm(formEl);
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(data){
							
							formEl.hide();
							if(data.success){
								successEl.show();
							} else if(data.error) {
								errorEl.append(": "+data.error);
								errorEl.show();
							} else {
								successEl.show();
							}
							
							self.families.displayFamily();
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
				}
			},
				
			/* 
			 * object: addTeamMember
			 * -> handle addTeamMember form
			*/
			addTeamMember: {
				onLoad: function(obj, id){
					var self = Defisante;
					
					if(id) {
						$(obj.w).find("#teamId").val(id);
					}
					var formEl = $(obj.w).find("form#addTeamMemberForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function() {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
							self.teams.displayTeams();
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			
			/* 
			 * object: addTeam
			 * -> handle addTeam form
			*/
			addTeam: {
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addTeamForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function() {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
							self.teams.displayTeams();
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			
			/*
			 * object: addAdministrator
			 * -> conf object for addAdministrator modal
			 */
			addAdministrator: {
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addAdministratorForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
									
								/* replace the password field */
								var password = formEl.find("#password").val();
								$(formEl).find("input#password").removeAttr("name");
								$(formEl).find("input#hiddenPassword").remove();
								
								/* add an hidden input with sha256 password to be submitted */
								$(formEl).append(
									$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
										.css("display", "none")
										.val(self.utils.sha256(password))
								);
								
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
							self.teams.displayTeams();
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			 /*
			 * object: editAdministrator
			 * -> conf object for editAdministrator modal
			 */
			 editAdministrator: {
				onLoad: function(obj, adminId){
					var self = Defisante;
					var formEl = $(obj.w).find("form#editAdministratorForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								if($(formEl).find("input#password").val() &&$(formEl).find("input#password").val() !== "") {
									
									/* replace the password field */
									var password = formEl.find("#password").val();
									$(formEl).find("input#password").removeAttr("name");
									$(formEl).find("input#hiddenPassword").remove();
									
									/* add an hidden input with sha256 password to be submitted */
									$(formEl).append(
										$("<input id=\"hiddenPassword\" type=\"hidden\" name=\"password\"/>")
											.css("display", "none")
											.val(self.utils.sha256(password))
									);
									
									/* submit form */
									options.beforeSubmit = "";
									$(formEl).ajaxSubmit(options);
									return false;
								
								} else {
									return valid;
								}
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
							self.teams.displayTeams();
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* get admin data and fill form */
					$.getJSON("php/administrators.php?action=administrator&id="+adminId, function(data){
						self.forms.fillForm("#editAdministratorForm", data.data);
						/* added to change if the administrator is communication type */
						if (data.data.communication == "1") {
							$("#internal").val("2");
						}
					});
				}
			},
			/*
			 * object: addEmployer
			 * -> conf object for addAdministrator modal
			 */
			addEmployer: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addEmployerForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			 /*
			 * object: editEmployer
			 * -> conf object for editAdministrator modal
			 */
			 editEmployer: {
				onLoad: function(obj, adminId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editEmployerForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/employers.php?action=employer&id="+adminId, function(data){
						self.forms.fillForm("#editEmployerForm", data.data);
					});
				}
			},
			/*
			 * object: addObjective
			 * -> conf object for addObjectif modal
			 */
			addObjective: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addObjectiveForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					self.forms.allDropDowns();
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: addObjectiveGroup
			 * -> conf object for addObjectiveGroup modal
			 */
			addObjectiveGroup: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addObjectiveGroupForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					self.forms.allDropDowns();
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: editGroupObjective
			 * -> conf object for editGroupObjective modal
			 */
			editObjectiveGroup: {
				onLoad: function(obj, objectiveGroupId){
	
					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editObjectiveGroupForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	

					self.forms.allDropDowns();
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/objectiveGroups.php?action=objectiveGroup&id="+objectiveGroupId, function(data){
						self.forms.fillForm("#editObjectiveGroupForm", data.data);
					});
				}
			},
			/*
			 * object: editObjective
			 * -> conf object for editObjective modal
			 */
			editObjective: {
				onLoad: function(obj, objectiveId){
	
					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editObjectiveForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	

					self.forms.allDropDowns();
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/objectives.php?action=objective&id="+objectiveId, function(data){
						self.forms.fillForm("#editObjectiveForm", data.data);
					});
				}
			},

			/*
			 * object: addCampaign
			 * -> conf object for addObjectif modal
			 */
			addCampaign: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addCampaignForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					self.forms.addDatePicker();
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: editCampaign
			 * -> conf object for editCampaign modal
			 */
			 editCampaign: {
				onLoad: function(obj, campaignId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editCampaignForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					self.forms.addDatePicker();
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/campaigns.php?action=campaign&id="+campaignId, function(data){
						self.forms.fillForm("#editCampaignForm", data.data);
					});
				}
			},
			/*
			 * object: addChoice
			 * -> conf object for addChoice modal
			 */
			addChoice: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addChoiceForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: editChoice
			 * -> conf object for editChoice modal
			 */
			 editChoice: {
				onLoad: function(obj, choiceId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editChoiceForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/choices.php?action=choice&id="+choiceId, function(data){
						self.forms.fillForm("#editChoiceForm", data.data);
					});
				}
			},
			/*
			 * object: addOptIns
			 * -> conf object for addOptIns modal
			 */
			addOptIns: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addOptInsForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: editOptIns
			 * -> conf object for editOptIns modal
			 */
			 editOptIns: {
				onLoad: function(obj, optInId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editOptInsForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/optIns.php?action=optIn&id="+optInId, function(data){
						self.forms.fillForm("#editOptInsForm", data.data);
					});
				}
			},
			/*
			 * object: addChoice
			 * -> conf object for addChoice modal
			 */
			addCoteSante: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addCoteSanteGroupForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");
					self.forms.allDropDowns();
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: editChoice
			 * -> conf object for editChoice modal
			 */
			 editCoteSante: {
				onLoad: function(obj, coteSanteId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					self.forms.allDropDowns();
					
					/* find elements */
					var formEl = $(obj.w).find("form#editCoteSanteGroupForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/coteSanteGroup.php?action=coteSanteGroup&id="+coteSanteId, function(data){
						self.forms.fillForm("#editCoteSanteGroupForm", data.data);
					});
					self.tables.coteSanteEnonceTable();
				}
			},
			/*
			 * object: addChoice
			 * -> conf object for addChoice modal
			 */
			addCoteSanteEnonce: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addCoteSanteEnonceForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");
					var coteSanteGroupId = $("#id").val();
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							$("#coteSanteGroupId").val(coteSanteGroupId);
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			/*
			 * object: editChoice
			 * -> conf object for editChoice modal
			 */
			 editCoteSanteEnonce: {
				onLoad: function(obj, enonceId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					self.forms.allDropDowns();
					
					/* find elements */
					var formEl = $(obj.w).find("form#editCoteSanteEnonceForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var coteSanteGroupId = $("#id").val();
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							$("#coteSanteGroupId").val(coteSanteGroupId);
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/coteSanteEnonce.php?action=coteSanteEnonce&id="+enonceId, function(data){
						self.forms.fillForm("#editCoteSanteEnonceForm", data.data);
					});
					self.tables.coteSanteEnonceTable();
				}
			},
			/*
			 * object: addSurvey
			 * -> conf object for addAdministrator modal
			 */
			addSurvey: {
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addSurveyForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					//self.surveys.addAnswerRow();
					self.forms.addDatePicker();
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
								
							} else {
								/* check if dates are not in conflict with another survey */
								var startDate = $(formEl).find("#surveyStartDate").val();
								var endDate = $(formEl).find("#surveyEndDate").val();
								$(formEl).find("#surveyStartDate").removeClass("invalid");
								$(formEl).find("#surveyEndDate").removeClass("invalid");
								
								$.getJSON("php/surveys.php?action=dateRange&startDate="+startDate+"&endDate="+endDate, function(data){
									if(data.error) {
										valid = false;
										$(formEl).find("#surveyStartDate").addClass("invalid");
										$(formEl).find("#surveyEndDate").addClass("invalid");
										self.forms.enableForm(formEl);
									}
								});
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* initialize questions table */
					self.forms.allDropDowns();
					self.tables.surveyQuestionsTable();
				}
			},
			/*
			 * object: addSurvey
			 * -> conf object for addAdministrator modal
			 */
			editSurvey: {

				onLoad: function(obj, surveyId){
					var self = Defisante;
					var formEl = $(obj.w).find("form#editSurveyForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					self.forms.addDatePicker();
					self.forms.fillDropdown(".campaigns");
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* check if dates are not in conflict with another survey */
								var startDate = $(formEl).find("#surveyStartDate").val();
								var endDate = $(formEl).find("#surveyEndDate").val();
								$(formEl).find("#surveyStartDate").removeClass("invalid");
								$(formEl).find("#surveyEndDate").removeClass("invalid");
								
								$.getJSON("php/surveys.php?action=dateRange&startDate="+startDate+"&endDate="+endDate+"&id="+surveyId, function(data){
									if(data.error) {
										valid = false;
										$(formEl).find("#surveyStartDate").addClass("invalid");
										$(formEl).find("#surveyEndDate").addClass("invalid");
										self.forms.enableForm(formEl);
									}
								});
							}
							return valid;
						},
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* fill form */
					$.getJSON("php/surveys.php?action=survey&id="+surveyId, function(data){
						data = data.data;
						self.forms.fillForm("#editSurveyForm", data, "survey");
					});
					
					/* set "add question" button click event */
					$("#surveyAddQuestionButton").click(function(){
						Defisante.modal.show('addQuestion?id='+surveyId);
					});
					
					/* initialize questions table */
					self.tables.surveyQuestionsTable(surveyId);
				}
			},
			
			/*
			 * object: viewSurvey
			 * -> conf object for addAdministrator modal
			 */
			viewSurvey: {

				onLoad: function(obj, surveyId){
					var self = Defisante;
					self.forms.addDatePicker();
					
					/* get survey results and display them */
					$.getJSON("php/surveys.php?action=surveyResults&id="+surveyId, function(data){
						$("#surveyName").html(data.name);
						$("#surveyStartDate").html(data.startDate);
						$("#surveyEndDate").html(data.endDate);
						var surveyResults = new Form("#surveyResultsContainer", data, "");
					});
				}
			},
			
			/*
			 * object: addQuestion
			 * conf object for addQuestion modal
			 */
			addQuestion: {
				
				onLoad: function(obj, surveyId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* set surveyId */
					$("#surveyQuestionSurveyId").val(surveyId);
					
					var formEl = $(obj.w).find("form#addSurveyQuestionForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					formEl.ajaxForm({
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
				}
			},
			/*
			 * object: editQuestion
			 * -> conf object for editQuestion modal
			 */
			editQuestion: {
				
				onLoad: function(obj, questionId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					var formEl = $(obj.w).find("form#editSurveyQuestionForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					formEl.ajaxForm({
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* fill form */
					$.getJSON("php/surveys.php?action=surveyQuestion&id="+questionId, function(data){
						data = data.data;
						self.forms.fillForm("#editSurveyQuestionForm", data, "surveyQuestion");
					});
				}
			},
			/*
			 * object: addAnswer
			 * -> conf object for addAnswer modal
			 */
			addAnswer: {
				
				onLoad: function(obj, questionId){
					var self = Defisante;
					
					var formEl = $(obj.w).find("form#addSurveyAnswerForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					formEl.ajaxForm({
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* set question id */
					formEl.find("#surveyAnswerQuestionId").val(questionId);
				}
			},
			/* 
			 * object: coteSanteEnonce
			 * -> conf object for coteSanteEnonce modal
			*/
			coteSanteEnonce: {
				
				/* handle the click event after the forgotPassword opened*/
				onLoad: function(obj){

					/* create Defisante object to inherit its data and functions*/
					var self = Defisante;
					var formEl = $(obj.w).find("form#enonceForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function() {
							return true;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							if(response.success){
								successEl.show();
								$("#enonceNoStarted").hide();
								$("#enonceStarted").show();
								window.location.reload(true);
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
								$("#enonceNoStarted").hide();
								$("#enonceStarted").show();
								window.location.reload(true);
							}

						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					self.coteSante.addEnonces();
				}
			},

			/*
			 * object: editAnswer
			 * -> conf object for editAnswer modal
			 */
			editAnswer: {
				
				onLoad: function(obj, answerId){
					var self = Defisante;
					
					var formEl = $(obj.w).find("form#editSurveyAnswerForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					formEl.ajaxForm({
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					
					/* fill form */
					$.getJSON("php/surveys.php?action=surveyAnswer&id="+answerId, function(data){
						data = data.data;
						self.forms.fillForm("#editSurveyAnswerForm", data, "surveyAnswer");
					});
				}
			},
			
			printConfirmation: {
				onLoad: function(obj) {
					var self = Defisante;
					var userId;
					var subscriptionDate;
					var objectives;
					var igaKitName;
					var igaKitAddress;
					
					/* get the information for printing */
					$.getJSON("php/users.php?action=getUserId", function(formData){
						userId = formData.userId;
						subscriptionDate = formData.subscriptionDate;
						objectives = formData.objectives;
						igaKitName = formData.igaKitName;
						igaKitAddress = formData.igaKitAddress;
					});
	
					/* get the igakit */
					var igaKit = "";
					if (igaKitName != "@") {
						var positionName = igaKitName.search("@");
						var positionAddress = igaKitAddress.search("@");
						igaKitName = igaKitName.substring(positionName + 1);
						igaKitAddress = igaKitAddress.substring(positionAddress + 1);
						igaKit = "<p><b>" + igaKitName + "<br/>" +igaKitAddress + "</b></p>";
						igaKit += self.langVars.printConfirmationKit;
						
					} else {
						igaKit = "";
					}

					/* add the full name */
					$(obj.w).find("#confirmationFullName").html($("#firstName").val()+ " " + $("#lastName").val());

					/* insert the objective */
					$.each(objectives, function(i, v){
						$(obj.w).find("#confirmationFirstList").append($("<li></li>").html(v.objectiveName));
					});

					/* Add IGA data */
					$(obj.w).find("#confirmationIGA").html(igaKit);
					
					/* Add confirmation number */
					var confirmationNumber = "DS2011-"+userId;
					$(obj.w).find("#confirmationNumber").html(confirmationNumber);

					/* Add subscription date */
					$(obj.w).find("#confirmationSubscriptionDate").html(subscriptionDate);

					$("#printConfirmation").jqprint();
				}
			},
			/*
			 * object: addMCSWeek
			 * -> conf object for addMCSWeek modal
			 */
			addMCSWeek: {
				
				onLoad: function(obj){
					var self = Defisante;
					var formEl = $(obj.w).find("form#addMCSWeekForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					var nameVal;
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							try {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							/* check if the week is not already in db */
							$.getJSON("php/mcs.php?action=checkMCSWeek&week="+$("#week").val(), function(data){
								if (data.week == 1) {
									if($.browser.msie) {
										$("#week").wrap($("<span></span>").addClass("invalid"));
										
									} else {
										$("#week").addClass("invalid");
									}
									valid= false;
								}
							});
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
																
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
							
							} catch(e) {
								alert(e);
								return false;
							}
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){
							
							formEl.hide();
							if(response.success){
								successEl.show();
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});	
				}
			},
			 /*
			 * object: editMCSWeek
			 * -> conf object for editMCSWeek modal
			 */
			 editMCSWeek: {
				onLoad: function(obj, adminId){

					/* create Defisante object to inherit its data and functions */
					var self = Defisante;
					
					/* find elements */
					var formEl = $(obj.w).find("form#editMCSWeekForm");
					var successEl = $(obj.w).find(".modalSuccess");
					var errorEl = $(obj.w).find(".modalError");	
					
					/* ajaxify form */
					formEl.ajaxForm({
						
						dataType: "json",
						
						/* check the form before the request has been sent */
						beforeSubmit: function(formData, formEl, options) {
							self.forms.disableForm(formEl);
							var valid = self.forms.validate(formEl);
							
							if(!valid) {
								self.forms.enableForm(formEl);
							
							} else {
								/* submit form */
								options.beforeSubmit = "";
								$(formEl).ajaxSubmit(options);
								return false;
							}
							return valid;
						},						
						
						/* display confirmation message when data has been received from the server successfully */
						success: function(response){	
							formEl.hide();
							if(response.success){
								successEl.show();
								
							} else if(response.error) {
								errorEl.append(response.error);
								errorEl.show();
								
							} else {
								successEl.show();
							}
						},
						
						/* display error message */
						error: function(){
							formEl.hide();
							errorEl.show();
						}
					});
					/* get data and fill form */
					$.getJSON("php/mcs.php?action=getMCSWeek&id="+adminId, function(data){
						self.forms.fillForm("#editMCSWeekForm", data.data);
					});
				}
			},
			login: {
				onLoad: function(obj) {
					var self = Defisante;
					self.users.loginForm();
				}
			}
		}
	},

	/*
	 * object: utils
	 * -> miscellaneous functions
	 */
	utils: {
		
		/*
		 * function: round
		 *
		 * -> round a number with a precision
		 */
		round: function(number, decimals) {
			var self = Defisante;
			var m = Math.pow(10, parseInt(decimals, 10));
			return Math.round(parseFloat(number)*m)/m;
		},
		
		/*
		 * function: getUrlVars
		 *
		 * -> retrieve url-style variable in a given url
		 */
		getUrlVars: function(url) {
			var self = Defisante;
			url = url.split("#")[0];
			var vars = {}, hash;
			var hashes = url.slice(url.indexOf("?") + 1).split("&");

			for(var i = 0; i < hashes.length; i++) {
				hash = hashes[i].split("=");
				vars[hash[0]] = decodeURIComponent(hash[1]).replace("+", " ");
			}
			return vars;
		},
		
		/*
		 * function: validateEmail
		 * -> check if an email has a valid syntax
		 */
		validateEmail: function(email) {
			var self = Defisante;
			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: sha256
		 *
		 * -> return the SHA256 hash of a string
		 */
		sha256: function(s){
			var chrsz   = 8;
			var hexcase = 0;
		 
			function safe_add (x, y) {
				var lsw = (x & 0xFFFF) + (y & 0xFFFF);
				var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
				return (msw << 16) | (lsw & 0xFFFF);
			}
		 
			function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
			function R (X, n) { return ( X >>> n ); }
			function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
			function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
			function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
			function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
			function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
			function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
		 
			function core_sha256 (m, l) {
				var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
				var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
				var W = new Array(64);
				var a, b, c, d, e, f, g, h, i, j, T1, T2;
		 
				m[l >> 5] |= 0x80 << (24 - l % 32);
				m[((l + 64 >> 9) << 4) + 15] = l;
		 
				for ( var i = 0; i<m.length; i+=16 ) {
					a = HASH[0]; b = HASH[1];
					c = HASH[2]; d = HASH[3];
					e = HASH[4]; f = HASH[5];
					g = HASH[6]; h = HASH[7];
		 
					for ( var j = 0; j<64; j++) {
						if (j < 16) W[j] = m[j + i];
						else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
		 
						T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
						T2 = safe_add(Sigma0256(a), Maj(a, b, c));
		 
						h = g; g = f; f = e;
						e = safe_add(d, T1);
						d = c; c = b; b = a;
						a = safe_add(T1, T2);
					}
		 
					HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]);
					HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]);
					HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]);
					HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
				}
				return HASH;
			}
		 
			function str2binb (str) {
				var bin = Array();
				var mask = (1 << chrsz) - 1;
				
				for(var i = 0; i < str.length * chrsz; i += chrsz) {
					bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
				}
				return bin;
			}
		 
			function Utf8Encode(string) {
				string = string.replace(/\r\n/g,"\n");
				var utftext = "";
		 
				for (var n = 0; n < string.length; n++) {
					var c = string.charCodeAt(n);
		 
					if (c < 128) {
						utftext += String.fromCharCode(c);
						
					} else if((c > 127) && (c < 2048)) {
						utftext += String.fromCharCode((c >> 6) | 192);
						utftext += String.fromCharCode((c & 63) | 128);
						
					} else {
						utftext += String.fromCharCode((c >> 12) | 224);
						utftext += String.fromCharCode(((c >> 6) & 63) | 128);
						utftext += String.fromCharCode((c & 63) | 128);
					}
				}
				return utftext;
			}
		 
			function binb2hex (binarray) {
				var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
				var str = "";
				for(var i = 0; i < binarray.length * 4; i++) {
					str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
					hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
				}
				return str;
			}
			s = Utf8Encode(s);
			return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
		},
		
		/*
		 * function: camelize
		 * -> return the camelized form of a string (first letter uppercase)
		 */
		camelize: function(string) {
			var self = Defisante;
			return string?string.substr(0, 1).toUpperCase()+string.substr(1):string;
		},
		
		/*
		 * function: uncamelize
		 * -> return the uncamelized form of a string (first letter lowercase)
		 */
		uncamelize: function(string) {
			var self = Defisante;
			return string?string.substr(0, 1).toLowerCase()+string.substr(1):string;
		},
		
		/*
		 * function: copyObj
		 *
		 * -> return an object copy
		 */
		copyObj: function(objOrig) {
			var self = Defisante;
			var newObj = (this instanceof Array) ? [] : {};
			
			for (i in objOrig) {
				
				if (objOrig[i] && typeof objOrig[i] == "object") {
					newObj[i] = self.utils.copyObj(objOrig[i]);
					
				} else { newObj[i] = objOrig[i]; }
			} 
			return newObj;
		},
		
		/*
		 * function: stripTags
		 * -> remove html/php tags from a string
		 */
		stripTags: function(str, allowed_tags) {
			var self = Defisante;
		    var key = "", allowed = false;
		    var matches = [];
		    var allowed_array = [];
		    var allowed_tag = "";
		    var i = 0;
		    var k = "";
		    var html = "";

		    var replacer = function (search, replace, str) {
		        return str.split(search).join(replace);
		    };

		    if (allowed_tags) {
		        allowed_array = allowed_tags.match(/([a-zA-Z0-9]+)/gi);
		    }
		    str += '';
		    matches = str.match(/(<\/?[\S][^>]*>)/gi);

		    for (key in matches) {
		        if (isNaN(key)) {
		            continue;
		        }

		        html = matches[key].toString();
		        allowed = false;

		        for (k in allowed_array) {
		            allowed_tag = allowed_array[k];
		            i = -1;

		            if (i != 0) { i = html.toLowerCase().indexOf("<"+allowed_tag+">");}
		            if (i != 0) { i = html.toLowerCase().indexOf("<"+allowed_tag+" ");}
		            if (i != 0) { i = html.toLowerCase().indexOf("</"+allowed_tag);}

		            if (i == 0) {
		                allowed = true;
		                break;
		            }
		        }
		        if (!allowed) {str = replacer(html, "", str);}
		    }
		    return str;
		},
		
		/*
		 * function: validatePostalCode
		 * - > check if a string syntax match a postal code syntax
		 */
		validatePostalCode: function(value) {
			var self = Defisante;
			return value.match(/^[a-zA-Z][0-9][a-zA-Z](-| )?[0-9][a-zA-Z][0-9]$/);
		},
		

		/*
		 * function: addTotal
		 * -> 
		 */	
		addTotal: function(tableId, ids, beforeElId) {
			var self = Defisante;
			var total = 0;
			var totalPercent = parseFloat(0);
			$(tableId+" tbody").find("tr").find("td:first").each(function(){
				
				if(ids) {
					if($.inArray($(this).text(), ids) != -1) {
						total += parseInt($(this).next().next().text(), 10);
						totalPercent += parseFloat($(this).next().next().next().text().replace(",", "."));
					}
					
				} else {
					total += parseInt($(this).next().next().text(), 10);
					totalPercent += parseFloat($(this).next().next().next().text().replace(",", "."));
				}
			});
			totalPercent = self.utils.round(totalPercent, 2);
			
			var trEl = $("<tr></tr>").append("<td>&nbsp;</td>")
						.append("<td>&nbsp;</td>")
						.append("<td style=\"padding:2px 0px;\"><span style=\"display:block;border-top:1px solid black;\">"+total.toString()+"</span></td>")
						.append("<td style=\"padding:2px 0px;\"><span style=\"display:block;border-top:1px solid black;\">"+totalPercent+"</span></td>");
			
			if(beforeElId) {
				$(beforeElId).parents("tr:first").before(trEl);
				
			} else {
				$(tableId+" tbody").append(trEl);
			}
		}
	},
	
	/*
	 * object: forms
	 * -> forms related functions
	 */
	forms: {
		
		/*
		 * function: disableForm
		 * -> disable a form by displaying a modal over it
		 */
		disableForm: function(formEl) {
			formEl = $(formEl);
			
			if(formEl.get(0)) {
				
				/* append a modal over the form */
				var modalEl = $("<div>&nbsp;</div>").css({
					position: "absolute",
					top:	formEl.position().top,
					left:	formEl.position().left,
					width:	formEl.width()+"px",
					height:	formEl.height()+"px",
					backgroundColor: "#FFFFFF",
					opacity: ".3",
					filter:	"alpha(opacity=30)"
						
				}).addClass("formModal").insertAfter(formEl);
				formEl.get(0).modal = modalEl;
			}
		},
		
		/*
		 * function: enableForm
		 * -> enable a form by removing the modal over it
		 */
		enableForm: function(formEl) {
			$(".formModal").remove();
		},
		
		/*
		 * function: fillDropdown
		 * -> fill a dropdown (select element) with information from database
		 *    regarding the class attributed to it
		 */
		fillDropdown: function(className) {
			var self = Defisante;
			/* find select with this class name */
			if($(className).get(0)) {
				
				/* set resources */
				var resource = {
					cellPhoneProvider: "php/users.php?action=cellPhoneProvider",
					employers: "php/employers.php?action=employers",
					years: "php/users.php?action=years",
					couponType: "php/users.php?action=couponType",
					ages: "php/users.php?action=ages",
					cities: "php/users.php?action=cities",
					csss: "php/users.php?action=csss",
					dsps: "php/users.php?action=dsps",
					surveys: "php/surveys.php?action=surveys",
					campaigns: "php/campaigns.php?action=allCampaigns",
					campaignsStrict: "php/campaigns.php?action=allCampaigns",
					objectiveGroups: "php/objectiveGroups.php?action=objectiveGroups"
				};
				
				/* set callback */
				var callback = function(data) {
					data = data.data;
					var selectContent = "";
					
					if(className.replace(".","") != "campaignsStrict") {
						selectContent += "<option value=\"\">"+self.langVars.chooseOneLabel+"</option>\n";
					}
					$.each(data, function(i,v){
						
						/* element is an <optgroup/> element */
						if(v.value) {
							selectContent += "<optgroup label=\""+v.name+"\">\n";
							$.each(v.value, function(x,y){
								selectContent += "<option value=\""+y.id+"\">"+y.name+"</option>\n";
							});
							selectContent += "</optgroup>\n";
						
						/* element is an <option/> element */
						} else {
							selectContent += "<option value=\""+v.id+"\">"+v.name+"</option>\n";
						}
					});
					
					/* add content to <select/> element */
					$("select"+className).each(function(){
						if(($(this).val() === "" || !$(this).val()) && this.options.length < 2) {
							$(this).empty().html(selectContent);
						}
					});
				};

				$.getJSON(resource[className.replace(".","")], callback);
				return true;
			}
		},
		
		/* 
		 * function: fillForm
		 * -> fill a form with data
		 */
		fillForm: function(formId, data, prefix) {
			var self = Defisante;
			
			$.each(data, function(n,v){
				v = (!v || v.toString() == "null")?"":v;
				n = prefix?prefix+self.utils.camelize(n):n;
				
				if($(formId).find("#"+n).get(0)) {
					var el = $(formId).find("#"+n);

					if(el.is("input[type='checkbox'], input[type='radio']")) {
						el.attr("checked", (parseInt(v, 10)==1?true:false));
					
					} else if(el.is("input, select")) {
						try {
							el.val(v);
						} catch(e){}
						
					} else if(el.is("textarea")) {
						try {
							el.val(v);
							el.html(v);
						} catch(e){}
					}
				
				/* name case - only for radios */
				} else if($(formId).find("[name='"+n+"']").get(0) && $(formId).find("[name='"+n+"']").is("[type='radio']")) {
					var els = $(formId).find("[name='"+n+"']");
					
					els.each(function(){
						
						if($(this).val() == v) {
							$(this).click();
						}
					});
				}
			});
		},
		
		/*
		 * function: validate
		 * -> validate a form
		 */
		validate: function(formEl) {
			var self = Defisante;
			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;
					}
				}
			});
			
			/* validate data in datepickers if there is data */
			$(formEl).find("input.dp-applied").each(function(){
				
				if($(this).val() !== "" && $(this).val()) {

					if($(this).val().search(/^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])$/i) == -1) {
						$(this).addClass("invalid");
						valid = false;
					}

				}
			});
			
			/* email fields should be valid email addresses */
			$(formEl).find(".email").each(function(){
				
				if($(this).val() === "" || !$(this).val() || !self.utils.validateEmail($(this).val())) {
					$(this).addClass("invalid");
					valid = false;
				}
			});
			
			$(formEl).find(".optionalEmail").each(function(){
				
				if($(this).val() !== "" && $(this).val() && !self.utils.validateEmail($(this).val())) {
					$(this).addClass("invalid");
					valid = false;
				}
			});
			
			$(formEl).find(".phoneNumber").each(function(){
				
				if($(this).val() !== "" ) {
					if($(this).val().search(/^[0-9]/i) == -1) {
						$(this).addClass("invalid");
						valid = false;
					}
				}
			});
			
			/* group of checkboxes where at least one checkbox has to be checked */
			$(formEl).find(".requireOne").each(function(){
				var elName = $(this).attr("name");
				var oneChecked = false;
				
				$("input[name='"+elName+"']").each(function(){
					if($(this).is(":checked")) {
						oneChecked = true;
					}
				})

				if(!oneChecked) {
					$("input[name='"+elName+"']").each(function(){
						if(!$(this).parent().is(".invalid")) {
							$(this).wrap($("<span></span>").addClass("invalid"));
						}
					});
					valid = false;
				}
			});
			
			/* hide error messages that are not relevant anymore */
			$("span.myDataErrorMessage").hide();
			
			/* display error messages near inputs if they exist */
			$(".invalid").each(function(){
				var inputEl;
				
				if($(this).find("input[type='radio']").get(0) || $(this).find("input[type='checkbox']").get(0)) {
					inputEl = $(this).parent().find("label:last");
				
				} else {
					inputEl = $(this).parent().find(".invalid:last");
				}

				var dimensions = inputEl.offset();
				dimensions.width = inputEl.width();
				
				$(this).parent().find("span.myDataErrorMessage").each(function(){
					
					$(this).css({
						"position": "absolute",
						"top": (parseInt(dimensions.top, 10)-10).toString()+"px",
						"left": (parseInt(dimensions.left, 10) + parseInt(dimensions.width, 10) + 10).toString()+"px"
					}).show();
					
				});
			});
			
			
			
			/* if valid, process to submit; else abort */
			if(!valid) {
				$.scrollTo($(".invalid:first"), 500);
			}
			
			return valid;
		},
		
		/*
		 * function: confirmEmail
		 * -> do a email match validation
		 */
		confirmEmail: function(emailEl, emailConfirmEl) {
			var self = Defisante;
			
			if (emailEl.val() != emailConfirmEl.val()) {
				emailConfirmEl.addClass("invalid");
				return false;
				
			} else {
				return true;
			}
		},
		
		/*
		 * function: confirmPassword
		 * -> do a password match validation
		 */
		confirmPassword: function(passwordEl, passwordConfirmEl) {
			var self = Defisante;
			
			/* password field should match password confirmation field */
			if (passwordEl.val() != passwordConfirmEl.val()) {
				passwordConfirmEl.addClass("invalid");
				
				/* show the error message*/
				var dimensions = passwordConfirmEl.offset();
				dimensions.width = passwordConfirmEl.width();
				passwordConfirmEl.parent().find("span.myDataErrorMessage").each(function(){	
					$(this).css({
						"position": "absolute",
						"top": (parseInt(dimensions.top, 10)-10).toString()+"px",
						"left": (parseInt(dimensions.left, 10) + parseInt(dimensions.width, 10) + 10).toString()+"px"
					}).show();
					
				});
				
				return false;
			
			/* passsword cannot be less than 6 characters long */
			} else if(passwordEl.val().length < 6) {
				passwordEl.addClass("invalid");
				return false;
				
			} else {
				return true;
			}
		},
		
		/*
		 * function: validatePostalCode
		 * -> validate a postal code
		 */
		validatePostalCode: function(postalCodeEls){
			var self = Defisante;
			var pattern = /^[a-zA-Z][0-9][a-zA-Z][0-9][a-zA-Z][0-9]$/gi;
			var postalCode = "";
			
			postalCodeEls.each(function(){
				postalCode += $(this).val();
			});

			if(!postalCode || postalCode === "" || postalCode.search(pattern) == -1){
				postalCodeEls.addClass("invalid");
				return false;
			
			} else {
				return true;
			}
		},
		
		
		validateProvince: function(postalCode, province){
			var valid = true;
			if(province == "QC") {
				$.getJSON("php/users.php?action=inQuebec&zipcode="+postalCode, function(data){
					
					if(data.inQuebec != "true") {
						valid = false;
						if($.browser.msie) {
							$("#province").wrap($("<span></span>").addClass("invalid"));
							
						} else {
							$("#province").addClass("invalid");
						}
					}
				});
			
			}
			return valid;
		},
		
		/*
		 * function: allDropDowns
		 * -> fill all known dropdowns
		 */
		allDropDowns: function(){
			var self = Defisante;
			self.forms.fillDropdown(".cellPhoneProvider");
			self.forms.fillDropdown(".employers");
			self.forms.fillDropdown(".years");
			self.forms.fillDropdown(".ages");
			self.forms.fillDropdown(".cities");
			self.forms.fillDropdown(".csss");
			self.forms.fillDropdown(".dsps");
			self.forms.fillDropdown(".surveys");
			self.forms.fillDropdown(".couponType");
			self.forms.fillDropdown(".campaigns");
			self.forms.fillDropdown(".campaignsStrict");
			self.forms.fillDropdown(".objectiveGroups");
		},
		
		/*
		 * function: addDatePicker
		 * -> add a date picker (calendar) to an input allowing to choose a date
		 */
		addDatePicker: function() {
			var self = Defisante;
			
			if($(".datepicker").get(0)) {
				$.getScript("js/jquery/jquery.datePicker.js");
				$.getScript("js/ds2010/date.prototype.js");
				Date.format = 'yyyy-mm-dd';
				
				$(".datepicker").datePicker({startDate:'2010-01-01', horizontalPosition:$.dpConst.POS_RIGHT});
			}
		}
	},
	
	/*
	 * object: draw
	 * -> draw related functions
	 */
	draw: {
		initDraw: function(){
			var self = Defisante;
			
			if($("#drawForm").get(0)) {
				
				/* display extra coupons field onclick */
				$("#couponType").hide();
				$("#coupon").click(function(){
					if ($("#coupon").is(":checked")) {
						$("#couponType").show();
						
					} else {
						$("#couponType").hide();
						$("#couponTypeId").val("");	
					}
				});
				
				/* display extra desjardins inputs on click */
				$("#eType").hide();
				$("#desjardins").click(function(){
					if ($("#desjardins").is(":checked")) {
						$("#eType").show();
						
					} else {
						$("#eType").hide();
						$("#employeeType").val("");
					}
						
				});
				
				/* initialize draw form */
				$("#drawForm").ajaxForm({
					dataType: "json",
					beforeSubmit: function(formData, formEl, options) {
						var self = Defisante;			
						var valid = self.forms.validate(formEl);
						
						/* form doesn't validate, re-enable form */
						if(!valid) {
							$.scrollTo($(".invalid:first"), 500);
							return false;
						
						}
					},
					success:function(data){
						if(data.error) {
							self.modal.error(self.langVars.genericErrorTitle, self.langVars.genericErrorMessage, function(){}, function(){});
						
						} else {
							$("#drawResultTable").get(0).reloadData();
						}
						
					}, 
					error: self.users.loginError
				});
			}
		}
	},
	/*
	 * object: reports
	 * -> reports related functions
	 */
	reports: {
		/*
		 * method: initReports
		 * -> initialize "Reports" tab in /admin/statistics
		 */
		initReports: function() {
			var self = Defisante;
			
			if($("#statisticsReports").get(0)){
				
				/* regarding report type, enable/disable extra inputs */
				$("#reportType").change(function(){
					
					switch ($("#reportType").val()) {
						case "0":
							$("#groupRegionIdReport, #groupCsssIdReport, #reportCampagnes").attr("disabled", true);
							break;
							
						case "1":
							$("#groupRegionIdReport, #reportCampagnes").removeAttr("disabled");
							$("#groupCsssIdReport").attr("disabled", true);
							break;
							
						case "2":
							$("#groupRegionIdReport").attr("disabled", true);
							$("#groupCsssIdReport, #reportCampagnes").removeAttr("disabled");
							break;
					}
						
				});
			}
		},
		
		/*
		 * function: pdf
		 * -> allows to export statistics as PDF reports
		 */		
		pdf: function(){
			var self = Defisante;
			var valid = 1;
			var exportUrl = "";
			
			/* build the export URL with all criterias */
			var buildUrl = function(exportUrl) {
				var fromDate = $("#groupFromDateReport").val();
				var toDate = $("#groupToDateReport").val();
				var campagneId = $("#reportCampagnes").val();
				
				exportUrl += (fromDate && fromDate !== "")?("&fromDate="+fromDate):"";
				exportUrl += (toDate && toDate !== "")?("&toDate="+toDate):"";
				exportUrl += (campagneId && campagneId !== "")?("&campagneId="+campagneId):"";
				
				return exportUrl;
			};
			
			/* set an element as invalid */
			var invalid = function(el) {
				el.wrap($("<span></span>").addClass("invalid"));
			};
			
			switch ($("#reportType").val()) {
			
				/* provincial report */
				case "0" :
					var campagneId = $("#reportCampagnes").val();
					exportUrl = "php/reports.php?action=provincial"+((campagneId && campagneId !== "")?"&campagneId="+campagneId:"");
					break;
				
				/* DSP report */
				case "1" :
					var regionIdEl = $("#groupRegionIdReport");
					
					if (regionIdEl.val() === "") {
						invalid(regionIdEl);
						
					} else {
						exportUrl = buildUrl("php/reports.php?action=dsp&dspId="+regionIdEl.val());
					}
					break;
					
				/* CSSS report */
				case "2" :
					var csssIdEl = $("#groupCsssIdReport");
					
					if (csssIdEl.val() === "") {
						invalid(csssIdEl);
						
					} else {
						exportUrl = buildUrl("php/reports.php?action=csss&csssId="+csssIdEl.val());
					}
					break;
			}
			
			/* redirect to the PDF report */
			if (exportUrl !== "") {
				$("#workingIndicator").show();
				top.location = exportUrl;
			}	
		}
	},
	
	/*
	 * object: teams
	 * -> teams related functions
	 */
	teams: {
		
		/*
		 * method: initMyTeams
		 * -> initialize /myTeams page
		 */
		initMyTeams: function(){
			var self = Defisante;
			if($("#teamsContainer").get(0)) {
				self.teams.displayTeams();
				$.getJSON("php/users.php?action=checkDateRange", function(data){
					if (data.validDate == "0") {
						$("#addTeamButton, [id^=\"deleteTeamButton\"], [id^=\"addTeamMemberButton\"], [id^=\"deleteTeamMemberButton\"]").remove();
					}
				});
			}
		},
		/*
		 * function: displayTeams
		 * -> display teams for the current user
		 */
		displayTeams: function() {
			var self = Defisante;
			
			/* get teams */
			$.getJSON("php/teams.php?action=teams", function(data){
				
				if(data.data) {
					var teams = data.data;
					var containerEl = $("#teamsContainer");
					containerEl.empty();
					
					/* create a table per team */
					$.each(teams, function(i, team){
						
						var id = team.id?team.id:i.toString();
						
						/* container */
						var divEl = $("<div class=\"team\"></div>").appendTo(containerEl);
						
						/* tables */
						var buttonDeleteTeam = "";
						if(team.creatorId == team.userId) {
							buttonDeleteTeam = " <input type=\"button\" id=\"deleteTeamButton"+id+"\" class=\"submit\" onclick=\"javascript:Defisante.teams.deleteTeam('"+id+"')\" value=\"" + self.langVars.deleteTeamLabel +"\">";
						}
						var tableEl = $("<table id=\"teamTable_"+id+"\" cellspacing=\"0\">").appendTo(divEl);
						tableEl.append("<caption>"+team.name+buttonDeleteTeam+"</caption>")
							.append("<thead></thead>")
							.append("<tfoot></tfoot>")
							.append("<tbody></tbody>");
						
						/* buttons */
						var controlsEl = $("<div class=\"controls\"></div>").appendTo(divEl);
						
						/* Add controls for family chief */
						if(team.creatorId == team.userId) {
							
							$("<a></a>").attr("id","addTeamMemberButton"+id).attr("href", "javascript:Defisante.modal.show('addTeamMember?id="+id+"');")
								.css("float", "left")
								.css("text-decoration", "none")
								.appendTo(controlsEl).append(
									$("<img/>").attr("alt", self.langVars.addTeamMemberButton)
										.attr("src", "img/AjouterMembre"+(self.language=="en"?"EN":"FR")+".jpg")
								);
							
							
							$("<a></a>").attr("href", "javascript:Defisante.teams.deleteTeamMembers('"+id+"');")
								.attr("id","deleteTeamMemberButton"+id)
								.css("float", "right")
								.css("text-decoration", "none")
								.appendTo(controlsEl).append(
									$("<img/>").attr("alt", self.langVars.DeleteTeamMemberButton)
										.attr("src", "img/SupprimerMembre"+(self.language=="en"?"EN":"FR")+".jpg")
								);
							
						} else {
							tableEl.addClass("readonly");
						}
						/* separator */
						$("<hr/>").insertAfter(controlsEl);
						
						/* apply dataTable prototype */
						self.tables.teamTable(id);
					});
				}
			});
		},

		/*
		 * function: displayPendingTeams
		 * -> display Pending teams for the current user
		 */
		displayPendingTeams: function() {
			var self = Defisante;
			
			/* check if user is logged in */
			if($("#pendingTeamsContainer").get(0)) {
				$.getJSON("php/users.php?action=userStatus", function(data){
					
					/* user is not logged in, display login modal */
					if(data.status != "logged") {
						$("#addTeamButton").hide();
						self.modal.show("login");
						
					}
				});
				/* get teams */
				$.getJSON("php/teams.php?action=pendingTeams", function(data){
					
					if(data.data) {
						var teams = data.data;
						var containerEl = $("#pendingTeamsContainer");
						containerEl.empty();
						
						/* create a table per team */
						$.each(teams, function(i, team){
							
							var id = team.id?team.id:i.toString();
							
							/* container */
							var divEl = $("<div class=\"team\"></div>").appendTo(containerEl);
							
							/* tables */
							var tableEl = $("<table id=\"pendingTeamTable_"+id+"\" cellspacing=\"0\">").appendTo(divEl);
							tableEl.append("<caption>"+team.name+"</caption>")
								.append("<thead></thead>")
								.append("<tfoot></tfoot>")
								.append("<tbody></tbody>");
							
							/* buttons */
							var controlsEl = $("<div class=\"controls\"></div>").prependTo(divEl);
							
							var pEl = $("<p></p>").appendTo(controlsEl).html(self.langVars.membershipMessage+"&nbsp;");
							
							$("<a></a>").attr("href", "javascript:Defisante.teams.acceptMembership('"+id+"');")
								.css("float", "none")
								.appendTo(pEl).html(self.langVars.acceptMembershipLabel);
							
							$("<span></span>").appendTo(pEl).html("&nbsp;"+self.langVars.or+"&nbsp;");
							
							$("<a></a>").attr("href", "javascript:Defisante.teams.refuseMembership('"+id+"');")
								.css("float", "none")
								.appendTo(pEl).html(self.langVars.refuseMembershipLabel);
							
							tableEl.addClass("readonly");
								
							/* separator */
							$("<hr/>").appendTo(divEl);
							
							/* apply dataTable prototype */
							self.tables.pendingTeamTable(id);
						});
					}
				});
			}
		},

		/*
		 * function: deleteTeam
		 * -> allow to delete a team
		 */
		deleteTeam: function(teamId){
			var self = Defisante;
			
			/* open confirmation modal */
			self.modal.confirm(self.langVars.confirmTeamDeletionMessage, function(){
				$.ajax({
					url: "php/teams.php?action=deleteTeam&teamId="+teamId,
					type: "delete",
					async: true,
					dataType: "json",
					success: function(data) {
						if(data.error) {
							self.modal.error(self.langVars.genericErrorTitle, data.error);
						
						} else {
							self.modal.alert(self.langVars.deleteTeamMessage, self.langVars.deleteTeamMessage);
							self.teams.displayTeams();
						}

					}
				});
			}, function(){});
			return;
		},
		
		/*
		 * function: deleteTeamMembers
		 * -> allow to delete team members
		 */
		deleteTeamMembers: function(teamId){
			var self = Defisante;
			
			if(!$("#teamTable_"+teamId).find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(self.langVars.confirmMembersDeletionMessage, function(){
				var memberIds = [];
				
				/* gather team members */
				$("#teamTable_"+teamId).find(":checked").each(function(){
					memberIds.push($(this).val());
				});
				
				memberIds = memberIds.join(",");
				$.ajax({
					url: "php/teams.php?action=deleteMembers&teamId="+teamId+"&ids="+memberIds,
					type: "delete",
					async: true,
					dataType: "json",
					success: function(data) {
					
						if(data.error) {
							self.modal.error(self.langVars.genericErrorTitle, data.error);
						
						} else {
							self.modal.alert(self.langVars.deleteMemberMessage, "");
							self.teams.displayTeams();
						}
					}
				});
			}, function(){});
			return;
		},
		
		/*
		 * function: acceptMembership
		 * -> allow to accept a team invitation
		 */
		acceptMembership: function(id) {
			var self = Defisante;

			$.post("php/teams.php?action=acceptMembership&id="+id, function(data){
				if(data.error) {
					self.modal.error(self.langVars.genericErrorTitle, data.error);
				}
				self.teams.displayTeams();
				self.teams.displayPendingTeams();
			}, "json");
		},
		
		/*
		 * function: refuseMembership
		 * -> allow to refuse a team invitation
		 */
		refuseMembership: function(id) {
			var self = Defisante;
			
			$.post("php/teams.php?action=refuseMembership&id="+id, function(data){
				if(data.error) {
					self.modal.error(self.langVars.genericErrorTitle, data.error);
				}
				self.teams.displayTeams();
				self.teams.displayPendingTeams();
			}, "json");
		}
	},
	
	/*
	 * object: families
	 * -> families related functions
	 */
	families: {
		
		/*
		 * method: initMyFamily
		 * -> initialize /myFamily page
		 */
		initMyFamily: function(){
			var self = Defisante;
			if($("#familyTable").get(0)) {
				self.families.displayFamily();
				
				$.getJSON("php/users.php?action=checkDateRange", function(data){
					if (data.validDate == "0") {
						$("#addFamilyButton, #deleteFamilyButton, #addFamilyMemberButton, #deleteFamilyMemberButton").remove();
					}
				});

			}
			
		},
		
		/*
		 * function: displayFamily
		 * -> display family for the current user
		 */
		displayFamily: function(){
			var self = Defisante;
			
			$.getJSON("php/families.php?action=family", function(data){
				var familyTableEl = $("#familyTable");
				var addFamilyButtonParentEl = $("#addFamilyButton").parent();
				
				if(data.name) {
					
					addFamilyButtonParentEl.hide();
					
					/* hide controls when user is not chief */
					if(data.creatorId != data.userId) {
						familyTableEl.parent().find(".controls").hide();
						familyTableEl.addClass("readonly");
					}
					var buttonDeleteFamily = "";
					if(data.creatorId == data.userId) {
						buttonDeleteFamily = " <input type=\"button\" id=\"deleteFamilyButton\" class=\"submit\" onclick=\"Defisante.families.deleteFamily()\" value=\"" + self.langVars.deleteFamilyLabel + "\">";
					}
					familyTableEl.each(function(){this.reloadData();});
					familyTableEl.parent().show();
					familyTableEl.find("caption").html(data.name+buttonDeleteFamily);
					
				} else {
					addFamilyButtonParentEl.show();
					familyTableEl.parent().hide();
				}
			});
		},
		
		/*
		 * function: deleteFamily
		 * -> allow to delete a Family
		 */
		deleteFamily: function(){
			var self = Defisante;
			
			/* open confirmation modal */
			self.modal.confirm(self.langVars.confirmFamilyDeletionMessage, function(){
				$.ajax({
					url: "php/families.php?action=deleteFamily",
					type: "delete",
					async: true,
					dataType: "json",
					success: function(data) {
					
						if(data.error) {
							self.modal.error(self.langVars.genericErrorTitle, data.error);
						
						} else {
							self.modal.alert(self.langVars.deleteFamilyMessage, self.langVars.deleteFamilyMessage);
							self.families.displayFamily();
						}
					}
				});
			}, function(){});
			return;
		},
		

		/*
		 * function: deleteFamilyMembers
		 * -> allow to delete family members
		 */
		deleteFamilyMembers: function(){
			var self = Defisante;
			
			if(!$("#familyTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(self.langVars.confirmMembersDeletionMessage, function(){
				var memberIds = [];
				
				/* gather team members */
				$("#familyTable").find(":checked").each(function(){
					memberIds.push($(this).val());
				});
				
				$.ajax({
					url: "php/families.php?action=deleteMembers&ids="+memberIds.join(","),
					type: "delete",
					async: true,
					dataType: "json",
					success: function(data) {
					
						if(data.error) {
							self.modal.error(self.langVars.genericErrorTitle, data.error);
						
						} else {
							self.modal.alert(self.langVars.deleteMemberMessage, "");
							self.families.displayFamily();
						}
					}
				});
			}, function(){});
		}
	},
	/*
	 * object: coteSante
	 * -> "cote santé" related functions
	 */
	coteSante: {
		
		
		exportCsvCoteSante: function(){
			var self = Defisante;
			var statisticsCoteSanteCampagnes = $('#statisticsCoteSanteCampagnes').val();
			$("#csvExport").attr("src","php/coteSanteEnonce.php?action=statistics&csv=1&campagneId="+statisticsCoteSanteCampagnes);
		},
		/*
		 * method: statisticsCoteSante
		 * -> display "cote santé" statistics in /admin/statistics
		 */
		statisticsCoteSante: function(){
			var self = Defisante;
			
			if($("#statisticsCoteSanteNumberOfFamilyChiefs").get(0)) {
				
				var statisticsCoteSanteCampagnes = $('#statisticsCoteSanteCampagnes').val();
				/* get cote santé statistics */
				$.getJSON("php/coteSanteEnonce.php?action=statistics&campagneId="+statisticsCoteSanteCampagnes, function(data){
					
					/* update number of family chiefs who filled cote sante evaluation */
					$("#statisticsCoteSanteNumberOfFamilyChiefs").find("td:last").html(data.numberOfChiefs);
					
					/* update average cote santé for those who filled the cote santé evaluation */
					$("#statisticsCoteSanteAverage").find("td:last").html(data.average);
					
					/* clear old table data */
					$("#statisticsEnonceTable").find("tbody").empty();
					
					/* set nameFr */
					var nameFr = "";
					
					/* add selected enonces */
					$.each(data.enonces, function(i, row){
						
						if(nameFr != row.nameFr) {
							nameFr = row.nameFr;
							$("<tr><td colspan=\"5\"><strong>"+nameFr+"</strong></td></tr>").appendTo($("#statisticsEnonceTable"));
						}
						
						var trEl = $("<tr></tr>").appendTo($("#statisticsEnonceTable"));
						var checkedPercentage = Math.round((parseInt(row.checked) / parseInt(data.numberOfChiefs))*10000)/100;
						var uncheckedPercentage = Math.round((parseInt(row.unchecked) / parseInt(data.numberOfChiefs))*10000)/100;
						trEl.append(
							$("<td></td>").html(row.enonceFr)
						).append(
							$("<td></td>").html(row.checked)
						).append(
							$("<td></td>").html(checkedPercentage)
						).append(
							$("<td></td>").html(row.unchecked)
						).append(
							$("<td></td>").html(uncheckedPercentage)
						);
					});
					
					/* clear old table data */
					$("#statisticsStrategiesTable").find("tbody").empty();
					
					/* set nameFr */
					nameFr = "";
					
					/* add not selected strategies */
					$.each(data.strategies, function(i, row){

						if(nameFr != row.nameFr) {
							nameFr = row.nameFr;
							$("<tr><td colspan=\"5\"><strong>"+nameFr+"</strong></td></tr>").appendTo($("#statisticsStrategiesTable"));
						}
						var trEl = $("<tr></tr>").appendTo($("#statisticsStrategiesTable"));
						var checkedPercentage = Math.round((parseInt(row.checked) / parseInt(data.numberOfChiefs))*10000)/100;
						var uncheckedPercentage = Math.round((parseInt(row.unchecked) / parseInt(data.numberOfChiefs))*10000)/100;
						trEl.append(
							$("<td></td>").html(row.enonceFr)
						).append(
							$("<td></td>").html(row.checked)
						).append(
							$("<td></td>").html(checkedPercentage)
						).append(
							$("<td></td>").html(row.unchecked)
						).append(
							$("<td></td>").html(uncheckedPercentage)
						);
					});
				});
			}
		},
		
		/*
		 * method: initEnonces
		 * -> initialize table display in /coteSante
		 */
		initEnonces: function() {
			var self = Defisante;
			if($("#enonceStarted").get(0)) {
				
				self.coteSante.addEnoncesSelected();
				self.coteSante.addEnoncesNotSelected();
				
				/* Add tooltips */
				$.getScript("js/jquery/jquery.simpletip.js", function(){
					$(".enonceTooltip").each(function(){
						var el = this;
						$(el).simpletip({ 
						    content: $(el).next().html(),
						    persistent: true,
						    persistentClass: "tooltipClear",
						    onBeforeShow: function(){
								$(this.getTooltip()).appendTo($(el).parent());
								$(el).children(":last").prev().appendTo($(el));
							},
						    onShow: function(){
								$(el).css("font-weight", "bold");
							},
							onHide: function(){
								$(el).css("font-weight", "");
							}
						});
					});
				});
				
				/* fill the form with the enonces selected*/
				$.getJSON("php/coteSanteEnonce.php?action=strategies", function(data){
					$.each(data.data, function(i, enonce){
						$("#enonce"+enonce.enonceId).attr('checked', true);
					});
				});
				self.coteSante.updateTableEnonce();
				
				var formEl = $("#enonceForm");
				
				/* ajaxify form */
				formEl.ajaxForm({
					
					dataType: "json",
					
					/* check the form before the request has been sent */
					beforeSubmit: function() {
						return true;
					},						
					
					/* display confirmation message when data has been received from the server successfully */
					success: function(response){
						self.modal.alert("Information", self.langVars.strategiesSuccessMessage);
					},
					
					/* display error message */
					error: function(){
						return true;
					}
				});
			}
		},
		
		/*
		 * function: addEnonces
		 * -> add Enonces
		 */
		addEnonces: function(){
			var self = Defisante;

			/* fill the form with the choices */
			$.getJSON("php/coteSanteEnonce.php?action=enonceAndGroups", function(data){
				$.each(data.data, function(i, group){
					
					/* create group */
					var groupEl = $("<div></div>");
					var groupLabel = $("<div style=\"font-weight: bold;padding-top:10px\">"+ group.groupName +"</div>");
					groupEl.append(groupLabel);
					
					/* Add enoncés for this group */
					$.each(group.enonce, function(j, enonce){
						var enonceEl = $("<div></div>").appendTo(groupEl);
						var checkboxEl = $("<input class=\"checkbox\" type=\"checkbox\" value=\"" + enonce.id + "\" id=\"enonce"+enonce.id+"\" name=\"enonces[]\"/>");
						var labelEl = $("<label class=\"auto\" style=\"width:95%\">"+ enonce.enonce +"</label>");
						enonceEl.append(checkboxEl);
						enonceEl.append(labelEl);
					});
					
					$("#enonceDiv").append(groupEl);
				});
			});	
		},
		/*
		 * function: updateTableEnonce
		 */
		addEnoncesSelected: function(){
			var self = Defisante;

			/* fill the form with the choices */
			$.getJSON("php/coteSanteEnonce.php?action=enoncesSelected", function(data){
				
				/* check if groups will be added to this section */
				if(data.data.length > 0) {
					$.each(data.data, function(i, group){
						
						/* create group */
						var groupEl = $("<div></div>");
						var groupLabel = $("<div style=\"font-weight: bold;padding-top:10px\">"+ group.groupName +"</div>");
						groupEl.append(groupLabel);
						
						/* Add enoncés for this group */
						$.each(group.enonce, function(j, enonce){
							var enonceEl = $("<div></div>").appendTo(groupEl)
								.mouseover(function(){
									$(this).css("background-color", "#CCCCCC");
								}).mouseout(function(){
									$(this).css("background-color", "");
								});
							var checkboxEl = $("<input class=\"checkbox\" type=\"checkbox\" value=\"" + enonce.id + "\" id=\"enonce"+enonce.id+"\" name=\"enonces[]\"/>");
							var divEl = $("<div style=\"display: none;clear:both\"></div>");
							var divtooltip = $("<div style=\"display: none;\" id=\"enonceTooltip_"+enonce.id+"\"></div>").append(
								$("<span style=\"font-weight: normal;\"></span>").html(enonce.enonceExplanation)
							);
							var labelEl = $("<label id=\"enonceText_"+enonce.id+"\"></label>").css("margin-bottom", "0px").addClass("enonceTooltip")
								.append($("<span>"+enonce.enonce+"</span>").click(function(){$(this).parent().click();}))
								.mouseover(function(){
									$(this).css("background-color", "#CCCCCC");
								}).mouseout(function(){
									$(this).css("background-color", "");
								});
							enonceEl.append(checkboxEl);
							enonceEl.append(labelEl);
							enonceEl.append(divtooltip);
							enonceEl.append("<br class=\"clearboth\"/>");
						});
						
						$("#pointsForts").append(groupEl);
					});
				
				/* no groups - remove the title for "Points Forts" */
				} else {
					$("#pointsFortsTitle").css("display", "none");
				}
			});	
			
		}, 
		/*
		 * function: updateTableEnonce
		 */
		addEnoncesNotSelected: function(){
			var self = Defisante;

			/* fill the form with the choices */
			$.getJSON("php/coteSanteEnonce.php?action=enoncesNotSelected", function(data){
				
				if(data.data.length > 0) {
					$.each(data.data, function(i, group){
						
						/* create group */
						var groupEl = $("<div></div>");
						var groupLabel = $("<div style=\"font-weight: bold;padding-top:10px\">"+ group.groupName +"</div>");
						groupEl.append(groupLabel);
						
						/* Add enoncés for this group */
						$.each(group.enonce, function(j, enonce){
							var enonceEl = $("<div></div>").appendTo(groupEl)
								.mouseover(function(){
									$(this).css("background-color", "#CCCCCC");
								}).mouseout(function(){
									$(this).css("background-color", "");
								});
							var checkboxEl = $("<input class=\"checkbox\" type=\"checkbox\" value=\"" + enonce.id + "\" id=\"enonce"+enonce.id+"\" name=\"enonces[]\"/>");
							var divEl = $("<div style=\"display: none;clear:both\"></div>");
							var divtooltip = $("<div style=\"display: none;\" id=\"enonceTooltip_"+enonce.id+"\"></div>").append(
								$("<span style=\"font-weight: normal;\"></span>").html(enonce.enonceExplanation)
							);
							var labelEl = $("<label id=\"enonceText_"+enonce.id+"\"></label>").css("margin-bottom", "0px").addClass("enonceTooltip")
								.append($("<span>"+enonce.enonce+"</span>").click(function(){$(this).parent().click();}))
								.mouseover(function(){
									$(this).css("background-color", "#CCCCCC");
								}).mouseout(function(){
									$(this).css("background-color", "");
								});
							enonceEl.append(checkboxEl);
							enonceEl.append(labelEl);
							enonceEl.append(divtooltip);
							enonceEl.append("<br class=\"clearboth\"/>");
						});
						
						$("#pointsAmeliorer").append(groupEl);
					});
				
				/* no groups - remove the title for "Points à Améliorer" */
				} else {
					$("#pointsAmeliorerTitle").css("display", "none");
				}
			});
		}, 
		/*
		 * function: updateTableEnonce
		 */
		updateTableEnonce: function() {
			var self = Defisante;
			
			$.getJSON("php/coteSanteEnonce.php?action=CoteSanteMaison", function(data){
				$("#resultCoteSante").html(data.enonces);
				if (data.full == "true") {
					$("#coteSanteFull").show();
				
				} else {
					$("#coteSanteNotFull").show();
				}
			});
		},
		/*
		 * function: deleteCoteSante
		 * -> allow to delete a cote santé group
		 */
		deleteCoteSante: function(){
			var self = Defisante;
			
			if(!$("#coteSanteTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(
				self.langVars.confirmCoteSanteDeletionMessage,
				function(){
					var coteSanteIds = [];
					
					/* gather employers members */
					$("#coteSanteTable").find(":checked").each(function(){
						coteSanteIds.push($(this).val());
					});

					$.ajax({
						url: "php/coteSanteGroup.php?action=delete&ids="+coteSanteIds.join(","),
						type: "delete",
						async: true,
						dataType: "json",
						success: function(data) {
							if(data.error) {
								self.modal.error(self.langVars.genericErrorTitle, data.error);
							
							} else {
								self.modal.alert(self.langVars.coteSanteDeletionMessage, self.langVars.coteSanteDeletionMessage);
								$("#coteSanteTable").get(0).reloadData();
							}
						}
					});
				}, 
				function(){}
			);
		},
		/*
		 * function: deleteCoteSanteEnonce
		 * -> allow to delete Cote santé Enonce
		 */
		deleteCoteSanteEnonce: function(){
			var self = Defisante;
			
			if(!$("#coteSanteEnonceTable").find(":checked").get(0)) {
				return;
			}
			
			/* open confirmation modal */
			self.modal.confirm(self.langVars.confirmCoteSanteEnonceDeletionMessage,function(){
				var enonceIds = [];
				
				/* gather employers members */
				$("#coteSanteEnonceTable").find(":checked").each(function(){
					enonceIds.push($(this).val());
				});

				$.ajax({
					url: "php/coteSanteEnonce.php?action=delete&ids="+enonceIds.join(","),
					type: "delete",
					async: true,
					dataType: "json",
					success: function(data) {
						if(data.error) {
							self.modal.error(self.langVars.genericErrorTitle, data.error);
						
						} else {
							self.modal.alert(self.langVars.coteSanteEnonceDeletionMessage, self.langVars.coteSanteEnonceDeletionMessage);
							$("#coteSanteEnonceTable").get(0).reloadData();
						}
					}
				});
			}, function(){});
		},
		
		/*
		 * function: checkCoteSantePage
		 * -> check if the page cote sante it's available for the user, if not then redirect to myData
		 */
		checkCoteSantePage: function() {
			if($("#enonceStarted").get(0)) {
				$.getJSON("php/coteSanteEnonce.php?action=checkCoteSante", function(data){
					if (data.coteSante == 0) {
						window.location= "myData";
					}
				});
			}
		}
	}
};

/* intialize Defisante */
Defisante.init();
