if(TFI == undefined) {
    var TFI = {};
}

TFI.Candidate = {

    pageMode: null, //Define page mode (Create, Edit, Display) 
	originalCandidateCV: null, //Store original CV to set dbstatus
	candidateToken: "",
	
    createCandidate: function() {
        var candidate = TFI.Candidate.candidateCV;
        var res = { value: -1 }; //Default: return error -1
        
        if (candidate.CandidateCVs.candidate_CV.AttachDocumentName == "") {
		    candidate.CandidateCVs.candidate_CV.DbStatus = TFI.Const.DbStatus.Unchanged;
        }
        
        if(RegistrationCivilStatus.validate() && RegistrationTargetJob.validate() && RegistrationDefinePassword.validate()) {
			candidate = RegistrationCivilStatus.saveValues(candidate);
			candidate = RegistrationTargetJob.saveValues(candidate);
			candidate = RegistrationDefinePassword.saveValues(candidate);
			if(candidate != null) {
				TFI.Candidate.candidateCV = candidate;
				candidate = TFI.Candidate.addDbStatusNew(candidate);
				
				// MANTIS #8870 : transmit the Source parameter to the LEA web service
				res = TFI.ClientServices.Candidate.CreateCandidate(candidate, (RegExp("Source=(.+?)(&|$)").exec(location.search)||[,null])[1]);
			}
		}
		return res.value;
    },
    
    addDbStatusNew: function(candidate) {
		var dbStatusNew = TFI.Const.DbStatus.New;
		var i;
		
		candidate.civilStatus.DbStatus = dbStatusNew;
		candidate.civilStatus.candidate.DbStatus = dbStatusNew;
		candidate.candidateState.DbStatus = dbStatusNew;
		candidate.candidateState.candidateAssignment.DbStatus = dbStatusNew;
		for(i=0; i<candidate.candidateState.candidateAssignment.TypeContracts.length; i++) {
			candidate.candidateState.candidateAssignment.TypeContracts[i].DbStatus = dbStatusNew;
		}
		candidate.Mobility.DbStatus = dbStatusNew;
		for(i=0; i<candidate.Mobility.Mobilities.length; i++) {
			candidate.Mobility.Mobilities[i].DbStatus = dbStatusNew;
		}
		candidate.Job.DbStatus = dbStatusNew;
		for(i=0; i<candidate.Job.JobTitles.length; i++) {
			candidate.Job.JobTitles[i].DbStatus = dbStatusNew;
		}
		candidate.Aptitude.handicapCandidate.DbStatus = dbStatusNew;
		return candidate;
    },
 
    saveOriginalCandidate: function(candidate) {
    
		TFI.Candidate.originalCandidateCV = jQuery.extend(true, {}, candidate);
    },
   
    setDbStatusForCivilStatus: function(candidate) {
		var dbStatusUpdate = TFI.Const.DbStatus.Update;
		candidate.civilStatus.DbStatus = dbStatusUpdate;
		candidate.civilStatus.candidate.DbStatus = dbStatusUpdate;
		if (candidate.Aptitude.handicapCandidate.DbStatus != TFI.Const.DbStatus.New) {
		    candidate.Aptitude.handicapCandidate.DbStatus = dbStatusUpdate;
		}
		candidate.Mobility.DbStatus = dbStatusUpdate;
		candidate.Mobility.CandidateMobility.DbStatus = dbStatusUpdate;
		if (candidate.CandidateCVs.candidate_CV.AttachDocumentName == "") {
		    candidate.CandidateCVs.candidate_CV.DbStatus = TFI.Const.DbStatus.Unchanged;
		}
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Mobility.DrivingLicenses, candidate.Mobility.DrivingLicenses, "DrivingLicenseId");		
		return candidate;
    },
    
    setDbStatusForJobs: function(candidate) {
		var dbStatusUpdate = TFI.Const.DbStatus.Update;
		candidate.candidateState.DbStatus = dbStatusUpdate;
		candidate.candidateState.candidateAssignment.DbStatus = dbStatusUpdate;
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.candidateState.candidateAssignment.TypeContracts, candidate.candidateState.candidateAssignment.TypeContracts, "ContractId");
		candidate.Mobility.DbStatus = TFI.Const.DbStatus.Update;
		candidate.Mobility.CandidateMobility.DbStatus = dbStatusUpdate;
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Mobility.Mobilities, candidate.Mobility.Mobilities, "GeoAreaId", "TypeGeoAreaId");
		candidate.Job.DbStatus = dbStatusUpdate;
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Job.JobTitles, candidate.Job.JobTitles, "JobTitleId");
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Job.Tasks, candidate.Job.Tasks, "TaskId");
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Job.Tools, candidate.Job.Tools, "ToolId");
		candidate.Mobility.DrivingLicenses.DbStatus = TFI.Const.DbStatus.Unchanged;
		return candidate;
    },
    
    setDbStatusForSkills: function(candidate) {
		var dbStatusUpdate = TFI.Const.DbStatus.Update;
		candidate.Office.DbStatus = dbStatusUpdate;
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Office.OfficeKnowledges, candidate.Office.OfficeKnowledges, "OfficeKnowledgeId");		
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Office.Languages, candidate.Office.Languages, "LanguageKnowledgeId");		
		candidate.Training.DbStatus = dbStatusUpdate;
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Training.TrainingDomains, candidate.Training.TrainingDomains, "TrainingDomainId");
		candidate.Habilitation.DbStatus = dbStatusUpdate;
		TFI.Candidate.updateDbStatus(TFI.Candidate.originalCandidateCV.Habilitation.Licenses, candidate.Habilitation.Licenses, "LicenseId");
		return candidate;
    },
   
    updateCandidateCivilStatus: function(deleteFile, onCandidateUpdated) {
        var candidate;
		var res = { value: false }; //Default: return false

		if(RegistrationCivilStatus.validate()) {
			//Read original CV from server
			res = TFI.ClientServices.Candidate.GetUserProfile(TFI.Candidate.candidateToken);
			TFI.Candidate.saveOriginalCandidate(res.value);			
			candidate = RegistrationCivilStatus.saveValues(res.value);
			if(candidate != null) {
				TFI.Candidate.candidateCV = candidate;
				//Set DbStatus
				candidate = TFI.Candidate.setDbStatusForCivilStatus(candidate);

        res = { value: -10 }; // Default: return -10 (other error)	           
				res = TFI.ClientServices.Candidate.UpdateCivilStatus(
					TFI.Candidate.candidateToken, 
					candidate.civilStatus,
					candidate.Mobility,
					candidate.Aptitude,
					candidate.CandidateCVs,
					candidate.CVIndexes,
					RegistrationCivilStatus.deleteFile					
				);
				
				// if res < 0, there was an error
				if (res.value >= 0) {
				    if (TFI.Candidate.candidateCV.CandidateCVs.candidate_CV.DbStatus == TFI.Const.DbStatus.New) {
				        TFI.Candidate.candidateCV.CandidateCVs.candidate_CV.DbStatus = TFI.Const.DbStatus.Unchanged;
				        TFI.Candidate.candidateCV.CVIndexes = null;
				    }
				}
			}
        }    
		if(onCandidateUpdated != null) {
			onCandidateUpdated(res.value);
		}
    },
    
    updateCandidateJobs: function(onCandidateUpdated) {
        var candidate;
		var res = { value: false }; //Default: return false

		if(RegistrationTargetJob.validate()) {
			//Read original CV from server
			res = TFI.ClientServices.Candidate.GetUserProfile(TFI.Candidate.candidateToken);
			TFI.Candidate.saveOriginalCandidate(res.value);
			candidate = RegistrationTargetJob.saveValues(res.value);
			if(candidate != null) {
				TFI.Candidate.candidateCV = candidate;
				//Set DbStatus				
				candidate = TFI.Candidate.setDbStatusForJobs(candidate);
	           
				res = TFI.ClientServices.Candidate.UpdateJobs(
					TFI.Candidate.candidateToken, 
					candidate.Job,
					candidate.candidateState,
					candidate.Mobility
				);
			}
        }    
		if(onCandidateUpdated != null) {
			onCandidateUpdated(res.value);
		}
    },
    
    updateCandidateSkills: function(onCandidateUpdated) {
        var candidate;
		var res = { value: false }; //Default: return false
        
        if(ModifySkills.validate()) {
			//Read original CV from server
			res = TFI.ClientServices.Candidate.GetUserProfile(TFI.Candidate.candidateToken);
			TFI.Candidate.saveOriginalCandidate(res.value);
			candidate = ModifySkills.saveValues(res.value);
			if(candidate != null) {
				TFI.Candidate.candidateCV = candidate;
				//Set DbStatus				
				candidate = TFI.Candidate.setDbStatusForSkills(candidate);
	           
				res = TFI.ClientServices.Candidate.UpdateSkills(
					TFI.Candidate.candidateToken, 
					candidate.Training,
					candidate.Office,
					candidate.Habilitation
				);
			}
        }    
		if(onCandidateUpdated != null) {
			onCandidateUpdated(res.value);
		}
    },
	
	getUniqueControlStructure: function(civilStatus) {
		var unicityInfo;
		
		unicityInfo = TFI.ClientServices.Candidate.CheckUniqueControl(civilStatus);
		return unicityInfo.value;
	},
	
	updateDbStatus: function(original, current, idField1, idField2) {
		var exists = false;
		var i, k;
		
		current.DbStatus = TFI.Const.DbStatus.Update; //Set DbStatus = Update for collection

		//Remove DBStatus attribute from original
		for(i=0; i<original.length; i++) {
			original[i].DbStatus = null;
		}
		
		//Add DbStatus = New
		for(i=0; i<current.length; i++) {
			exists = false;
			for(k=0; k<original.length; k++) {
				if(current[i][idField1] == original[k][idField1] && (idField2==undefined || current[i][idField2] == original[k][idField2])) {
					exists = true;
					current[i].DbStatus = TFI.Const.DbStatus.Unchanged;
					original[k].DbStatus = TFI.Const.DbStatus.Unchanged;
					break; //element found -> Exit 
				}
			}
			if(!exists) {
				current[i].DbStatus = TFI.Const.DbStatus.New;
			}
		}
		//Add DbStatus Delete
		for(i=0; i<original.length; i++) {
			if(original[i].DbStatus != TFI.Const.DbStatus.Unchanged) {
				//Doesn't exist in current. Mark to be deleted
				var item = { DbStatus: TFI.Const.DbStatus.Delete }; //Create a new item
				item[idField1] = original[i][idField1];
				if(idField2 != undefined) {
					item[idField2] = original[i][idField2];
				}
				if(idField2 != undefined && idField2 == "TypeGeoAreaId") {
				    if (item[idField2] == TFI.Const.GeographicalAreaType.Town || item[idField2] == TFI.Const.GeographicalAreaType.Distrit){
				        item["ZipCodeId"] = original[i]["ZipCodeId"];
				    }
				}
				if(idField1 == "TrainingDomainId") {
				    item["TrainingId"] = original[i]["TrainingId"];
				}
				
				current.push(item);				
				//original[i].DbStatus = TFI.Const.DbStatus.Delete;
				//current.push(original[i]);
			}
		}
		return current;		
	},
		    
	candidateCV: {
	    civilStatus: {
	        candidate: {
	            CandidateId: 0,
	            SocialSecurityNumber: null,
	            HasContacteurAuthorization: 0,
	            HasEmailContactAuthorization: 0,
	            SocialSecurityNumberKey: null,
	            GenderId: 0,
	            GenderName: null,
	            FirstName: null,
	            LastName:null,
	            BirthDate: null, // \/Date(1228125796597)\/, //Sample birthdate
	            BirthGeoAreaId: 0,
	            BirthGeoAreaName: null,
	            Street1: null,
	            Street2: null,
	            City: null,
	            OldLogin: null,
	            Login: null,
	            ZipCode: null,
	            CountryId: null,
	            CountryName: null,
	            Phone1: null,
	            Phone2: null,
	            CommentPhone1: null,
	            CommentPhone2: null,
	            Mobile: null,
	            TypeContractId: 0,
	            TypeContractName: null,
	            CandidateSourceId: TFI.Const.WEB_SITE_CANDIDATE_SOURCE_ID,
	            CandidateSourceName: null,
	            Email: null,
	            HasMeansTransportation: 0,
	            MaritalStatusId: 0,
	            MaritalStatusName: null,
	            MaidenName: null,
	            MedCheckUpValidityTime: 0,
	            LastMedicalVisitDate: null,
	            PeopleSupportedNumber: 0,
	            QualityStatusId: 1,
	            ActiveStatusId: 1,
	            ActiveStatusName: null,
	            PartialReferenceId: 0,
	            PartialReferenceName: null,
	            TypeTempId: 1,
	            BelongedBUGroupId: 0,
	            NationalityId: 0,
	            NationalityName: null,
	            TypePermitId: 0,
	            TypePermitName: null,
	            PermitNumber: null,
	            PermitValidityBeginingDate: null,
	            PermitValidityEndingDate: null,
	            HasReadKnowledge: 1,
	            HasWriteKnowledge: 1,
	            HasCountKnowledge: 1,
	            IsMedicalCheckUpPresented: 0,
	            Code: null,
	            BGeoCity: null,
	            CivilityId: 1,
	            CivilityName: null,
	            SearchAgentStatusId: 2,
	            SearchAgentStatusName: null,
	            IsRestricted: 0,
	            IsContractGivenByBranch: 0,
	            IsContractGivenByPayroll: 0,
	            IsRetired: 0,
	            CreateLogin: 0,
	            RestrictedNetworkId: 0,
	            RestrictedNetworkName: null,
	            IsNatValidated: 0,
	            NValidationDate: null,
	            NValidationStructureId: 0,
	            NValidationStructureCode: null,
	            TypeTempName: null,
	            QualityStatusName: null,
	            Password: null,
	            HasAcceptGreatDisplacement: 0,
	            DbStatus: 0
            },
            stateMultipleBed: {
                JobTitleId: "",
                JobTitleName: "",
                TrainingDomainId: "",
                TrainingDomainName: "",
                ProfessionalAreaId: "",
                ProfessionalAreaName: "",
                HasMobility: 0,
                DatesLicenses: 0,
                HasTypeContract: 0,
                DbStatus: 0
            },
            DbStatus: 0
        },
        candidateState: {
            candidateAssignment: {
                BirthGeoAreaId: 0,
                ActiveStatusId: 1,
                QualityStatusId: 1,
                BirthDate: null,
                IsContractGivenByBranch: 0,
                IsContractGivenByPayroll: 0,
                CreationBranch: "",
                TypeContracts: [],
                ReferenceBranch: "",
                ReferenceDate: null,
                FormatedReferencementDate: null,
                DbStatus: 0
            },
            DbStatus: 0
        },
        Mobility: {
            Mobilities: [],
            CandidateMobility: {
                CandidateId: 0,
                HasMeansTransportation: 0,
                HasAcceptGreatDisplacement: 0,
                DbStatus: 0
            },
            DrivingLicenses: [],
            DbStatus: 0
        },
        Job: {
            JobTitles: [],
            Tasks: [],
            Tools: [],
            ProfessionalAreas: [],
            DbStatus: 0
        },
        Indisponibility: {
            WorkVolumes: [],
            WorkRhytms: [],
            Unavailabilities: [],
            WorkObservations: null,
            DbStatus: 0
        },
        Aptitude: {
            handicapCandidate: {
				HasOtherHandicap: 0,
				DbStatus: 0
            },
            DbStatus: 0
        },
        Office: {
            OfficeKnowledges: [],
            Languages: [],
            DbStatus: 0
        },
        ExternalWorkExperience: {
            ExternalWorkExperiences: [],
            DbStatus: 0
        },
        InternalWorkExperience: {
            InternalExperiences: [],
            DbStatus: 0
        },
        Training: {
            TrainingDomains: [],
            ProfessionalAreas: [],
            DbStatus: 0
        },
        EvaluationAttitude: {
            Candidate: {
                HasReadKnowledge: 1,
                HasWriteKnowledge: 1,
                HasCountKnowledge: 1,
                DbStatus: 0
            },
            m_sTests: null,
            BehaviourSkills: [],
            DbStatus: 0
        },
        Habilitation: {
            Licenses: [],
            SafetyEquipments: [],
            DbStatus: 0
        },
        CandidateCVs: {
            Comments: null,
            CandidatePassword: null,
            candidate_CV: {
                AttachDocumentId: 0,
                LingwayDocId: 0,
                IsParsed: 0,
                IsIndexed: 0,
                ParsingErrorCode: "",
                IndexingErrorCode: "",
                AttachDocumentPath: "",
                AttachDocumentName: "",
                IsPublic: 0,
                TypeCreatorId: 0,
                DbStatus: 0
            },
            DbStatus: 0
        },
        Salary: null,
        CVIndexes: null,
        DbStatus:0
    }, //End of CandidateCV
    
    //object for unique control   
    UnicityCheck: {
        code: 0,
        message: null,
        candidates: [],
        branch: {
            name: null,
            street1: null,
            zipCode: null,
            city: null,
            phoneNumber: null
        }       
    }
}
