const STEP_FINISHED = 1000; function ResumeWizard($json_content) { this.nocs_manager = null; this.autoshow_mode = false; this.save_validating = false; this.first_unfilled_control = null; ResumeWizard.steps_containers_array = [ "user_work_experience_info", "is_native_language_block", "english_level_block", "pages_count_block", "has_sent_resume_block", "sent_resume_info_block", "plan_sent_resume_info_block", "has_photo_block", "has_birthdate_block", "has_gender_block", "has_children_count_block", "has_job_skip_experience_block", "has_job_achievement_block", "has_key_skills_block", "has_volunteer_exp_block", "has_personal_pronoun_block", "has_personal_interest_block", "has_dismissal_reason_block", "is_public_analysis_block", "user_contact_info"]; this.Initialize($json_content); } ResumeWizard.prototype.InitializeNocsManagers = function() { var object = this; var on_change_nocs = function (sender){ object.InitializeInterface(); }; // nocs manager for client this.nocs_manager = new NocsManager(false); this.nocs_manager.can_auto_accept_job = true; this.nocs_manager.clear_job_on_key_press = true; this.nocs_manager.AddItem(); this.nocs_manager.OnChangeNocs(on_change_nocs); } ResumeWizard.prototype.AddSelectOptions = function(select_control, option_text, option_value) { var option = document.createElement("option"); option.text = option_text; option.value = option_value; $(select_control)[0].appendChild(option); } ResumeWizard.prototype.UpdateVisibility = function(control, is_visible) { if (control) { if (is_visible) $(control).show(); else $(control).hide(); } } ResumeWizard.prototype.DoShowContainer = function(step) { this.UpdateVisibility("#" + step, this.IsStepVisible(step)); } ResumeWizard.prototype.DoHideContainer = function(step) { if (this.autoshow_mode) $("#" + step).hide(); else this.UpdateVisibility("#" + step, this.IsStepVisible(step)); } ResumeWizard.prototype.ChangeControlBackgroundColor = function(selected, control) { $(control).removeClass("error-control-value"); $(control).removeClass("filled-control-value"); $(control).removeClass("unknown-control-value"); if (selected) $(control).addClass('filled-control-value'); else { if (this.save_validating) { $(control).addClass('error-control-value'); } else $(control).addClass('unknown-control-value'); } } ResumeWizard.prototype.ChangeInputControlStyle = function(current_step) { var object = this; $("select").each(function() { object.ChangeControlBackgroundColor(IsSelectBoxFilled(this), this); }); $(".btn-group-member").each(function() { object.ChangeControlBackgroundColor(IsButtonGroupSelected($(this).parent()), this); }); $("span.radio-label").each(function() { var is_filled = null; var parent = $(this).parent(); $(parent).children().each(function(index, child){ if (IsRadioBox(child)) { is_filled = IsRadioBoxFilled(child); return; } }); object.ChangeControlBackgroundColor(is_filled, this); }); $("textarea, input[type=text], input[type=tel], input[type=email]").each(function() { var is_filled = (this.value != ""); var element_id = $(this).attr('id') if ((object.save_validating) && (element_id == "user_email")) { is_filled = is_filled && AnalyzeEmailControl("#user_email", false); } object.ChangeControlBackgroundColor(is_filled, this); }); } ResumeWizard.prototype.WasResumeSent = function() { return (IsButtonGroupCheckBoxOn("#has_sent_resume_group")); } ResumeWizard.prototype.IsStepVisible = function(step) { var result = true; if (step == "sent_resume_info_block") result &= (this.WasResumeSent()); if (step == "plan_sent_resume_info_block") result &= (!this.WasResumeSent()); return result; } ResumeWizard.prototype.IsSaveAvailable = function() { var current_step = this.GetCurrentStepIndex(); return (current_step == STEP_FINISHED); } ResumeWizard.prototype.IsStepElementFilled = function(step, element) { // check is input/select really filled var result = true; if (element.tagName.toLowerCase() == "select") { result &= (IsSelectBoxFilled(element)); } if (element.tagName.toLowerCase() == "textarea") { result &= IsTextBoxFilled(element); } if (element.tagName.toLowerCase() == "input") { result &= IsInputFilled(element); var element_id = $(element).attr('id') if ((this.save_validating) && (element_id == "user_email")) { result = result && AnalyzeEmailControl("#user_email", true); } } if (IsButtonGroup(element)) { result &= IsButtonGroupSelected(element); } return result; } ResumeWizard.prototype.IsVirtualContainer = function(element) { return ($(element).hasClass("virtual-container")); } ResumeWizard.prototype.EnumerateStepElementsParent = function(step, element, check_parent) { var result = true; var object = this; var is_virtual_container = false; if (check_parent) is_virtual_container = this.IsVirtualContainer(element); var is_protype = ($(element).hasClass("prototype")); if (!is_protype) { // enumerate all nesting divs of given step $(element).children().each(function (child_div_index, child_div) { var is_hidden = $(child_div).hasClass("hidden-container"); var is_child_virtual_container = object.IsVirtualContainer(child_div); if (!is_hidden) { if (is_virtual_container) { result &= object.EnumerateStepElementsParent(step, child_div, true); } else if (is_child_virtual_container) { result &= object.EnumerateStepElementsParent(step, child_div, false); } else { result &= object.EnumerateStepElements(step, child_div); } if (!result) return; } }); } return result; } ResumeWizard.prototype.EnumerateStepElements = function(step, element) { var result = true; var object = this; $(element).children().each(function (index, child) { var dom_element = $(child).get(0); result = result && (object.IsStepElementFilled(step, dom_element)); if (!result) { if (object.first_unfilled_control == null) object.first_unfilled_control = dom_element; return; } }); return result; } ResumeWizard.prototype.IsStepFilled = function(step) { if (this.IsStepVisible(step)) { var children_containers_selector = "#" + step; return this.EnumerateStepElementsParent(step, children_containers_selector, true); } return true; } ResumeWizard.prototype.GetCurrentStepIndex = function() { this.first_unfilled_control = null; for (var i = 0; i < ResumeWizard.steps_containers_array.length; i++) { if (!this.IsStepFilled(ResumeWizard.steps_containers_array[i])) return i; } return STEP_FINISHED; } ResumeWizard.prototype.InitializeInterface = function() { var current_step = this.GetCurrentStepIndex(); var is_save_visible = (current_step == STEP_FINISHED); this.save_validating = false; this.ChangeInputControlStyle(current_step); if (this.autoshow_mode) this.UpdateVisibility($("#save_form"), is_save_visible); for (var i = 0; i < ResumeWizard.steps_containers_array.length; i++) { if (i <= current_step) { this.DoShowContainer(ResumeWizard.steps_containers_array[i]); } else { this.DoHideContainer(ResumeWizard.steps_containers_array[i]); } } } ResumeWizard.prototype.SerializeNocsFields = function(nocs_manager, title) { return nocs_manager.SerializeNocsFields(title); } ResumeWizard.prototype.AddSerializedValue = function(result, value) { if ((result != "") && (value != "")) { result += "&"; } result += value; return result; } ResumeWizard.prototype.SerializeAdditionalFields = function() { var result = ""; result = this.AddSerializedValue(result, this.SerializeNocsFields(this.nocs_manager, "user_nocs")); return result; } ResumeWizard.prototype.CheckUserNocsCommon = function(nocs_manager) { var result = true; has_work = nocs_manager.HasAnyFilledNoc(); if (has_work === false) { var message_str = "Désolé, vous devez sélectionner une profession dans la liste déroulante qui s'affiche au fur et à mesure que vous tapez.\n\n"; message_str += "S'il n'y a pas d'options, veuillez essayer de reformuler la profession ou d'entrer un synonyme pour celle-ci.\n"; alert(message_str); $("#has_resume").parent()[0].scrollIntoView({ behavior: 'smooth'}); result = false; } return result; } ResumeWizard.prototype.HasResumeFile = function() { var result = (Assigned($("#resume-file-name").html())); result = result && ($("#resume-file-name").is(":visible")); return result; } ResumeWizard.prototype.ShowErrorAndScrollToControl = function(errorText, scrollControlSelector) { alert(errorText); if ($(scrollControlSelector).length > 0) $(scrollControlSelector)[0].scrollIntoView({ behavior: 'smooth'}); } ResumeWizard.prototype.CheckResumeFileExisting = function() { var result = this.HasResumeFile(); if (!result) this.ShowErrorAndScrollToControl("Vous devez joindre un fichier CV pour une analyse plus approfondie\n\n", "#file_resume_block"); return result; } ResumeWizard.prototype.IsResumeFileFormatSupported = function(resumeFileExt) { let result = (resumeFileExt == "docx"); result = result || (resumeFileExt == "pdf"); return result; } ResumeWizard.prototype.CheckResumeFileFormat = function() { let resumeFileName = $("#file_resume_name").val(); let resumeFileExt = resumeFileName.split('.').pop().toLowerCase(); let result = this.IsResumeFileFormatSupported(resumeFileExt); if (!result) this.ShowErrorAndScrollToControl("Le format de fichier spécifié pour le CV est obsolète et n'est plus pris en charge. Pour une meilleure compatibilité avec les formats de CV canadiens, veuillez supprimer le fichier précédent et l'ajouter au format .docx ou .pdf.\n", "#file_resume_block"); return result; } ResumeWizard.prototype.CheckResumeFile = function() { let result = this.CheckResumeFileExisting(); result = result && (this.CheckResumeFileFormat()); return result; } ResumeWizard.prototype.CheckUserNocs = function() { return this.CheckUserNocsCommon(this.nocs_manager); } ResumeWizard.prototype.CheckSaveAvailability = function(save_data) { this.save_validating = true; this.ChangeInputControlStyle(); var result = this.IsSaveAvailable(); if (this.first_unfilled_control != null) { var parent = $(this.first_unfilled_control).parent(); $(parent)[0].scrollIntoView({ behavior: 'smooth'}); } if (result) result &= this.CheckUserNocs(); if (result) result &= this.CheckResumeFile(); this.save_validating = false; return result; } ResumeWizard.prototype.ChangeInputsEnabledState = function(is_disabled) { $(".prototype-item").attr("disabled", is_disabled); $("#plan_change_for_vacancy").attr("disabled", is_disabled && (this.WasResumeSent())); $("#was_interview").attr("disabled", is_disabled && (!this.WasResumeSent())); $("#vacancies_count").attr("disabled", is_disabled && (!this.WasResumeSent())); $("#was_changed_for_vacancy").attr("disabled", is_disabled && (!this.WasResumeSent())); $("#file_resume_name").attr("disabled", is_disabled && (document.getElementById('file_resume_name').value == "")); $("#file_resume_size").attr("disabled", is_disabled && (document.getElementById('file_resume_size').value == "")); $("#file_resume_data").attr("disabled", is_disabled && (document.getElementById('file_resume_data').value == "")); } ResumeWizard.prototype.SendProfileToServer = function(save_data) { if (this.CheckSaveAvailability(save_data)) { this.SendProfileToServerInternal(save_data); } } ResumeWizard.prototype.SubmitForm = function() { this.SendProfileToServer(true); } ResumeWizard.prototype.CalculateResults = function() { this.SendProfileToServer(false); } ResumeWizard.prototype.LoadControlsFromJSON = function(json) { SetButtonGroupCheckBoxValue("#has_resume", true); for (var propertyName in json) { var jquery_name = "#" + propertyName; if (IsCheckBox(jquery_name)) { if (json[propertyName] == "true") $(jquery_name).attr('checked', 'checked'); } else if (IsInputBox(jquery_name)) $(jquery_name).val(json[propertyName]); else if (IsSelectBox(jquery_name)) SetSelectBoxValue(jquery_name, json[propertyName]); } // button check boxes SetButtonGroupValue("#pages_count_group", json["pages_count"]); SetButtonGroupValue("#pages_count_group", json["pages_count"]); SetButtonGroupCheckBoxValue("#is_native_language_group", json["is_native_language"]); SetButtonGroupCheckBoxValue("#has_photo_group", json["has_photo"]); SetButtonGroupCheckBoxValue("#has_gender_group", json["has_gender"]); SetButtonGroupCheckBoxValue("#has_birthdate_group", json["has_birthdate"]); SetButtonGroupCheckBoxValue("#has_children_count_group", json["has_children_count"]); SetButtonGroupCheckBoxValue("#has_job_skip_experience_group", json["has_job_skip_experience"]); SetButtonGroupCheckBoxValue("#has_job_achievement_group", json["has_job_achievement"]); SetButtonGroupCheckBoxValue("#has_key_skills_group", json["has_key_skills"]); SetButtonGroupCheckBoxValue("#has_volunteer_exp_group", json["has_volunteer_exp"]); SetButtonGroupCheckBoxValue("#has_personal_pronoun_group", json["has_personal_pronoun"]); SetButtonGroupCheckBoxValue("#has_personal_interest_group", json["has_personal_interest"]); SetButtonGroupCheckBoxValue("#has_dismissal_reason_group", json["has_dismissal_reason"]); SetButtonGroupCheckBoxValue("#is_public_analysis_group", json["is_public_analysis"]); // check resume was sent var was_sent = (json["vacancies_count"] > 0); SetButtonGroupCheckBoxValue("#has_sent_resume_group", was_sent); if (was_sent) { SetButtonGroupValue("#vacancies_count_group", json["vacancies_count"]); SetButtonGroupCheckBoxValue("#was_interview_group", json["was_interview"]); SetButtonGroupCheckBoxValue("#was_changed_for_vacancy_group", json["was_changed_for_vacancy"]); } else { SetButtonGroupCheckBoxValue("#plan_change_for_vacancy_group", json["plan_change_for_vacancy"]); } } ResumeWizard.prototype.LoadNocsControlsFromJSON = function(json) { var has_nocs = false; if (json["user_nocs"]) { nocs_array = json["user_nocs"]; has_nocs = (nocs_array.length > 0); if (has_nocs) { for (var i = 0; i < nocs_array.length; i++) { var current_item = this.nocs_manager.current_item; current_item.SetInputValue("", nocs_array[i].job_title); current_item.ShowWorkExperience(nocs_array[i].job_title, nocs_array[i].job_id, nocs_array[i].noc_id); } } } } ResumeWizard.prototype.LoadResumeFileFromJSON = function(json) { var file_resume_name = json["file_resume_name"]; $("#resume-file-name").html(file_resume_name); if (Assigned(file_resume_name)) $("#resume-file-info").show(); if (json["file_is_admin"]) { var file_resume_url = json["file_resume_url"]; var file_resume_admin_name = json["file_resume_admin_name"]; if (json["file_resume_admin_name"]) { $("#resume-file-url").html(file_resume_admin_name); $("#resume-file-url").attr("href", file_resume_url); $("#resume-file-url-container").show(); } $("#resume-file-upload-container").hide(); } } ResumeWizard.prototype.LoadControlsFromJSONContent = function(json_content) { if (json_content) { var json = JSON.parse(json_content); this.LoadControlsFromJSON(json); this.LoadNocsControlsFromJSON(json); this.LoadResumeFileFromJSON(json); this.InitializeResumeExisting(); } } ResumeWizard.prototype.LoadParameters = function() { this.autoshow_mode = (ReadCurrentURLParam("auto_show") == "1"); } ResumeWizard.prototype.InitializeInternalObjects = function() { this.InitializeDragAndDropObjects(); this.InitializeNocsManagers(); } ResumeWizard.prototype.SendProfileToServerInternal = function(save_data) { // prototype items var form = $("#ResumeProfile"); var additional_data_fields = this.SerializeAdditionalFields(); this.ChangeInputsEnabledState(true); var post_url = form.attr("action"); var request_method = form.attr("method"); var form_data = form.serialize(); if (additional_data_fields != "") form_data += "&" + additional_data_fields; this.ChangeInputsEnabledState(false); SubmitSerializedDataToServer(post_url, request_method, form_data); } ResumeWizard.prototype.InitializeResumeExisting = function() { var is_resume_block_visible = IsButtonGroupCheckBoxOn("#has_resume"); this.UpdateVisibility("#resume_block_no_message", !is_resume_block_visible); this.UpdateVisibility("#resume_block_yes_message", is_resume_block_visible); } ResumeWizard.prototype.IsSupportedDragTarget = function(event) { var result = (event.target === $('#resume-file-drag-box').get(0)); result = result || (event.target === $('#resume-file-drag-box_p').get(0)); return result; } ResumeWizard.prototype.ProcessDragEvent = function(event) { if (this.IsSupportedDragTarget(event)) { event.preventDefault(); event.stopPropagation(); return true; } return false; } ResumeWizard.prototype.DeleteResumeAttachedFile = function() { document.getElementById('file_resume_name').value = ""; document.getElementById('file_resume_size').value = ""; document.getElementById('file_resume_data').value = ""; $("#resume-upload").val(""); $("#resume-file-name").html(""); $("#resume-file-info").hide(); } ResumeWizard.prototype.GenerateResumeFileDisplayName = function(file_name, file_size) { prefix = "octets" file_size_str = file_size; if (file_size_str > 1024) { file_size_str = (file_size_str / 1024).toFixed(2); prefix = "KB"; } if (file_size_str > 1024) { file_size_str = (file_size_str / 1024).toFixed(2); prefix = "MB"; } return file_name + ", " + file_size_str + " " + prefix; } ResumeWizard.prototype.UploadResumeFile = function(file) { // max file size is 10 Mb const MAX_FILE_SIZE = 10 * 1024 * 1024; if (file.size == 0) { alert("Le fichier ne peut pas être vide"); } else if (file.size > MAX_FILE_SIZE) { alert("La taille du fichier ne doit pas dépasser 10 Mo"); } else { document.getElementById('file_resume_name').value = file.name; document.getElementById('file_resume_size').value = file.size; $("#resume-file-info").show(); $("#resume-file-name").html(this.GenerateResumeFileDisplayName(file.name, file.size)); reader = new FileReader(); reader.onload = function(event) { document.getElementById('file_resume_data').value = event.target.result; } reader.readAsDataURL(file); } } ResumeWizard.prototype.SelectResumeFile = function() { var file = $("#resume-upload").get(0).files[0]; console.log(file); this.UploadResumeFile(file); } ResumeWizard.prototype.InitializeDragAndDropObjects = function() { var object = this; $(document).on('drag dragstart', function(e) { object.ProcessDragEvent(e); }); $(document).on('dragover dragenter', function(e) { if (object.ProcessDragEvent(e)) $('#resume-file-drag-box').addClass('is-dragover'); }); $(document).on('dragleave dragend', function(e) { if (object.ProcessDragEvent(e)) { $('#resume-file-drag-box').removeClass('is-dragover'); } }); $(document).on('drop', function(e) { if (object.ProcessDragEvent(e)) { $('#resume-file-drag-box').removeClass('is-dragover'); var droppedFiles = e.originalEvent.dataTransfer.files; let droppedFileExt = droppedFiles[0].name.split('.').pop().toLowerCase(); if (object.IsResumeFileFormatSupported(droppedFileExt)) object.UploadResumeFile(droppedFiles[0]); else object.ShowErrorAndScrollToControl("Vous essayez d'ajouter un CV dans un format de fichier non pris en charge. Pour une analyse plus détaillée de votre CV, veuillez ajouter votre CV au format .docx ou .pdf.\n", "#file_resume_block"); } }); } ResumeWizard.prototype.Initialize = function(json_content) { this.LoadParameters(); this.InitializeInternalObjects(); this.LoadControlsFromJSONContent(json_content); this.InitializeInterface(); }