{"version":3,"sources":["components.js","alert-modal/alert-modal.js","auto-number/auto-number.js","back/back.js","big-element/big-element.js","button/button.js","button-group/button-group.js","checkbox/checkbox.js","checkboxes/checkboxes.js","ck-editor/ck-editor.js","clinicians-import/clinicians-import-modal.js","clinicians-import/clinicians-import.js","confirm/confirm.js","copy-form/copy-form.js","application-response/application-response.js","cybersource/cybersource.js","date/date.js","date-range/date-range.js","deficiency/deficiency.js","drivers-license-number/drivers-license-number.js","edit-history/edit-history.js","elavon/elavon.js","application-type/application-type.js","field/field.js","file-upload/file-upload-modal.js","file-upload/file-upload.js","flash-message/flash-message.js","form/form.js","form-builder/form-builder.js","form-builder-form/form-builder-form-pdf.js","form-builder-form/form-builder-form.js","form-field/form-field.js","help/help.js","html/html.js","icon/icon.js","input/input.js","inspection-pdf/inspection-pdf.js","inspection-spot-check-modal/inspection-spot-check-modal.js","inspection-visit/inspection-visit.js","inspections-schedule/inspections-schedule.js","inspections-scheduling/inspections-scheduling.js","list/list.js","loading/loading.js","longevity-credits-approval/longevity-credits-approval.js","messages/messages.js","month-year-select/month-year-select.js","multiple-autocomplete/multiple-autocomplete.js","multiple-select/multiple-select.js","nested-form/nested-form.js","number/number.js","page-settings/page-settings.js","phone/phone.js","photo-upload/photo-upload.js","postal-code/postal-code-modal.js","postal-code/postal-code.js","query/query.js","radio/radio.js","radios/radios.js","select/select.js","service-training-reimbursement/service-training-reimbursement.js","signature/signature.js","slush-box/slush-box.js","ssn/ssn.js","submit/submit.js","supplemental-training/education-report.js","supplemental-training/supplemental-training.js","supplemental-training-modal/education-report-modal.js","supplemental-training-modal/supplemental-training-modal.js","tabset-scroll/tabset-scroll.js","textarea/textarea.js","time/time.js","true-false/true-false.js","typeahead/typeahead.js","voucher-pay/voucher-pay.js","yes-no/yes-no.js","form-builder/form-builder-component/form-builder-component.js","form-builder/form-builder-component-conditions/form-builder-component-conditions.js","form-builder/form-builder-question-list/form-builder-question-list.js","form-builder/form-builder-question-show/form-builder-question-show.js","form-builder/form-builder-questions-edit/form-builder-questions-edit.js","form-builder/form-builder-skills-edit/form-builder-skills-edit.js","form-builder/form-builder-skills-list/form-builder-skills-list.js","form-builder-form/form-component/form-component.js","form-builder-form/form-group/form-group.js","form-builder-form/form-groups/form-groups.js","form-builder-form/form-question/form-question.js","form-builder-form/form-skill/form-skill.js","list/alpha-filter/alpha-filter.js","list/filter/filter.js","list/pagination/pagination.js"],"names":["angular","module","run","$rootScope","formFieldScope","name","id","label","title","requiredText","classes","instructions","blankText","selectShow","selectSort","selectValue","availableShow","availableSort","compareValue","arrayValue","service","method","groupBy","size","maxLength","placeholder","showBlank","showLabel","topLabel","showColon","modal","isRequired","showRequired","isDisabled","forceString","serviceOverride","multiple","sortable","vertical","pdf","innerForm","directive","$timeout","scope","element","attrs","$on","focusOn","e","timer","focus","cancel","controller","$scope","$modalInstance","message","$sce","trustAsHtml","ok","close","Format","AutoNumbers","restrict","licenseId","licenseCategoryId","autoNumber","showLinks","replace","templateUrl","link","elem","ctrl","length","undefined","$watch","get","then","auto_number","Array","isArray","dateFormats","ruleFormats","Date","FormatNumber","number","rule","numberFormatted","i","toString","FormatDate","dateFormat","format","$state","back","from","navigationBack","go","params","state","remove","$q","LicenseRequestLevels","CertificationLevels","ApplicationTypes","LicenseRequestApplicationTypes","LicenseLevelConfigurations","loading","portal","current","data","isPortal","promises","push","data_type","levels","allLevels","parameters","user_id","currentLevels","types","applicationTypes","certLevels","certificationLevels","license_request_id","lrat","licenseRequestApplicationTypes","config","levelConfig","all","initProms","renewalType","forEach","type","renewal","level","application_type_id","license_request_level_id","save","checked","component","elementAnswer","response","showLevel","show","curLevel","license_category_level_id","data_element_id","certLevel","clear","key","levelChange","indexOf","Permissions","loadingText","permission","permissionState","transclude","require","access","hasPermission","setLoader","off","this","text","groupLoading","buttonClass","ngModel","question","checkboxLabel","value","changeFunction","index","hideLabel","array","checkboxItem","wasEmpty","contains","updateArray","item","wasString","isString","split","splice","arr","toLowerCase","onChange","submitted","$setViewValue","isFunction","$injector","Validation","updateService","options","showValue","validation","requiredPositions","groups","additional_id","group_id","validate","validateQuestion","result","answer","invalid","isEmpty","$error","validationTimeout","$setValidity","data_point_id","newValue","oldValue","full_position","groupsBool","component_allow_multiple_groups","service_id","answerList","j","questions","currQuestion","includes","concat","original_value","option","checkbox","document","getElementById","isFull","max","filter","disabled","valueArr","compile","pre","timeouts","optionsLoaded","dirOptions","getOptions","Object","prototype","call","trim","$evalAsync","refresh","limit_position_ids","refreshOptions","data_point_code","refreshValidation","opt","setShowValue","$modelValue","refreshvalidation","generateStringFromArrays","$render","hide","getTitle","processingChange","height","toolbarGroups","skin","elm","attr","$root","ck","CKEDITOR","toolbar","forcePasteAsPlainText","removePlugins","on","setData","$viewValue","getData","bind","destroy","htmlSrc","template","$observe","newHtml","Upload","vm","file","file_content","uploading","working","fileChange","fileUpdated","base64DataUrl","content","filePicked","file_name","dismiss","$modal","Clinicians","Documents","preview","enterprise","website","portalURL","site_location","internalURL","response_id","getDocumentByResponseID","document_id","getByID","fileUpload","document_code","code","downloadClinicians","downloading","downloadExcel","createElement","href","download","click","importClinicians","open","animation","resolve","upload","file_updated","saved","yes","no","license_id","license_category_id","Licenses","settings","licenseID","licenses","$stateParams","FBResponses","LicenseRequests","Triggers","$filter","$window","Session","saving","progressing","completed","advance","submitting","loadingMessage","api","formsApi","CheckSession","validSession","checkIn","responseID","progress","vehicle_id","child_service","default_license_category_id","display_changed_answers","form","fireStartTrigger","started_on","start_trigger_name","fire","triggerID","start_trigger_id","licenseRequestID","setProgress","the_form","review","newContinuePage","portal_pages","visible","applicationID","submitRequest","d","defer","isUndefined","pages","tab_active","foundMatch","activePage","page","has_content","scrollTo","promise","showSave","currentPage","show_save_button","showSaveAndContinue","activePageIndex","pagesCount","showSubmit","copyCustomResponseFields","sections","section","expanded","k","components","l","group","edit","m","document_description","document_name","document_type","n","sub_components","subcomponent","o","subgroup","p","subquestion","deferred","answerRefresh","saveByForm","absoluteFurthestPageIndex","documentErrors","documentNames","map","error","join","setupValidationMessages","hasContent","a","b","doRecalculate","scrollTabIntoView","waitToFinish","loopCount","promiseFuncs","checkAdditionalFormsFactory","executeSequentialPromiseFactories","submissionMessage","reject","redirectImmediately","handleSubmit","submit","application","datapointAnswers","success","lastApplication","responses","every","getApplication","validationError","copy","current_triggers_firing_count","license","charges","checkout","tasks","finalPromise","reduce","prev","when","submitFailed","validationMessages","display_submit_confirmation","cleanupStateChange","event","confirm","window","onbeforeunload","preventDefault","returnValue","timeout","Payments","Regions","Resource","licenseRequestId","signTransaction","directPayment","copyBilling","directPaymentObject","transaction_license_requests","checkout_items_ids","payment_method","payment","merchant_defined_data10","regions","region","billing_region_id","billing_region_name","shipping_region_id","shipping_region_name","transactionID","transactionid","top","location","preSaveCyberSourceObject","mypayment","mytotals","totals","preSaveCyberSource","reference_number","sign","signature","signed","changeMethod","paymentMethods","paymentMethodName","toggleDirectPayment","direct_payment","directPaymentMethods","nonDirectPaymentMethods","selected_name","url","history","unsign","columnClick","isInspections","predicate","inspectionPred","inspectionRev","requestPred","requestRev","checkPaymentType","changeDirect","same_as_billing","shipping_street","billing_street","shipping_street_2","billing_street_2","shipping_municipality","billing_municipality","shipping_postal_code","billing_postal_code","paying","items","checkingAccountTypes","sum_balance_due","access_key","profile_id","enterpriseWebsite","enterpriseSiteLocation","transaction_uuid","guid","internal","userID","enterprise_id","enterpriseID","amount","signed_field_names","unsigned_field_names","signed_date_time","cyberSourceDate","locale","transaction_type","currency","bill_to_forename","bill_to_surname","bill_to_email","bill_to_address_line1","bill_to_address_city","bill_to_address_state","bill_to_address_country","bill_to_address_postal_code","merchant_defined_data5","merchant_defined_data6","merchant_defined_data7","merchant_defined_data8","merchant_defined_data9","unsigned","card_type","card_number","card_expiry_date","card_cvn","requestColumns","header","init","getAttributes","attributes","post_location","trustAsResourceUrl","hasOwnProperty","fee_message","getPaymentMethods","methods","GetSessionDataForPayment","bulkPayLicenseData","recordcount","bulkpaylicensedataObj","total","parseFloat","balance_due","toFixed","getLicenseRequestTotals","getCheckingAccountTypes","results","GetAbbreviation","cardTypes","countries","initialized","todayLoading","setTime","time","setHours","isValidDate","getHours","setMinutes","getMinutes","useTime","date","opened","dateOptions","showWeeks","altInputFormats","month","minMode","altMonthInputFormats","today","getMonth","getDate","getFullYear","useCurrentTimeToday","full","autoComplete","showToday","fixed","formatText","startDate","endDate","startLabel","endLabel","dateChanged","dateRange","$setDirty","querySelector","firstInvalid","IPDeficiencies","resultSet","deficiency","deficiencyId","resultClick","expandable","reqText","sort","fail","abbr","Logger","loggingTimeout","showDriversLicenseNumber","recordId","logAccess","getSectionType","boxNumber","setFields","boxone","driversLicenseNumber","change","masked","log","record","revertTimezone","showModified","deleted","pay","payment_method_id","expDateSplitArray","ssl_exp_date","shortenedExpDate","slice","copyPayment","saveElavonObject","payElavon","methodId","selectedMethod","ssl_payment_type","payment_provider_key","ssl_transaction_type","ssl_amount","ssl_country","ssl_card_type","ssl_first_name","ssl_last_name","ssl_email","ssl_phone","ssl_avs_address","ssl_city","ssl_state","getCreditCardTypes","creditCardTypes","getDebitCardTypes","debitCardTypes","LicenseCategoryLevels","typeLevels","typeLevel","isRenewal","typeOptions","hasLevels","defaultGroup","defaultApplicationType","defaultCertificationLevel","application_types","typeID","sprocValueFound","defaultValueFound","answerShowVal","typeAnswerVal","default_value","applicationTypeID","applicationTypeName","renewalTypeId","show_value","levelAnswerVal","license_category_levels","v","typeOptionsMapped","row","has_levels","typeChange","levelsChange","hideRadioBtn","checkboxOrRadio","$templateCache","directiveAttributes","post","FileTypes","file_upload_existing_docs","question_id","existingFileSelected","newFileSelected","validationText","getByEnterprise","extensions","existingFileUpdated","documentParameters","documentTypes","fromForm","showDescription","requireTextFields","profilePictureFileName","openDocumentModal","document_type_id","description","document_locked","locked","file_upload_description","fbForm","isFb","setValidationMessages","$compile","noPermission","handleDisabled","handleDisabledTimer","handleDisabledTimeout","buttons","transcludedButtons","appendChild","onSubmit","$broadcast","submissionTimer","submissionTimeout","submitEventHandler","required","$invalid","field","$name","conditions_met","subComponent","subGroup","subQuestion","formType","sets","elements","attachments","changesMade","showLayouts","showPages","scrlTabsApi","label_position_options","applicant_access","apply_label_position","applyLabelPosition","addPage","form_id","sort_order","continue_button_label","save_button_label","removePage","pageNameChanged","openPageSettings","changed","switchView","layout","builderType","savePageSettings","show_settings","addSection","page_id","removeSection","initComponent","initialQuestions","component_type_id","limit_document_type_ids","limit_document_type_ids_array","limit_position_ids_array","limit_vehicle_type_ids","limit_vehicle_type_ids_array","skill_question_ids","skill_show_points","skill_default","updateEditList","updateSelectedList","set","data_set_id","data_set","orignalLicenseID","data_points","reverse","point","object","addComponent","section_id","component_conditions","allow_multiple_groups","maximum_groups","groups_until_list","content_type","update_from_form_add","removeComponent","pageOptions","containment","scrollableContainer","containerPositioning","accept","sourceItemHandleScope","destSortableScope","itemScope","sortableScope","$id","orderChanged","sectionOptions","itemMoved","componentOptions","$parent","editElement","original","revertElement","allDisabled","toggleAllDisabled","allUpdateFromForm","toggleAllUpdate","allShowInGrid","toggleAllShowInGrid","allRequired","toggleAllRequired","label_position","checkIfImageOrPDF","document_file_name","pop","getDocumentURL","toUpperCase","pdf_preview_content","getPDFPreviewContent","getPDFFileContent","browser","navigator","msSaveOrOpenBlob","dataUrltoBlob","doc","contentWindow","write","URL","createObjectURL","count","deficiencies","deficiencyScore","inspectionChecklist","httpLoading","progressListener","finishListener","ready","finishListenerTimer","iElem","iAttrs","lowercaseFirstLetter","string","charAt","initializeAnswers","answers","getComponentAnswers","isList","trainingId","isValidGuid","other_file_groups","isValidGuidList","ids","console","val","select_show","answerArray","escapeString","str","checkConditions","groupID","satisfied","answerIfStatement","ifStatement","cIndex","condition","and_flag","left_parenthesis","answerStatement","aIndex","aiIndex","operator","isObject","date_option","computed","num_unit","parseInt","isNaN","setDate","setMonth","result_set_id","right_parenthesis","eval","component_type","componentHasContent","contentIndex","furthestPageIndex","display_blank_zero","focusQuestion","focusText","$destroy","setOptions","getDescendantProp","obj","desc","$parse","html","contents","alt","ariaLabel","entireWidth","valid","test","getClasses","getWidth","max_length","Math","min","ceil","onFormSubmit","inspection","decodeHtml","encodedHtml","txt","innerHTML","score","checklist","footer","passingChecklist","inspectionID","comments","require_responsible_party_signoff","signature_type_in_person","Services","IPVisits","spotCheckInfo","vehicle","new_vehicle","services","selectParameter","addVehicle","getServicesFromVehicleId","is_default","removeVehicle","addService","serviceId","idx","findIndex","postSpotCheckInspection","ret","visit","masterVisit","visitID","resetting","isDetailsOpen","isInspectionsOpen","isAvaliableOpen","vehicles","expiration_date","toLocaleString","nativeJSDateFormat","date_time_set","inspection_date_time","inspection_date","Date_Time_Set","addInspector","inspector","inspectors","newInspector","inspections","serial_number","filterAdded","isServiceAvailable","reset","setInspectionTime","DocumentTypes","creating","getOtherDocuments","otherTypes","messages","documents","pass","service_template","data_object_id","removeInspector","addGroup","added","removeGroup","closeGroup","setEdit","Cache","DataElements","listParams","numPerPage","bulkCreateVisits","view","getServiceClassification","classifications","serviceClassificationOptions","daysLeftInMonth","now","endDay","getYear","daysLeftInYear","endofyear","one_day","getTime","hideOptions","display","expireLengths","inactiveServiceOptions","serviceLabels","getExpireLength","expireLength","setRange","start","end","setHideCriteria","hideDate","hideEmptyExpireDate","getExpiring","inactiveVehicle","inactiveService","activeVehicle","activeService","inactiveCriteria","rangeLength","alert","serviceClassification","unshift","cacheList","getState","sortBy","search","setState","setCounts","service_expired_count","vehicle_expired_count","has_no_expiration","expired","expireSelect","has_expired","will_expire","getDisplayString","vehicleLabels","vehicleColumns","info","showDashes","revertTimeZone","compare","checkAllServices","checkAll","stopImmediatePropagation","bulkActionItems","inBulkApply","bulkCreateChange","service_name","vehicle_type","changeBack","setAllDates","setAllTimes","setAllInspectors","inspector_id","setAllServiceChecklist","template_id","setAllVehicleChecklist","cacheListAttrs","defaultSort","defaultSortOrder","showPagination","showAlpha","alphaField","showSearch","defaultNumPerPage","records","columns","filters","advancedFilters","clickable","bulkActions","recordsLoading","listLoading","showBulkAction","bulkActionRunning","linkDisabled","hidePdf","criteria","stopPropagation","subList","subRecords","subColumns","pdfLinkDisabled","alphaFilterChanged","letter","alphaFilter","masterFilter","pageChanged","perPageChanged","perPage","filterChanged","keep","advancedFilterOn","isApplyAll","filtered","recordsSet","numOfSortOrderCols","sublist","subcolumns","subrecords","documentURL","recordsTotal","dynamic","pageRecords","searchTimeout","getRecords","filteredRecords","countTimeout","getCount","oldCriteria","evaluateField","dateTimeFlag","broke","f","vehicles_serial_number","evaluateJSON","fullName","optionalTime","dirtyVal","dirtyArr","cleanArr","dirtyStr","fileSize","investigation_external_document_name","investigation_external_document_file_name","determineClasses","column","floor","mod","c","getInfoFields","shift","advancedFilter","changeState","dropDown","openDocument","htmlLink","checkPermission","applyAll","skipBulkAction","applyOne","initBulkAction","bulkAction","showActionForRecord","hideAction","hideActionPermission","filteredOut","reverseDefaultSort","isTotalUndefined","setCachedFilters","cachedFilters","checkedCache","of","oldFilters","oldRecords","oldColumns","cacheLoading","old","newie","newVal","oldVal","cachedAdvancedFilters","opts","x","partial","parent","input","out","ServiceUserLongevities","Users","service_users","serviceUserLongevities","check_all","inactiveServiceUsers","longevityGet","serviceUsers","user","approved","sul","nameandnumber","approve","focusOnChange","trust","year","monthYear","months","years","yearOffset","yearSpan","$http","suggestionsArr","modelArr","apiUrl","beforeSelectItem","afterSelectItem","beforeRemoveItem","afterRemoveItem","onChangeFunction","existingLoaded","selectedOptions","objectProperty","selectedItemIndex","errMsgRequired","disable","isOpen","getSuggestionsList","onBlur","relatedTarget","classList","target","toggleOpen","keyParser","$event","keys","38","40","8","13","9","27","keyCode","inputValue","removeAddedValues","filteredSuggestionArr","alreadyAddedValues","onSuggestedItemsClick","selectedValue","isDuplicate","duplicate","equals","isAdded","itemIndex","mouseEnterOnItem","cachedArr","isHover","isFocused","onFocus","onMouseEnter","onMouseLeave","keyPress","charCode","which","integerOnly","positiveOnly","step","money","pattern","isNumeric","isFinite","setPhone","boxtwo","boxthree","phone","valueList","overwriteOnChange","resizeOptions","quality","width","resizeConditions","postalCode","addresses","FIPSLookup","select","address","lookupZip","postalSearching","getByPostalCode","failMessage","city","county","city_name","county_name","region_id","postal_code","$viewChangeListeners","$eval","ngChange","Queries","cacheRecords","previewId","queryChanged","query","display_bulk_actions","query_page","link_state","query_page_parameters","queryPageParameter","param","json","query_column_values","sortObjectArray","queryColumnValue","query_column","query_column_parameters","queryColumnParameter","query_filter_values","queryFilterValue","display_label","query_filter","query_advanced_filter_values","queryAdvancedFilterValue","query_advanced_filter","exactMatch","exact_match","default_sort","default_order","defaultOrder","query_criteria","queryCriteria","criteriaValue","skipit","doquotes","query_calculated_value","query_field","daysVal","Number","compareDate","query_operator","recordsWatchInit","queryState","queries","cachedQuery","found","default_view","radioLabel","RadioDirectiveTag","__tag","directiveScope","extend","useDefault","multiSelect","optionClause","existingOptionsLoaded","selectedArray","needToChangeToString","newArray","getNameFromListArray","valueArray","ServiceUserTrainings","TrainingUsers","FBForms","removeTraingingFromDict","oldAnswer","userId","training_id","usedTrainingIndex","userTrainingUsed","iter","trainings","addTraingingToDict","training","removeIndex","calculateReimbursementRuleTime","reimbursement_rules","certOffset","serviceOffset","certRuleTime","serviceRuleTime","timezoneOffset","getTimezoneOffset","setRuleDate","reimbursement_certification_length","reimbursement_certification_length_type","reimbursement_service_length","reimbursement_service_length_type","certification_rule_time","service_rule_time","ruleTime","setFullYear","serviceUserTrainings","setUpAnswers","getTrainingsForReimbursement","first_name","last_name","reimburse","course_name","reimbursement","find","reimburse_date","reimburse_amount","training_user","training_completed_on","completed_on","training_pass_fail","training_attendee_status_name","getReimbursementRules","getServiceUsersForReimbursement","certTimezoneOffset","primary_cert_initial_issue_date","serviceTimezoneOffset","service_user_start_date","certLengthPass","serviceLengthPass","sut","trainingSelected","userSelected","name_and_number","calculateTotalReimbursementAmount","reimbursementAmount","Account","$asyncValidators","modelValue","viewValue","apiLocation","password","user_name","userAccount","display_name","Authentication","showUsername","$dirty","cleanupSubmitHandler","add","addAll","filterFn","removed","removeByAttr","removeAll","up","upitem","down","downitem","slushbox","selectedOptionClause","availableOptionClause","newModel","domOptions","setAttribute","showSSN","ssn","setSsn","security","substring","isGenerated","filterFound","Levels","Trainings","expandedCourse","currentTopic","zero","levelsLoading","certificationLevel","applicationType","application_type","certification_levels","cl","trainingLevels","trainingsLoading","calculateLevels","userProgress","getUserLevelProgress","levelID","totalRequired","totalCount","levelRequirementSummaries","requiredHours","completedHours","levelTotalString","levelRequirement","cHours","rHours","per","progressPer","getRemainingHours","topic","remainingHours","removeCourse","courseID","removeAttendeeFromCourse","addCourse","t","checkCourseOptions","courses","course","selectedOption","LicenseRequestSupplementalTrainingTrainings","supplementalTrainings","completedTrainingParameters","completedOnly","otherApplications","getTrainingValidationDates","validationDates","editTraining","topics","training_topics","topic_id","topic_name","availableoptions","selected_options","training_topic","removeTraining","dateCheck","start_date","end_date","complete","override_complete","required_requirement_hours","required_requirement_flex_hours","completed_hours","used_hours","completed_flex_hours","used_flex_hours","used_requirement_flex_hours","missingFlexRequirements","requirements","requirement","required_topic_hours","max_hours","all_hours","required_hours","remaining_hours","required_flex_hours","remaining_flex_hours","override","override_required_flex_hours","required_flex_hours_actual","hasRequirements","Topics","TrainingLocations","TrainingFields","selectedTopic","locationsLoading","documentsLoading","showWarning","getTopicOptions","topicID","supplementalOnly","temp","checkBoxOptions","courseTopics","getEducationVerificationDates","dates","parse","$$hashKey","checkDate","completedOn","getUTCHours","locations","fields","locationChange","trainingLocation","locationId","certificate","fileContent","fileName","postCourseUserSummary","training_location_id","training_location","optionChange","training_location_name","topicChange","changing","hasOptions","any","provider","defaultConfig","showDropDown","showTooltips","tooltipLeftPlacement","tooltipRightPlacement","scrollBy","autoRecalculate","setShowDropDown","setShowTooltips","setTooltipLeftPlacement","setTooltipRightPlacement","setScrollBy","setAutoRecalculate","$get","scrollableTabsetConfig","$interval","isButtonsVisible","dropDownClass","dropDownMenuClass","dropDownHeaderTemplateUrl","dropDownHeaderClass","$el","dropdownTabs","hideButtons","hideDropDown","tooltipRightHtml","tooltipLeftHtml","disableLeft","disableRight","tooltipLeftDirection","tooltipRightDirection","mouseDownInterval","isHolding","winResizeTimeout","userShowDropDown","userShowTooltips","scrollByPixels","reCalcAll","arg","duration","callback","isLinear","scrollLeft","increment","position","animateScroll","elapsedTime","linearTween","easeInOutQuad","setTimeout","currentTime","onWindowResize","clearTimeout","$apply","cancelMouseDownInterval","scrollButtonDown","direction","realScroll","tabContainer","reCalcSides","scrollButtonUp","activateTab","tab","scrollWidth","offsetWidth","reCalcTooltips","rightTooltips","leftTooltips","allTabs","querySelectorAll","rightPosition","getBoundingClientRect","left","leftPosition","heading","getAttribute","ignore","textContent","rightTooltipsHtml","leftTooltipsHtml","tabToScroll","argInt","activeTab","dif","autoRecalc","tabsetElement","$watchCollection","isolateScope","tabs","tabScope","tabScrollTitle","cols","rows","textarea","put","needed","addCourseModal","filterArray","onType","searchBy","valueChange","show_vehicles_without_type","vehicle_restrict_services","optVal","intialValidation","VoucherPay","compareAmounts","getExistingVouchersByLicenseRequestID","existingVouchers","getVoucherAmounts","voucherAmounts","voucherAmount","existingVoucher","quantity","reorder","activeInactive","instructions2","parentQuestion","parentComponent","calculatedFieldCalculationTypeOptions","reimburseLengthTypes","contentOptions","contentTypeOptions","componentTypeInit","formElementInit","form_elements","element_id","element_code","element_instructions","componentTypeChange","calculation_type","calcFieldConditions","component_id","ssn_setting","update_from_form","share_files","show_in_grid","masked_setting","showValidation","question_type_id","question_type","validation_type_id","type_message","dataSetInit","license_category_specific","data_point","attribute_id","table_name","encrypted","data_point_table_name","compound_id","instruction_text","expression","expression_message","dataSetChange","initialQuestion","initialFound","initialLength","foreignDataSetInit","foreignDataSetChange","allow_add","allow_edit","componentTypes","old_data_points","old_questions","componentType","parent_question_id","foreign_data_set_id","foreign_data_set","isForeignDataSet","nullGuid","guidCondition","nullCondition","dataPointChange","setProperties","limitPositionsChange","getByAttr","limitVehicleTypesChange","vehicle_types","limitDocumentTypesChange","document_types","conditionalChange","conditional","formElementChange","allowMultipleGroupChange","update_from_form_update","update_from_form_delete","showShareFiles","cke_skin","$watchGroup","newValues","oldValues","conditionalComponent","hitComponent","getComponentQuestion","questionChange","getComponentFromID","componentID","andOrOptions","leftParenOptions","rightParenOptions","initial","operators","current_license_id","order","applicationTypeExists","exists","q","ssn_setting_options","true_false_options","yes_no_options","changeUpdateFromFormBasedOnDisabled","updateFromFormInstructions","setUpdateFromFormInstructions","getForForm","questionOrderChanged","saveQuestion","allow_sub_components","allow_dynamic_addition","allow_dynamic_edit","addQuestion","addSubComponent","questionTypeInit","questionTypeChange","questionNameChange","old_name","removeQuestion","questionOptions","subComponentOptions","toggleValidation","EXSkill","EXSkillCategory","skillsloading","SkillCategoriesFilter","selectedskills","showScores","skillDefault","skills","allSKills","skillsDefaultOptions","getActive","Skills","y","total_points","points","updateBothLists","addSelecteSkills","SkillCategories","skillscolumns","skillfilters","skillid","skill","setSelectedIDs","newList","oldList","htmlText","max_points","setSelectedValues","updateOrder","removeSkill","isEven","getPassButtonClass","getFailButtonClass","selectedSkillOptions","selectedSkill","parentGroup","show_documents_without_type","append","default_group","component_data_set_code","data_set_code","defaultQuestion","document_type_copy","document_name_copy","note","phone_ext","show_comments","initializeSubComponentAnswers","getAnswer","stringVal","dataset","initGroup","setHeaders","headers","globalHeaders","collapsed","groupForms","$valid","Vehicles","dynamicDelete","answerChanged","previousAction","dynamicDeleteShow","dynamicAdd","dynamicAddShow","dynamicDisabled","childServiceDisabled","actionChanged","single_group_action","setupAddress","data_point_address_field","data_point_address_postal_data_point_id","positionsAnswers","positionsOnForm","positionAnswer","values","apply","tempOptions","positionCount","comparisonResults","positionOnForm","match","requiredPosition","retrieveCourseInfo","courseInfo","attendee_count","attendee_max_count","remainingSpots","locationinfo","street1","street2","municipality","regioninfo","abbreviation","checkPrerequisites","failedPrerequisites","customFunctionMessage","permitNumber","vehicleID","record_id","getCertificationByNumber","permitNumberCount","vehicle_certification_number","vcn","serialNumber","getVehicleBySerialNumber","serialNumberCount","vehicle_serial_number","vsn","email","getUserbyEmail","yearCount","calendar_year","personnelID","serviceID","getUserByServicePersonnelID","coreRosterUser","userCount","service_users_personnel_id","sup","ServiceAreaCities","ServiceAreaCounties","ServiceAreaPostalCodes","ServiceAreaCensusTracts","IPComment","Positions","showReviewComment","showDynamicComment","currComment","administrative_review","getAdministrativeCommentsByQuestionId","createdon","createdOn","createdby","questionId","fbQuestionId","setAutoCompleteByDisabled","toggleReviewComment","toggleDynamicComment","enableAdminComments","saveReviewComment","comment","saveAdministrativeComment","resolveComment","resolveAdministrativeComment","resolved","toggleShowOnPdf","openImageModal","showServiceRosterList","clearQuestion","numberCheck","keyEvent","stateChanged","stateCode","newState","datasetquestion","getByStateCode","initQuestion","populateSubComponent","data_point_foreign_data_set_code","populateGroup","convertDateToUTC","hasPositions","filterOptions","originalOptions","custom_filter","newOpts","children","childAdded","child","filter_data_point_code","current_training_id","actionOptions","component_group_add","component_group_update","component_group_remove","financialNumberIds","parentDeficiencies","counter","list_count","hasService","hasUser","position_original_value","getServiceDesignation","positions","questionDefScore","newResult","passed","tallyScores","getFaillButtonClass","updateScore","talliedPoints","alpha","perPages","numOfPages","setCurrentPage","setPerPage"],"mappings":"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","file":"components-24.12.2.2.min.js","sourcesContent":["'use strict';\r\n\r\nangular.module('imagetrend.components', [\r\n 'imagetrend.components.tpl'\r\n])\r\n.run(['$rootScope', function ($rootScope) {\r\n $rootScope.formFieldScope = {\r\n // strings\r\n name: '@?',\r\n id: '@?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n classes: '@?',\r\n instructions: '@?',\r\n blankText: '@?',\r\n selectShow: '@?',\r\n selectSort: '@?',\r\n selectValue: '@?',\r\n availableShow: '@?',\r\n availableSort: '@?',\r\n compareValue: '@?',\r\n arrayValue: '@?',\r\n service: '@?',\r\n method: '@?',\r\n groupBy: '@?',\r\n size: '@?',\r\n maxLength: '@?',\r\n placeholder: '@?',\r\n\r\n // bools\r\n showBlank: '=?',\r\n showLabel: '=?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n modal: '=?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n isDisabled: '=?',\r\n forceString: '=?',\r\n serviceOverride: '=?',\r\n multiple: '=?',\r\n sortable: '=?',\r\n vertical: '=?',\r\n pdf: '=?',\r\n innerForm: '=?'\r\n }\r\n}])\r\n.directive('focusOn', ['$timeout', function ($timeout) {\r\n return function (scope, element, attrs) {\r\n scope.$on(attrs.focusOn, function (e) {\r\n var timer = $timeout(function () {\r\n element[0].focus();\r\n }, 0);\r\n scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n };\r\n}])","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('AlertModalController', ['$scope', '$modalInstance', 'message', '$sce', function ($scope, $modalInstance, message, $sce) {\r\n $scope.message = $sce.trustAsHtml(message);\r\n\r\n $scope.ok = function () {\r\n $modalInstance.close(true);\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpAutoNumber', ['Format', 'AutoNumbers', function (Format, AutoNumbers) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n licenseId: '=?',\r\n licenseCategoryId: '=?',\r\n autoNumber: '=?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n showLinks: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n label: '@?',\r\n },\r\n replace: true,\r\n templateUrl: 'templates/auto-number/auto-number.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'auto_number'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.showLinks) { attrs.showLinks = false; } else { if (attrs.showLinks == 'true') { attrs.showLinks = true; } else { attrs.showLinks = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n\r\n //disabled\r\n if (scope.isDisabled == undefined) { scope.isDisabled = false; }\r\n\r\n scope.$watch('licenseId + licenseCategoryId', function () {\r\n if (scope.autoNumber == undefined && (scope.licenseId != undefined || scope.licenseCategoryId != undefined)) {\r\n AutoNumbers.get(scope.licenseId, scope.licenseCategoryId).then(function (auto_number) {\r\n if (Array.isArray(auto_number) && auto_number.length > 0) {\r\n scope.autoNumber = auto_number[0];\r\n }\r\n else {\r\n scope.autoNumber = auto_number;\r\n }\r\n }) \r\n }\r\n })\r\n\r\n scope.dateFormats = [\r\n { name: 'none', id: null },\r\n { name: 'yy', id: 'yy' },\r\n { name: 'yyyy', id: 'yyyy' },\r\n { name: 'yymm', id: 'yymm' },\r\n { name: 'yymmdd', id: 'yymmdd' },\r\n { name: 'yyyymmdd', id: 'yyyymmdd' }\r\n ];\r\n scope.ruleFormats = [\r\n { name: 'XXX', id: 'XXX' },\r\n { name: 'XXXX', id: 'XXXX' },\r\n { name: 'XXXXX', id: 'XXXXX' },\r\n { name: 'XXXXXX', id: 'XXXXXX' },\r\n { name: 'XXXXXXX', id: 'XXXXXXX' },\r\n { name: 'XXXXXXXX', id: 'XXXXXXXX' },\r\n { name: 'XXXXXXXXX', id: 'XXXXXXXXX' },\r\n { name: 'XXXXXXXXXX', id: 'XXXXXXXXXX' },\r\n { name: 'XXXXXXXXXXX', id: 'XXXXXXXXXXX' }\r\n ];\r\n\r\n scope.Date = function () {\r\n return new Date();\r\n }\r\n\r\n scope.FormatNumber = function (number, rule) {\r\n var numberFormatted = number;\r\n\r\n if (rule !== undefined && number !== undefined) {\r\n for (var i = 0; i < rule.length - number.toString().length; i++)\r\n numberFormatted = '0' + numberFormatted;\r\n }\r\n\r\n return numberFormatted;\r\n }\r\n\r\n scope.FormatDate = function (dateFormat) {\r\n var format = dateFormat;\r\n\r\n if (format == 'none') {\r\n format = null;\r\n }\r\n else if (format == 'yymm') {\r\n format = 'yyMM'\r\n }\r\n else if (format == 'yymmdd') {\r\n format = 'yyMMdd'\r\n }\r\n else if (format == 'yyyymmdd') {\r\n format = 'yyyyMMdd'\r\n }\r\n\r\n return format;\r\n }\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpBackController', ['$scope', '$rootScope', '$state', function ($scope, $rootScope, $state) {\r\n $scope.back = function () {\r\n if ($rootScope.$state.from.name != \"\" && $scope.navigationBack) {\r\n $state.go($rootScope.$state.from.name, $rootScope.$state.from.params);\r\n }\r\n else {\r\n if ($scope.params == null) {\r\n $scope.params = {};\r\n }\r\n $state.go($scope.state, $scope.params);\r\n } \r\n }\r\n }])\r\n .directive('hlpBack', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n replace: true,\r\n scope: {\r\n id: '@?',\r\n label: '@?',\r\n title: '@?',\r\n classes: '@?',\r\n state: '@?',\r\n params: '=?',\r\n navigationBack: '=?'\r\n },\r\n templateUrl: 'templates/back/back.html',\r\n controller: 'hlpBackController',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!attrs.id) { attrs.id = 'back'; }\r\n if (!attrs.label) { attrs.label = 'Back'; }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.classes) { attrs.classes = 'back'; }\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpBigElementController', ['$scope', '$q', 'LicenseRequestLevels', 'CertificationLevels', 'ApplicationTypes', 'LicenseRequestApplicationTypes', 'LicenseLevelConfigurations', '$state', function ($scope, $q, LicenseRequestLevels, CertificationLevels, ApplicationTypes, LicenseRequestApplicationTypes, LicenseLevelConfigurations, $state) {\r\n\r\n $scope.loading = true;\r\n $scope.portal = $state.current.data.isPortal;\r\n var promises = [];\r\n\r\n promises.push(LicenseRequestLevels.get({ data_type: 'User' }).then(function (levels) {\r\n $scope.allLevels = levels;\r\n }))\r\n\r\n if ($scope.parameters.user_id != null) {\r\n promises.push(LicenseRequestLevels.get($scope.parameters).then(function (levels) {\r\n $scope.currentLevels = levels;\r\n }))\r\n }\r\n else {\r\n $scope.currentLevels = [];\r\n }\r\n\r\n promises.push(ApplicationTypes.get({ data_type: 'User' }).then(function (types) {\r\n $scope.applicationTypes = types;\r\n }))\r\n\r\n if ($scope.parameters.user_id != null) {\r\n promises.push(CertificationLevels.get($scope.parameters).then(function (certLevels) {\r\n $scope.certificationLevels = certLevels;\r\n }))\r\n }\r\n else {\r\n $scope.certificationLevels = [];\r\n }\r\n\r\n if ($scope.parameters.license_request_id != null) {\r\n promises.push(LicenseRequestApplicationTypes.get($scope.parameters).then(function (lrat) {\r\n $scope.licenseRequestApplicationTypes = lrat;\r\n }))\r\n }\r\n else {\r\n $scope.licenseRequestApplicationTypes = [];\r\n }\r\n\r\n promises.push(LicenseLevelConfigurations.get($scope.parameters).then(function (config) {\r\n $scope.levelConfig = config;\r\n }))\r\n\r\n $q.all(promises).then(function () {\r\n var initProms = [];\r\n\r\n if ($scope.licenseRequestApplicationTypes.length == 0) {\r\n var renewalType = null;\r\n $scope.applicationTypes.forEach(function(type) {\r\n if (type.renewal) {\r\n renewalType = type.id;\r\n }\r\n });\r\n\r\n $scope.currentLevels.forEach(function (level) {\r\n $scope.levelConfig.forEach(function (config) {\r\n if (renewalType != null && config.application_type_id == renewalType && config.license_request_level_id == level.id) {\r\n initProms.push(LicenseRequestApplicationTypes.save({ license_request_id: $scope.parameters.license_request_id, application_type_id: renewalType, license_request_level_id: level.id, checked: true }).then(function (lrat) {\r\n $scope.licenseRequestApplicationTypes.push(lrat);\r\n }));\r\n }\r\n });\r\n });\r\n }\r\n\r\n $q.all(initProms).then(function () {\r\n if ($scope.component.elementAnswer == null) {\r\n $scope.component.elementAnswer = {};\r\n $scope.licenseRequestApplicationTypes.forEach(function (lrat) {\r\n $scope.component.elementAnswer[lrat.application_type_id + '%' + lrat.license_request_level_id] = lrat.checked;\r\n });\r\n }\r\n $scope.loading = false;\r\n })\r\n .catch(function (response) {\r\n // handle error\r\n }); ;\r\n })\r\n .catch(function (response) {\r\n // handle error\r\n }); ;\r\n\r\n $scope.showLevel = function (type, level) {\r\n var show = false;\r\n\r\n $scope.levelConfig.forEach(function (config) {\r\n if (config.application_type_id == type.id && config.license_request_level_id == level.id) {\r\n if (type.renewal) {\r\n if ($scope.portal) {\r\n $scope.currentLevels.forEach(function (curLevel) {\r\n if (curLevel.license_category_level_id == level.license_category_level_id || curLevel.data_element_id == level.data_element_id || level.data_element_id == null) {\r\n show = true;\r\n }\r\n else {\r\n $scope.certificationLevels.forEach(function (certLevel) {\r\n if (level.license_category_level_id == certLevel.license_category_level_id) {\r\n $scope.component.elementAnswer[type.id + '%' + level.id] = true;\r\n show = true;\r\n }\r\n })\r\n }\r\n })\r\n }\r\n else {\r\n show = true;\r\n }\r\n }\r\n else {\r\n show = true;\r\n }\r\n }\r\n })\r\n\r\n if (show && $scope.component.elementAnswer[type.id + '%' + level.id] == null) {\r\n $scope.component.elementAnswer[type.id + '%' + level.id] = false;\r\n }\r\n\r\n return show;\r\n }\r\n\r\n $scope.clear = function () {\r\n for (var key in $scope.component.elementAnswer) {\r\n $scope.component.elementAnswer[key] = false;\r\n }\r\n }\r\n\r\n $scope.levelChange = function(type, level) {\r\n for (var key in $scope.component.elementAnswer) {\r\n if (key == (type.id + '%' + level.id)) {\r\n $scope.component.elementAnswer[key] = true;\r\n } else if (key.indexOf('%' + level.id) >= 0) {\r\n $scope.component.elementAnswer[key] = false;\r\n }\r\n }\r\n }\r\n }])\r\n .directive('hlpBigElement', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/big-element/big-element.html',\r\n replace: true,\r\n controller: 'hlpBigElementController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?',\r\n pdf: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpButton', ['Format', 'Permissions', '$rootScope', function (Format, Permissions, $rootScope) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n id: '@?',\r\n label: '@?',\r\n title: '@?',\r\n classes: '@?',\r\n loading: '=?',\r\n loadingText: '@?',\r\n permission: '@?',\r\n permissionState: '@?',\r\n isDisabled: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: '^hlpButtonGroup',\r\n templateUrl: 'templates/button/button.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n if (!attrs.id) { attrs.id = 'button'; }\r\n if (!attrs.label) { attrs.label = 'Button'; }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.classes && attrs.classes != \"\") { attrs.classes = 'edit'; }\r\n if (!attrs.loadingText) { if (attrs.loading) { attrs.loadingText = Format.label(attrs.loading) } else { attrs.loadingText = 'Loading'; } }\r\n if (!attrs.permissionState && $rootScope.$state != null && $rootScope.$state.current != null) { attrs.permissionState = $rootScope.$state.current.name; }\r\n\r\n if (attrs.permission != null && attrs.permissionState != null) {\r\n Permissions[attrs.permission](attrs.permissionState).then(function (access) {\r\n scope.hasPermission = access;\r\n });\r\n }\r\n else {\r\n scope.hasPermission = true;\r\n }\r\n\r\n scope.$watch('loading', function (loading) {\r\n if (loading != null) {\r\n ctrl.setLoader(loading, scope.classes, scope.loadingText);\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpButtonGroup', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n classes: '@?',\r\n loading: '=?'\r\n },\r\n transclude: true,\r\n replace: true,\r\n controller: ['$scope', function ($scope) {\r\n this.setLoader = function (loading, classes, text) {\r\n $scope.groupLoading = loading;\r\n $scope.buttonClass = classes;\r\n $scope.loadingText = text;\r\n }\r\n }],\r\n templateUrl: 'templates/button-group/button-group.html',\r\n link: function (scope, elem, attrs, ctrl, transclude) {\r\n\r\n scope.groupLoading = false;\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpCheckbox', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n checkboxLabel: '@?',\r\n value: '=?',\r\n changeFunction: '&?',\r\n index: '=?',\r\n showColon: '=?',\r\n hideLabel: '@?',\r\n\r\n //required\r\n isRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //label\r\n showLabel: '@?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //bridge ** only use when multiple checkboxes directive can't be used.\r\n array: '=?',\r\n checkboxItem: '=?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n pdf: '=?'\r\n },\r\n transclude: true,\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/checkbox/checkbox.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'checkbox'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (attrs.hideLabel === undefined || attrs.hideLabel === null) { attrs.hideLabel = false }\r\n\r\n //label\r\n var wasEmpty = attrs.label == 'EMPTY';\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); } else { if (attrs.label == 'EMPTY') { attrs.label = ''; } }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0 || wasEmpty; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.requiredText) { attrs.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)) }\r\n\r\n if (!attrs.index) { attrs.index = 0 }\r\n\r\n if (scope.checkboxItem != null && typeof scope.checkboxItem != 'object') {\r\n scope.checkboxItem = { id: scope.checkboxItem, name: scope.checkboxItem };\r\n }\r\n\r\n scope.$watch('checkboxItem + array', function () {\r\n if (scope.checkboxItem != null && scope.array != null) {\r\n scope.ngModel = contains(scope.array, scope.checkboxItem.id);\r\n }\r\n });\r\n\r\n scope.updateArray = function (array, item, checked) {\r\n var wasString = false;\r\n\r\n if (angular.isString(array)) {\r\n if (array == '') {\r\n array = [];\r\n }\r\n else {\r\n array = array.split(',');\r\n }\r\n wasString = true;\r\n }\r\n if (item != null) {\r\n if (checked) {\r\n array = angular.isArray(array) ? array : [];\r\n if (!contains(array, item.id)) {\r\n if (wasString) {\r\n array.push(item.id);\r\n }\r\n else {\r\n array.push(item);\r\n }\r\n }\r\n }\r\n else {\r\n if (angular.isArray(array)) {\r\n for (var i = array.length; i--;) {\r\n if (array[i].id == item.id || array[i] == item.id) {\r\n array.splice(i, 1);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return wasString ? array.toString() : array;\r\n }\r\n\r\n // contains\r\n var contains = function (arr, item) {\r\n if (angular.isString(arr)) {\r\n arr = arr.split(',');\r\n }\r\n if (angular.isArray(arr)) {\r\n for (var i = arr.length; i--;) {\r\n if (arr[i] != null) {\r\n if (arr[i].id == item || (angular.isString(arr[i]) && arr[i].toLowerCase() == item.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (angular.isFunction(scope.changeFunction)) {\r\n scope.changeFunction();\r\n }\r\n }\r\n //ctrl.$viewChangeListeners.push(function () {\r\n // scope.$eval(attrs.ngChange);\r\n //});\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpCheckboxes\", [\r\n \"$injector\",\r\n \"Format\",\r\n \"Validation\",\r\n \"$timeout\",\r\n function ($injector, Format, Validation, $timeout) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n ngModel: \"=\",\r\n question: \"=?\",\r\n name: \"@?\",\r\n id: \"@?\",\r\n showLabel: \"@?\",\r\n updateService: \"@?\",\r\n isRequired: \"=?\",\r\n showRequired: \"=?\",\r\n options: \"=?\",\r\n label: \"@?\",\r\n title: \"@?\",\r\n requiredText: \"@?\",\r\n instructions: \"@?\",\r\n classes: \"@?\",\r\n selectShow: \"@?\",\r\n selectValue: \"@?\",\r\n service: \"@?\",\r\n method: \"@?\",\r\n isDisabled: \"=?\",\r\n topLabel: \"=?\",\r\n modal: \"@?\",\r\n showColon: \"=?\",\r\n vertical: \"=?\",\r\n parameters: \"=?\",\r\n pdf: \"=?\",\r\n showValue: \"=?\",\r\n validation: \"=?\",\r\n requiredPositions: \"=?\",\r\n groups: \"=?\" // for service user affiliations (positions)\r\n },\r\n require: \"ngModel\",\r\n transclude: true,\r\n replace: true,\r\n templateUrl: \"templates/checkboxes/checkboxes.html\",\r\n controller: [\r\n \"$scope\",\r\n \"$timeout\",\r\n function ($scope, $timeout) {\r\n $scope.additional_id = ($scope.question && $scope.question.group_id) ? $scope.question.group_id + ',' : '';\r\n $scope.validate = function () {\r\n if ($scope.validation) {\r\n Validation.validateQuestion(\r\n $scope.innerForm,\r\n $scope.validation,\r\n $scope.ngModel\r\n ).then(function (result) {\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty($scope.innerForm.$error);\r\n }\r\n });\r\n } else {\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid = !isEmpty(\r\n $scope.innerForm.$error\r\n );\r\n }\r\n }\r\n };\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText =\r\n \"Please select a \" +\r\n Format.label($scope.label || \"value\");\r\n }\r\n\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.isRequired) {\r\n if (\r\n $scope.ngModel == null ||\r\n $scope.ngModel.length == 0\r\n ) {\r\n $scope.innerForm.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n $scope.innerForm.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n $scope.validate();\r\n }\r\n }, 0);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n\r\n if ($scope.question !== undefined && $scope.question.data_point_id === 'ba99ae16-280a-4fe5-9dd1-755e03733ded') { // service_users_position Data Point\r\n // When options are updated, usually a user or service was change, update checkboxes as needed\r\n $scope.$watch('options', function (newValue, oldValue) {\r\n // case for multiple provider positions where full_position can be dropped\r\n if (newValue && oldValue && typeof (newValue[0]) !== \"string\" && newValue[0].full_position === null && newValue.length === oldValue.length) {\r\n for (var i = 0; i < newValue.length; i++) {\r\n newValue[i].full_position = oldValue[i].full_position;\r\n }\r\n }\r\n if (newValue !== null && Array.isArray(newValue)) {\r\n var groupsBool = $scope.groups && $scope.groups[0].component_allow_multiple_groups && $scope.groups[0].service_id !== null;\r\n // List of answers & original answers to allow checkboxes to be re-toggled when position is full\r\n $scope.answerList = [];\r\n // multiple service users & position from service license\r\n if (groupsBool) {\r\n for (var i = 0; i < $scope.groups.length; i++) {\r\n for (var j = 0; j < $scope.groups[i].questions.length; j++) {\r\n var currQuestion = $scope.groups[i].questions[j];\r\n // skip the question if it doesn't match the current checkbox question\r\n if (currQuestion.data_point_id !== 'ba99ae16-280a-4fe5-9dd1-755e03733ded') { continue; }\r\n\r\n // only check values on form in this instance\r\n if (currQuestion.answer.value !== null) {\r\n if (currQuestion.answer.value.includes(',')) {\r\n $scope.answerList = $scope.answerList.concat(currQuestion.answer.value.split(','));\r\n } else {\r\n $scope.answerList = $scope.answerList.concat(currQuestion.answer.value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n if ($scope.question.original_value !== null) {\r\n if ($scope.question.original_value.includes(',')) {\r\n $scope.answerList = $scope.answerList.concat($scope.question.original_value.split(','));\r\n }\r\n else {\r\n $scope.answerList = $scope.answerList.concat($scope.question.original_value);\r\n }\r\n }\r\n if ($scope.question.answer.value !== null) {\r\n if ($scope.question.answer.value.includes(',')) {\r\n $scope.answerList = $scope.answerList.concat($scope.question.answer.value.split(','));\r\n }\r\n else {\r\n $scope.answerList = $scope.answerList.concat($scope.question.answer.value);\r\n }\r\n }\r\n }\r\n\r\n for (var i = 0; i < newValue.length; i++) {\r\n const option = newValue[i];\r\n var checkbox = document.getElementById($scope.additional_id + option.id + '_checkbox');\r\n if (checkbox !== null) {\r\n // Inside of () is a check for Service User/Service Affiliation Data Set (position)\r\n // allow a \"Full\" position to be re-checked if the position isn't full.\r\n var isFull = (groupsBool) ? (option.max && option.max <= $scope.answerList.filter(function (id) { return id === option.id; }).length) : option.full_position;\r\n\r\n // uncheck checkbox if needed and handle disabling\r\n if ((option.max === 0 || $scope.answerList.length === 0) && checkbox.checked === true) {\r\n checkbox.checked = false;\r\n $scope.ngModel = []; // needed for single position forms, switching users then checking a previous box held; then click any position, can cause some fields to lose data\r\n }\r\n if (groupsBool) {\r\n checkbox.disabled = $scope.isDisabled || !$scope.show(option) || option.max === 0 || (isFull && checkbox.checked !== true);\r\n }\r\n else {\r\n checkbox.disabled = $scope.isDisabled || !$scope.show(option) || ((($scope.answerList.indexOf(option.id) === -1 && option.checked !== true && option.full_position === 1 && isFull) || option.max === 0) && option.max !== null);\r\n }\r\n }\r\n }\r\n }\r\n }, true);\r\n\r\n // Only do this for non-preview\r\n if ($scope.question.answer) {\r\n // Value can sometimes be updated after options & ensure no double click needed\r\n $scope.$watch('question.answer.value', function (newValue) {\r\n if (newValue !== null && newValue.length !== 0) {\r\n var valueArr = newValue.includes(',') ? newValue.split(',') : newValue;\r\n\r\n if (typeof (valueArr) === 'string') { valueArr = [valueArr]; }\r\n\r\n valueArr.forEach(function (answer) {\r\n var checkbox = document.getElementById($scope.additional_id + answer + '_checkbox');\r\n if (checkbox !== null) { checkbox.checked = true; }\r\n });\r\n }\r\n }, true);\r\n }\r\n }\r\n }\r\n ],\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n scope.timeouts = [];\r\n\r\n if (!attrs.name) {\r\n attrs.name = \"checkboxes\";\r\n }\r\n if (!attrs.id) {\r\n attrs.id = attrs.name;\r\n }\r\n if (!attrs.label) {\r\n attrs.label = Format.label(attrs.name);\r\n }\r\n if (!attrs.showLabel) {\r\n attrs.showLabel = attrs.label.length > 0;\r\n } else {\r\n if (attrs.showLabel == \"true\") {\r\n attrs.showLabel = true;\r\n } else {\r\n attrs.showLabel = false;\r\n }\r\n }\r\n if (!attrs.topLabel) {\r\n attrs.topLabel = false;\r\n } else {\r\n if (\r\n attrs.topLabel == true ||\r\n attrs.topLabel == \"true\"\r\n ) {\r\n attrs.topLabel = true;\r\n } else {\r\n attrs.topLabel = false;\r\n }\r\n }\r\n if (!attrs.updateService) {\r\n attrs.updateService = true;\r\n } else {\r\n if (\r\n attrs.updateService == true ||\r\n attrs.updateService == \"true\"\r\n ) {\r\n attrs.updateService = true;\r\n } else {\r\n attrs.updateService = false;\r\n }\r\n }\r\n if (!attrs.showColon) {\r\n attrs.showColon = true;\r\n } else {\r\n if (\r\n attrs.showColon == true ||\r\n attrs.showColon == \"true\"\r\n ) {\r\n attrs.showColon = true;\r\n } else {\r\n attrs.showColon = false;\r\n }\r\n }\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.title) {\r\n attrs.title = attrs.label;\r\n }\r\n\r\n if (!attrs.selectShow) {\r\n attrs.selectShow = \"name\";\r\n }\r\n if (!attrs.selectValue) {\r\n attrs.selectValue = \"id\";\r\n }\r\n if (!attrs.method) {\r\n attrs.method = \"get\";\r\n }\r\n if (!attrs.modal) {\r\n attrs.modal = false;\r\n } else {\r\n if (attrs.modal == \"true\") {\r\n attrs.modal = true;\r\n } else {\r\n attrs.modal = false;\r\n }\r\n }\r\n if (!attrs.forceString) {\r\n attrs.forceString = false;\r\n } else {\r\n if (attrs.forceString == \"true\") {\r\n attrs.forceString = true;\r\n } else {\r\n attrs.forceString = false;\r\n }\r\n }\r\n if (!attrs.vertical) {\r\n attrs.vertical = false;\r\n } else {\r\n if (attrs.vertical == \"true\") {\r\n attrs.vertical = true;\r\n } else {\r\n attrs.vertical = false;\r\n }\r\n }\r\n\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n scope.getOptions = function () {\r\n if (\r\n scope.options != null &&\r\n !(\r\n scope.service != null &&\r\n scope.service != \"\" &&\r\n scope.serviceOverride\r\n )\r\n ) {\r\n if (\r\n Object.prototype.toString.call(\r\n scope.options\r\n ) !== \"[object Array]\"\r\n ) {\r\n scope.options\r\n .split(\",\")\r\n .forEach(function (option) {\r\n scope.dirOptions.push({\r\n id: option.trim(),\r\n name: option.trim()\r\n });\r\n });\r\n scope.optionsLoaded = true;\r\n } else {\r\n scope.$evalAsync(function () {\r\n scope.dirOptions = scope.options;\r\n scope.optionsLoaded = true;\r\n });\r\n }\r\n } else if (\r\n scope.service != null &&\r\n scope.service != \"\"\r\n ) {\r\n var service = $injector.get(scope.service);\r\n\r\n service[scope.method](scope.parameters).then(\r\n function (data) {\r\n scope.dirOptions = data;\r\n if (attrs.updateService) {\r\n scope.options = data;\r\n }\r\n scope.optionsLoaded = true;\r\n }\r\n );\r\n } else {\r\n scope.optionsLoaded = true;\r\n }\r\n };\r\n scope.getOptions();\r\n\r\n // watch for signal to refresh the options\r\n scope.$watch(\r\n \"question.refreshOptions\",\r\n function (refresh) {\r\n if (scope.question !== undefined) {\r\n if (\r\n refresh !== undefined &&\r\n refresh !== null &&\r\n refresh.length &&\r\n (scope.service != null &&\r\n scope.service.length)\r\n ) {\r\n scope.parameters.limit_position_ids = refresh;\r\n scope.optionsLoaded = false;\r\n scope.getOptions();\r\n }\r\n scope.question.refreshOptions = null;\r\n }\r\n },\r\n true\r\n );\r\n\r\n // watch for signal to refresh the validation\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.data_point_code ==\r\n \"service_users_position\"\r\n ) {\r\n scope.$watch(\r\n \"question.refreshValidation\",\r\n function (refresh) {\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n if (\r\n refresh !== undefined &&\r\n refresh !== null &&\r\n refresh.length\r\n ) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n scope.ngModel\r\n ).then(function (result) {\r\n if (\r\n scope.question !==\r\n undefined &&\r\n scope.question\r\n .answer !==\r\n undefined\r\n ) {\r\n scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(\r\n scope.innerForm\r\n .$error\r\n );\r\n }\r\n });\r\n }\r\n scope.question.refreshValidation = null;\r\n }, 0)\r\n );\r\n },\r\n true\r\n );\r\n }\r\n\r\n // watch if options is coming from an array that hasn't been set yet\r\n scope.$watch(\"options\", function (options) {\r\n if (\r\n options != null &&\r\n scope.optionsLoaded &&\r\n scope.service == null\r\n ) {\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n\r\n if (\r\n Object.prototype.toString.call(\r\n scope.options\r\n ) !== \"[object Array]\"\r\n ) {\r\n scope.options\r\n .split(\",\")\r\n .forEach(function (option) {\r\n scope.dirOptions.push({\r\n id: option.trim(),\r\n name: option.trim()\r\n });\r\n });\r\n } else {\r\n scope.dirOptions = scope.options;\r\n }\r\n scope.optionsLoaded = true;\r\n }\r\n });\r\n\r\n scope.$watch(\"optionsLoaded\", function (optionsLoaded) {\r\n if (optionsLoaded && scope.showValue == null) {\r\n scope.dirOptions.forEach(function (opt) {\r\n opt.checked = false;\r\n });\r\n if (scope.showValue == null) {\r\n scope.setShowValue();\r\n }\r\n }\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n if (\r\n scope.isRequired &&\r\n scope.innerForm !== undefined\r\n ) {\r\n if (\r\n ngModel.$modelValue == null ||\r\n ngModel.$modelValue.length == 0\r\n ) {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n if (scope.question !== undefined) {\r\n scope.question.refreshvalidation = true;\r\n }\r\n }, 0)\r\n );\r\n\r\n // validate questions on options loaded - allows maxed positions to be disabled\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n ngModel.$modelValue\r\n ).then(function (result) {\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.answer !== undefined\r\n ) {\r\n scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n });\r\n\r\n scope.setShowValue = function () {\r\n if (\r\n ngModel.$modelValue != null &&\r\n scope.dirOptions != null\r\n ) {\r\n scope.showValue = generateStringFromArrays(\r\n ngModel.$modelValue,\r\n scope.dirOptions\r\n );\r\n }\r\n };\r\n\r\n // see if this needs to be wrapped in a $timeout\r\n ngModel.$render = function () {\r\n if (ngModel.$modelValue != null) {\r\n if (\r\n scope.showValue == null &&\r\n scope.optionsLoaded\r\n ) {\r\n scope.setShowValue();\r\n }\r\n }\r\n\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n ngModel.$modelValue\r\n );\r\n }\r\n };\r\n\r\n scope.show = function (item) {\r\n return (\r\n typeof item.hide == \"undefined\" ||\r\n item.hide == null ||\r\n item.hide == false ||\r\n item.checked != false\r\n );\r\n };\r\n scope.getTitle = function (item) {\r\n return scope.show(item)\r\n ? scope.title\r\n : \"Maximum number of positions reached\";\r\n };\r\n\r\n scope.onChange = function () {\r\n scope.submitted = false;\r\n scope.processingChange = true;\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n scope.setShowValue();\r\n if (scope.isRequired) {\r\n if (\r\n ngModel.$modelValue == null ||\r\n ngModel.$modelValue.length == 0\r\n ) {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n ngModel.$modelValue\r\n ).then(function (result) {\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.answer !==\r\n undefined\r\n ) {\r\n scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(\r\n scope.innerForm.$error\r\n );\r\n }\r\n });\r\n }\r\n\r\n scope.processingChange = false;\r\n }, 0)\r\n );\r\n };\r\n\r\n scope.submitted = false;\r\n scope.$on(\"form:submit\", function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on(\"$destroy\", function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n };\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('ckEditor', ['$timeout', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n scope: {\r\n height: '@?',\r\n toolbarGroups: '=?',\r\n skin: '=?',\r\n remove: '=?'\r\n },\r\n link: function (scope, elm, attr, ngModel) {\r\n if (!ngModel) return;\r\n if (!scope.height) {\r\n scope.height = 250;\r\n }\r\n if (!scope.toolbarGroups) {\r\n scope.toolbarGroups = [\r\n { name: 'clipboard', groups: ['clipboard', 'undo'] },\r\n { name: 'links' },\r\n { name: 'insert', groups: ['Image', 'Table', 'HorizontalRule', 'SpecialChar', 'PageBreak'] },\r\n { name: 'tools', groups: ['Maximize'] },\r\n { name: 'others' },\r\n '/',\r\n { name: 'basicstyles', groups: ['basicstyles', 'cleanup'] },\r\n { name: 'paragraph', groups: ['list', 'indent', 'blocks', 'align'] },\r\n { name: 'styles' },\r\n { name: 'colors' },\r\n { name: 'about' }\r\n ];\r\n }\r\n\r\n // Set Skin\r\n if (!scope.skin && scope.$root.$state.current.name === \"portal.menus.login\") {\r\n scope.skin = 'bootstrapck';\r\n }\r\n else if (!scope.skin || scope.skin == '')\r\n {\r\n scope.skin = 'moono';\r\n }\r\n\r\n // Remove any plugins (mostly toolbar things)\r\n if (!scope.remove || scope.remove == '')\r\n {\r\n scope.remove = 'liststyle,exportpdf,smiley,iframe,showblocks,copyformatting';\r\n }\r\n else\r\n {\r\n scope.remove += 'liststyle,exportpdf,smiley,iframe,showblocks,copyformatting';\r\n }\r\n\r\n var ck = CKEDITOR.replace(elm[0], {\r\n toolbar: 'Regular',\r\n forcePasteAsPlainText: 'true',\r\n height: scope.height,\r\n toolbarGroups: scope.toolbarGroups,\r\n skin: scope.skin,\r\n removePlugins: scope.remove\r\n });\r\n\r\n ck.on('instanceReady', function () {\r\n ck.setData(ngModel.$viewValue);\r\n });\r\n\r\n ck.on('change', function () {\r\n var timer = $timeout(function() {\r\n ngModel.$setViewValue(ck.getData());\r\n }, 0);\r\n scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n\r\n ngModel.$render = function (value) {\r\n ck.setData(ngModel.$viewValue);\r\n };\r\n\r\n elm.bind('$destroy', function () {\r\n ck.destroy();\r\n });\r\n }\r\n }\r\n }])\r\n .directive('ckHtml', ['$sce', function ($sce) {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n htmlSrc: '@?',\r\n id: '@?'\r\n },\r\n transclude: true,\r\n template:\r\n '
',\r\n link: function (scope, elm, attr) {\r\n attr.$observe(\"htmlSrc\", function () {\r\n scope.newHtml = $sce.trustAsHtml(scope.htmlSrc);\r\n });\r\n }\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('ImportCliniciansModalController', ['$scope', '$modalInstance', 'Upload', function ($scope, $modalInstance, Upload) {\r\n\r\n $scope.vm = {\r\n file: null,\r\n file_content: null\r\n }\r\n $scope.uploading = false;\r\n $scope.working = false;\r\n\r\n $scope.fileChange = function () {\r\n if (!$scope.working) {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.fileUpdated = function (file) {\r\n $scope.working = true;\r\n Upload.base64DataUrl(file).then(function (content) {\r\n $scope.vm.file_content = content;\r\n $scope.working = false;\r\n $scope.uploading = false;\r\n })\r\n }\r\n\r\n $scope.filePicked = function () {\r\n $scope.uploading = true;\r\n }\r\n\r\n $scope.save = function () {\r\n if ($scope.vm.file != null) {\r\n $modalInstance.close({\r\n file_name: $scope.vm.file.name,\r\n file_content: $scope.vm.file_content\r\n });\r\n }\r\n else {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpCliniciansImportController', ['$scope', '$rootScope', '$modal', 'Clinicians', 'Documents',\r\n function ($scope, $rootScope, $modal, Clinicians, Documents) {\r\n $scope.preview = false;\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n if ($rootScope.enterprise && $rootScope.enterprise.website) {\r\n $scope.portalURL = $rootScope.enterprise.website;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.portalURL;\r\n }\r\n }\r\n else {\r\n if ($rootScope.enterprise && $rootScope.enterprise.site_location) {\r\n $scope.portalURL = $rootScope.enterprise.site_location;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.internalURL;\r\n }\r\n }\r\n\r\n if ($scope.parameters.response_id) {\r\n Clinicians.getDocumentByResponseID($scope.parameters.response_id).then(function (document_id) {\r\n if (document_id) {\r\n Documents.getByID(document_id).then(function (file) {\r\n $scope.fileUpload = {\r\n file_name: file.file_name,\r\n document_id: file.id,\r\n document_code: file.code,\r\n service_id: $scope.parameters.service_id\r\n };\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n });\r\n }\r\n else {\r\n $scope.fileUpload = {\r\n file_content: null,\r\n file_name: null,\r\n service_id: $scope.parameters.service_id\r\n };\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n }\r\n });\r\n } else {\r\n $scope.fileUpload = {\r\n file_content: null,\r\n file_name: null,\r\n service_id: $scope.parameters.service_id\r\n };\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n }\r\n\r\n $scope.downloadClinicians = function () {\r\n $scope.downloading = true;\r\n if ($scope.parameters.service_id) {\r\n Clinicians.downloadExcel($scope.parameters.service_id).then(function (data) {\r\n data = \"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,\" + data;\r\n var link = document.createElement(\"a\");\r\n link.href = data;\r\n link.download = \"clinicians.xlsx\"\r\n link.click();\r\n\r\n $scope.downloading = false;\r\n });\r\n }\r\n else {\r\n //Form is in preview mode\r\n $scope.downloading = false;\r\n $scope.preview = true;\r\n }\r\n }\r\n\r\n $scope.importClinicians = function () {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/clinicians-import/clinicians-import-modal.html',\r\n controller: 'ImportCliniciansModalController',\r\n resolve: {\r\n }\r\n }).result.then(function (upload) {\r\n if (upload != null) {\r\n $scope.fileUpload.file_content = upload.file_content;\r\n $scope.fileUpload.file_name = upload.file_name;\r\n $scope.fileUpload.file_updated = true;\r\n $scope.fileUpload.saved = false;\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n }\r\n });\r\n }\r\n }])\r\n .directive('hlpCliniciansImport', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/clinicians-import/clinicians-import.html',\r\n replace: true,\r\n controller: 'hlpCliniciansImportController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('ConfirmModalController', ['$scope', '$modalInstance', 'message', function ($scope, $modalInstance, message) {\r\n $scope.message = message;\r\n\r\n $scope.yes = function () {\r\n $modalInstance.close(true);\r\n }\r\n\r\n $scope.no = function () {\r\n $modalInstance.close(false);\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n });\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('CopyFormModalController', ['$scope', '$modalInstance', 'name', 'license_id', 'license_category_id', 'Licenses', function ($scope, $modalInstance, name, license_id, license_category_id, Licenses) {\r\n $scope.settings = {};\r\n $scope.settings.name = name;\r\n $scope.settings.licenseID = license_id;\r\n $scope.settings.license_category_id = license_category_id;\r\n $scope.licenses = [];\r\n\r\n // Get other licenses from the same category\r\n Licenses.get({ license_category_id: license_category_id }).then(function (result) {\r\n if (result != null) {\r\n $scope.licenses = result;\r\n }\r\n });\r\n\r\n $scope.save = function () {\r\n $modalInstance.close($scope.settings);\r\n }\r\n $scope.cancel = function () {\r\n $modalInstance.close(null);\r\n }\r\n\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('ApplicationResponse', ['$scope', '$stateParams', '$modal', '$q', '$rootScope', '$timeout', 'FBResponses', 'LicenseRequests', 'Triggers', '$state', '$filter', '$window', 'Session',\r\n function ($scope, $stateParams, $modal, $q, $rootScope, $timeout, FBResponses, LicenseRequests, Triggers, $state, $filter, $window, Session) {\r\n $scope.portal = $state.current.data.isPortal;\r\n $scope.saving = false;\r\n $scope.loading = true;\r\n $scope.progressing = false;\r\n $scope.completed = false;\r\n $scope.parameters = {};\r\n $scope.advance = false;\r\n $scope.timeouts = [];\r\n $scope.submitting = false;\r\n $scope.loadingMessage = '';\r\n\r\n $scope.vm = {\r\n api: {},\r\n formsApi: {}\r\n }\r\n Session.CheckSession().then(function (validSession) {\r\n if (validSession) {\r\n Session.checkIn();\r\n if ($stateParams.responseID != null) {\r\n FBResponses.getByID($stateParams.responseID).then(function (response) {\r\n if (response != null) {\r\n if (response.progress == 2) {\r\n $scope.completed = true;\r\n }\r\n $scope.parameters = { response_id: $stateParams.responseID, license_request_id: response.license_request_id, license_id: response.license_id, user_id: response.user_id, service_id: response.service_id, vehicle_id: response.vehicle_id, child_service: response.child_service, default_license_category_id: response.license_category_id, display_changed_answers: response.form.display_changed_answers };\r\n\r\n if ($scope.fireStartTrigger != null && $scope.fireStartTrigger == 'true' && response.progress == 0) {\r\n response.progress = 1;\r\n response.started_on = new Date();\r\n FBResponses.save(response, null, false);\r\n if (response.form.start_trigger_name != null && response.form.start_trigger_name != \"\") {\r\n Triggers.fire({\r\n name: response.form.start_trigger_name,\r\n triggerID: response.form.start_trigger_id,\r\n licenseRequestID: response.license_request_id\r\n });\r\n }\r\n }\r\n\r\n // Move on\r\n $scope.setProgress(response);\r\n $scope.response = response;\r\n $scope.the_form = response.form.the_form;\r\n $scope.loading = false;\r\n }\r\n });\r\n }\r\n else {\r\n if ($scope.portal) {\r\n if ($scope.review) {\r\n $state.go('portal.menus.review');\r\n }\r\n else {\r\n var newContinuePage = $rootScope.portal_pages[\"portal.menus.applicationsContinueList\"];\r\n if (newContinuePage != null && newContinuePage.visible) {\r\n $state.go('portal.menus.applicationsContinueList');\r\n } else {\r\n $state.go('portal.menus.applications');\r\n }\r\n }\r\n }\r\n else {\r\n $state.go('internal.licensing.application.responses', { id: $scope.applicationID });\r\n }\r\n }\r\n }\r\n else {\r\n $state.go('portal.menus.denied');\r\n }\r\n });\r\n\r\n $scope.setProgress = function (response, submitRequest) {\r\n var d = $q.defer();\r\n if (isUndefined(submitRequest)) {\r\n submitRequest = false;\r\n }\r\n // need the timout so that the calculations of what pages have content finishes first\r\n var timer = $timeout(function () {\r\n $scope.progressing = true;\r\n\r\n if ($scope.completed) {\r\n if (response.form.pages.length > 0) {\r\n response.form.pages[0].tab_active = true;\r\n }\r\n $scope.progressing = false;\r\n $scope.saving = false;\r\n }\r\n else {\r\n var foundMatch = false;\r\n\r\n // Loop through the pages and check to see if they have a response_page record. The first one that doesn't will be our active page, and any after will be disabled\r\n if (response != null && response.form != null && response.form.pages != null) {\r\n var activePage = $scope.vm.formsApi.activePage();\r\n response.form.pages.forEach(function (page) {\r\n page.disabled = foundMatch && !page.completed;\r\n if (!page.completed && !foundMatch && page.has_content && $scope.advance == true) {\r\n page.tab_active = true;\r\n foundMatch = true;\r\n }\r\n else {\r\n if ($scope.advance == false) {\r\n page.tab_active = page.id == activePage.id;\r\n if (page.tab_active) {\r\n foundMatch = true;\r\n }\r\n }\r\n else {\r\n page.tab_active = false;\r\n }\r\n\r\n }\r\n })\r\n }\r\n\r\n if (!foundMatch && $scope.advance == true) {\r\n for (var i = response.form.pages.length - 1; i >= 0; i--) {\r\n var page = response.form.pages[i];\r\n\r\n if (!foundMatch && page.has_content) {\r\n page.tab_active = true;\r\n foundMatch = true;\r\n }\r\n page.disabled = !foundMatch && !page.completed;\r\n }\r\n }\r\n\r\n $scope.progressing = false;\r\n if (submitRequest != true) {\r\n $scope.saving = false;\r\n }\r\n $window.scrollTo(0, 0);\r\n d.resolve();\r\n }\r\n }, 0);\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n return d.promise;\r\n }\r\n\r\n $scope.showSave = function () {\r\n var currentPage = $scope.vm.formsApi.activePage();\r\n if (currentPage != null) {\r\n return currentPage.show_save_button;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n $scope.showSaveAndContinue = function () {\r\n return ($scope.vm.formsApi.activePageIndex() < $scope.vm.formsApi.pagesCount());\r\n }\r\n\r\n $scope.showSubmit = function () {\r\n return ($scope.vm.formsApi.activePageIndex() >= $scope.vm.formsApi.pagesCount());\r\n }\r\n\r\n // This function exists because after a save, the form coming back is fresh from the database, and we'll loose several \"custom\" properties that have been put on the form. And we want them still\r\n $scope.copyCustomResponseFields = function (response) {\r\n var d = $q.defer();\r\n // pages\r\n for (var i = 0; i < $scope.response.form.pages.length; i++) {\r\n var page = $scope.response.form.pages[i];\r\n // sections\r\n for (var j = 0; j < page.sections.length; j++) {\r\n var section = page.sections[j];\r\n response.form.pages[i].sections[j].expanded = section.expanded;\r\n //components\r\n for (var k = 0; k < section.components.length; k++) {\r\n var component = section.components[k];\r\n if (component.elementAnswer !== undefined) {\r\n response.form.pages[i].sections[j].components[k].elementAnswer = component.elementAnswer;\r\n }\r\n if (component.parameters !== undefined) {\r\n response.form.pages[i].sections[j].components[k].parameters = component.parameters;\r\n }\r\n // groups\r\n for (var l = 0; l < component.groups.length; l++) {\r\n var group = component.groups[l];\r\n if (group.edit != undefined) {\r\n response.form.pages[i].sections[j].components[k].groups[l].edit = group.edit;\r\n }\r\n if (group.parameters !== undefined) {\r\n response.form.pages[i].sections[j].components[k].groups[l].parameters = group.parameters;\r\n }\r\n // questions\r\n for (var m = 0; m < group.questions.length; m++) {\r\n var question = group.questions[m];\r\n if (question.answer !== undefined && question.answer != null) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].answer.invalid = question.answer.invalid;\r\n if (question.answer.document_description !== undefined && question.answer.document_description != null) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].answer.document_description = question.answer.document_description;\r\n }\r\n if (question.answer.document_name !== undefined && question.answer.document_name != null) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].answer.document_name = question.answer.document_name;\r\n }\r\n if (question.answer.document_type !== undefined && question.answer.document_type != null) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].answer.document_type = question.answer.document_type;\r\n }\r\n if (question.validation !== undefined && question.validation != null) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].validation = question.validation;\r\n }\r\n }\r\n // sub components\r\n for (var n = 0; n < question.sub_components.length; n++) {\r\n var subcomponent = question.sub_components[n];\r\n if (subcomponent.parameters !== undefined) {\r\n //make sure subcomponent is defined before parameters are set to it, else\r\n //TypeError: Cannot set property 'parameters' of undefined\r\n //this may have to be the structure throughout this function if we get other TypeErrors in the console\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].sub_components[n] = subcomponent;\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].sub_components[n].parameters = subcomponent.parameters;\r\n }\r\n // groups\r\n for (var o = 0; o < subcomponent.groups.length; o++) {\r\n var subgroup = subcomponent.groups[o];\r\n if (subgroup.parameters !== undefined) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].sub_components[n].groups[o].parameters = subgroup.parameters;\r\n }\r\n for (var p = 0; p < subgroup.questions.length; p++) {\r\n var subquestion = subgroup.questions[p];\r\n if (subquestion.answer !== undefined && subquestion.answer != null) {\r\n response.form.pages[i].sections[j].components[k].groups[l].questions[m].sub_components[n].groups[o].questions[p].answer.invalid = subquestion.answer.invalid;\r\n }\r\n };\r\n };\r\n };\r\n };\r\n };\r\n };\r\n };\r\n };\r\n d.resolve();\r\n return d.promise;\r\n }\r\n\r\n $scope.save = function (advance, submitRequest) {\r\n var deferred = $q.defer();\r\n Session.checkIn();\r\n $scope.loadingMessage = \"Saving application response...\";\r\n $scope.saving = true;\r\n $scope.answerRefresh = false;\r\n $scope.advance = advance == true;\r\n\r\n FBResponses.saveByForm($scope.response, $scope.applicationID, $scope.vm.formsApi.absoluteFurthestPageIndex(), false, false, false).then(function (response) {\r\n if (response != null && response.documentErrors != null && response.documentErrors.length > 0) {\r\n deferred.resolve(response.documentErrors);\r\n }\r\n else {\r\n deferred.resolve();\r\n }\r\n \r\n if (response != null && response.documentErrors != null && response.documentErrors.length > 0) {\r\n //Something errored when saving documents - display modal, and don't advance or set progress\r\n var documentNames = response.documentErrors.map(function (error) { return \"
  • \" + error.document_name + \"
  • \"; }).join('');\r\n $scope.saving = false;\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/alert-modal/alert-modal.html',\r\n controller: 'AlertModalController',\r\n resolve: {\r\n message: function () {\r\n if ($scope.portal) {\r\n return \"Form has been saved, but an error occurred uploading the following document\"\r\n + (response.documentErrors.length > 1 ? \"s\" : \"\")\r\n + \":
    Please try again. If you continue to experience problems, please contact your system administrator.\";\r\n\r\n }\r\n else {\r\n return \"Form has been saved, but an error occurred uploading the following document\"\r\n + (response.documentErrors.length > 1 ? \"s\" : \"\")\r\n + \":
    Please try again. If you continue to experience problems, please submit a support ticket.\";\r\n }\r\n }\r\n }\r\n })\r\n }\r\n else if (response != null) {\r\n response.form.the_form = $scope.response.form.the_form;\r\n response.form.setupValidationMessages = $scope.response.form.setupValidationMessages;\r\n if (response.form.pages != null) {\r\n $filter('filter')(response.form.pages, $scope.vm.formsApi.hasContent());\r\n }\r\n var a = $scope.setProgress(response, submitRequest);\r\n var b = $scope.copyCustomResponseFields(response);\r\n $q.all([a, b]).then(function () {\r\n $scope.response = response;\r\n $scope.answerRefresh = true;\r\n $scope.$evalAsync(function () {\r\n if ($scope.response.form.setupValidationMessages != null && $scope.response.form.setupValidationMessages !== undefined) {\r\n $scope.response.form.setupValidationMessages($scope.response.form);\r\n }\r\n });\r\n if ($scope.advance == true) {\r\n $scope.vm.api.doRecalculate();\r\n $scope.vm.api.scrollTabIntoView();\r\n }\r\n })\r\n .catch(function (response) {\r\n // handle error\r\n }); ;\r\n }\r\n else {\r\n // something errored in the .NET side\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/alert-modal/alert-modal.html',\r\n controller: 'AlertModalController',\r\n resolve: {\r\n message: function () {\r\n if ($scope.portal) {\r\n return \"An error occurred submitting the form. Please try again. If you continue to experience problems, please contact your system administrator.\\n\" + ((response != null && response.error != null) ? response.error : \"\");\r\n }\r\n else {\r\n return \"An error occurred submitting the form. Please try again. If you continue to experience problems, please submit a support ticket\\n\" + ((response != null && response.error != null) ? response.error : \"\");\r\n }\r\n }\r\n }\r\n }).result.then(function (result) {\r\n $scope.saving = false;\r\n });\r\n }\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n var waitToFinish = function (loopCount) {\r\n // creating array of functions that return promises\r\n var promiseFuncs = [];\r\n for (var i = 1; i <= 30; i++) { // 30 iterations that should take between 30s-60s maximum\r\n promiseFuncs.push(checkAdditionalFormsFactory());\r\n }\r\n // now we want to sequentially execute this array of promise factories\r\n executeSequentialPromiseFactories(promiseFuncs).then(function (result) {\r\n // if we fall into this block the array has reached its max iterations and we will display a message on the first occurance and start the loop over again\r\n if (loopCount == 1) {\r\n $scope.response.form.submissionMessage = 'Your application is still submitting and there may be additional steps that require your attention. Please do not close this window. You will be redirected shortly.';\r\n }\r\n\r\n waitToFinish(loopCount + 1);\r\n }).catch(function (reject) {\r\n // we have a number of reject reasons set up, in this case reject stops our polling and we make a decision based on the reject reason\r\n $scope.saving = false;\r\n if (reject == 'Charges') {\r\n $state.go('portal.menus.checkout', { redirectImmediately: $scope.redirectImmediately });\r\n }\r\n else {\r\n var newContinuePage = $rootScope.portal_pages[\"portal.menus.applicationsContinueList\"];\r\n if (newContinuePage != null && newContinuePage.visible) {\r\n $state.go('portal.menus.applicationsContinueList');\r\n } else {\r\n $state.go('portal.menus.applications');\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.handleSubmit = function () {\r\n Session.checkIn();\r\n $scope.loadingMessage = \"Submitting application response...\";\r\n $scope.redirectImmediately = false;\r\n $scope.submitting = true;\r\n $scope.saving = true;\r\n\r\n //If the PDF generation finishes before the submission redirect takes place, we need to know that it happened so we do not wait for a call that already happened.\r\n //In the scenario that a charge is added, we will redirect to the portal.menus.checkout page with a redirectImmediately parameter of true\r\n //The same code below here will watch for the 'reset:application' to be broadcast to the $rootscope as well as on the application-checkout.js\r\n $rootScope.$on('reset:application', function () {\r\n $scope.redirectImmediately = true;\r\n });\r\n\r\n // Watching PDF Generation for message\r\n $rootScope.$on('generate:pdf', function () {\r\n $scope.loadingMessage = \"PDF generating...\";\r\n });\r\n\r\n // Watching license charges for message\r\n $rootScope.$on('calculate:charges', function () {\r\n $scope.loadingMessage = \"Calculating License Charges...\";\r\n });\r\n\r\n // Watching for packages to get ran & complete\r\n $rootScope.$on('package:complete', function () {\r\n $scope.loadingMessage = \"Completing packages...\";\r\n });\r\n\r\n // Watching for Form Conditions to evaulate\r\n $rootScope.$on('form:conditions', function () {\r\n $scope.loadingMessage = \"Evaluating Form Conditions...\";\r\n });\r\n\r\n // Watching for Triggers to fire\r\n $rootScope.$on('form:triggers', function () {\r\n $scope.loadingMessage = \"Firing Triggers...\";\r\n });\r\n\r\n LicenseRequests.submit($scope.application, $scope.response, $scope.parameters, $scope.application.datapointAnswers).then(function (result) {\r\n if (result != null && result.success) {\r\n if ($scope.portal) {\r\n if ($scope.review) {\r\n $scope.saving = false;\r\n $scope.submitting = false;\r\n $state.go('portal.menus.review');\r\n }\r\n else {\r\n // going to poll the server until triggers are complete\r\n LicenseRequests.getByID($scope.application.id).then(function (application) {\r\n // initialization\r\n $scope.application = application;\r\n\r\n $scope.lastApplication = $scope.application && $scope.application.responses && $scope.application.responses.every(function (response) {\r\n return (response.progress == 2); // if all other responses are done then we navigate to checkout\r\n });\r\n\r\n waitToFinish(1);\r\n });\r\n }\r\n $scope.loadingMessage = \"Completing Form...\";\r\n }\r\n else {\r\n $scope.loadingMessage = \"Completing Form...\";\r\n if ($scope.getApplication != null) {\r\n $scope.getApplication();\r\n }\r\n $scope.saving = false;\r\n $scope.submitting = false;\r\n $state.go('internal.licensing.application.responses', { id: $scope.applicationID });\r\n }\r\n }\r\n else {\r\n $scope.submitting = false;\r\n $scope.saving = false;\r\n\r\n if (result != null && result.validationError) {\r\n // Server-side validation failed\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/alert-modal/alert-modal.html',\r\n controller: 'AlertModalController',\r\n resolve: {\r\n message: function () {\r\n return \"Required information is missing. Please check over the form and make sure to supply all required information.\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n\r\n });\r\n }\r\n else {\r\n // something errored in the .NET side\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/alert-modal/alert-modal.html',\r\n controller: 'AlertModalController',\r\n resolve: {\r\n message: function () {\r\n if ($scope.portal) {\r\n return \"An error occurred submitting the form. Please try again. If you continue to experience problems, please contact your system administrator.\\n\" + ((result != null && result.error != null) ? result.error : \"\");\r\n }\r\n else {\r\n return \"An error occurred submitting the form. Please try again. If you continue to experience problems, please submit a support ticket\\n\" + ((result != null && result.error != null) ? result.error : \"\");\r\n }\r\n }\r\n }\r\n }).result.then(function (result) {\r\n\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n // the reason we are writing a function that returns a function that returns a promise (a factory function) is that promises immediately start executing when created (ie pushed onto an array),\r\n // and we want to control when the promise gets executed so we can implement sequential promises using Array.reduce on an array of functions that return promises.\r\n var checkAdditionalFormsFactory = function () {\r\n return function () {\r\n\r\n var deferred = $q.defer(); // note we are using AngularJS promises that do not use the recommended implementation, and are a subset of Q\r\n // timeout so we get at least 30s waiting, which may be more like 45s-60s due to round trip to server \r\n $timeout(function () {\r\n // make a request to see if this is the last application and if triggers are firing\r\n LicenseRequests.getByID($scope.application.id).then(function (application) {\r\n $scope.application = angular.copy(application);\r\n\r\n $scope.lastApplication = $scope.application && $scope.application.responses && $scope.application.responses.every(function (response) {\r\n return (response.progress == 2);\r\n });\r\n\r\n // if this is the last application and no triggers are firing, then we are going to stop polling and decide what we are going to do, else continue polling\r\n if (($scope.application.current_triggers_firing_count != null && $scope.application.current_triggers_firing_count > 0)) {\r\n deferred.resolve('Triggers Still Firing');\r\n }\r\n else {\r\n if ($scope.lastApplication && $scope.application.license.charges && $scope.application.checkout !== false) {\r\n // redirect to checkout only if there are charges on this license\r\n deferred.reject('Charges');\r\n }\r\n else if ($scope.lastApplication) {\r\n deferred.reject('No Charges')\r\n }\r\n else if (!$scope.lastApplication) {\r\n deferred.reject('Not Last Application')\r\n }\r\n else {\r\n deferred.reject('Unknown');\r\n }\r\n }\r\n })\r\n .catch(function (response) {\r\n // handle error\r\n });\r\n }, 1000);\r\n return deferred.promise;\r\n }\r\n }\r\n\r\n // helper function to execute promises sequentially\r\n var executeSequentialPromiseFactories = function (tasks) {\r\n var finalPromise = tasks.reduce(function (prev, current) {\r\n return prev = prev.then(current);\r\n }, $q.when());\r\n return finalPromise;\r\n }\r\n\r\n $scope.submit = function () {\r\n $scope.submitFailed = false;\r\n $scope.loadingMessage = \"Saving application response...\";\r\n $scope.save(false, true).then(function (documentErrors) {\r\n $scope.saving = true;\r\n $scope.submitting = true;\r\n if (documentErrors != null && documentErrors.length > 0) {\r\n // Abandon submit if there were errors from saving documents\r\n $scope.saving = false;\r\n $scope.submitting = false;\r\n }\r\n else if ($scope.response.form.validationMessages != null && $scope.response.form.validationMessages !== undefined && $scope.response.form.validationMessages.length > 0) {\r\n // Abandon submit if there are validation messages\r\n $scope.saving = false;\r\n $scope.submitting = false;\r\n }\r\n else if ($scope.response.form.display_submit_confirmation) {\r\n $scope.saving = false;\r\n $scope.submitting = false;\r\n\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n return \"Are you sure you want to submit this form? If you submit, you will not be able to make any changes.\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n $scope.saving = true;\r\n $scope.submitting = true;\r\n\r\n if (result) {\r\n $scope.handleSubmit();\r\n }\r\n else {\r\n $scope.saving = false;\r\n }\r\n $scope.submitting = false;\r\n })\r\n .catch(function (error) {\r\n // handle error \r\n });\r\n }\r\n else {\r\n $scope.handleSubmit();\r\n $scope.submitting = false;\r\n }\r\n })\r\n .catch(function (error) {\r\n // handle error \r\n });\r\n }\r\n\r\n var cleanupStateChange = $scope.$on('$stateChangeStart', function (event) {\r\n if ($scope.saving) {\r\n var answer = confirm(\"The application is currently submitting. Leaving this page could cause issues with your application. Are you sure you want to leave this page?\");\r\n if (!answer) {\r\n event.preventDefault();\r\n }\r\n else {\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n else {\r\n window.onbeforeunload = null;\r\n }\r\n });\r\n\r\n window.onbeforeunload = function (e) {\r\n if ($scope.saving) {\r\n var message = \"The application is currently submitting. Leaving this page could cause issues with your application. Are you sure you want to leave this page?\",\r\n e = e || $window.event;\r\n // For IE and Firefox\r\n if (e) {\r\n e.returnValue = message;\r\n }\r\n\r\n // For Safari\r\n return message;\r\n }\r\n };\r\n\r\n $scope.$on('$destroy', function () {\r\n cleanupStateChange();\r\n $scope.timeouts.map(function (timeout) {\r\n $timeout.cancel(timeout);\r\n });\r\n });\r\n }])\r\n .directive('applicationResponse', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/application-response/application-response.html',\r\n replace: true,\r\n controller: 'ApplicationResponse'\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpCyberSource', ['$q', '$window', '$filter', '$rootScope', 'Payments', 'Regions', 'Resource', 'Format', '$sce', function ($q, $window, $filter, $rootScope, Payments, Regions, Resource, Format, $sce) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n licenseRequestId: '@'\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/cybersource/cybersource.html',\r\n controller: ['$scope', '$timeout', '$sce', function ($scope, $timeout, $sce) {\r\n // scope functions\r\n $scope.signTransaction = function () {\r\n if ($scope.submitting == false) {\r\n $scope.submitting = true;\r\n if ($scope.directPayment) {\r\n $scope.copyBilling($scope.directPaymentObject);\r\n $scope.directPaymentObject.transaction_license_requests = $scope.checkout_items_ids;\r\n $scope.directPaymentObject.payment_method = $scope.payment.merchant_defined_data10;\r\n $scope.regions.forEach(function (region) {\r\n if (region.id === $scope.directPaymentObject.billing_region_id) {\r\n $scope.directPaymentObject.billing_region_name = region.name;\r\n }\r\n if (region.id === $scope.directPaymentObject.shipping_region_id) {\r\n $scope.directPaymentObject.shipping_region_name = region.name;\r\n }\r\n });\r\n\r\n Payments.directPayment($scope.directPaymentObject).then(function (data) {\r\n var transactionID = \"\";\r\n var message = \"\";\r\n\r\n if (data != undefined) {\r\n transactionID = data.transactionid;\r\n message = data.message;\r\n }\r\n\r\n if (!$scope.isPortal) {\r\n top.location.href = $rootScope.internalURL + 'license/controller.cfm?method=cnt_transactions.transactionRedirect&message=' + message + '&transactionID=' + transactionID;\r\n }\r\n });\r\n }\r\n else {\r\n $scope.regions.forEach(function (region) {\r\n if (region.id === $scope.payment.billing_region_id) {\r\n $scope.payment.billing_region_name = region.name;\r\n }\r\n if (region.id === $scope.payment.shipping_region_id) {\r\n $scope.payment.shipping_region_name = region.name;\r\n }\r\n });\r\n $scope.payment.payment_method = 'card';\r\n\r\n $scope.preSaveCyberSourceObject = {};\r\n $scope.preSaveCyberSourceObject.mypayment = $scope.payment;\r\n $scope.preSaveCyberSourceObject.mytotals = $scope.totals;\r\n\r\n Payments.preSaveCyberSource($scope.preSaveCyberSourceObject).then(function (transactionID) {\r\n $scope.payment.reference_number = transactionID;\r\n Payments.sign($scope.payment).then(function (signature) {\r\n $scope.signature = signature;\r\n $scope.signed = true;\r\n $scope.submitting = false;\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n $scope.changeMethod = function (method) {\r\n $scope.paymentMethods.forEach(function (opt) {\r\n if (opt.id == method) {\r\n $scope.paymentMethodName = opt.value;\r\n }\r\n });\r\n }\r\n\r\n $scope.toggleDirectPayment = function (direct_payment) {\r\n if (direct_payment) {\r\n $scope.paymentMethods = directPaymentMethods;\r\n }\r\n else {\r\n $scope.paymentMethods = nonDirectPaymentMethods;\r\n }\r\n $scope.selected_name = '';\r\n $scope.payment.payment_method = undefined;\r\n $scope.paymentMethodName = \"\";\r\n }\r\n\r\n $scope.back = function () {\r\n var url = $rootScope.internalURL + 'license/applications/billing/show.cfm?licenseRequestID=' + $scope.licenseRequestId;\r\n if ($scope.isPortal) {\r\n $window.history.back();\r\n }\r\n else {\r\n $window.location.replace(url);\r\n }\r\n }\r\n\r\n $scope.unsign = function () {\r\n $scope.signature = \"\";\r\n $scope.signed = false;\r\n }\r\n\r\n $scope.columnClick = function (isInspections, predicate) {\r\n if (isInspections) {\r\n $scope.inspectionPred = predicate;\r\n $scope.inspectionRev = !$scope.inspectionRev;\r\n }\r\n else {\r\n $scope.requestPred = predicate;\r\n $scope.requestRev = !$scope.requestRev;\r\n }\r\n }\r\n\r\n $scope.checkPaymentType = function (options) {\r\n if ($scope.paymentMethodName == undefined || $scope.paymentMethodName == \"\") { return false; }\r\n return options.indexOf($scope.paymentMethodName) >= 0;\r\n }\r\n\r\n $scope.changeDirect = function (newValue) {\r\n if (newValue) {\r\n $scope.paymentMethods = $scope.directPaymentMethods;\r\n }\r\n else {\r\n $scope.paymentMethods = $scope.nonDirectPaymentMethods;\r\n }\r\n $scope.directPayment = newValue;\r\n $scope.selected_name = '';\r\n $scope.payment.payment_method = undefined;\r\n }\r\n\r\n $scope.copyBilling = function () {\r\n if ($scope.directPaymentObject.same_as_billing) {\r\n $scope.directPaymentObject.shipping_street = $scope.directPaymentObject.billing_street;\r\n $scope.directPaymentObject.shipping_street_2 = $scope.directPaymentObject.billing_street_2;\r\n $scope.directPaymentObject.shipping_municipality = $scope.directPaymentObject.billing_municipality;\r\n $scope.directPaymentObject.shipping_region_id = $scope.directPaymentObject.billing_region_id;\r\n $scope.directPaymentObject.shipping_postal_code = $scope.directPaymentObject.billing_postal_code;\r\n }\r\n }\r\n\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n // scope variables\r\n scope.loading = true;\r\n scope.submitting = false;\r\n scope.paying = false;\r\n scope.items = [];\r\n scope.paymentMethods = [];\r\n scope.directPaymentMethods = [];\r\n scope.nonDirectPaymentMethods = [];\r\n scope.paymentMethodName = \"\";\r\n scope.directPayment = false;\r\n scope.checkingAccountTypes = [];\r\n scope.regions = [];\r\n scope.sum_balance_due = 0;\r\n scope.isPortal = true;\r\n scope.access_key = \"\";\r\n scope.profile_id = \"\";\r\n scope.enterpriseWebsite = \"\";\r\n scope.enterpriseSiteLocation = \"\";\r\n scope.transaction_uuid = guid();\r\n scope.signed = false;\r\n\r\n if ($rootScope.enterprise) {\r\n scope.isPortal = $rootScope.isPortal == \"True\";\r\n scope.enterpriseWebsite = $rootScope.enterprise.website;\r\n scope.enterpriseSiteLocation = $rootScope.enterprise.site_location;\r\n }\r\n\r\n scope.directPaymentObject = {\r\n internal: !scope.isPortal,\r\n user_id: $rootScope.userID,\r\n enterprise_id: $rootScope.enterpriseID,\r\n amount: 0\r\n };\r\n\r\n //the order of these fields is important to the signing which creates the signature in PaymentsController; order must match order in \"signed_field_names\" property\r\n scope.payment = {\r\n access_key: scope.access_key,\r\n profile_id: scope.profile_id,\r\n transaction_uuid: scope.transaction_uuid, //used to check for duplicate submissions on their end\r\n signed_field_names: 'access_key,profile_id,transaction_uuid,signed_field_names,unsigned_field_names,signed_date_time,locale,transaction_type,reference_number,amount,currency,payment_method,bill_to_forename,bill_to_surname,bill_to_email,bill_to_address_line1,bill_to_address_city,bill_to_address_state,bill_to_address_country,bill_to_address_postal_code,merchant_defined_data5,merchant_defined_data6,merchant_defined_data7,merchant_defined_data8,merchant_defined_data9,merchant_defined_data10',\r\n unsigned_field_names: 'card_type,card_number,card_expiry_date,card_cvn',\r\n signed_date_time: Format.cyberSourceDate(new Date()),\r\n locale: 'en',\r\n transaction_type: 'sale', //authorizes transaction and is immediately submitted for settlement\r\n reference_number: '', // gets set to our transaction ID\r\n amount: 0,\r\n currency: 'USD',\r\n payment_method: 'card',\r\n bill_to_forename: '',\r\n bill_to_surname: '',\r\n bill_to_email: '',\r\n bill_to_address_line1: '',\r\n bill_to_address_city: '',\r\n bill_to_address_state: '',\r\n bill_to_address_country: '',\r\n bill_to_address_postal_code: '',\r\n merchant_defined_data5: scope.isPortal, //isPortal true or false\r\n merchant_defined_data6: $rootScope.userID, //userID \r\n merchant_defined_data7: $rootScope.enterpriseID, //enterpriseID\r\n merchant_defined_data8: scope.enterpriseWebsite, //enterprise.website used for portal redirect\r\n merchant_defined_data9: scope.enterpriseSiteLocation, //enterprise.site_location used for internal redirect\r\n merchant_defined_data10: '' //payment method\r\n };\r\n scope.signature = \"\";\r\n\r\n scope.unsigned = {\r\n card_type: '', //001 Test Data\r\n card_number: '', //4111111111111111 Test Data\r\n card_expiry_date: '', // 11-2020 Test Data\r\n card_cvn: ''\r\n };\r\n scope.requestColumns = [\r\n { header: 'License', predicate: 'license_name' },\r\n { header: 'Amount', predicate: 'balance_due' }\r\n ];\r\n scope.requestPred = 'license_name';\r\n\r\n // initial loading\r\n var init = function () {\r\n var promises = [];\r\n\r\n promises.push(Payments.getAttributes().then(function (attributes) {\r\n if (attributes != null) {\r\n scope.payment.access_key = attributes.access_key;\r\n scope.payment.profile_id = attributes.profile_id;\r\n scope.post_location = $sce.trustAsResourceUrl(attributes.post_location);\r\n if (attributes.hasOwnProperty('fee_message')) {\r\n scope.fee_message = attributes.fee_message;\r\n }\r\n else {\r\n scope.fee_message = \"\";\r\n }\r\n }\r\n }));\r\n\r\n promises.push(Payments.getPaymentMethods().then(function (methods) {\r\n if (methods != null) {\r\n scope.directPaymentMethods = $filter('filter')(methods, { 'direct_payment': true });\r\n scope.nonDirectPaymentMethods = $filter('filter')(methods, { 'direct_payment': false });\r\n scope.paymentMethods = scope.nonDirectPaymentMethods;\r\n }\r\n }));\r\n\r\n promises.push(Payments.GetSessionDataForPayment().then(function (items) {\r\n scope.checkout_items_ids = \"\";\r\n scope.bulkPayLicenseData = {};\r\n\r\n if (items.hasOwnProperty('data')) {\r\n if (items[\"data\"].hasOwnProperty('checkout_items_ids')) {\r\n\r\n scope.checkout_items_ids = items[\"data\"][\"checkout_items_ids\"].toString();\r\n if (scope.checkout_items_ids != null) {\r\n\r\n if (items[\"data\"].hasOwnProperty('bulkpaylicensedata') && items[\"data\"][\"bulkpaylicensedata\"].recordcount > 0) {\r\n var bulkpaylicensedataObj = items[\"data\"][\"bulkpaylicensedata\"];\r\n scope.totals = [];\r\n scope.payment.amount = 0;\r\n\r\n var i;\r\n for (i = 1; i <= bulkpaylicensedataObj.recordcount; i++) {\r\n scope.totals.push(bulkpaylicensedataObj[i]);\r\n }\r\n\r\n scope.totals.forEach(function (total) {\r\n scope.payment.amount += parseFloat(total.balance_due);\r\n });\r\n\r\n scope.payment.amount = parseFloat(scope.payment.amount).toFixed(2);\r\n scope.directPaymentObject.amount = scope.payment.amount;\r\n\r\n } else {\r\n\r\n promises.push(Payments.getLicenseRequestTotals(scope.checkout_items_ids).then(function (totals) {\r\n scope.totals = totals ? totals : [];\r\n scope.payment.amount = 0;\r\n\r\n scope.totals.forEach(function (total) {\r\n scope.payment.amount += parseFloat(total.balance_due);\r\n });\r\n scope.payment.amount = parseFloat(scope.payment.amount).toFixed(2);\r\n scope.directPaymentObject.amount = scope.payment.amount;\r\n }));\r\n }\r\n }\r\n }\r\n }\r\n }));\r\n\r\n promises.push(Payments.getCheckingAccountTypes().then(function (results) {\r\n if (results != null) {\r\n scope.checkingAccountTypes = results;\r\n }\r\n }));\r\n\r\n promises.push(Regions.GetAbbreviation().then(function (regions) {\r\n scope.regions = regions;\r\n }));\r\n\r\n // var i = Transactions.getPaymentProvider();\r\n //add a and g\r\n $q.all(promises).then(function () {\r\n scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n }\r\n init();\r\n\r\n scope.cardTypes = [\r\n { id: '001', name: 'Visa' },\r\n { id: '002', name: 'Mastercard' },\r\n { id: '003', name: 'American Express' },\r\n { id: '004', name: 'Discover' }\r\n ];\r\n\r\n scope.countries = [\r\n { id: 'US', name: 'United States' },\r\n { id: 'CA', name: 'Canada' }\r\n ];\r\n }\r\n };\r\n }])\r\n\r\n ;","\"use strict\";\r\n\r\nangular\r\n .module(\"imagetrend.components\")\r\n .controller(\"hlpDateController\", [\r\n \"$scope\",\r\n \"Format\",\r\n \"$filter\",\r\n \"Validation\",\r\n \"$timeout\",\r\n function($scope, Format, $filter, Validation, $timeout) {\r\n var initialized = false;\r\n $scope.todayLoading = false;\r\n\r\n $scope.setTime = function(time) {\r\n if (time == null) {\r\n time = new Date();\r\n time.setHours(0, 0, 0, 0);\r\n }\r\n $scope.time = time;\r\n\r\n if (isValidDate($scope.ngModel)) {\r\n $scope.ngModel.setHours(time.getHours());\r\n $scope.ngModel.setMinutes(time.getMinutes());\r\n }\r\n };\r\n\r\n $scope.$watch(\"ngModel\", function(ngModel) {\r\n if (!isUndefined(ngModel) && !initialized) {\r\n if (typeof ngModel != \"object\") {\r\n ngModel = new Date(ngModel.toString());\r\n } \r\n if ($scope.useTime) {\r\n var d = new Date();\r\n d.setHours(ngModel.getHours());\r\n d.setMinutes(ngModel.getMinutes());\r\n $scope.time = d;\r\n } else {\r\n ngModel.setHours(0);\r\n ngModel.setMinutes(0);\r\n }\r\n initialized = true;\r\n }\r\n // if date field is cleared, set view to null\r\n if (ngModel === null && $scope.innerForm.date != null) {\r\n $scope.innerForm.date.$setViewValue(null);\r\n $scope.innerForm.date.$setValidity(\"required\", null);\r\n $scope.refresh = true;\r\n $scope.onChange($scope.ngModel);\r\n $scope.innerForm.date.$render();\r\n }\r\n });\r\n\r\n $scope.$watch(\"refresh\", function(refresh) {\r\n if (!isUndefined($scope.ngModel) && refresh) {\r\n $scope.todayLoading = true;\r\n if ($scope.useTime) {\r\n var d = new Date();\r\n d.setHours($scope.ngModel.getHours());\r\n d.setMinutes($scope.ngModel.getMinutes());\r\n $scope.time = d;\r\n } else {\r\n $scope.ngModel.setHours(0);\r\n $scope.ngModel.setMinutes(0);\r\n }\r\n $scope.refresh = false;\r\n $scope.todayLoading = false;\r\n }\r\n });\r\n\r\n $scope.opened = false;\r\n\r\n $scope.dateOptions = {\r\n showWeeks: false\r\n };\r\n\r\n $scope.altInputFormats = [\r\n \"MM/dd/yyyy\",\r\n \"M/d/yyyy\",\r\n \"MM/d/yyyy\",\r\n \"M/dd/yyyy\",\r\n \"M!/d!/yyyy\",\r\n \"M!/d!/yy\",\r\n \"MM/dd/yy\",\r\n \"shortDate\",\r\n \"\"\r\n ];\r\n $scope.format = $scope.altInputFormats[1];\r\n\r\n if ($scope.month) {\r\n $scope.dateOptions.minMode = \"month\";\r\n $scope.altMonthInputFormats = [\r\n \"MM/yyyy\",\r\n \"M/yyyy\",\r\n \"M!/yyyy\",\r\n \"\"\r\n ];\r\n $scope.format = $scope.altMonthInputFormats[1];\r\n }\r\n\r\n $scope.today = function() {\r\n $scope.todayLoading = true;\r\n $scope.ngModel = new Date();\r\n $scope.innerForm.date.$setViewValue(\r\n $scope.ngModel.getMonth() +\r\n 1 +\r\n \"/\" +\r\n $scope.ngModel.getDate() +\r\n \"/\" +\r\n $scope.ngModel.getFullYear()\r\n );\r\n $scope.innerForm.date.$setValidity(\"required\", null);\r\n $scope.refresh = true;\r\n $scope.onChange($scope.ngModel);\r\n $scope.todayLoading = false;\r\n\r\n $scope.innerForm.date.$render();\r\n if ($scope.useCurrentTimeToday == true) {\r\n //Set the time as the current time\r\n $scope.setTime(new Date());\r\n }\r\n };\r\n\r\n $scope.validate = function() {\r\n if ($scope.innerForm !== undefined) {\r\n Validation.validateQuestion(\r\n $scope.innerForm.date,\r\n $scope.validation,\r\n $scope.ngModel\r\n );\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid = !isEmpty(\r\n $scope.innerForm.date.$error\r\n );\r\n }\r\n }\r\n };\r\n\r\n var validationTimeout = $timeout(function() {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText =\r\n \"Please enter a \" +\r\n Format.label($scope.label || $scope.name);\r\n $scope.requiredText =\r\n $scope.requiredText +\r\n ($scope.month\r\n ? \" in MM/YYYY format\"\r\n : \" in MM/DD/YYYY format\");\r\n }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on(\"$destroy\", function() {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }\r\n ])\r\n .directive(\"hlpDate\", [\r\n \"Format\",\r\n \"Validation\",\r\n \"$timeout\",\r\n function(Format, Validation, $timeout) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n ngModel: \"=\",\r\n question: \"=\",\r\n refresh: \"=?\",\r\n validation: \"=?\",\r\n\r\n //attributes\r\n name: \"@?\",\r\n id: \"@?\",\r\n classes: \"@?\",\r\n full: \"@?\",\r\n month: \"=?\",\r\n autoComplete: '@?',\r\n\r\n //required\r\n isRequired: \"=?\",\r\n showRequired: \"=?\",\r\n requiredText: \"@?\",\r\n\r\n //disabled\r\n isDisabled: \"=?\",\r\n\r\n //label\r\n showLabel: \"@?\",\r\n label: \"@?\",\r\n title: \"@?\",\r\n showToday: \"@?\",\r\n useTime: \"@?\",\r\n topLabel: \"=?\",\r\n showColon: \"=?\",\r\n vertical: \"=?\",\r\n fixed: \"=?\",\r\n useCurrentTimeToday: \"=?\",\r\n\r\n //instructions\r\n instructions: \"@?\",\r\n pdf: \"=?\"\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: \"ngModel\",\r\n templateUrl: \"templates/date/date.html\",\r\n link: function(scope, elem, attrs, ctrl) {\r\n scope.timeouts = [];\r\n scope.autoComplete = attrs.autoComplete;\r\n\r\n //attributes\r\n if (!attrs.name) {\r\n attrs.name = \"date\";\r\n }\r\n if (!attrs.id) {\r\n attrs.id = attrs.name;\r\n }\r\n if (!attrs.full) {\r\n attrs.full = false;\r\n } else {\r\n if (attrs.full == \"true\") {\r\n attrs.full = true;\r\n } else {\r\n attrs.full = false;\r\n }\r\n }\r\n if (!attrs.month) {\r\n attrs.month = false;\r\n } else {\r\n if (attrs.month == \"true\") {\r\n attrs.month = true;\r\n } else {\r\n attrs.month = false;\r\n }\r\n }\r\n\r\n //label\r\n if (!attrs.label) {\r\n attrs.label = Format.label(attrs.name);\r\n }\r\n if (!attrs.showLabel) {\r\n attrs.showLabel = attrs.label.length > 0;\r\n } else {\r\n if (attrs.showLabel == \"true\") {\r\n attrs.showLabel = true;\r\n } else {\r\n attrs.showLabel = false;\r\n }\r\n }\r\n if (!attrs.vertical) {\r\n attrs.vertical = false;\r\n } else {\r\n if (\r\n attrs.vertical == true ||\r\n attrs.vertical == \"true\"\r\n ) {\r\n attrs.vertical = true;\r\n } else {\r\n attrs.vertical = false;\r\n }\r\n }\r\n if (!attrs.topLabel) {\r\n attrs.topLabel = false;\r\n } else {\r\n if (\r\n attrs.topLabel == true ||\r\n attrs.topLabel == \"true\"\r\n ) {\r\n attrs.topLabel = true;\r\n } else {\r\n attrs.topLabel = false;\r\n }\r\n }\r\n if (!attrs.showColon) {\r\n attrs.showColon = true;\r\n } else {\r\n if (\r\n attrs.showColon == true ||\r\n attrs.showColon == \"true\"\r\n ) {\r\n attrs.showColon = true;\r\n } else {\r\n attrs.showColon = false;\r\n }\r\n }\r\n if (!attrs.title) {\r\n if (attrs.month == \"true\" || attrs.month == true) {\r\n attrs.title = \"Please enter in mm/yyyy format\";\r\n } else {\r\n attrs.title =\r\n \"Please enter date in mm/dd/yyyy format\";\r\n }\r\n }\r\n if (!attrs.showToday) {\r\n attrs.showToday = true;\r\n } else {\r\n if (attrs.showToday == \"true\") {\r\n attrs.showToday = true;\r\n } else {\r\n attrs.showToday = false;\r\n }\r\n }\r\n if (!attrs.useTime) {\r\n attrs.useTime = false;\r\n } else {\r\n if (attrs.useTime == \"true\") {\r\n attrs.useTime = true;\r\n } else {\r\n attrs.useTime = false;\r\n }\r\n }\r\n scope.formatText =\r\n \"Please enter a valid date\" +\r\n (attrs.month\r\n ? \" in MM/YYYY format\"\r\n : \" in MM/DD/YYYY format\");\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n\r\n scope.onChange = function(item) {\r\n scope.ngModel = item;\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm.date,\r\n scope.validation,\r\n ctrl.$modelValue\r\n );\r\n }\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.answer !== undefined\r\n ) {\r\n scope.question.answer.invalid = !isEmpty(\r\n scope.innerForm.date.$error\r\n );\r\n }\r\n };\r\n //ctrl.$viewChangeListeners.push(function () {\r\n // scope.$eval(attrs.ngChange);\r\n //});\r\n\r\n scope.submitted = false;\r\n scope.$on(\"form:submit\", function() {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on(\"$destroy\", function() {\r\n scope.timeouts.forEach(function(timer) {\r\n $timeout.cancel(timer);\r\n });\r\n if (elem) {\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n },\r\n controller: \"hlpDateController\"\r\n };\r\n }\r\n ]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpDateRange', ['Format', '$timeout', function (Format, $timeout) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n startDate: '=?',\r\n endDate: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n label: '@?',\r\n title: '@?',\r\n startLabel: '@?',\r\n endLabel: '@?',\r\n useTime: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n\r\n //instructions\r\n instructions: '@?'\r\n },\r\n replace: true,\r\n templateUrl: 'templates/date-range/date-range.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'date_range'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.startLabel) { attrs.startLabel = 'Open On'; }\r\n if (!attrs.endLabel) { attrs.endLabel = 'Close On'; }\r\n if (!attrs.useTime) { attrs.useTime = true; } else { if (attrs.useTime == 'true') { attrs.useTime = true; } else { attrs.useTime = false; } }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n $timeout(function () {\r\n if (!attrs.requiredText) { scope.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)) }\r\n }, 0);\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.submitted = true;\r\n });\r\n\r\n scope.dateChanged = function () {\r\n scope.submitted = false;\r\n if (scope.startDate != null) {\r\n var startDate = new Date(scope.startDate);\r\n }\r\n else {\r\n var startDate = null;\r\n }\r\n if (scope.endDate != null) {\r\n var endDate = new Date(scope.endDate);\r\n }\r\n else {\r\n var endDate = null;\r\n }\r\n\r\n scope.innerForm.dateRange.$setDirty();\r\n\r\n if (isValidDate(startDate) && isValidDate(endDate)) {\r\n if (new Date(startDate) > new Date(endDate)) {\r\n scope.innerForm.dateRange.$setValidity('range', false);\r\n }\r\n else {\r\n scope.innerForm.dateRange.$setValidity('range', true);\r\n }\r\n }\r\n else { \r\n if (isValidDate(endDate) && !isValidDate(startDate)) {\r\n scope.innerForm.dateRange.$setValidity('range', false);\r\n }\r\n else {\r\n scope.innerForm.dateRange.$setValidity('range', true);\r\n }\r\n } \r\n }\r\n\r\n elem[0].querySelector('input').focus = function () {\r\n var firstInvalid = elem[0].querySelector('input.empty');\r\n if (firstInvalid) {\r\n firstInvalid.focus();\r\n }\r\n else {\r\n var firstInvalid = elem[0].querySelector('input.field');\r\n if (firstInvalid) {\r\n firstInvalid.focus();\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpDeficiency', ['Format', 'IPDeficiencies', function (Format, IPDeficiencies) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n resultSet: '=?',\r\n deficiency: '=?',\r\n deficiencyId: '=?',\r\n classes: '@?',\r\n resultClick: '&',\r\n isRequired: '=?',\r\n requiredText: '@?',\r\n number: '@?',\r\n expandable: '=?',\r\n pdf: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/deficiency/deficiency.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n if (!attrs.requiredText || attrs.requiredText == \"\") {\r\n scope.reqText = 'Please select a result' + (scope.deficiency ? \"for \" + scope.deficiency.question : \"\");\r\n } else {\r\n scope.reqText = attrs.requiredText;\r\n }\r\n\r\n scope.resultSet.sort(function (a, b) {\r\n if (a.fail === b.fail) {\r\n if (a.abbr < b.abbr) { return -1; }\r\n else if (a.abbr > b.abbr) { return 1 }\r\n else { return 0 }\r\n }\r\n else if (a.fail < b.fail) { return -1; }\r\n else if (a.fail > b.fail) { return 1 }\r\n else { return 0 }\r\n })\r\n\r\n scope.$watch('deficiencyId', function (id) {\r\n if (id != null) {\r\n IPDeficiencies.getByID(id).then(function (deficiency) {\r\n scope.deficiency = deficiency;\r\n });\r\n }\r\n });\r\n\r\n if (scope.ngModel && scope.ngModel.deficiency) {\r\n scope.deficiency = scope.ngModel.deficiency;\r\n }\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n },\r\n controller: ['$scope', function ($scope) {\r\n\r\n }]\r\n };\r\n }])\r\n\r\n ;\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpDriversLicenseNumberController', ['$scope', '$timeout', 'Logger', function ($scope, $timeout, Logger) {\r\n\r\n var loggingTimeout = $timeout(function() {\r\n if ($scope.vm.showDriversLicenseNumber && $scope.recordId && !($scope.ngModel == null || $scope.ngModel == '')) {\r\n Logger.logAccess($scope.recordId, \"Drivers License Number\");\r\n }\r\n }, 0);\r\n\r\n $scope.getSectionType = function (boxNumber) {\r\n var result = \"password\";\r\n switch(boxNumber) {\r\n case 1:\r\n result = ($scope.vm.showDriversLicenseNumber) ? \"text\" : \"password\";\r\n break;\r\n }\r\n return result;\r\n }\r\n\r\n $scope.setFields = function (value) {\r\n if (value != undefined) {\r\n $scope.vm.boxone = value;\r\n }\r\n };\r\n\r\n $scope.validate = function() {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.driversLicenseNumber.$error);\r\n }\r\n }\r\n }\r\n var validationTimeout = $timeout($scope.validate(), 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(loggingTimeout);\r\n $timeout.cancel(validationTimeout);\r\n });\r\n\r\n $scope.$watch('ngModel', function (ngModel) {\r\n if (!isUndefined(ngModel) && isUndefined($scope.vm.boxone)) {\r\n $scope.setFields(ngModel);\r\n }\r\n });\r\n }])\r\n .directive('hlpDriversLicenseNumber', ['Format', '$timeout', 'Logger', function (Format, $timeout, Logger) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n name: '@',\r\n id: '@?',\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n isDisabled: '=?',\r\n change: '&?',\r\n ngModel: '=',\r\n question: '=?',\r\n recordId: '=?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n instructions: '@?',\r\n classes: '@?',\r\n masked: '=?',\r\n pdf: '=?'\r\n },\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/drivers-license-number/drivers-license-number.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.masked) { attrs.masked = false }\r\n $timeout(function () {\r\n if (!attrs.requiredText) { scope.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)) }\r\n }, 0);\r\n scope.vm = {};\r\n scope.vm.showDriversLicenseNumber = !scope.masked;\r\n scope.vm.boxone = \"\";\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.driversLicenseNumber.$error);\r\n }\r\n }\r\n scope.log = function () {\r\n if (scope.vm.showDriversLicenseNumber && scope.recordId && !(scope.ngModel == null || scope.ngModel == '')) {\r\n Logger.logAccess(scope.recordId, \"Drivers License Number\");\r\n }\r\n }\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n },\r\n controller: 'hlpDriversLicenseNumberController'\r\n };\r\n }])\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpEditHistory\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n //attributes\r\n record: \"=?\",\r\n revertTimezone: \"=?\",\r\n showModified: \"=?\",\r\n deleted: \"=?\"\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: \"templates/edit-history/edit-history.html\",\r\n link: function(scope, elem, attrs, ctrl) {\r\n // if (record) console.log(record);\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpElavon', ['$q', '$window', '$filter', '$rootScope', 'Payments', 'Regions', 'Resource', 'Format', function ($q, $window, $filter, $rootScope, Payments, Regions, Resource, Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n licenseRequestId: '@'\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/elavon/elavon.html',\r\n controller: ['$scope', '$timeout', function ($scope, $timeout) {\r\n // scope functions\r\n $scope.pay = function () {\r\n if ($scope.submitting == false) {\r\n $scope.submitting = true;\r\n if ($scope.directPayment) {\r\n $scope.copyBilling($scope.directPaymentObject);\r\n $scope.directPaymentObject.transaction_license_requests = $scope.checkout_items_ids;\r\n $scope.directPaymentObject.payment_method = $scope.payment.payment_method_id;\r\n $scope.regions.forEach(function (region) {\r\n if (region.id === $scope.directPaymentObject.billing_region_id) {\r\n $scope.directPaymentObject.billing_region_name = region.name;\r\n }\r\n if (region.id === $scope.directPaymentObject.shipping_region_id) {\r\n $scope.directPaymentObject.shipping_region_name = region.name;\r\n }\r\n });\r\n\r\n var directPayment = angular.copy($scope.directPaymentObject);\r\n Payments.directPayment(directPayment).then(function (data) {\r\n var transactionID = \"\";\r\n var message = \"\";\r\n\r\n if (data != undefined) {\r\n transactionID = data.transactionid;\r\n message = data.message;\r\n }\r\n\r\n if (!$scope.isPortal) {\r\n top.location.href = $rootScope.internalURL + 'license/controller.cfm?method=cnt_transactions.transactionRedirect&message=' + message + '&transactionID=' + transactionID;\r\n }\r\n });\r\n }\r\n else {\r\n $scope.regions.forEach(function (region) {\r\n if (region.id === $scope.payment.billing_region_id) {\r\n $scope.payment.billing_region_name = region.name;\r\n }\r\n if (region.id === $scope.payment.shipping_region_id) {\r\n $scope.payment.shipping_region_name = region.name;\r\n }\r\n });\r\n\r\n // exp date is input as a MM-YYYY string and we need to send MMYY\r\n var expDateSplitArray = $scope.payment.ssl_exp_date.split('-')\r\n var shortenedExpDate = expDateSplitArray[0] + expDateSplitArray[1].slice(2);\r\n var copyPayment = angular.copy($scope.payment);\r\n copyPayment.ssl_exp_date = shortenedExpDate;\r\n\r\n $scope.saveElavonObject = {};\r\n $scope.saveElavonObject.mypayment = copyPayment;\r\n $scope.saveElavonObject.mytotals = $scope.totals;\r\n\r\n Payments.payElavon($scope.saveElavonObject).then(function (data) {\r\n\r\n var transactionID = \"\";\r\n var message = \"\";\r\n\r\n if (data != undefined) {\r\n transactionID = data.transactionid;\r\n message = data.message;\r\n }\r\n\r\n if (!$scope.isPortal) {\r\n top.location.href = $rootScope.internalURL + 'license/controller.cfm?method=cnt_transactions.transactionRedirect&message=' + message + '&transactionID=' + transactionID;\r\n }\r\n else {\r\n top.location.href = $rootScope.portalURL + \"controller.cfm?method=public.transactionRedirect&message=\";\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n $scope.changeMethod = function (methodId) {\r\n $scope.paymentMethods.forEach(function (opt) {\r\n if (opt.id == methodId) {\r\n $scope.paymentMethodName = opt.value;\r\n $scope.selectedMethod = opt;\r\n if (!$scope.directPayment) {\r\n $scope.payment.ssl_payment_type = $scope.selectedMethod.payment_provider_key;\r\n $scope.payment.payment_method_id = opt.id;\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.copyBilling = function () {\r\n if ($scope.directPaymentObject.same_as_billing) {\r\n $scope.directPaymentObject.shipping_street = $scope.directPaymentObject.billing_street;\r\n $scope.directPaymentObject.shipping_street_2 = $scope.directPaymentObject.billing_street_2;\r\n $scope.directPaymentObject.shipping_municipality = $scope.directPaymentObject.billing_municipality;\r\n $scope.directPaymentObject.shipping_region_id = $scope.directPaymentObject.billing_region_id;\r\n $scope.directPaymentObject.shipping_postal_code = $scope.directPaymentObject.billing_postal_code;\r\n }\r\n }\r\n\r\n $scope.toggleDirectPayment = function (directPayment) {\r\n if (directPayment) {\r\n $scope.paymentMethods = directPaymentMethods;\r\n }\r\n else {\r\n $scope.paymentMethods = nonDirectPaymentMethods;\r\n }\r\n $scope.selected_name = '';\r\n $scope.payment.payment_method = undefined;\r\n $scope.paymentMethodName = \"\";\r\n }\r\n\r\n $scope.checkPaymentType = function (options) {\r\n if ($scope.paymentMethodName == undefined || $scope.paymentMethodName == \"\") { return false; }\r\n return options.indexOf($scope.paymentMethodName) >= 0;\r\n }\r\n\r\n $scope.changeDirect = function (newValue) {\r\n if (newValue) {\r\n $scope.paymentMethods = $scope.directPaymentMethods;\r\n }\r\n else {\r\n $scope.paymentMethods = $scope.nonDirectPaymentMethods;\r\n }\r\n $scope.directPayment = newValue;\r\n $scope.selected_name = '';\r\n $scope.payment.payment_method = undefined;\r\n }\r\n\r\n $scope.back = function () {\r\n var url = $rootScope.internalURL + 'license/applications/billing/show.cfm?licenseRequestID=' + $scope.licenseRequestId;\r\n if ($scope.isPortal) {\r\n $window.history.back();\r\n }\r\n else {\r\n $window.location.replace(url);\r\n }\r\n }\r\n\r\n $scope.columnClick = function (isInspections, predicate) {\r\n if (isInspections) {\r\n $scope.inspectionPred = predicate;\r\n $scope.inspectionRev = !$scope.inspectionRev;\r\n }\r\n else {\r\n $scope.requestPred = predicate;\r\n $scope.requestRev = !$scope.requestRev;\r\n }\r\n }\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n // scope variables\r\n scope.loading = true;\r\n scope.submitting = false;\r\n scope.paying = false;\r\n scope.items = [];\r\n scope.paymentMethods = [];\r\n scope.directPaymentMethods = [];\r\n scope.nonDirectPaymentMethods = [];\r\n scope.selectedMethod = {};\r\n scope.paymentMethodName = \"\";\r\n scope.directPayment = false;\r\n scope.checkingAccountTypes = [];\r\n scope.regions = [];\r\n scope.sum_balance_due = 0;\r\n scope.isPortal = true;\r\n scope.enterpriseWebsite = \"\";\r\n scope.enterpriseSiteLocation = \"\";\r\n\r\n if ($rootScope.enterprise) {\r\n scope.isPortal = $rootScope.isPortal == 'True';\r\n scope.enterpriseWebsite = $rootScope.enterprise.website;\r\n scope.enterpriseSiteLocation = $rootScope.enterprise.site_location;\r\n }\r\n\r\n scope.directPaymentObject = {\r\n internal: !scope.isPortal,\r\n user_id: $rootScope.userID,\r\n enterprise_id: $rootScope.enterpriseID,\r\n amount: 0\r\n };\r\n\r\n scope.payment = {\r\n payment_method_id: '',\r\n ssl_transaction_type: 'ccsale', //authorizes transaction and is immediately submitted for settlement\r\n ssl_amount: 0,\r\n ssl_country: 'USA',\r\n ssl_card_type: 'CREDITCARD',\r\n ssl_first_name: '',\r\n ssl_last_name: '',\r\n ssl_email: '',\r\n ssl_phone: '',\r\n ssl_avs_address: '',\r\n ssl_city: '',\r\n ssl_state: ''\r\n };\r\n\r\n scope.requestColumns = [\r\n { header: 'License', predicate: 'license_name' },\r\n { header: 'Amount', predicate: 'balance_due' }\r\n ];\r\n scope.requestPred = 'license_name';\r\n\r\n // initial loading\r\n var init = function () {\r\n var promises = [];\r\n\r\n promises.push(Payments.getPaymentMethods().then(function (methods) {\r\n if (methods != null) {\r\n\r\n // scope.paymentMethods = methods;\r\n scope.directPaymentMethods = methods.filter(function (method) {\r\n return method.direct_payment;\r\n });\r\n scope.nonDirectPaymentMethods = methods.filter(function (method) {\r\n return !method.direct_payment;\r\n });\r\n\r\n // init to non-direct\r\n scope.paymentMethods = scope.nonDirectPaymentMethods;\r\n }\r\n }));\r\n\r\n // this makes a call to Payments that looks at a session data set in CF code to determine which license requests were selected for payment\r\n // see initiate_transaction.cfm for CF code\r\n //for bulk pay, see PublicPortalService.cfc checkPaymentAmount\r\n\r\n promises.push(Payments.GetSessionDataForPayment().then(function (items) {\r\n scope.checkout_items_ids = \"\";\r\n scope.bulkPayLicenseData = {}\r\n\r\n if (items != null) {\r\n if (items.hasOwnProperty('data')) {\r\n if (items[\"data\"].hasOwnProperty('checkout_items_ids')) {\r\n\r\n scope.checkout_items_ids = items[\"data\"][\"checkout_items_ids\"].toString();\r\n if (scope.checkout_items_ids != null) {\r\n\r\n if (items[\"data\"].hasOwnProperty('bulkpaylicensedata') && items[\"data\"][\"bulkpaylicensedata\"].recordcount > 0) {\r\n var bulkpaylicensedataObj = items[\"data\"][\"bulkpaylicensedata\"];\r\n scope.totals = [];\r\n scope.payment.ssl_amount = 0;\r\n\r\n var i;\r\n for (i = 1; i <= bulkpaylicensedataObj.recordcount; i++) {\r\n scope.totals.push(bulkpaylicensedataObj[i]);\r\n }\r\n\r\n scope.totals.forEach(function (total) {\r\n scope.payment.ssl_amount += parseFloat(total.balance_due);\r\n });\r\n\r\n scope.payment.ssl_amount = parseFloat(scope.payment.ssl_amount).toFixed(2);\r\n scope.directPaymentObject.amount = scope.payment.ssl_amount;\r\n } else {\r\n promises.push(Payments.getLicenseRequestTotals(scope.checkout_items_ids).then(function (totals) {\r\n scope.payment.transaction_license_requests = scope.items;\r\n scope.totals = totals ? totals : [];\r\n scope.payment.amount = 0;\r\n\r\n scope.totals.forEach(function (total) {\r\n scope.payment.ssl_amount += parseFloat(total.balance_due);\r\n });\r\n scope.payment.ssl_amount = parseFloat(scope.payment.ssl_amount).toFixed(2);\r\n scope.directPaymentObject.amount = scope.payment.ssl_amount;\r\n }));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }));\r\n\r\n promises.push(Payments.getCheckingAccountTypes().then(function (results) {\r\n if (results != null) {\r\n scope.checkingAccountTypes = results;\r\n }\r\n }));\r\n\r\n promises.push(Payments.getCreditCardTypes().then(function (results) {\r\n if (results != null) {\r\n scope.creditCardTypes = results;\r\n }\r\n }));\r\n\r\n promises.push(Payments.getDebitCardTypes().then(function (results) {\r\n if (results != null) {\r\n scope.debitCardTypes = results;\r\n }\r\n }));\r\n\r\n promises.push(Regions.GetAbbreviation().then(function (regions) {\r\n scope.regions = regions;\r\n }));\r\n\r\n $q.all(promises).then(function () {\r\n scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n }\r\n init();\r\n }\r\n };\r\n }])\r\n\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpApplicationTypeController', ['$scope', 'ApplicationTypes', 'LicenseCategoryLevels', '$q', '$timeout', function ($scope, ApplicationTypes, LicenseCategoryLevels, $q, $timeout) {\r\n\r\n $scope.loading = true;\r\n $scope.typeLevels = {};\r\n $scope.typeLevel = {};\r\n $scope.vm = {};\r\n var isRenewal = false;\r\n var promises = [];\r\n $scope.typeOptions = [];\r\n $scope.hasLevels = false;\r\n\r\n if ($scope.defaultGroup) {\r\n $scope.defaultGroup.questions.forEach(function (question) {\r\n if (question.answer.data_point_code === 'certification_application_type')\r\n {\r\n $scope.defaultApplicationType = question.answer.value;\r\n }\r\n else if (question.answer.data_point_code === 'certification_levels')\r\n {\r\n $scope.defaultCertificationLevel = question.answer.value;\r\n }\r\n });\r\n }\r\n\r\n promises.push(ApplicationTypes.get($scope.parameters).then(function (types) {\r\n $scope.application_types = types;\r\n }))\r\n\r\n promises.push(LicenseCategoryLevels.get($scope.parameters).then(function (levels) {\r\n $scope.levels = levels;\r\n }))\r\n\r\n $q.all(promises).then(function () {\r\n var typeID = null;\r\n\r\n $scope.application_types.forEach(function (type) {\r\n $scope.typeLevels[type.id] = [];\r\n $scope.levels.forEach(function (level) {\r\n $scope.typeLevel[type.id + '%' + level.id] = false;\r\n })\r\n })\r\n\r\n if ($scope.group != null) {\r\n $scope.group.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_application_type') {\r\n $scope.sprocValueFound = false;\r\n var defaultValueFound = false;\r\n var answerShowVal = '';\r\n $scope.typeAnswerVal = '';\r\n $scope.application_types.forEach(function (type) {\r\n //If the applicant doesn't have a certification of that license category or have a expired certification (expiration is today or earlier) of that license category\r\n //The application type radio button on the form should display the selected options under License > Details > Application Types except \"Renewal\"\r\n\r\n //If the applicant has a valid certification (expiration date is later than today) of that license category\r\n //The application type radio button on the form should display the selected options under License > Details > Application Types\r\n //See TFS 161695\r\n //See TFS 169096\r\n // Take SPROC (getCertificationDataSetData) as priority, then default value \r\n if (!$scope.sprocValueFound && (question.default_value === type.name || type.id === question.answer.value)) {\r\n typeID = type.id;\r\n isRenewal = type.renewal;\r\n answerShowVal = type.name;\r\n $scope.typeAnswerVal = type.id;\r\n $scope.vm.applicationTypeID = type.id;\r\n $scope.vm.applicationTypeName = type.name;\r\n\r\n if (question.default_value === type.name) {\r\n defaultValueFound = true;\r\n }\r\n\r\n if (question.answer.value === type.id && type.renewal) {\r\n $scope.sprocValueFound = true;\r\n $scope.renewalTypeId = question.answer.value;\r\n }\r\n }\r\n });\r\n\r\n // Clear Default or SPROC Value if it's not on the form or set it if it was found\r\n if (!defaultValueFound && !$scope.sprocValueFound && question.default_value === question.answer.value) {\r\n question.answer.show_value = null;\r\n question.answer.value = null;\r\n } else {\r\n question.answer.show_value = answerShowVal;\r\n question.answer.value = $scope.typeAnswerVal;\r\n }\r\n }\r\n else if (question.data_point_code == 'certification_levels') {\r\n $scope.hasLevels = true;\r\n $scope.levelAnswerVal = question.answer.value;\r\n }\r\n })\r\n\r\n $scope.group.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_levels' && question.answer.value != null) {\r\n if (typeID != null) {\r\n $scope.application_types.forEach(function (type) {\r\n if (type.id == typeID) {\r\n question.answer.show_value = null;\r\n type.license_category_levels.forEach(function (l) {\r\n question.answer.value.split(',').forEach(function (v) {\r\n if (v == l.id) {\r\n $scope.typeLevels[typeID].push({ id: v });\r\n $scope.typeLevel[type.id + '%' + l.id] = true;\r\n if (question.answer.show_value == null) {\r\n question.answer.show_value = l.name;\r\n }\r\n else {\r\n question.answer.show_value += ', ' + l.name;\r\n }\r\n }\r\n })\r\n })\r\n }\r\n })\r\n }\r\n else {\r\n question.answer.value = null;\r\n }\r\n }\r\n })\r\n\r\n if (!$scope.hasLevels) {\r\n $scope.application_types.forEach(function (type) {\r\n //If this is only Application Types data point, without certification levels attached, then Renewal should always be included.\r\n //See DevOps 168875\r\n $scope.typeOptions.push(type);\r\n })\r\n }\r\n }\r\n else {\r\n $scope.typeOptions = $scope.application_types;\r\n\r\n if ($scope.component != null) {\r\n $scope.component.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_levels') {\r\n $scope.hasLevels = true;\r\n }\r\n })\r\n }\r\n }\r\n $scope.typeOptionsMapped = $scope.typeOptions.map(function (row) {\r\n return { has_levels: row.has_levels, id: row.id, label: row.label, license_category_levels: row.license_category_levels, name: row.label, renewal: row.renewal }\r\n })\r\n\r\n $scope.loading = false;\r\n })\r\n .catch(function (response) {\r\n // handle error\r\n });\r\n\r\n $scope.showLevel = function (type, level) {\r\n var show = false;\r\n\r\n if (\r\n //see TFS 161695\r\n //initial is not the app type and renewal is the preselected choice\r\n //see TFS 169096\r\n //changed to show Initial bubble always\r\n (isRenewal) ||\r\n //renewal is not the app type and renewal is not the preselected choice\r\n (type.name !== 'Renewal' && !isRenewal)\r\n //there is nothing in the group\r\n || $scope.group == null) {\r\n type.license_category_levels.forEach(function (l) {\r\n if (l.id == level.id) {\r\n show = true;\r\n }\r\n })\r\n }\r\n\r\n if ($scope.defaultCertificationLevel === level.id && $scope.defaultApplicationType === type.id) {\r\n show = true; // show old renewal value\r\n }\r\n\r\n return show;\r\n }\r\n\r\n $scope.typeChange = function (vm) {\r\n var timer = $timeout(function () {\r\n if ($scope.group != null) {\r\n $scope.group.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_application_type') {\r\n question.answer.value = vm.applicationTypeID;\r\n question.answer.show_value = vm.applicationTypeName;\r\n }\r\n });\r\n }\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n }\r\n\r\n $scope.levelsChange = function (type, level) {\r\n for (var key in $scope.typeLevels) {\r\n // skip loop if the property is from prototype\r\n if (!$scope.typeLevels.hasOwnProperty(key)) continue;\r\n\r\n if (key == type.id) {\r\n if ($scope.group != null) {\r\n $scope.group.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_levels') {\r\n question.answer.value = null;\r\n question.answer.show_value = null;\r\n\r\n if ($scope.isRequired) {\r\n question.answer.invalid = true;\r\n $scope.innerForm.$setValidity(\"required\", false);\r\n }\r\n\r\n if (angular.isArray($scope.typeLevels[key])) {\r\n\r\n $scope.typeLevels[key].forEach(function (v) {\r\n question.answer.invalid = false;\r\n $scope.innerForm.$setValidity(\"required\", true);\r\n\r\n if (question.answer.value == null) {\r\n question.answer.value = v.id;\r\n }\r\n else {\r\n question.answer.value += ',' + v.id;\r\n }\r\n if (question.answer.show_value == null) {\r\n question.answer.show_value = v.name;\r\n }\r\n else {\r\n question.answer.show_value += ', ' + v.name;\r\n }\r\n })\r\n }\r\n }\r\n else if (question.data_point_code == 'certification_application_type') {\r\n question.answer.value = key;\r\n question.answer.show_value = type.name;\r\n }\r\n })\r\n }\r\n }\r\n else {\r\n $scope.typeLevels[key] = [];\r\n }\r\n\r\n }\r\n }\r\n\r\n $scope.validate = function () {\r\n // Does not have a group when building the form, but does when filling one out\r\n if ($scope.group !== undefined) {\r\n $scope.group.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_levels' || question.data_point_code == 'certification_application_type') {\r\n if ($scope.isRequired && (question.answer.value == null && question.answer.show_value == null)) {\r\n question.answer.invalid = true;\r\n $scope.innerForm.$setValidity(\"required\", false);\r\n }\r\n else {\r\n question.answer.invalid = false;\r\n $scope.innerForm.$setValidity(\"required\", true);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.levelChange = function (type, level) {\r\n for (var key in $scope.typeLevel) {\r\n // skip loop if the property is from prototype\r\n if (!$scope.typeLevel.hasOwnProperty(key)) continue;\r\n\r\n if (key != (type.id + '%' + level.id)) {\r\n $scope.typeLevel[key] = false;\r\n }\r\n }\r\n\r\n if ($scope.group != null) {\r\n $scope.group.questions.forEach(function (question) {\r\n if (question.data_point_code == 'certification_levels') {\r\n question.answer.value = level.id;\r\n question.answer.show_value = level.name;\r\n $scope.levelAnswerVal = level.id;\r\n\r\n question.answer.invalid = !isEmpty($scope.innerForm.file.$error);\r\n\r\n if ($scope.isRequired && (question.answer.show_value == null && question.answer.value == null)) {\r\n question.answer.invalid = true;\r\n }\r\n }\r\n else if (question.data_point_code == 'certification_application_type') {\r\n question.answer.value = type.id;\r\n question.answer.show_value = type.name;\r\n $scope.typeAnswerVal = type.id;\r\n }\r\n })\r\n\r\n if ($scope.question !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.file.$error);\r\n\r\n if ($scope.isRequired && ($scope.question.answer.show_value == null && $scope.question.answer.value == null)) {\r\n $scope.question.answer.invalid = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // This is extra code to help showLevels(), this will disable other renewal columns if renewal is returned by the SPROC or disable all of them if it's not returned at all\r\n $scope.hideRadioBtn = function (type, level) {\r\n if ($scope.sprocValueFound && type.id === $scope.typeAnswerVal && level.id === $scope.levelAnswerVal)\r\n {\r\n return false; // don't disable selected option\r\n }\r\n else if ($scope.defaultCertificationLevel === level.id && $scope.defaultApplicationType === type.id)\r\n {\r\n return false; // if answer was sproc, keep it on form after changing value \r\n }\r\n else if ($scope.sprocValueFound && type.id === $scope.typeAnswerVal && level.id !== $scope.levelAnswerVal && type.renewal)\r\n {\r\n return true; // disable the (renewal) column when renewal came from sproc\r\n }\r\n else if ($scope.sprocValueFound && $scope.renewalTypeId !== undefined && type.renewal)\r\n {\r\n return true; // disable the (renewal) column. This is a weird case, but prevent renewal from being selected when not from SPROC\r\n }\r\n else\r\n {\r\n return false; // default, don't disable\r\n }\r\n }\r\n }])\r\n .directive('hlpApplicationType', ['$timeout', 'Format', 'Validation', function ($timeout, Format, Validation) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/application-type/application-type.html',\r\n replace: true,\r\n controller: 'hlpApplicationTypeController',\r\n scope: {\r\n parameters: '=?',\r\n checkboxOrRadio: '=?',\r\n group: '=?',\r\n component: '=?',\r\n defaultGroup: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n modal: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n showColon: '=?',\r\n pdf: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n //attributes\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n\r\n //label\r\n if (!attrs.showLabel) { attrs.showLabel = true; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.requiredText) { attrs.requiredText = 'Please enter a ' + attrs.label }\r\n\r\n scope.submitted = false;\r\n\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpField', ['$templateCache', function ($templateCache) {\r\n return {\r\n scope: {\r\n // strings\r\n name: '@?',\r\n id: '@?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n classes: '@?',\r\n instructions: '@?',\r\n blankText: '@?',\r\n selectShow: '@?',\r\n selectSort: '@?',\r\n selectValue: '@?',\r\n availableShow: '@?',\r\n availableSort: '@?',\r\n compareValue: '@?',\r\n arrayValue: '@?',\r\n service: '@?',\r\n method: '@?',\r\n groupBy: '@?',\r\n size: '@?',\r\n maxLength: '@?',\r\n placeholder: '@?',\r\n\r\n // bools\r\n showBlank: '=?',\r\n showLabel: '=?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n modal: '=?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n isDisabled: '=?',\r\n forceString: '=?',\r\n serviceOverride: '=?',\r\n multiple: '=?',\r\n sortable: '=?',\r\n vertical: '=?',\r\n pdf: '=?',\r\n innerForm: '=?'\r\n },\r\n transclude: true,\r\n template: function () {\r\n return $templateCache.get('templates/field/field.html');\r\n },\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n scope.directiveAttributes = attrs;\r\n },\r\n post: function (scope, elem, attrs, ngModel) {\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('FileUploadModalController', ['$scope', '$modalInstance', 'Upload', 'file_content', 'FileTypes', 'file_upload_existing_docs', 'parameters', '$rootScope', 'question_id', function ($scope, $modalInstance, Upload, file_content, FileTypes, file_upload_existing_docs, parameters, $rootScope, question_id) {\r\n\r\n $scope.vm = {\r\n file: null,\r\n file_content: file_content\r\n }\r\n $scope.uploading = false;\r\n $scope.working = false;\r\n $scope.file_upload_existing_docs = file_upload_existing_docs;\r\n $scope.existingFileSelected = false;\r\n $scope.newFileSelected = false;\r\n $scope.document_id = null;\r\n $scope.user_id = $rootScope.userID;\r\n $scope.validationText = false;\r\n\r\n if (parameters && parameters.user_id) {\r\n $scope.user_id = parameters.user_id\r\n }\r\n FileTypes.getByEnterprise().then(function(data) {\r\n if (data != null && data.length > 0) {\r\n $scope.extensions = data.toString();\r\n } else {\r\n $scope.extensions = \"'*'\";\r\n }\r\n \r\n });\r\n\r\n $scope.fileChange = function () {\r\n if (!$scope.working) {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.fileUpdated = function (file) {\r\n $scope.newFileSelected = file != null;\r\n $scope.working = true;\r\n Upload.base64DataUrl(file).then(function (content) {\r\n $scope.vm.file_content = content;\r\n $scope.working = false;\r\n $scope.uploading = false;\r\n })\r\n }\r\n\r\n $scope.existingFileUpdated = function (document_id) {\r\n $scope.existingFileSelected = document_id != null;\r\n $scope.document_id = document_id;\r\n }\r\n\r\n $scope.filePicked = function () {\r\n $scope.uploading = true;\r\n }\r\n\r\n $scope.documentParameters = {\r\n user_id: $scope.user_id,\r\n question_id: question_id\r\n }\r\n\r\n $scope.save = function () {\r\n if ($scope.vm.file != null && $scope.newFileSelected) {\r\n $modalInstance.close({\r\n file_name: $scope.vm.file.name,\r\n file_content: $scope.vm.file_content\r\n });\r\n }\r\n else if ($scope.document_id != null && $scope.existingFileSelected) {\r\n $modalInstance.close({\r\n document_id: $scope.document_id\r\n });\r\n }\r\n else if ($scope.file_upload_existing_docs == true)\r\n {\r\n $scope.validationText = true;\r\n }\r\n else {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFileUpload', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n fileUpload: '=',\r\n question: '=?',\r\n parameters: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n documentTypes: '=?',\r\n pdf: '=?',\r\n fromForm: '=?', // Do not require text fields when true\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n showDescription: '=?',\r\n topLabel: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n showColon: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/file-upload/file-upload.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'input'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.fromForm) { attrs.fromForm = false; } else { if (attrs.fromForm == true || attrs.fromForm == 'true') { attrs.fromForm = true; } else { attrs.fromForm = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n\r\n scope.requireTextFields = !attrs.fromForm ? attrs.isRequired : false;\r\n\r\n scope.$evalAsync(function () {\r\n if (!attrs.requiredText) { scope.requiredText = 'Please upload a ' + Format.label((scope.label || scope.name)) }\r\n });\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n },\r\n controller: ['$scope', '$rootScope', '$modal', '$window', '$timeout', 'Documents', function ($scope, $rootScope, $modal, $window, $timeout, Documents) {\r\n $scope.profilePictureFileName = null;\r\n $scope.userID = null;\r\n\r\n //Check the show_value field to see if the user already has a profile picture\r\n if ($scope.fileUpload && $scope.fileUpload.data_point_code == \"profile_photo\" && $scope.fileUpload.show_value != null) {\r\n $scope.profilePictureFileName = $scope.fileUpload.show_value;\r\n //Additional validation if the file is required and the user already has a profile picture\r\n var validationTimeout = $timeout(function () {\r\n if ($scope.innerForm !== undefined && $scope.isRequired) {\r\n $scope.innerForm.file.$setValidity(\"required\", true);\r\n }\r\n }, 0);\r\n $scope.$on(\"$destroy\", function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }\r\n if ($scope.question && $scope.question.parameters && $scope.question.parameters.user_id) {\r\n $scope.userID = $scope.question.parameters.user_id;\r\n }\r\n\r\n $scope.openDocumentModal = function (fileUpload) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/file-upload/file-upload-modal.html',\r\n controller: 'FileUploadModalController',\r\n resolve: {\r\n file_content: function () {\r\n return fileUpload.file_content;\r\n },\r\n file_upload_existing_docs: function () {\r\n if ($scope.question) {\r\n return $scope.question.file_upload_existing_docs;\r\n }\r\n return false;\r\n },\r\n question_id: function () {\r\n if ($scope.question) {\r\n return $scope.question.id;\r\n }\r\n return null;\r\n },\r\n parameters: function () {\r\n return $scope.parameters;\r\n }\r\n }\r\n }).result.then(function (upload) {\r\n if (upload != null) {\r\n if (upload.document_id != null) {\r\n Documents.getByID(upload.document_id).then(function (file) {\r\n fileUpload.file_name = file.file_name;\r\n fileUpload.document_name = file.name;\r\n fileUpload.document_id = file.id;\r\n fileUpload.document_code = file.code;\r\n fileUpload.document_type = file.document_type_id;\r\n fileUpload.document_description = file.description;\r\n fileUpload.document_locked = true;\r\n $scope.locked = true;\r\n fileUpload.file_updated = false;\r\n });\r\n }\r\n else {\r\n fileUpload.file_content = upload.file_content;\r\n fileUpload.file_name = upload.file_name;\r\n fileUpload.file_updated = true;\r\n fileUpload.document_id = null;\r\n fileUpload.document_locked = false;\r\n $scope.locked = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n if ($rootScope.enterprise && $rootScope.enterprise.website) {\r\n $scope.portalURL = $rootScope.enterprise.website;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.portalURL;\r\n }\r\n }\r\n else {\r\n if ($rootScope.enterprise && $rootScope.enterprise.site_location) {\r\n $scope.portalURL = $rootScope.enterprise.site_location;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.internalURL;\r\n }\r\n }\r\n\r\n if ($scope.question && $scope.question.answer) {\r\n $scope.locked = $scope.question.answer.document_locked;\r\n }\r\n\r\n $scope.validate = function () {\r\n if ($scope.question !== undefined && $scope.fileUpload !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.file.$error);\r\n\r\n if ($scope.isRequired && $scope.fileUpload.document_id == null && (isUndefined($scope.fileUpload.file_content) || $scope.fileUpload.file_content == null)) {\r\n $scope.question.answer.invalid = true;\r\n\r\n // Fix the form submission issue with profile photo uploaded from form for user with existing profile photo (Bug #246607)\r\n if ($scope.fileUpload.data_point_code == \"profile_photo\" && ($scope.fileUpload.show_value != null || !isUndefined($scope.fileUpload.show_value))) {\r\n $scope.question.answer.invalid = false;\r\n }\r\n }\r\n\r\n // This needs more checking, because that innerForm.file.$error isn't enough - \r\n // if the name or description are required but empty, we still need a validation error message, not just if the file isn't there.\r\n if ($scope.requireTextFields && ($scope.isRequired && ($scope.question.answer.document_name == null || ($scope.question.file_upload_description == true && $scope.question.answer.document_description == null)))) {\r\n $scope.question.answer.invalid = true;\r\n }\r\n }\r\n }\r\n }]\r\n }\r\n }]);","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('flashMessage', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n classes: '@?'\r\n },\r\n transclude: true,\r\n replace: true,\r\n templateUrl: 'templates/flash-message/flash-message.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpForm', ['Format', function (Format) {\r\n return {\r\n restrict: 'E',\r\n transclude: true,\r\n replace: true,\r\n scope: {\r\n id: '@?',\r\n classes: '@?',\r\n submit: '&',\r\n permission: '@?',\r\n permissionState: '@?',\r\n the_form: '=?theForm',\r\n fbForm: '=?',\r\n isFb: '=?',\r\n setValidationMessages: '=?',\r\n\r\n //disabled\r\n isDisabled: '=?'\r\n },\r\n templateUrl: 'templates/form/form.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n if (!attrs.id) { attrs.id = 'the_form' }\r\n\r\n }\r\n };\r\n }])\r\n .directive('accessibleForm', ['Permissions', '$compile', '$rootScope', '$window', '$timeout', function (Permissions, $compile, $rootScope, $window, $timeout) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem, attrs, ctrl, transclude) {\r\n\r\n if (!attrs.permissionState && $rootScope.$state != null && $rootScope.$state.current != null) { attrs.permissionState = $rootScope.$state.current.name; }\r\n\r\n if (attrs.permission != null && attrs.permissionState != null) {\r\n Permissions[attrs.permission](attrs.permissionState).then(function (access) {\r\n if (!access) {\r\n scope.noPermission = true;\r\n scope.handleDisabled();\r\n }\r\n });\r\n }\r\n\r\n scope.$watch('isDisabled', function (disabled) {\r\n if (disabled) {\r\n scope.handleDisabled();\r\n }\r\n });\r\n\r\n scope.handleDisabled = function () {\r\n scope.handleDisabledTimer = $timeout(scope.handleDisabledTimeout, 0);\r\n };\r\n\r\n scope.handleDisabledTimeout = function () {\r\n if (!(scope.isFb == true || scope.isFb == \"true\") && elem !== undefined) {\r\n scope.buttons = elem[0].querySelector('#buttons');\r\n scope.transcludedButtons = elem[0].querySelector('div.button-group');\r\n if (scope.buttons != null && scope.transcludedButtons != null) {\r\n scope.buttons.appendChild(scope.transcludedButtons);\r\n }\r\n }\r\n };\r\n\r\n scope.onSubmit = function () {\r\n scope.$broadcast(\"form:submit\");\r\n scope.submissionTimer = $timeout(scope.submissionTimeout, 0);\r\n }\r\n\r\n // set up event handler on the form element\r\n scope.submitEventHandler = angular.element(elem).on('submit', scope.onSubmit);\r\n\r\n scope.submissionTimeout = function () {\r\n // if this is a FB Form, loop through the form and find all invalid answers, and build the error messages with details for each. We have to do it this way so we know details about what page/question the answers are in (instead of using just a list of answers)\r\n if (scope.fbForm != null) {\r\n scope.setupValidationMessages(scope.fbForm);\r\n }\r\n if (scope.the_form != null) {\r\n if (scope.setValidationMessages == true) {\r\n scope.validationMessages = [];\r\n }\r\n angular.forEach(scope.the_form.$error.required, function(innerForm) {\r\n if (innerForm.$invalid) {\r\n innerForm.$setDirty();\r\n angular.forEach(innerForm.$error.required, function(field) {\r\n if (field != null && field.$invalid) {\r\n field.$setDirty();\r\n if (scope.setValidationMessages == true) {\r\n var message = field.$name;\r\n if (!scope.validationMessages.includes(message)) {\r\n scope.validationMessages.push(message);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n });\r\n if (scope.setValidationMessages == true) {\r\n scope.the_form.validationMessages = scope.validationMessages;\r\n }\r\n }\r\n\r\n if ((scope.fbForm != null && scope.fbForm.validationMessages.length > 0) || (scope.setValidationMessages == true && scope.the_form.validationMessages.length > 0)) {\r\n $window.scrollTo(0, 0);\r\n }\r\n else {\r\n // firstInvalid = elem[0].querySelector('.ng-invalid');\r\n scope.firstInvalid = elem[0].querySelector('.ng-invalid');\r\n // if we find one, set focus\r\n if (scope.firstInvalid) {\r\n scope.firstInvalid.focus();\r\n }\r\n /*if (firstInvalid) {\r\n firstInvalid.focus();\r\n }*/\r\n }\r\n };\r\n\r\n scope.setupValidationMessages = function (form) {\r\n if (form != null) {\r\n scope.validationMessages = [];\r\n form.pages.forEach(function (page) {\r\n page.sections.forEach(function (section) {\r\n if (section.has_content !== false) {\r\n section.components.forEach(function (component) {\r\n if (component.groups != null && component.conditions_met !== false && component.has_content !== false) {\r\n component.groups.forEach(function (group) {\r\n if (group.questions != null) {\r\n group.questions.forEach(function (question) {\r\n if (question.answer != null && question.answer != undefined && question.answer.invalid) {\r\n var message = {\r\n question: question,\r\n section: section,\r\n page: page\r\n }\r\n scope.validationMessages.push(message);\r\n }\r\n question.sub_components.forEach(function (subComponent) {\r\n if (subComponent.groups != null) {\r\n subComponent.groups.forEach(function (subGroup) {\r\n if (subGroup.questions != null) {\r\n subGroup.questions.forEach(function (subQuestion) {\r\n if (subQuestion.answer != null && subQuestion.answer != undefined && subQuestion.answer.invalid) {\r\n var message = {\r\n question: subQuestion,\r\n section: section,\r\n page: page\r\n }\r\n scope.validationMessages.push(message);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n });\r\n form.validationMessages = scope.validationMessages;\r\n }\r\n }\r\n\r\n if (scope.fbForm != null) {\r\n scope.fbForm.setupValidationMessages = scope.setupValidationMessages;\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n\r\n scope.buttons = undefined;\r\n scope.transcludedButtons = undefined;\r\n\t\t\t\t\tscope.submitEventHandler = undefined;\r\n scope.firstInvalid = undefined;\r\n\r\n $timeout.cancel(scope.submissionTimer);\r\n $timeout.cancel(scope.handleDisabledTimer);\r\n\r\n if (elem) {\r\n angular.element(elem).off('submit', scope.onSubmit);\r\n angular.element(elem).off(); // deregister all event handlers\r\n angular.element(elem).remove();\r\n elem = undefined;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormBuilder\", [\r\n \"$modal\",\r\n \"FBResponses\",\r\n \"$sce\",\r\n \"Upload\",\r\n \"Resource\",\r\n \"$timeout\",\r\n function($modal, FBResponses, $sce, Upload, Resource, $timeout) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n form: \"=?\",\r\n resultSet: \"=?\",\r\n classes: \"@?\",\r\n formType: \"=?\",\r\n sets: \"=?\",\r\n elements: \"=?\",\r\n parameters: \"=?\",\r\n attachments: \"=?\",\r\n changesMade: \"=?\",\r\n showLayouts: \"=?\",\r\n showPages: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"$injector\",\r\n \"$rootScope\",\r\n function($scope, $injector, $rootScope) {\r\n $scope.scrlTabsApi = {};\r\n \r\n if ($scope.showLayouts == null) {\r\n $scope.showLayouts = true;\r\n };\r\n\r\n if ($scope.showPages == null) {\r\n $scope.showPages = true;\r\n };\r\n\r\n $scope.label_position_options = [\r\n { id: true, name: \"Top\" },\r\n { id: false, name: \"Left\" }\r\n ];\r\n\r\n $scope.form.applicant_access =\r\n $scope.form.applicant_access || 0;\r\n\r\n $scope.form.apply_label_position = 0;\r\n $scope.applyLabelPosition = function() {\r\n // each question has a watcher on this variable, so all we need to do is change it, the value doesn't actually matter\r\n $scope.form.apply_label_position++;\r\n };\r\n\r\n $scope.addPage = function(form) {\r\n if (form.pages == null) {\r\n form.pages = [];\r\n }\r\n\r\n form.pages.push({\r\n id: guid(),\r\n form_id: form.id,\r\n sort_order: form.pages.length,\r\n name: \"Page \" + (form.pages.length + 1),\r\n sections: [\r\n {\r\n name: \"Section 1\",\r\n sort_order: 0,\r\n components: []\r\n }\r\n ],\r\n tab_active: true,\r\n show_save_button: false,\r\n continue_button_label: \"Save and Continue\",\r\n save_button_label: \"Save\"\r\n });\r\n };\r\n\r\n $scope.removePage = function(pages, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl: \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this page?\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n pages.splice(index, 1);\r\n $scope.scrlTabsApi.doRecalculate();\r\n $scope.form.the_form.$setDirty();\r\n }\r\n });\r\n };\r\n\r\n $scope.pageNameChanged = function() {\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n $scope.openPageSettings = function(pages, index) {\r\n var page = pages[index];\r\n\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/page-settings/page-settings.html\",\r\n controller: \"PageSettingsModalController\",\r\n resolve: {\r\n continue_button_label: function() {\r\n return page.continue_button_label;\r\n },\r\n show_save_button: function() {\r\n return page.show_save_button;\r\n },\r\n save_button_label: function() {\r\n return page.save_button_label;\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result != null) {\r\n pages[index].continue_button_label =\r\n result.continue_button_label;\r\n pages[index].show_save_button =\r\n result.show_save_button;\r\n pages[index].save_button_label =\r\n result.save_button_label;\r\n if (result.changed) {\r\n $scope.form.the_form.$setDirty();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.switchView = function (layout) {\r\n $scope.builderType = layout;\r\n };\r\n\r\n $scope.savePageSettings = function(page) {\r\n page.show_settings = false;\r\n };\r\n\r\n $scope.addSection = function(page) {\r\n if (page.sections == null) {\r\n page.sections = [];\r\n }\r\n\r\n page.sections.push({\r\n id: guid(),\r\n page_id: page.id,\r\n sort_order: page.sections.length,\r\n name: \"Section \" + (page.sections.length + 1),\r\n components: []\r\n });\r\n\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n $scope.removeSection = function(sections, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl: \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this section?\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n sections.splice(index, 1);\r\n $scope.form.the_form.$setDirty();\r\n }\r\n });\r\n };\r\n\r\n $scope.initComponent = function(component) {\r\n if (component.initialQuestions == null) {\r\n component.initialQuestions = [];\r\n }\r\n component.initialQuestions[\r\n component.component_type_id\r\n ] = component.questions;\r\n component.parameters = angular.copy($scope.parameters);\r\n //limit document type ids\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n component.limit_document_type_ids_array = component.limit_document_type_ids_array =\r\n component.limit_document_type_ids == null\r\n ? []\r\n : component.limit_document_type_ids;\r\n //limit position ids\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n component.limit_position_ids_array = component.limit_position_ids_array =\r\n component.limit_position_ids == null\r\n ? []\r\n : component.limit_position_ids;\r\n //limit vehicle type ids\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n component.limit_vehicle_type_ids_array = component.limit_vehicle_type_ids_array =\r\n component.limit_vehicle_type_ids == null\r\n ? []\r\n : component.limit_vehicle_type_ids;\r\n //skills\r\n component.parameters.skill_question_ids =\r\n component.skill_question_ids;\r\n component.parameters.skill_show_points =\r\n component.skill_show_points;\r\n component.parameters.skill_default =\r\n component.skill_default;\r\n component.updateEditList = false;\r\n component.updateSelectedList = false;\r\n\r\n if ($scope.sets != null) {\r\n $scope.sets.forEach(function(set) {\r\n if (set.id == component.data_set_id) {\r\n component.data_set = angular.copy(set);\r\n if (component.license_category_id == null) {\r\n component.license_category_id =\r\n set.default_license_category_id;\r\n } else {\r\n if (\r\n component.parameters\r\n .orignalLicenseID == null &&\r\n component.parameters.license_id !=\r\n null\r\n ) {\r\n component.parameters.orignalLicenseID =\r\n component.parameters.license_id;\r\n }\r\n\r\n component.parameters.license_category_id =\r\n component.license_category_id;\r\n\r\n if (\r\n component.data_set\r\n .default_license_category_id ==\r\n component.license_category_id\r\n ) {\r\n component.parameters.license_id =\r\n component.parameters.orignalLicenseID;\r\n } else {\r\n component.parameters.license_id = null;\r\n if (\r\n component.data_set.code ==\r\n \"certification\"\r\n ) {\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n point.code ==\r\n \"certification_application_type\"\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length -\r\n 1 -\r\n index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.addComponent = function(section) {\r\n if (section.components == null) {\r\n section.components = [];\r\n }\r\n\r\n section.components.push({\r\n id: guid(),\r\n section_id: section.id,\r\n sort_order: section.components.length,\r\n questions: [],\r\n edit: true,\r\n component_conditions: [],\r\n allow_multiple_groups: false,\r\n maximum_groups: null,\r\n groups_until_list: 2,\r\n limit_document_type_ids: null,\r\n limit_position_ids: null,\r\n limit_vehicle_type_ids: null,\r\n skill_question_ids: null,\r\n skill_show_points: true,\r\n skill_default: 0,\r\n content_type: 0,\r\n update_from_form_add: true\r\n });\r\n\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n $scope.removeComponent = function(components, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl: \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this component?\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n components.splice(index, 1);\r\n $scope.form.the_form.$setDirty();\r\n }\r\n });\r\n };\r\n\r\n $scope.pageOptions = {\r\n containment: \"#pages\",\r\n scrollableContainer: \"#pages\",\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope.sortableScope\r\n .$id === destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n }\r\n };\r\n\r\n $scope.sectionOptions = {\r\n containment: \"#sections\",\r\n scrollableContainer: \"#sections\",\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope.sortableScope\r\n .$id === destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n },\r\n itemMoved: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n }\r\n };\r\n\r\n $scope.componentOptions = {\r\n containment: \"#sections\",\r\n scrollableContainer: \"#sections\",\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope.sortableScope\r\n .$parent.$parent.$id ===\r\n destSortableScope.$parent.$parent.$id ||\r\n sourceItemHandleScope.itemScope.sortableScope\r\n .$parent.$parent.$parent.$parent.$id ===\r\n destSortableScope.$parent.$parent.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n },\r\n itemMoved: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n }\r\n };\r\n\r\n // Functions for editing and cancelling out of components\r\n $scope.editElement = function(element) {\r\n element.edit = true;\r\n element.original = angular.copy(element);\r\n };\r\n $scope.revertElement = function(element) {\r\n angular.copy(element.original, element);\r\n element.edit = false;\r\n };\r\n\r\n $scope.form.allDisabled = false;\r\n $scope.toggleAllDisabled = function() {\r\n // There's a listener on each question to update this\r\n $scope.form.allDisabled = !$scope.form.allDisabled;\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n $scope.form.allUpdateFromForm = false;\r\n $scope.toggleAllUpdate = function() {\r\n // There's a listener on each question to update this\r\n $scope.form.allUpdateFromForm = !$scope.form\r\n .allUpdateFromForm;\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n $scope.form.allShowInGrid = false;\r\n $scope.toggleAllShowInGrid = function() {\r\n // There's a listener on each question to update this\r\n $scope.form.allShowInGrid = !$scope.form.allShowInGrid;\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n $scope.form.allRequired = false;\r\n $scope.toggleAllRequired = function() {\r\n // There's a listener on each question to update this\r\n $scope.form.allRequired = !$scope.form.allRequired;\r\n $scope.form.the_form.$setDirty();\r\n };\r\n\r\n //default the label position to be \"left\"\r\n if (!$scope.form.label_position) {\r\n $scope.form.label_position = false;\r\n }\r\n\r\n //default the show_changed_answers to be false\r\n if (!$scope.form.display_changed_answers) {\r\n $scope.form.display_changed_answers = false;\r\n }\r\n\r\n $scope.checkIfImageOrPDF = function (component) {\r\n if (component.document_file_name) {\r\n var extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf'];\r\n return extensions.includes(component.document_file_name.split('.').pop().toLowerCase());\r\n }\r\n return false;\r\n }\r\n\r\n $scope.getDocumentURL = function (component) {\r\n return (\r\n $rootScope.internalURL +\r\n \"controller.cfm?method=publicPortalService.openDocument\" +\r\n \"&documentID=\" +\r\n component.document_id.toUpperCase() +\r\n \"&code=\" +\r\n component.document_code\r\n );\r\n };\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl: \"templates/form-builder/form-builder.html\",\r\n link: function(scope, elem, attrs, ctrl) {\r\n scope.builderType = true;\r\n\r\n scope.pdf_preview_content = null;\r\n scope.getPDFPreviewContent = function(component) {\r\n if (scope.pdf_preview_content == null) {\r\n FBResponses.getPDFFileContent(\r\n scope.form,\r\n scope.parameters\r\n ).then(function(pdf) {\r\n if (pdf != null && pdf.file_content != null) {\r\n // handle IE\r\n var browser = Resource.browser();\r\n if (\r\n browser.indexOf(\"Edge\") >= 0 ||\r\n browser.indexOf(\"IE\") >= 0\r\n ) {\r\n navigator.msSaveOrOpenBlob(\r\n Upload.dataUrltoBlob(pdf.file_content)\r\n );\r\n var doc = elem[0].querySelector(\r\n \"[id='component_pdf_preview']\"\r\n ).contentWindow.document;\r\n doc.open();\r\n doc.write(\"Open PDF to preview.\");\r\n doc.close();\r\n } else {\r\n scope.pdf_preview_content = $sce.trustAsResourceUrl(\r\n URL.createObjectURL(\r\n Upload.dataUrltoBlob(\r\n pdf.file_content\r\n )\r\n )\r\n );\r\n }\r\n }\r\n });\r\n }\r\n };\r\n }\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormBuilderFormPdf\", [\r\n \"$rootScope\",\r\n \"$timeout\",\r\n function($rootScope, $timeout) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n form: \"=?\",\r\n refresh: \"=?\",\r\n resultSet: \"=?\",\r\n classes: \"@?\",\r\n count: \"=?\",\r\n internal: \"@?\",\r\n deficiencies: \"=?\",\r\n parameters: \"=?\",\r\n deficiencyScore: \"=?\",\r\n inspectionChecklist: \"=?\"\r\n },\r\n controller: \"HlpFormBuilderFormController\",\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder-form/form-builder-form-pdf.html\",\r\n compile: function(elem, attrs) {\r\n var httpLoading = false;\r\n\r\n var progressListener = $rootScope.$on(\r\n \"loading:progress\",\r\n function() {\r\n if (!httpLoading) {\r\n //console.log('1 form-builder-form-pdf progressListener loading:progress');\r\n httpLoading = true;\r\n }\r\n }\r\n );\r\n\r\n var finishListener = $rootScope.$on(\r\n \"loading:finish\",\r\n function() {\r\n elem.ready(function() {\r\n var finishListenerTimer = $timeout(function() {\r\n //console.log('2 finishListener loading:finish');\r\n progressListener();\r\n finishListener();\r\n $rootScope.$broadcast(\"pdf:finish\");\r\n $timeout.cancel(finishListenerTimer);\r\n }, 0);\r\n });\r\n }\r\n );\r\n\r\n // maybe switch to ng-init\r\n elem.ready(function() {\r\n var timer = $timeout(function() {\r\n //if no api calls are made from the form (ie Doing File Upload/Signature and waiting for Document IDs to come back)\r\n if (!httpLoading) {\r\n //console.log('no api calls');\r\n progressListener();\r\n finishListener();\r\n $rootScope.$broadcast(\"pdf:finish\");\r\n $timeout.cancel(timer);\r\n }\r\n }, 0);\r\n });\r\n\r\n return {\r\n pre: function (scope, iElem, iAttrs) {\r\n scope.checkIfImageOrPDF = function (component) {\r\n if (component.document_file_name) {\r\n var extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf'];\r\n return extensions.includes(component.document_file_name.split('.').pop().toLowerCase());\r\n }\r\n return false;\r\n };\r\n },\r\n post: function(scope, iElem, iAttrs) {\r\n scope.$on(\"$destroy\", function() {\r\n //console.log('5 form-builder-form-pdf post progressListener');\r\n progressListener(); // apparently this deregisters the listener\r\n //console.log('6 form-builder-form-pdf post finishListener');\r\n finishListener(); // apparently this deregisters the listener\r\n\r\n if (iElem) {\r\n angular.element(iElem).off();\r\n angular.element(iElem).remove();\r\n iElem = null;\r\n }\r\n });\r\n }\r\n };\r\n }\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular\r\n .module(\"imagetrend.components\")\r\n .controller(\"HlpFormBuilderFormController\", [\r\n \"$scope\",\r\n \"$modal\",\r\n \"$filter\",\r\n \"$injector\",\r\n \"$rootScope\",\r\n \"$timeout\",\r\n function ($scope, $modal, $filter, $injector, $rootScope, $timeout) {\r\n $scope.initialized = false;\r\n $scope.submitted = false;\r\n\r\n var timeouts = [];\r\n\r\n function lowercaseFirstLetter(string) {\r\n return string.charAt(0).toLowerCase() + string.slice(1);\r\n }\r\n\r\n $scope.$watch(\"form\", function (form) {\r\n if ($scope.form != null && !$scope.initialized) {\r\n $scope.initializeAnswers();\r\n $scope.initialized = true;\r\n }\r\n });\r\n\r\n $scope.$watch(\"refresh\", function (refresh) {\r\n if (refresh && $scope.initialized) {\r\n $scope.initializeAnswers();\r\n }\r\n });\r\n\r\n $scope.$on(\"form:submit\", function () {\r\n $scope.submitted = true;\r\n });\r\n\r\n $scope.initializeAnswers = function (group_id) {\r\n $scope.answers = {};\r\n $scope.datapointAnswers = {};\r\n $scope.form.pages.forEach(function (page) {\r\n page.sections.forEach(function (section) {\r\n section.components.forEach(function (component) {\r\n $scope.getComponentAnswers(\r\n $scope.answers,\r\n component,\r\n $scope.datapointAnswers,\r\n false,\r\n group_id\r\n );\r\n });\r\n });\r\n });\r\n };\r\n\r\n $scope.getComponentAnswers = function (\r\n answers,\r\n component,\r\n datapointAnswers,\r\n isList,\r\n group_id\r\n ) {\r\n if (component.groups != null) {\r\n component.groups.forEach(function (group) {\r\n if (\r\n group.questions != null &&\r\n (group_id == null ||\r\n group_id == undefined ||\r\n group_id == group.id)\r\n ) {\r\n group.questions.forEach(function (question) {\r\n if (answers[question.id] == null) {\r\n answers[question.id] = [];\r\n }\r\n\r\n answers[question.id].push(question.answer);\r\n\r\n // data set answers\r\n if (question.data_point_code != null) {\r\n if (question.data_point_code == 'user_training_training_id' && question.default_value == null && $scope.trainingId && isValidGuid($scope.trainingId)) {\r\n question.answer.value = $scope.trainingId;\r\n }\r\n if (\r\n datapointAnswers[\r\n question.data_point_code\r\n ] == null\r\n ) {\r\n datapointAnswers[\r\n question.data_point_code\r\n ] = [];\r\n }\r\n\r\n datapointAnswers[\r\n question.data_point_code\r\n ].push(question.answer);\r\n }\r\n\r\n if (\r\n isList ||\r\n (component.allow_multiple_groups &&\r\n component.groups_until_list != null &&\r\n component.groups_until_list <=\r\n component.groups.length +\r\n component.other_file_groups\r\n .length)\r\n ) {\r\n isList = true;\r\n }\r\n\r\n // Get options from service/method, so that user-friendly values can be displayed on lists on page load (rather than guids)\r\n // GNIS code questions are slightly different - the ID isn't a GUID, but we want to use the method 'getByID'.\r\n if (\r\n isList &&\r\n question.service != null &&\r\n question.service != \"\" &&\r\n question.answer != null &&\r\n question.answer.show_value == null &&\r\n question.answer.value != null &&\r\n (isValidGuid(question.answer.value) ||\r\n isValidGuidList(question.answer.value) ||\r\n question.data_point_code == 'service_area_cities' ||\r\n question.data_point_code == 'service_area_counties' ||\r\n question.data_point_code == 'service_area_states' ||\r\n question.data_point_code == 'service_area_postal_codes' ||\r\n question.data_point_code == 'service_area_censustracts')\r\n ) {\r\n if (question.options == null) {\r\n var service = $injector.get(\r\n question.service\r\n );\r\n var method = \"getByID\";\r\n var params = question.answer.value;\r\n\r\n if (!isValidGuid(question.answer.value)\r\n ) {\r\n method = \"get\";\r\n params = {};\r\n params.ids = question.answer.value;\r\n params.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n params.limit_position_ids =\r\n component.limit_position_ids;\r\n params.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n params.skill_question_ids =\r\n component.skill_question_ids;\r\n params.skill_show_points =\r\n component.skill_show_points;\r\n params.skill_default =\r\n component.skill_default;\r\n }\r\n\r\n if (service[method] != null) {\r\n service[method](params, true).then(\r\n function (data) {\r\n if (angular.isArray(data)) {\r\n if (\r\n data.length >\r\n (question.answer\r\n .value != null\r\n ? question.answer.value.split(\r\n \",\"\r\n ).length\r\n : 0)\r\n ) {\r\n console.log(\r\n \"Write \" +\r\n method +\r\n \" method for \" +\r\n question.service +\r\n \" service with ids parameter!\"\r\n );\r\n } else {\r\n data.forEach(\r\n function (val) {\r\n if (\r\n val !=\r\n null\r\n ) {\r\n if (\r\n question\r\n .answer\r\n .show_value ==\r\n null\r\n ) {\r\n question.answer.show_value =\r\n val[\r\n question.select_show\r\n ];\r\n } else {\r\n question.answer.show_value +=\r\n \", \" +\r\n val[\r\n question\r\n .select_show\r\n ];\r\n }\r\n }\r\n }\r\n );\r\n }\r\n } else if (data != null) {\r\n question.answer.show_value =\r\n data[\r\n question.select_show\r\n ];\r\n }\r\n }\r\n );\r\n } else {\r\n console.log(\r\n \"Write \" +\r\n method +\r\n \" method for \" +\r\n question.service +\r\n \" service!\"\r\n );\r\n }\r\n } else {\r\n // this question has a service/method, but also has already had its options pulled in - no reason to do it again\r\n if (angular.isArray(question.options)) {\r\n var answerArray = question.answer.value.split(\r\n \",\"\r\n );\r\n question.options.forEach(function (\r\n val\r\n ) {\r\n if (\r\n val != null &&\r\n answerArray.indexOf(\r\n val.id\r\n ) >= 0\r\n ) {\r\n if (\r\n question.answer\r\n .show_value == null\r\n ) {\r\n question.answer.show_value =\r\n val[\r\n question.select_show\r\n ];\r\n } else {\r\n question.answer.show_value +=\r\n \", \" +\r\n val[\r\n question\r\n .select_show\r\n ];\r\n }\r\n }\r\n });\r\n } else if (question.options != null) {\r\n question.answer.show_value =\r\n question.options[\r\n question.select_show\r\n ];\r\n }\r\n }\r\n }\r\n\r\n question.sub_components.forEach(function (\r\n subComponent\r\n ) {\r\n $scope.getComponentAnswers(\r\n answers,\r\n subComponent,\r\n datapointAnswers,\r\n isList\r\n );\r\n });\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n var escapeString = function (str) {\r\n var result = \"\";\r\n if (str == null) {\r\n return result;\r\n }\r\n result = str.replace(\"'\", \"'\");\r\n result = result.replace(\"\\\\\", \"\\\\\\\\\");\r\n result = result.replace('\"', \""\");\r\n return result;\r\n };\r\n\r\n var checkConditions = function (component, groupID) {\r\n var satisfied = false;\r\n var answerIfStatement = [];\r\n if (component.component_conditions.length == 0) {\r\n satisfied = true;\r\n }\r\n //if we got this far, but $scope.answers is undefined, then something's wrong. For instance, this happens when a form is open and the user leaves the form by changing the process status, which pops up a modal. Once the modal closes, we get back in here and the $scope.answers are undefined, so the condition checker doesn't work. So let's try to get the answers reloaded in this situation.\r\n if ($scope.answers == undefined) {\r\n $scope.initializeAnswers();\r\n }\r\n\r\n if ($scope.answers != null) {\r\n var ifStatement = \"\";\r\n var cIndex = 0;\r\n component.component_conditions.forEach(function (condition) {\r\n var answers = $scope.answers[condition.question_id];\r\n\r\n if (cIndex > 0) {\r\n if (condition.and_flag) {\r\n ifStatement += \" && \";\r\n } else {\r\n ifStatement += \" || \";\r\n }\r\n }\r\n\r\n for (var i = 0; i < condition.left_parenthesis; i++) {\r\n ifStatement += \"(\";\r\n }\r\n\r\n if (answers != null && answers.length > 0) {\r\n // build answers (could be multiple)\r\n var answerStatement = \"\";\r\n var aIndex = 0;\r\n answers.forEach(function (answer) {\r\n if (answerIfStatement[aIndex] == undefined) {\r\n answerIfStatement[aIndex] = \"\";\r\n }\r\n if (groupID == null || groupID == answer.group_id) {\r\n if (cIndex > 0) {\r\n if (condition.and_flag) {\r\n answerIfStatement[aIndex] += \" && \";\r\n } else {\r\n answerIfStatement[aIndex] += \" || \";\r\n }\r\n }\r\n // answer value could be an array\r\n if (angular.isArray(answer.value)) {\r\n answerIfStatement[aIndex] += \"(\";\r\n answer.value.forEach(function (a, aiIndex) {\r\n if (aIndex > 0 || aiIndex > 0) {\r\n answerStatement += \" || \";\r\n }\r\n if (aiIndex > 0) {\r\n answerIfStatement[aIndex] += \" || \";\r\n }\r\n\r\n answerStatement +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n if (condition.operator == \"=\") {\r\n answerStatement += \"==\";\r\n answerIfStatement[aIndex] += \"==\";\r\n } else if (condition.operator == \"<>\") {\r\n answerStatement += \"!=\";\r\n answerIfStatement[aIndex] += \"!=\";\r\n } else if (condition.operator == \">\") {\r\n // setup field > value. we are doing value < field. so need to flip\r\n answerStatement += \"<\";\r\n answerIfStatement[aIndex] += \"<\";\r\n } else if (condition.operator == \"<\") {\r\n answerStatement += \">\";\r\n answerIfStatement[aIndex] += \">\";\r\n } else {\r\n answerStatement += condition.operator;\r\n answerIfStatement[aIndex] += condition.operator;\r\n }\r\n\r\n if (angular.isObject(a)) {\r\n answerStatement +=\r\n a != null\r\n ? \"'\" + a.id.toString().toLowerCase() + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n a != null\r\n ? \"'\" + a.id.toString().toLowerCase() + \"'\"\r\n : \"null\";\r\n } else {\r\n answerStatement +=\r\n a != null\r\n ? \"'\" + escapeString(a.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n a != null\r\n ? \"'\" + escapeString(a.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n }\r\n\r\n if (aiIndex == answer.value.length - 1) {\r\n answerIfStatement[aIndex] += \")\"\r\n }\r\n });\r\n if (answerIfStatement[aIndex] == \"(\") {\r\n answerIfStatement[aIndex] = \"false\";\r\n answerStatement = \"false\";\r\n }\r\n } else {\r\n var value = answer.value;\r\n\r\n if (condition.date_option > 0 && !condition.computed) {\r\n var num_unit = parseInt(condition.value);\r\n\r\n if (isNaN(num_unit)) {\r\n num_unit = 0;\r\n }\r\n\r\n condition.value = new Date();\r\n condition.computed = true;\r\n\r\n if (condition.date_option == 1) {\r\n //Date conditions using XX days from today\r\n condition.value = new Date(condition.value.setDate(condition.value.getDate() + num_unit));\r\n } else if (condition.date_option == 2) {\r\n //Date conditions using XX months from today\r\n condition.value = new Date(condition.value.setMonth(condition.value.getMonth() + num_unit));\r\n }\r\n }\r\n\r\n if (isValidDate(condition.value)) {\r\n condition.value = condition.value.setHours(0,0,0,0);\r\n }\r\n\r\n if (isValidDate(value)) {\r\n value = value.setHours(0, 0, 0, 0);\r\n }\r\n\r\n if (value == null && answer.result_set_id != null) {\r\n value = answer.result_set_id;\r\n }\r\n\r\n if (aIndex > 0) {\r\n answerStatement += \" || \";\r\n }\r\n\r\n answerStatement +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n if (value != null && angular.isString(value) && value.indexOf(\",\") > 0) {\r\n answerIfStatement[aIndex] += \"(\"\r\n }\r\n\r\n answerIfStatement[aIndex] +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n if (condition.operator == \"=\") {\r\n answerStatement += \"==\";\r\n answerIfStatement[aIndex] += \"==\";\r\n } else if (condition.operator == \"<>\") {\r\n answerStatement += \"!=\";\r\n answerIfStatement[aIndex] += \"!=\";\r\n } else if (condition.operator == \">\") {\r\n // setup field > value. we are doing value < field. so need to flip\r\n answerStatement += \"<\";\r\n answerIfStatement[aIndex] += \"<\";\r\n if (value == null || value == '') {\r\n value = '-8640000000000000'; // min date (for empty date fields)\r\n }\r\n } else if (condition.operator == \"<\") {\r\n answerStatement += \">\";\r\n answerIfStatement[aIndex] += \">\";\r\n if (value == null || value == '') {\r\n value = '8640000000000000'; // max date (for empty date fields) \r\n }\r\n } else {\r\n answerStatement += condition.operator;\r\n\r\n answerIfStatement[aIndex] += condition.operator;\r\n }\r\n\r\n answerStatement +=\r\n value != null\r\n ? \"'\" + escapeString(value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n \r\n answerIfStatement[aIndex] +=\r\n value != null\r\n ? \"'\" + escapeString(value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n // handle comma string answer\r\n if (value != null && angular.isString(value) && value.indexOf(\",\") > 0) {\r\n value.split(\",\").forEach(function (a, aiIndex) {\r\n answerStatement += \" || \";\r\n answerIfStatement[aIndex] += \" || \";\r\n \r\n answerStatement +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n condition.value != null\r\n ? \"'\" +escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n if (condition.operator == \"=\") {\r\n answerStatement += \"==\";\r\n answerIfStatement[aIndex] += \"==\";\r\n } else if (condition.operator == \"<>\") {\r\n answerStatement += \"!=\";\r\n answerIfStatement[aIndex] += \"!=\";\r\n } else if (condition.operator == \">\") {\r\n // setup field > value. we are doing value < field. so need to flip\r\n answerStatement += \"<\";\r\n answerIfStatement[aIndex] += \"<\";\r\n } else if (condition.operator == \"<\") {\r\n answerStatement += \">\";\r\n answerIfStatement[aIndex] += \">\";\r\n } else {\r\n answerStatement += condition.operator;\r\n answerIfStatement[aIndex] += condition.operator;\r\n }\r\n\r\n if (angular.isObject(a)) {\r\n answerStatement +=\r\n a != null\r\n ? \"'\" + a.id.toString().toLowerCase() + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n a != null\r\n ? \"'\" + a.id.toString().toLowerCase() + \"'\"\r\n : \"null\";\r\n } else {\r\n answerStatement +=\r\n a != null\r\n ? \"'\" + escapeString(a.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n a != null\r\n ? \"'\" + escapeString(a.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n }\r\n\r\n if (aiIndex == value.split(\",\").length - 1) {\r\n answerIfStatement[aIndex] += \")\"\r\n }\r\n });\r\n }\r\n }\r\n\r\n // check null/empty string\r\n if (answerStatement == \"\") {\r\n [null, \"\"].forEach(function (a, aiIndex) {\r\n if (aIndex > 0 || aiIndex > 0) {\r\n answerStatement += \" || \";\r\n }\r\n\r\n answerStatement +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n condition.value != null\r\n ? \"'\" + escapeString(condition.value.toString().toLowerCase()) + \"'\"\r\n : \"null\";\r\n\r\n if (condition.operator == \"=\") {\r\n answerStatement += \"==\";\r\n answerIfStatement[aIndex] += \"==\";\r\n } else if (condition.operator == \"<>\") {\r\n answerStatement += \"!=\";\r\n answerIfStatement[aIndex] += \"!=\";\r\n } else if (condition.operator == \">\") {\r\n // setup field > value. we are doing value < field. so need to flip\r\n answerStatement += \"<\";\r\n answerIfStatement[aIndex] += \"<\";\r\n } else if (condition.operator == \"<\") {\r\n answerStatement += \">\";\r\n answerIfStatement[aIndex] += \">\";\r\n } else {\r\n answerStatement += condition.operator;\r\n answerIfStatement[aIndex] += condition.operator;\r\n }\r\n\r\n answerStatement +=\r\n a != null\r\n ? \"'\" + a + \"'\"\r\n : \"null\";\r\n\r\n answerIfStatement[aIndex] +=\r\n a != null\r\n ? \"'\" + a + \"'\"\r\n : \"null\";\r\n });\r\n }\r\n aIndex++;\r\n }\r\n });\r\n } else {\r\n answerStatement = \"false\";\r\n answerIfStatement[aIndex] = \"false\";\r\n }\r\n\r\n if (answerStatement != \"\") {\r\n ifStatement += \"(\" + answerStatement + \")\";\r\n }\r\n\r\n for (var i = 0; i < condition.right_parenthesis; i++) {\r\n ifStatement += \")\";\r\n }\r\n cIndex++;\r\n });\r\n if (ifStatement.indexOf(\" && \") == 0) {\r\n ifStatement = ifStatement.replace(\" && \", \"\");\r\n }\r\n\r\n if (ifStatement.indexOf(\" || \") == 0) {\r\n ifStatement = ifStatement.replace(\" || \", \"\");\r\n }\r\n\r\n try {\r\n if (!satisfied && ifStatement != \"\" && eval(ifStatement)) {\r\n satisfied = true;\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n console.log(ifStatement, component, groupID);\r\n }\r\n }\r\n if (component.component_type.code == 'calculated_field') {\r\n var count = 0;\r\n answerIfStatement.forEach(function (answerStatement) {\r\n if (eval(answerStatement)) {\r\n count++;\r\n }\r\n })\r\n $scope.answers[component.groups[0].questions[0].id][0].value = count;\r\n }\r\n component.conditions_met = satisfied;\r\n return satisfied;\r\n };\r\n\r\n var componentHasContent = function (component) {\r\n if (component.groups != null) {\r\n component.groups.forEach(function (group) {\r\n if (group.questions != null) {\r\n group.questions.forEach(function (question) {\r\n question.sub_components.forEach(function (\r\n subComponent\r\n ) {\r\n if (\r\n checkConditions(subComponent, group.id)\r\n ) {\r\n componentHasContent(subComponent);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.api = {\r\n activePageIndex: function () {\r\n var contentIndex = 0;\r\n for (var i = 0; i < $scope.form.pages.length; i++) {\r\n var page = $scope.form.pages[i];\r\n if (page.tab_active) {\r\n return contentIndex;\r\n }\r\n if (page.has_content) {\r\n contentIndex++;\r\n }\r\n }\r\n return contentIndex;\r\n },\r\n\r\n activePage: function () {\r\n return $scope.form.pages[this.activePageIndex()];\r\n },\r\n\r\n furthestPageIndex: function () {\r\n var contentIndex = 0;\r\n for (var i = 0; i < $scope.form.pages.length; i++) {\r\n var page = $scope.form.pages[i];\r\n if (page.has_content) {\r\n if (page.disabled) {\r\n return contentIndex - 1;\r\n }\r\n contentIndex++;\r\n }\r\n }\r\n return contentIndex - 1;\r\n },\r\n\r\n absoluteFurthestPageIndex: function () {\r\n var contentIndex = 0;\r\n for (var i = 0; i < $scope.form.pages.length; i++) {\r\n var page = $scope.form.pages[i];\r\n if (page.disabled && page.has_content) {\r\n // if the page does not have content (ie the conditional fails) we actually want to increment past the page\r\n return contentIndex - 1;\r\n }\r\n contentIndex++;\r\n }\r\n return contentIndex - 1;\r\n },\r\n\r\n pagesCount: function () {\r\n var count = 0;\r\n for (var i = 0; i < $scope.form.pages.length; i++) {\r\n var page = $scope.form.pages[i];\r\n if (page.has_content) {\r\n count++;\r\n }\r\n }\r\n return count - 1;\r\n },\r\n\r\n hasContent: function () {\r\n return function (page) {\r\n page.has_content = false;\r\n if ($scope.initialized) {\r\n page.sections.forEach(function (section) {\r\n section.has_content = false;\r\n section.components.forEach(function (component) {\r\n if (checkConditions(component)) {\r\n page.has_content = true;\r\n section.has_content = true;\r\n componentHasContent(component, null);\r\n // give answers has content property to know whether to ignore on validation\r\n component.groups.forEach(function (group) {\r\n group.questions.forEach(function (question) {\r\n if (question.answer != undefined && question.answer != null) {\r\n question.answer.has_content = true;\r\n }\r\n });\r\n });\r\n } else {\r\n //calculated field component id\r\n if (component.component_type.id == \"f2c49055-cfe9-4288-afc0-d80bfff1de00\") {\r\n component.groups.forEach(function (group) {\r\n group.questions.forEach(function (question) {\r\n if (question.display_blank_zero == true) {\r\n question.answer.has_content = true;\r\n page.has_content = true;\r\n section.has_content = true;\r\n }\r\n })\r\n })\r\n }\r\n }\r\n });\r\n });\r\n }\r\n return page.has_content;\r\n };\r\n }\r\n };\r\n\r\n $scope.getDocumentURL = function (component) {\r\n var url = null;\r\n\r\n if (\r\n component != null &&\r\n component.document_id != null &&\r\n component.document_code != null\r\n ) {\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n if ($rootScope.enterprise && $rootScope.enterprise.website) {\r\n url = $rootScope.enterprise.website;\r\n }\r\n else {\r\n url = $rootScope.portalURL;\r\n }\r\n }\r\n else {\r\n if ($rootScope.enterprise && $rootScope.enterprise.site_location) {\r\n url = $rootScope.enterprise.site_location;\r\n }\r\n else {\r\n url = $rootScope.internalURL;\r\n }\r\n }\r\n url +=\r\n \"controller.cfm?method=publicPortalService.openDocument\" +\r\n \"&documentID=\" +\r\n component.document_id.toUpperCase() +\r\n \"&formResponseID=\" +\r\n component.response_id.toUpperCase() +\r\n \"&code=\" +\r\n component.document_code;\r\n }\r\n\r\n return url;\r\n };\r\n\r\n $scope.checkIfImageOrPDF = function (component) {\r\n if (component.document_file_name) {\r\n var extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf'];\r\n return extensions.includes(component.document_file_name.split('.').pop().toLowerCase());\r\n }\r\n return false;\r\n };\r\n\r\n $scope.focusQuestion = function (question, section, page) {\r\n for (var i = 0; i < $scope.form.pages.length; i++) {\r\n var p = $scope.form.pages[i];\r\n p.tab_active = false;\r\n }\r\n page.tab_active = true;\r\n section.expanded = true;\r\n var focusText = \"focus\" + question.id;\r\n timeouts.push(\r\n $timeout(function () {\r\n $scope.$broadcast(focusText);\r\n }, 0)\r\n );\r\n };\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n timeouts.forEach(function (timeout) {\r\n $timeout.cancel(timeout);\r\n });\r\n if ($scope) {\r\n $scope.$destroy();\r\n $scope = null;\r\n }\r\n });\r\n }\r\n ])\r\n .directive(\"hlpFormBuilderForm\", [\r\n \"FBResponses\",\r\n \"$sce\",\r\n \"Upload\",\r\n \"Resource\",\r\n function (FBResponses, $sce, Upload, Resource) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n form: \"=?\",\r\n refresh: \"=?\",\r\n resultSet: \"=?\",\r\n classes: \"@?\",\r\n count: \"=?\",\r\n internal: \"@?\",\r\n deficiencies: \"=?\",\r\n deficiencyScore: \"=?\",\r\n parameters: \"=?\",\r\n answers: \"=?\",\r\n datapointAnswers: \"=?\",\r\n scrlTabsApi: \"=?\",\r\n completed: \"=?\",\r\n saving: \"=?\",\r\n api: \"=?\",\r\n preview: \"=?\",\r\n trainingId: \"=?\",\r\n inspectionChecklist: \"=?\"\r\n },\r\n controller: \"HlpFormBuilderFormController\",\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder-form/form-builder-form.html\",\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.getPDFPreviewContent = function (component) {\r\n scope.parameters.document_name =\r\n scope.form.name == null\r\n ? \"application\"\r\n : scope.form.name;\r\n FBResponses.getPDFFileContent(\r\n scope.form,\r\n scope.parameters\r\n ).then(function (pdf) {\r\n if (pdf != null && pdf.file_content != null) {\r\n // handle IE\r\n var browser = Resource.browser();\r\n if (\r\n browser.indexOf(\"Edge\") >= 0 ||\r\n browser.indexOf(\"IE\") >= 0\r\n ) {\r\n navigator.msSaveOrOpenBlob(\r\n Upload.dataUrltoBlob(pdf.file_content)\r\n );\r\n var doc = elem[0].querySelector(\r\n \"[id='component_pdf_preview']\"\r\n ).contentWindow.document;\r\n doc.open();\r\n doc.write(\"Open PDF to preview.\");\r\n doc.close();\r\n doc = undefined;\r\n } else {\r\n component.pdf_preview_content = $sce.trustAsResourceUrl(\r\n URL.createObjectURL(\r\n Upload.dataUrltoBlob(\r\n pdf.file_content\r\n )\r\n )\r\n );\r\n }\r\n }\r\n });\r\n };\r\n }\r\n };\r\n }\r\n ]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormField', ['$injector', '$rootScope', '$templateCache', '$timeout', 'Format', function ($injector, $rootScope, $templateCache, $timeout, Format) {\r\n return {\r\n replace: true,\r\n transclude: true,\r\n template: function () {\r\n return $templateCache.get('templates/form-field/form-field.html');\r\n },\r\n controller: ['$scope', '$timeout', function($scope, $timeout) {\r\n }],\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ctrl) {\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n\r\n // strings\r\n if (!scope.directiveAttributes.name) { scope.name = 'field'; }\r\n if (!scope.directiveAttributes.id) { scope.id = scope.name; }\r\n if (!scope.directiveAttributes.label) { scope.label = Format.label(scope.name); }\r\n scope.$evalAsync(function () {\r\n if (!scope.directiveAttributes.requiredText) { scope.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)); }\r\n });\r\n if (!scope.directiveAttributes.blankText) { scope.blankText = 'Select ' + scope.label; } else { if (scope.blankText == 'EMPTY') { scope.blankText = ''; } else { scope.blankText = 'Select ' + scope.blankText; } } \r\n if (!scope.directiveAttributes.method) { scope.method = 'get'; }\r\n if (!scope.directiveAttributes.size) { scope.size = 35; }\r\n if (!scope.directiveAttributes.placeholder) { scope.placeholder = ''; }\r\n\r\n // bools\r\n if (!scope.directiveAttributes.showLabel) { scope.showLabel = scope.label.length > 0; }\r\n if (!scope.directiveAttributes.title) { scope.title = scope.label; }\r\n if (!scope.directiveAttributes.showColon) { scope.showColon = true; }\r\n if (!scope.directiveAttributes.showBlank) { scope.showBlank = true; }\r\n if (!scope.directiveAttributes.setOptions) { scope.setOptions = true; }\r\n\r\n /*scope.$evalAsync(function () {\r\n //angular.element(elem[0]).on(\"focus\", 'ng-form', function () {\r\n // var firstInvalid = elem[0].querySelector('input:not([type=hidden]), select:not([type=hidden])');\r\n // if (firstInvalid) {\r\n // firstInvalid.focus();\r\n // }\r\n //});\r\n });*/\r\n },\r\n post: function (scope, elem, attrs, ctrl) {\r\n\r\n /*\r\n scope.validationFocus = function () {\r\n elem[0].querySelector('ng-form').focus = function () {\r\n scope.firstInvalid = elem[0].querySelector('input:not([type=hidden]), select:not([type=hidden])');\r\n if (scope.firstInvalid) {\r\n scope.firstInvalid.focus();\r\n }\r\n }\r\n };\r\n\r\n var validationFocusTimeout = $timeout(function () {\r\n scope.validationFocus();\r\n }, 0);\r\n */\r\n\r\n if (scope.options != null && !(scope.service != null && scope.service != '' && scope.serviceOverride)) {\r\n if (Object.prototype.toString.call(scope.options) !== '[object Array]') {\r\n scope.options.split(',').forEach(function (option) {\r\n scope.dirOptions.push({ id: option.trim(), name: option.trim() });\r\n });\r\n scope.optionsLoaded = true;\r\n }\r\n else {\r\n scope.$evalAsync(function () {\r\n scope.dirOptions = scope.options;\r\n scope.optionsLoaded = true;\r\n });\r\n }\r\n }\r\n else if (scope.service != null && scope.service != '') {\r\n var service = $injector.get(scope.service);\r\n\r\n if (typeof (scope.parameters) == 'undefined' && scope.parameters == null) {\r\n scope.parameters = {};\r\n }\r\n service[scope.method](angular.copy(scope.parameters)).then(function (data) {\r\n scope.dirOptions = data;\r\n scope.optionsLoaded = true;\r\n if (scope.setOptions) {\r\n scope.options = data;\r\n }\r\n });\r\n }\r\n else {\r\n scope.optionsLoaded = true;\r\n }\r\n\r\n // watch if options is coming from an array that hasn't been set yet\r\n scope.$watch('options', function (options) {\r\n if (options != null && scope.optionsLoaded) {\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n\r\n if (Object.prototype.toString.call(scope.options) !== '[object Array]') {\r\n scope.options.split(',').forEach(function (option) {\r\n scope.dirOptions.push({ id: option.trim(), name: option.trim() });\r\n });\r\n }\r\n else {\r\n scope.dirOptions = scope.options;\r\n }\r\n scope.optionsLoaded = true;\r\n }\r\n }, true);\r\n\r\n scope.getDescendantProp = function (obj, desc) {\r\n return Format.getDescendantProp(obj, desc, scope.forceString);\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n // $timeout.cancel(validationFocusTimeout);\r\n\r\n // scope.firstInvalid = undefined;\r\n // elem[0].querySelector('ng-form').focus = undefined;\r\n });\r\n \t}\r\n \t}\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpHelp', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n //attributes\r\n text: '@',\r\n classes: '@?'\r\n\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/help/help.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n \r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpHtml', ['$compile', '$parse', function ($compile, $parse) {\r\n return {\r\n restrict: 'E',\r\n link: function (scope, element, attr) {\r\n scope.$watch(attr.content, function () {\r\n element.html($parse(attr.content)(scope));\r\n $compile(element.contents())(scope);\r\n }, true);\r\n\r\n scope.$on('$destroy', function () {\r\n if (element) {\r\n angular.element(element).off();\r\n angular.element(element).remove();\r\n element = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpIcon', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n name: '@?',\r\n id: '@?',\r\n alt: '@?',\r\n title: '@?',\r\n classes: '@?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/icon/icon.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!attrs.name) { attrs.name = 'icon'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.alt) { attrs.alt = Format.label(attrs.name); }\r\n if (!attrs.title) { attrs.title = attrs.alt; }\r\n if (!attrs.classes) { attrs.classes = 'delete' }\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpInput', ['$timeout', 'Format', 'Validation', function ($timeout, Format, Validation) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=',\r\n validation: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n size: '@?',\r\n type: '@?',\r\n maxLength: '@?',\r\n modal: '@?',\r\n placeholder: '@?',\r\n hideLabel: '@?',\r\n ariaLabel: '@?',\r\n autoComplete: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n entireWidth: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n pdf: '=?'\r\n\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/input/input.html',\r\n controller: ['$scope', '$timeout', function ($scope, $timeout) {\r\n $scope.validate = function () {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.type == 'email' && $scope.ngModel != null && $scope.ngModel.length > 0) {\r\n var valid = /^[a-z0-9._%+!#$&'*/=?^`{|}~-]+@[a-z0-9.-]+\\.[a-z]{2,63}$/i.test($scope.ngModel);\r\n $scope.innerForm[$scope.name].$setValidity(\"email\", valid);\r\n }\r\n if ($scope.type == 'mmyyyy' && $scope.ngModel != null && $scope.ngModel.length > 0) {\r\n var valid = /^(0[1-9]|1[012])-\\d{4}$/i.test($scope.ngModel);\r\n $scope.innerForm[$scope.name].$setValidity(\"mmyyyy\", valid);\r\n }\r\n if ($scope.type == 'numberRegex' && $scope.ngModel != null && $scope.ngModel.length > 0) {\r\n var valid = /^[0-9]*$/i.test($scope.ngModel);\r\n $scope.innerForm[$scope.name].$setValidity(\"numberRegex\", valid);\r\n }\r\n if ($scope.validation) {\r\n Validation.validateQuestion($scope.innerForm[$scope.name], $scope.validation, $scope.ngModel).then(function (result) {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !result || !isEmpty($scope.innerForm[$scope.name].$error) || !isEmpty($scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n var validationTimeout = $timeout(function() {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || $scope.name));\r\n }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.autoComplete = attrs.autoComplete;\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'input'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.size) { attrs.size = '35'; }\r\n if (!attrs.type) { attrs.type = 'text' }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n if (!attrs.maxLength) { attrs.maxLength = '5000'; } else { if (attrs.maxLength == '') attrs.maxLength = '5000'; }\r\n if (attrs.hideLabel === undefined || attrs.hideLabel === null) { attrs.hideLabel = false }\r\n\r\n //label\r\n var wasEmpty = attrs.label == 'EMPTY';\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); } else { if (attrs.label == 'EMPTY') { attrs.label = ''; } }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0 || wasEmpty; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n //if (!attrs.requiredText) { scope.requiredText = 'Please enter a ' + Format.label(attrs.label || attrs.name) }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n \r\n /*\r\n scope.validationFocus = function () {\r\n // if (!attrs.requiredText) { scope.requiredText = 'Please enter a ' + Format.label(scope.label || scope.name) }\r\n\r\n // new way of doing this\r\n angular.element(elem[0]).on('focus', 'ng-form', function () {\r\n scope.firstInvalid = elem[0].querySelector('input');\r\n if (scope.firstInvalid) {\r\n scope.firstInvalid.focus();\r\n }\r\n });\r\n\r\n // old way of doing this\r\n elem[0].querySelector('ng-form').focus = function () {\r\n scope.firstInvalid = elem[0].querySelector('input');\r\n if (scope.firstInvalid) {\r\n scope.firstInvalid.focus();\r\n }\r\n }\r\n };\r\n\r\n var validationFocusTimeout = $timeout(function () {\r\n scope.validationFocus();\r\n }, 0);\r\n */\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.type == 'email' && scope.ngModel != null && scope.ngModel.length > 0) {\r\n var valid = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,63}$/i.test(scope.ngModel);\r\n scope.innerForm[scope.name].$setValidity(\"email\", valid);\r\n }\r\n if (scope.type == 'mmyyyy' && scope.ngModel != null && scope.ngModel.length > 0) {\r\n var valid = /^(0[1-9]|1[012])-\\d{4}$/i.test(scope.ngModel);\r\n scope.innerForm[scope.name].$setValidity(\"mmyyyy\", valid);\r\n }\r\n if (scope.type == 'numberRegex' && scope.ngModel != null && scope.ngModel.length > 0) {\r\n var valid = /^[0-9]*$/i.test(scope.ngModel);\r\n scope.innerForm[scope.name].$setValidity(\"numberRegex\", valid);\r\n }\r\n if (scope.ngModel == null) {\r\n scope.innerForm[scope.name].$setValidity(\"mmyyyy\", true);\r\n scope.innerForm[scope.name].$setValidity(\"numberRegex\", true);\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm[scope.name], scope.validation, scope.ngModel).then(function (result) {\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !result || !isEmpty(scope.innerForm[scope.name].$error) || !isEmpty(scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n\r\n }\r\n\r\n scope.getClasses = function () {\r\n if ((!scope.showLabel && !scope.modal && !scope.topLabel) || scope.topLabel) {\r\n return 'no-label col-lg-' + scope.getWidth(12) + ' col-xs-' + scope.getWidth(12);\r\n }\r\n else if (scope.showLabel && !scope.modal && !scope.topLabel) {\r\n return 'col-xs-' + scope.getWidth(9) + ' col-lg-' + scope.getWidth(10);\r\n }\r\n else if (scope.modal && !scope.topLabel) {\r\n return 'col-xs-' + scope.getWidth(9);\r\n }\r\n }\r\n\r\n if (scope.question !== undefined && (scope.question.data_point_code == 'vehicle_certification_number' || scope.question.data_point_code == 'user_email' || scope.question.data_point_code == 'user_training_training_id' || scope.question.data_point_code == 'service_users_personnel_id' || scope.question.data_point_code == 'calendar_year')) {\r\n // watch for signal to refresh the validation\r\n scope.$watch('question.refreshValidation', function (refresh) {\r\n scope.$evalAsync(function () {\r\n if (refresh !== undefined && refresh !== null && refresh.length) {\r\n Validation.validateQuestion(scope.innerForm[scope.name], scope.validation, scope.ngModel).then(function (result) {\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !result || !isEmpty(scope.innerForm[scope.name].$error) || !isEmpty(scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n scope.question.refreshValidation = null;\r\n });\r\n }, true);\r\n }\r\n\r\n scope.getWidth = function (max) {\r\n if (scope.entireWidth) {\r\n return max;\r\n }\r\n else {\r\n var max_length = (scope.validation != null) ? scope.validation.max_length || scope.maxLength : scope.maxLength;\r\n if (max_length == null || max_length == 0) {\r\n return max;\r\n }\r\n return Math.max(Math.min(Math.ceil(max_length / max), max), 2);\r\n }\r\n }\r\n //ctrl.$viewChangeListeners.push(function () {\r\n // scope.$eval(attrs.ngChange);\r\n //});\r\n\r\n scope.submitted = false;\r\n scope.onFormSubmit = scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.onFormSubmit();\r\n // $timeout.cancel(validationFocusTimeout);\r\n\r\n // scope.firstInvalid = undefined;\r\n // elem[0].querySelector('ng-form').focus = undefined;\r\n\r\n // when scope.$destroy is executed, it will remove all listeners registered via $on on scope, but it will NOT remove $rootScope listeners\r\n // which must be unregistered manually\r\n\r\n // when scope.$destroy is executed, it will remove all listeners registered via $on on scope, but it will NOT remove $rootScope listeners\r\n // which must be unregistered manually\r\n\r\n // when element.remove() is executed that element and all of its children will be removed from the DOM together with all event handlers\r\n // attached via element.on, it will NOT destroy the scope associated with the element\r\n\r\n // angular.js removes $$watchers when scope's $destroy method is call, so we SHOULD NOT have to do this manually\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"inspectionPdf\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n templateUrl: \"templates/inspection-pdf/inspection-pdf.html\",\r\n scope: {\r\n inspection: \"=?\"\r\n },\r\n replace: true,\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.deficiencyScore = { score: 0 };\r\n // Decodes header and footer for PDF\r\n function decodeHtml(encodedHtml) {\r\n var txt = document.createElement(\"textarea\");\r\n txt.innerHTML = encodedHtml;\r\n return txt.value;\r\n }\r\n if (scope.inspection.checklist.template.header != null) {\r\n scope.inspection.checklist.template.header = decodeHtml(\r\n scope.inspection.checklist.template.header\r\n );\r\n }\r\n if (scope.inspection.checklist.template.footer != null) {\r\n scope.inspection.checklist.template.footer = decodeHtml(\r\n scope.inspection.checklist.template.footer\r\n );\r\n }\r\n\r\n scope.$on(\"$destroy\", function() {\r\n if (elem) {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n\r\n if (scope.inspection.checklist.template !== null && scope.inspection.id !== null) {\r\n scope.inspection.passingChecklist = scope.inspection.checklist.template;\r\n scope.inspection.passingChecklist.inspectionID = scope.inspection.id;\r\n scope.inspection.passingChecklist.comments = scope.inspection.comments;\r\n\r\n if (scope.inspection.checklist.template.require_responsible_party_signoff === true && (scope.inspection.checklist.signature_type_in_person === null || scope.inspection.checklist.signature_type_in_person === undefined)) {\r\n scope.inspection.checklist.signature_type_in_person = true;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('InspectionSpotCheckModalController', ['$scope', '$modalInstance', 'Services', 'IPVisits', function ($scope, $modalInstance, Services, IPVisits) {\r\n $scope.spotCheckInfo = {\r\n vehicle: {},\r\n service: {}\r\n };\r\n $scope.new_vehicle = false;\r\n $scope.services = [];\r\n $scope.selectParameter = 'Service';\r\n $scope.close = function () {\r\n $modalInstance.close(false);\r\n }\r\n\r\n $scope.addVehicle = function (vehicle) {\r\n if (vehicle != null) {\r\n $scope.spotCheckInfo.vehicle = vehicle;\r\n Services.getServicesFromVehicleId(vehicle.id).then(function (services) {\r\n $scope.services = services;\r\n\r\n if (services.length === 1) {\r\n $scope.services[0].is_default = true;\r\n $scope.spotCheckInfo.service = $scope.services[0];\r\n }\r\n });\r\n\r\n vehicle = null;\r\n $scope.new_vehicle = false;\r\n }\r\n }\r\n\r\n $scope.removeVehicle = function () {\r\n $scope.spotCheckInfo.vehicle = {};\r\n $scope.spotCheckInfo.service = {};\r\n $scope.services = [];\r\n }\r\n\r\n $scope.addService = function (serviceId) {\r\n if (serviceId != null) {\r\n var idx = $scope.services.findIndex(function (item) {\r\n return item.id === serviceId;\r\n });\r\n $scope.spotCheckInfo.service = $scope.services[idx];\r\n } else {\r\n $scope.spotCheckInfo.service = {};\r\n }\r\n }\r\n\r\n $scope.postSpotCheckInspection = function () {\r\n IPVisits.postSpotCheckInspection($scope.spotCheckInfo).then(function (ret) {\r\n $modalInstance.close(ret);\r\n });\r\n }\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('InspectionVisit', ['$scope', '$stateParams', 'IPVisits', '$state', 'Format', function ($scope, $stateParams, IPVisits, $state, Format) {\r\n\r\n $scope.portal = $state.current.data.isPortal;\r\n $scope.visit = $stateParams.visit == null ? {} : $stateParams.visit;\r\n $scope.masterVisit = $stateParams.visit == null ? {} : $stateParams.visit;\r\n $scope.visitID = $stateParams.id;\r\n $scope.saving = false;\r\n $scope.resetting = false;\r\n $scope.loading = false;\r\n $scope.isDetailsOpen = true;\r\n $scope.isInspectionsOpen = true;\r\n $scope.isAvaliableOpen = true;\r\n\r\n if ($stateParams.id != null) {\r\n $scope.loading = true;\r\n\r\n IPVisits.getByID($stateParams.id).then(function (visit) {\r\n for (var i = visit.service.vehicles.length - 1; i >= 0; i--) {\r\n if (visit.service.vehicles[i].expiration_date != null) {\r\n visit.service.vehicles[i].expiration_date = new Date(visit.service.vehicles[i].expiration_date).toLocaleString([], Format.nativeJSDateFormat('MM/DD/YY'));\r\n }\r\n }\r\n\r\n $scope.visit = visit;\r\n if (visit.date_time_set) {\r\n $scope.visit.inspection_date_time = angular.copy($scope.visit.inspection_date);\r\n }\r\n $scope.masterVisit = angular.copy($scope.visit);\r\n $scope.loading = false;\r\n });\r\n }\r\n else {\r\n if ($scope.portal) {\r\n $state.go('portal.menus.denied');\r\n }\r\n else {\r\n $state.go('internal.inspecting.denied');\r\n }\r\n }\r\n\r\n $scope.save = function () {\r\n $scope.saving = true;\r\n\r\n $scope.visit.Date_Time_Set = ($scope.visit.inspection_date_time != null);\r\n IPVisits.save($scope.visit).then(function (visit) {\r\n if (visit != null) {\r\n $scope.visit = visit;\r\n if (visit.date_time_set) {\r\n $scope.visit.inspection_date_time = angular.copy($scope.visit.inspection_date);\r\n }\r\n $scope.masterVisit = angular.copy($scope.visit);\r\n }\r\n\r\n $scope.saving = false;\r\n })\r\n }\r\n\r\n $scope.addInspector = function (visit) {\r\n if (visit.inspector != null) {\r\n visit.inspectors.push(angular.copy(visit.inspector));\r\n visit.inspector = null;\r\n visit.newInspector = false;\r\n }\r\n }\r\n\r\n $scope.remove = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n\r\n $scope.addService = function (visit) {\r\n visit.inspections.push({ service_id: visit.service_id, type: 'service', name: visit.service.name });\r\n }\r\n\r\n $scope.addVehicle = function (visit, vehicle) {\r\n visit.inspections.push({ vehicle_id: vehicle.id, service_id: visit.service_id, type: 'vehicle', name: vehicle.serial_number });\r\n }\r\n\r\n $scope.filterAdded = function (item) {\r\n var show = true;\r\n\r\n if ($scope.visit.inspections != null) {\r\n $scope.visit.inspections.forEach(function (i) {\r\n if (i.vehicle_id == item.id) {\r\n show = false;\r\n }\r\n })\r\n }\r\n\r\n return show;\r\n }\r\n\r\n $scope.isServiceAvailable = function (visit) {\r\n var show = true;\r\n\r\n if (visit.inspections != null) {\r\n visit.inspections.forEach(function (i) {\r\n if (i.service_id == visit.service_id && i.vehicle_id == null) {\r\n show = false;\r\n }\r\n });\r\n }\r\n\r\n return show;\r\n }\r\n\r\n $scope.reset = function () {\r\n $scope.resetting = true;\r\n $scope.visit = angular.copy($scope.masterVisit);\r\n $scope.resetting = false;\r\n }\r\n\r\n $scope.setInspectionTime = function (time) {\r\n if (time != null && isValidDate(time)) {\r\n if ($scope.visit.inspection_date == null) {\r\n $scope.visit.inspection_date = new Date();\r\n }\r\n $scope.visit.inspection_date.setHours(time.getHours());\r\n $scope.visit.inspection_date.setMinutes(time.getMinutes());\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('InspectionsSchedule', ['$scope', 'IPVisits', '$state', '$rootScope', '$modal', 'DocumentTypes', 'Documents', 'Upload', function ($scope, IPVisits, $state, $rootScope, $modal, DocumentTypes, Documents, Upload) {\r\n $scope.portal = $state.current.data.isPortal;\r\n $scope.loading = true;\r\n $scope.creating = false;\r\n $scope.visit = {};\r\n $scope.visit.inspectors = [];\r\n $scope.visit.vehicles = [];\r\n $scope.group = [ ];\r\n\r\n if ($scope.portal) {\r\n if ($rootScope.enterprise && $rootScope.enterprise.website) {\r\n $scope.portalURL = $rootScope.enterprise.website;\r\n } else {\r\n $scope.portalURL = $rootScope.portalURL;\r\n }\r\n } else {\r\n if ($rootScope.enterprise && $rootScope.enterprise.site_location) {\r\n $scope.portalURL = $rootScope.enterprise.site_location;\r\n } else {\r\n $scope.portalURL = $rootScope.internalURL;\r\n }\r\n }\r\n\r\n DocumentTypes.getOtherDocuments().then(function (otherTypes) {\r\n $scope.DocumentTypes = otherTypes;\r\n });\r\n\r\n $scope.save = function (visit) {\r\n $scope.creating = true;\r\n $scope.messages = [];\r\n var documents = [];\r\n var pass = true;\r\n\r\n for (var i = 0; i < $scope.group.length; i++) {\r\n if ($scope.group[i].fileUpload.file_name === undefined || $scope.group[i].fileUpload.file_name === '') {\r\n $scope.messages.push(\"Document \" + (i + 1) + \" is missing a required file\");\r\n pass = false;\r\n $scope.creating = false;\r\n break;\r\n }\r\n documents.push($scope.group[i].fileUpload);\r\n }\r\n if (pass) {\r\n\r\n visit.Date_Time_Set = (visit.inspection_date_time != null)\r\n visit.inspections = [];\r\n if (visit.service != null) {\r\n visit.service_id = visit.service.id;\r\n\r\n if (visit.service_template != null) {\r\n visit.inspections.push({ service_id: visit.service.id, type: 'service' });\r\n }\r\n visit.vehicles.forEach(function (vehicle) {\r\n visit.inspections.push({ vehicle_id: vehicle.id, service_id: visit.service.id, type: 'vehicle' });\r\n })\r\n }\r\n\r\n IPVisits.save(visit).then(function (visit) {\r\n\r\n // Save Document to Inspection Visit\r\n if (documents != null) {\r\n documents.forEach(function (document) {\r\n document.data_object_id = 'E5A495F9-D340-4AEA-B6E3-2DD5D2190241'; // Data_Object_ID for Inspections\r\n Documents.upload({\r\n file: Upload.dataUrltoBlob(document.file_content, document.file_name),\r\n name: (document.document_name !== null && document.document_name !== '') ? document.document_name : document.file_name,\r\n description: document.document_description,\r\n document_type_id: document.document_type,\r\n data_object_id: document.data_object_id,\r\n }, visit.inspections[0].id).then(function (file) {\r\n\r\n })\r\n })\r\n }\r\n\r\n if ($scope.portal) {\r\n $state.go('portal.menus.visit', { id: visit.id, visit: visit });\r\n }\r\n else {\r\n $state.go('internal.inspecting.visit', { id: visit.id, visit: visit });\r\n }\r\n $scope.creating = false;\r\n });\r\n }\r\n }\r\n\r\n $scope.addInspector = function (visit) {\r\n if (visit.inspector != null) {\r\n visit.inspectors.push(angular.copy(visit.inspector));\r\n visit.inspector = null;\r\n visit.newInspector = false;\r\n }\r\n }\r\n\r\n $scope.removeInspector = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n\r\n $scope.setInspectionTime = function (time) {\r\n if (time != null && isValidDate(time)) {\r\n if ($scope.visit.inspection_date == null) {\r\n $scope.visit.inspection_date = new Date();\r\n }\r\n $scope.visit.inspection_date.setHours(time.getHours());\r\n $scope.visit.inspection_date.setMinutes(time.getMinutes());\r\n }\r\n };\r\n\r\n $scope.addGroup = function (group) {\r\n var doc = {};\r\n doc.fileUpload = {};\r\n doc.fileUpload.document_id = guid();\r\n doc.fileUpload.document_name = null;\r\n doc.fileUpload.document_description = null;\r\n doc.edit = true;\r\n doc.added = true;\r\n doc.sort_order = group.length + 1;\r\n group.push(doc);\r\n }\r\n\r\n $scope.removeGroup = function (group, index, doc) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n \r\n return \"Are you sure you would like to remove this document?\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n\r\n if (index == null) {\r\n updateArray(group, doc, result);\r\n }\r\n else {\r\n group[index].doc = {};\r\n group.splice(index, 1);\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.closeGroup = function (doc) {\r\n $scope.messages = [];\r\n if (doc !== null && doc.fileUpload.document_id !== undefined && doc.fileUpload.file_content !== undefined && doc.fileUpload.document_type !== undefined) {\r\n doc.edit = false;\r\n doc.changed = true;\r\n } else {\r\n if (doc.fileUpload.file_content === undefined) $scope.messages.push(\"An uploaded file is required for an inspection document.\"); // missing file\r\n if (!(doc.fileUpload.document_type !== undefined && doc.fileUpload.document_type !== \"\")) $scope.messages.push(\"A document type is required for an inspection document.\"); // missing type\r\n if (doc.fileUpload.document_id === null || doc.fileUpload.id === \"\") $scope.messages.push(\"Something went wrong, try again later.\"); // something else\r\n }\r\n }\r\n\r\n // Open Modal for Upload\r\n $scope.openDocumentModal = function (fileUpload, document) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/file-upload/file-upload-modal.html',\r\n controller: 'FileUploadModalController',\r\n resolve: {\r\n file_content: function () {\r\n return fileUpload.file_content;\r\n },\r\n file_upload_existing_docs: function () {\r\n if ($scope.question) {\r\n return $scope.question.file_upload_existing_docs;\r\n }\r\n return false;\r\n },\r\n question_id: function () {\r\n if ($scope.question) {\r\n return $scope.question.id;\r\n }\r\n return null;\r\n },\r\n parameters: function () {\r\n return $scope.parameters;\r\n }\r\n }\r\n }).result.then(function (upload) {\r\n if (upload != null) {\r\n if (upload.document_id != null) {\r\n Documents.getByID(upload.document_id).then(function (file) {\r\n fileUpload.file_name = file.file_name;\r\n fileUpload.document_name = file.name;\r\n fileUpload.document_id = file.id;\r\n fileUpload.document_code = file.code;\r\n fileUpload.document_type = file.document_type_id;\r\n fileUpload.document_description = file.description;\r\n document.fileUpload = fileUpload;\r\n });\r\n }\r\n else {\r\n fileUpload.file_content = upload.file_content;\r\n fileUpload.file_name = upload.file_name;\r\n document.fileUpload = fileUpload;\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.setEdit = function (doc) {\r\n if (doc.fileUpload.document_id != null) {\r\n doc.edit = !doc.edit;\r\n }\r\n }\r\n }])\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").controller(\"InspectionsScheduling\", [\r\n \"$scope\",\r\n \"Services\",\r\n \"$window\",\r\n \"IPVisits\",\r\n \"$q\",\r\n \"$state\",\r\n \"Cache\",\r\n \"$rootScope\",\r\n \"DataElements\",\r\n \"$timeout\",\r\n \"$compile\",\r\n function (\r\n $scope,\r\n Services,\r\n $window,\r\n IPVisits,\r\n $q,\r\n $state,\r\n Cache,\r\n $rootScope,\r\n DataElements,\r\n $timeout,\r\n $compile\r\n ) {\r\n $scope.portal = $state.current.data.isPortal;\r\n $scope.loading = true;\r\n\r\n $scope.saving = false;\r\n $scope.services = [];\r\n $scope.listParams = {\r\n currentPage: 0,\r\n numPerPage: 10\r\n };\r\n $scope.bulkCreateVisits = [];\r\n $scope.view = \"list\";\r\n\r\n DataElements.getServiceClassification({}).then(function (classifications) {\r\n $scope.serviceClassificationOptions = classifications;\r\n })\r\n\r\n $scope.daysLeftInMonth = function () {\r\n var now = new Date();\r\n var endDay = new Date(\r\n now.getYear(),\r\n now.getMonth() + 1,\r\n 0\r\n ).getDate();\r\n return endDay - now.getDate();\r\n };\r\n\r\n $scope.daysLeftInYear = function () {\r\n var today = new Date();\r\n var endofyear = new Date(today.getFullYear(), 11, 31);\r\n var one_day = 1000 * 60 * 60 * 24;\r\n return Math.ceil((endofyear.getTime() - today.getTime()) / one_day);\r\n };\r\n\r\n $scope.hideOptions = [\r\n {\r\n name: \"Show when Empty\",\r\n id: \"show\",\r\n value: false,\r\n display: \"show when empty\"\r\n },\r\n {\r\n name: \"Hide when Empty\",\r\n id: \"hide\",\r\n value: true,\r\n display: \"hide when empty\"\r\n }\r\n ];\r\n\r\n $scope.expireLengths = [\r\n {\r\n name: \"Select Expires Date\",\r\n id: 0,\r\n value: 0,\r\n display: \"not selected\"\r\n },\r\n { name: \"This Week\", id: 1, value: 7, display: \"this week\" },\r\n {\r\n name: \"This Month\",\r\n id: 2,\r\n value: $scope.daysLeftInMonth(),\r\n display: \"this month\"\r\n },\r\n {\r\n name: \"This Year\",\r\n id: 3,\r\n value: $scope.daysLeftInYear(),\r\n display: \"this year\"\r\n },\r\n {\r\n name: \"Next 30 Days\",\r\n id: 4,\r\n value: 30,\r\n display: \"the next 30 days\"\r\n },\r\n {\r\n name: \"Next 60 Days\",\r\n id: 5,\r\n value: 60,\r\n display: \"the next 60 days\"\r\n },\r\n {\r\n name: \"Next 90 Days\",\r\n id: 6,\r\n value: 90,\r\n display: \"the next 90 days\"\r\n },\r\n {\r\n name: \"Next 120 Days\",\r\n id: 7,\r\n value: 120,\r\n display: \"the next 120 days\"\r\n },\r\n {\r\n name: \"Next 365 Days\",\r\n id: 8,\r\n value: 365,\r\n display: \"the next 365 days\"\r\n },\r\n { name: \"Other\", id: 10, value: -1, display: \"other\" }\r\n ];\r\n\r\n $scope.inactiveServiceOptions = [\r\n { name: \"Active Vehicle Records\", id: \"active_vehicle_records\" },\r\n {\r\n name: \"Active \" + ($rootScope.enterprise.serviceLabels['SERVICE'] != null\r\n ? $rootScope.enterprise.serviceLabels['SERVICE'] : \"Service\") + \" Records\", id: \"active_service_records\"\r\n },\r\n { name: \"Inactive Vehicle Records\", id: \"inactive_vehicle_records\" },\r\n {\r\n name: \"Inactive \" + ($rootScope.enterprise.serviceLabels['SERVICE'] != null\r\n ? $rootScope.enterprise.serviceLabels['SERVICE'] : \"Service\") + \" Records\", id: \"inactive_service_records\"\r\n },\r\n ];\r\n\r\n $scope.getExpireLength = function (key) {\r\n if (key == null) {\r\n key = 0;\r\n }\r\n\r\n var expireLength;\r\n\r\n $scope.expireLengths.forEach(function (length) {\r\n if (key == length.id) {\r\n expireLength = length;\r\n }\r\n });\r\n\r\n return expireLength;\r\n };\r\n\r\n $scope.setRange = function (start, end) {\r\n $scope.startDate = start;\r\n $scope.endDate = end;\r\n };\r\n\r\n $scope.setHideCriteria = function (hideDate) {\r\n $scope.hideEmptyExpireDate = hideDate;\r\n }\r\n $scope.getExpiring = function (key) {\r\n $scope.loading = true;\r\n\r\n var inactiveVehicle = false;\r\n var inactiveService = false;\r\n var activeVehicle = false;\r\n var activeService = false;\r\n\r\n if (!isUndefined($scope.inactiveCriteria) && $scope.inactiveCriteria != null) {\r\n if ($scope.inactiveCriteria.includes(\"inactive_vehicle_records\")) {\r\n inactiveVehicle = true;\r\n }\r\n if ($scope.inactiveCriteria.includes(\"inactive_service_records\")) {\r\n inactiveService = true;\r\n }\r\n if ($scope.inactiveCriteria.includes(\"active_vehicle_records\")) {\r\n activeVehicle = true;\r\n }\r\n if ($scope.inactiveCriteria.includes(\"active_service_records\")) {\r\n activeService = true;\r\n }\r\n }\r\n\r\n var length = $scope.getExpireLength(key).value;\r\n var rangeLength = 0;\r\n\r\n // if custom date range\r\n if (key == 10) {\r\n var rangeLength = Math.ceil(\r\n ($scope.startDate - new Date()) / (1000 * 60 * 60 * 24)\r\n );\r\n var length = Math.ceil(\r\n ($scope.endDate - new Date()) / (1000 * 60 * 60 * 24)\r\n );\r\n\r\n if (rangeLength > length) {\r\n alert(\"Date Range is invalid\");\r\n }\r\n } else {\r\n rangeLength = -1;\r\n }\r\n var hideEmptyExpireDate = false;\r\n if (!isUndefined($scope.hideEmptyExpireDate) && $scope.hideEmptyExpireDate != null) {\r\n if ($scope.hideEmptyExpireDate.includes(\"hide\")) {\r\n hideEmptyExpireDate = true;\r\n }\r\n }\r\n\r\n Services.getExpiring($scope.serviceClassification, rangeLength, length, inactiveVehicle, inactiveService, activeVehicle, activeService, hideEmptyExpireDate).then(\r\n function (services) {\r\n if (services) {\r\n services.forEach(function (service) {\r\n service.vehicles.unshift({\r\n id: service.id,\r\n expiration_date: service.expiration_date,\r\n type: \"service\",\r\n name: service.name\r\n });\r\n });\r\n }\r\n $scope.services = services;\r\n $scope.loading = false;\r\n }\r\n );\r\n $scope.cacheList();\r\n };\r\n\r\n Cache.getState(\"list\").then(function (state) {\r\n if (state != null) {\r\n $scope.sortBy = state.sortBy;\r\n $scope.reverse = state.reverse;\r\n $scope.search = state.search;\r\n $scope.listParams.currentPage = state.currentPage;\r\n $scope.listParams.numPerPage = state.numPerPage;\r\n $scope.expireLength =\r\n state.expireLength == null ? 0 : state.expireLength;\r\n $scope.inactiveService =\r\n state.inactiveService == null\r\n ? false\r\n : state.inactiveService;\r\n $scope.inactiveCriteria = state.inactiveCriteria;\r\n $scope.serviceClassification = state.serviceClassification;\r\n $scope.hideEmptyExpireDate = state.hideEmptyExpireDate;\r\n } else {\r\n $scope.expireLength = 0;\r\n $scope.inactiveService = false;\r\n $scope.listParams.currentPage = 0;\r\n $scope.listParams.numPerPage = 10;\r\n }\r\n\r\n $scope.getExpiring($scope.expireLength);\r\n }).catch(function (response) {\r\n return $q.reject(response.data);\r\n });\r\n\r\n $scope.cacheList = function () {\r\n var state = {\r\n sortBy: $scope.sortBy,\r\n reverse: $scope.reverse,\r\n search: $scope.search,\r\n currentPage: $scope.listParams.currentPage,\r\n numPerPage: $scope.listParams.numPerPage,\r\n expireLength: $scope.expireLength,\r\n inactiveService: $scope.inactiveService,\r\n inactiveCriteria: $scope.inactiveCriteria,\r\n serviceClassification: $scope.serviceClassification,\r\n hideEmptyExpireDate: $scope.hideEmptyExpireDate,\r\n };\r\n\r\n Cache.setState(\"list\", state);\r\n };\r\n\r\n $scope.$watch(\"search + expireLength\", function () {\r\n $scope.listParams.currentPage = 0;\r\n $scope.cacheList();\r\n });\r\n\r\n $scope.$watch(\r\n \"listParams.currentPage + listParams.numPerPage + sortBy + reverse\",\r\n function () {\r\n $scope.cacheList();\r\n }\r\n );\r\n\r\n $scope.clear = function () {\r\n $scope.search = \"\";\r\n $scope.expireLength = 0;\r\n $scope.serviceClassification = [];\r\n $scope.inactiveCriteria = [];\r\n $scope.listParams.currentPage = 0;\r\n $scope.hideEmptyExpireDate = \"show\";\r\n $scope.cacheList();\r\n };\r\n\r\n $scope.setCounts = function (service) {\r\n var now = new Date();\r\n\r\n service.service_expired_count = 0;\r\n service.vehicle_expired_count = 0;\r\n\r\n service.vehicles.forEach(function (vehicle) {\r\n if (vehicle.expiration_date == null) {\r\n service.has_no_expiration = true;\r\n vehicle.expired = true;\r\n vehicle.type == \"service\"\r\n ? service.service_expired_count++\r\n : service.vehicle_expired_count++;\r\n } else {\r\n var expired = new Date();\r\n var length = $scope.getExpireLength($scope.expireSelect)\r\n .value;\r\n expired.setDate(now.getDate() + length);\r\n if (vehicle.expiration_date <= expired) {\r\n vehicle.expired = true;\r\n vehicle.type == \"service\"\r\n ? service.service_expired_count++\r\n : service.vehicle_expired_count++;\r\n\r\n if (vehicle.expiration_date < now) {\r\n service.has_expired = true;\r\n } else {\r\n service.will_expire = true;\r\n }\r\n } else {\r\n vehicle.expired = false;\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.getDisplayString = function (service) {\r\n var string = \"\";\r\n\r\n if (service.service_expired_count > 0) {\r\n string +=\r\n service.service_expired_count +\r\n \" \" +\r\n $rootScope.enterprise.serviceLabels[\"SERVICE\"];\r\n\r\n if (\r\n service.service_expired_count > 1 &&\r\n $rootScope.enterprise.serviceLabels[\"SERVICE\"] != null &&\r\n $rootScope.enterprise.serviceLabels[\"SERVICE\"].slice(-1) !=\r\n \"s\"\r\n ) {\r\n string += \"s\";\r\n }\r\n }\r\n if (\r\n service.vehicle_expired_count > 0 &&\r\n service.service_expired_count > 0\r\n ) {\r\n string += \" and \";\r\n }\r\n if (service.vehicle_expired_count > 0) {\r\n string +=\r\n service.vehicle_expired_count +\r\n \" \" +\r\n $rootScope.enterprise.vehicleLabels[\"VEHICLE\"];\r\n\r\n if (\r\n service.vehicle_expired_count > 1 &&\r\n $rootScope.enterprise.vehicleLabels[\"VEHICLE\"] != null &&\r\n $rootScope.enterprise.vehicleLabels[\"VEHICLE\"].slice(-1) !=\r\n \"s\"\r\n ) {\r\n string += \"s\";\r\n }\r\n }\r\n if (service.has_no_expiration) {\r\n if (\r\n service.vehicle_expired_count +\r\n service.service_expired_count >\r\n 1\r\n ) {\r\n string += \" have\";\r\n } else {\r\n string += \" has\";\r\n }\r\n string += \" no expiration date\";\r\n }\r\n if (\r\n service.has_no_expiration &&\r\n (service.will_expire || service.has_expired)\r\n ) {\r\n string += \" or\";\r\n }\r\n if (service.will_expire || service.has_expired) {\r\n string += \" expire\";\r\n\r\n if (service.has_expired && !service.will_expire) {\r\n string += \"d\";\r\n } else if (\r\n service.vehicle_expired_count +\r\n service.service_expired_count <=\r\n 1\r\n ) {\r\n string += \"s\";\r\n }\r\n }\r\n if (service.will_expire) {\r\n string += \" in\";\r\n }\r\n if (service.will_expire && service.has_expired) {\r\n string += \" or\";\r\n }\r\n if (service.has_expired) {\r\n string += \" before\";\r\n }\r\n\r\n if (service.will_expire || service.has_expired) {\r\n string +=\r\n \" \" + $scope.getExpireLength($scope.expireSelect).display;\r\n }\r\n\r\n return string;\r\n };\r\n\r\n $scope.vehicleColumns = [\r\n {\r\n label:\r\n $rootScope.enterprise.serviceLabels[\"SERVICE\"] +\r\n \"/\" +\r\n $rootScope.enterprise.vehicleLabels[\"VEHICLE\"],\r\n field: \"name\",\r\n info: [\r\n {\r\n label: \"Unit Number\",\r\n field: \"unit_number\"\r\n },\r\n {\r\n label: \"Call Sign\",\r\n field: \"call_sign\"\r\n }\r\n ]\r\n },\r\n {\r\n label: \"Number\",\r\n field: \"number\"\r\n },\r\n {\r\n label: \"Issue Date\",\r\n field: \"issue_date\",\r\n type: \"date\",\r\n showDashes: true,\r\n revertTimeZone: true\r\n },\r\n {\r\n label: \"Expiration Date\",\r\n field: \"expiration_date\",\r\n type: \"date\",\r\n classes: [\r\n {\r\n name: \"red\",\r\n field: \"expired\",\r\n compare: true\r\n }\r\n ],\r\n showDashes: true,\r\n revertTimeZone: true\r\n },\r\n {\r\n label: \"Last Inspection Date\",\r\n field: \"last_inspection_date\",\r\n type: \"date\",\r\n showDashes: true\r\n }\r\n ];\r\n\r\n $scope.checkAllServices = function (event, checkAll, services) {\r\n event.stopImmediatePropagation();\r\n services.forEach(function (service) {\r\n service.bulkActionItems = [];\r\n service.vehicles.forEach(function (vehicle) {\r\n vehicle.inBulkApply = checkAll;\r\n if (checkAll) {\r\n service.bulkActionItems.push(vehicle.id);\r\n }\r\n });\r\n });\r\n };\r\n\r\n $scope.bulkCreateChange = function (services) {\r\n $scope.bulkCreateVisits = [];\r\n\r\n services.forEach(function (service) {\r\n var visit = {};\r\n visit.service_id = service.id;\r\n visit.service_name = service.name;\r\n visit.inspections = [];\r\n visit.inspectors = [];\r\n service.vehicles.forEach(function (vehicle) {\r\n if (vehicle.inBulkApply) {\r\n visit.inspections.push({\r\n service_id: service.id,\r\n vehicle_id:\r\n vehicle.type == \"vehicle\" ? vehicle.id : null,\r\n expiration_date: vehicle.expiration_date,\r\n type: vehicle.type,\r\n name: vehicle.name,\r\n vehicle_type: vehicle.vehicle_type\r\n });\r\n }\r\n });\r\n\r\n if (visit.inspections.length > 0) {\r\n $scope.bulkCreateVisits.push(visit);\r\n }\r\n });\r\n\r\n $scope.view = \"edit\";\r\n $window.scrollTo(0, 0);\r\n };\r\n\r\n $scope.changeBack = function () {\r\n $scope.view = \"list\";\r\n $window.scrollTo(0, 0);\r\n };\r\n\r\n $scope.setAllDates = function (date) {\r\n $scope.bulkCreateVisits.forEach(function (visit) {\r\n visit.inspection_date = angular.copy(date);\r\n $scope.setInspectionTime(visit);\r\n });\r\n };\r\n\r\n $scope.setAllTimes = function (date) {\r\n $scope.bulkCreateVisits.forEach(function (visit) {\r\n visit.inspection_date_time = angular.copy(date);\r\n if (visit.inspection_date == null) {\r\n visit.inspection_date = new Date();\r\n }\r\n visit.inspection_date.setHours(date.getHours());\r\n visit.inspection_date.setMinutes(date.getMinutes());\r\n });\r\n };\r\n\r\n $scope.setAllInspectors = function (inspector) {\r\n if (inspector != null) {\r\n $scope.bulkCreateVisits.forEach(function (visit) {\r\n if (visit.inspectors.indexOf(inspector) == -1) {\r\n visit.inspectors.push(inspector);\r\n }\r\n if (visit.inspections !== undefined && visit.inspections != null) {\r\n visit.inspections.forEach(function (inspection) {\r\n inspection.inspector_id = inspector.id;\r\n });\r\n }\r\n });\r\n inspector = null;\r\n }\r\n };\r\n\r\n $scope.addInspector = function (visit) {\r\n if (visit.inspector != null) {\r\n visit.inspectors.push(angular.copy(visit.inspector));\r\n visit.inspector = null;\r\n visit.newInspector = false;\r\n }\r\n };\r\n\r\n $scope.remove = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n };\r\n\r\n $scope.setAllServiceChecklist = function (checklist) {\r\n $scope.bulkCreateVisits.forEach(function (visit) {\r\n visit.inspections.forEach(function (inspection) {\r\n if (inspection.type == \"service\") {\r\n inspection.template_id = checklist;\r\n }\r\n });\r\n });\r\n };\r\n\r\n $scope.setAllVehicleChecklist = function (checklist) {\r\n $scope.bulkCreateVisits.forEach(function (visit) {\r\n visit.inspections.forEach(function (inspection) {\r\n if (inspection.type == \"vehicle\") {\r\n inspection.template_id = checklist;\r\n }\r\n });\r\n });\r\n };\r\n\r\n $scope.save = function () {\r\n var promises = [];\r\n $scope.saving = true;\r\n\r\n $scope.bulkCreateVisits.forEach(function (visit) {\r\n visit.Date_Time_Set = (visit.inspection_date_time != null)\r\n promises.push(IPVisits.save(visit));\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n if ($scope.portal) {\r\n $state.go(\"portal.menus.inspections\");\r\n } else {\r\n $state.go(\"internal.inspecting.inspections\");\r\n }\r\n $scope.saving = false;\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n };\r\n\r\n $scope.setInspectionTime = function (visit) {\r\n if (visit.inspection_date_time != null && isValidDate(visit.inspection_date_time)) {\r\n if (visit.inspection_date == null) {\r\n visit.inspection_date = new Date();\r\n }\r\n visit.inspection_date.setHours(visit.inspection_date_time.getHours());\r\n visit.inspection_date.setMinutes(visit.inspection_date_time.getMinutes());\r\n }\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\nangular.module(\"imagetrend.components\").directive(\"hlpList\", [\"$filter\", \"Format\", \"$state\", \"Cache\", \"$window\", \"$timeout\", \"$rootScope\", \"$injector\", \"$sce\", \"$q\", function ($filter, Format, $state, Cache, $window, $timeout, $rootScope, $injector, $sce, $q) {\r\n return {\r\n restrict: \"E\",\r\n transclude: true,\r\n replace: true,\r\n scope: {\r\n //attributes \r\n name: \"@?\",\r\n id: \"@?\",\r\n classes: \"@?\",\r\n cacheListAttrs: \"@?\",\r\n defaultSort: \"@?\",\r\n defaultSortOrder: \"@?\",\r\n //scope \r\n showPagination: \"@?\",\r\n showAlpha: \"@?\",\r\n alphaField: \"@?\",\r\n showSearch: \"@?\",\r\n defaultNumPerPage: \"@?\",\r\n //default numPerPage listParam value on page load\r\n records: \"=?\",\r\n columns: \"=?\",\r\n filters: \"=?\",\r\n advancedFilters: \"=?\",\r\n link: \"=?\",\r\n clickable: \"=?\",\r\n bulkActions: \"=?\",\r\n recordsLoading: \"=?\",\r\n listLoading: \"=?\",\r\n showBulkAction: \"@?\",\r\n bulkActionItems: \"=?\",\r\n bulkActionRunning: \"=?\",\r\n linkDisabled: \"=?\",\r\n hidePdf: \"=?\",\r\n service: \"@?\",\r\n criteria: \"=?\",\r\n stopPropagation: \"@?\",\r\n refresh: \"=?\",\r\n // sub list params\r\n subList: \"@?\",\r\n subRecords: \"=?\",\r\n subColumns: \"=?\",\r\n pdfLinkDisabled: \"=?\"\r\n\r\n },\r\n controller: [\"$scope\", function ($scope) {\r\n this.alphaFilterChanged = function (letter) {\r\n $scope.listParams.alphaFilter = letter;\r\n $scope.masterFilter();\r\n };\r\n this.pageChanged = function (page) {\r\n $scope.listParams.currentPage = page;\r\n $scope.masterFilter();\r\n };\r\n this.perPageChanged = function (perPage) {\r\n $scope.listParams.numPerPage = perPage;\r\n $scope.listParams.currentPage = 0;\r\n $scope.masterFilter();\r\n };\r\n this.filterChanged = function (keep) {\r\n $scope.masterFilter(keep);\r\n };\r\n }],\r\n templateUrl: \"templates/list/list.html\",\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.advancedFilterOn = false;\r\n scope.sortBy = null;\r\n scope.loading = true;\r\n scope.vm = {\r\n isApplyAll: false\r\n };\r\n var timeouts = [];\r\n var filtered = false;\r\n var recordsSet = false;\r\n var numOfSortOrderCols = 0;\r\n if (!attrs.name) {\r\n attrs.name = \"list\";\r\n }\r\n if (!attrs.id) {\r\n attrs.id = attrs.name;\r\n }\r\n if (attrs.showAlpha == undefined) {\r\n attrs.showAlpha = true;\r\n } else {\r\n attrs.showAlpha = attrs.showAlpha == \"true\";\r\n }\r\n if (attrs.showBulkAction == undefined) {\r\n attrs.showBulkAction = false;\r\n } else {\r\n attrs.showBulkAction = attrs.showBulkAction == \"true\";\r\n }\r\n if (attrs.showPagination == undefined) {\r\n attrs.showPagination = true;\r\n } else {\r\n attrs.showPagination = attrs.showPagination == \"true\";\r\n }\r\n if (attrs.showSearch == undefined) {\r\n attrs.showSearch = true;\r\n } else {\r\n attrs.showSearch = attrs.showSearch == \"true\";\r\n }\r\n if (attrs.cacheListAttrs == undefined) {\r\n attrs.cacheListAttrs = true;\r\n } else {\r\n attrs.cacheListAttrs = attrs.cacheListAttrs == \"true\";\r\n }\r\n if (attrs.alphaField == undefined) {\r\n attrs.alphaField = \"name\";\r\n }\r\n if (attrs.stopPropagation == undefined) {\r\n attrs.stopPropagation = false;\r\n } else {\r\n attrs.stopPropagation = attrs.stopPropagation == \"true\";\r\n }\r\n if (attrs.refresh != null && attrs.refresh != undefined) {\r\n scope.refresh = attrs.refresh;\r\n };\r\n scope.listParams = {\r\n currentPage: 0,\r\n numPerPage: attrs.showPagination ? 10 : null,\r\n alphaFilter: null,\r\n search: {\r\n value: \"\",\r\n type: \"input\"\r\n },\r\n sortBy: null,\r\n reverse: false\r\n };\r\n if (attrs.sublist != null) {\r\n scope.subList = attrs.sublist == \"true\";\r\n };\r\n if (attrs.subcolumns != null) {\r\n scope.subColumns = attrs.subcolumns;\r\n };\r\n if (attrs.subrecords != null) {\r\n scope.subRecords = attrs.subrecords;\r\n };\r\n \r\n if (attrs.defaultSort != null) {\r\n scope.listParams.sortBy = attrs.defaultSort;\r\n }\r\n if (attrs.defaultNumPerPage != null) {\r\n scope.listParams.numPerPage = parseInt(attrs.defaultNumPerPage, 10);\r\n }\r\n scope.internalURL = $rootScope.internalURL;\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n scope.documentURL = $rootScope.portalURL;\r\n }\r\n else {\r\n scope.documentURL = $rootScope.internalURL;\r\n }\r\n scope.recordsTotal = null;\r\n scope.dynamic = false;\r\n scope.pageRecords = {};\r\n var searchTimeout = null;\r\n var service = null;\r\n scope.getRecords = function () {\r\n if (scope.dynamic && service != null) {\r\n if (scope.filteredRecords == null) {\r\n scope.filteredRecords = [];\r\n }\r\n if (scope.pageRecords[scope.listParams.currentPage] == null) {\r\n scope.loading = true;\r\n if (searchTimeout != null) {\r\n searchTimeout.resolve();\r\n searchTimeout = null;\r\n }\r\n searchTimeout = $q.defer();\r\n service[\"getFilter\"]({\r\n currentPage: scope.listParams.currentPage,\r\n numPerPage: scope.listParams.numPerPage,\r\n sortBy: scope.sortBy,\r\n search: scope.listParams.search.value,\r\n reverse: scope.reverse,\r\n alphaFilter: scope.listParams.alphaFilter,\r\n filters: scope.filters,\r\n advancedFilters: scope.advancedFilters,\r\n criteria: scope.criteria\r\n }, searchTimeout).then(function (data) {\r\n searchTimeout = null;\r\n if (data != null) {\r\n scope.pageRecords[scope.listParams.currentPage] = data;\r\n scope.filteredRecords = data;\r\n scope.loading = false;\r\n }\r\n });\r\n } else {\r\n scope.filteredRecords = scope.pageRecords[scope.listParams.currentPage];\r\n }\r\n }\r\n };\r\n var countTimeout = null;\r\n scope.getCount = function () {\r\n if (scope.dynamic && service != null) {\r\n if (countTimeout != null) {\r\n countTimeout.resolve();\r\n countTimeout = null;\r\n }\r\n countTimeout = $q.defer();\r\n service[\"getCount\"]({\r\n search: scope.listParams.search.value,\r\n alphaFilter: scope.listParams.alphaFilter,\r\n filters: scope.filters,\r\n advancedFilters: scope.advancedFilters,\r\n criteria: scope.criteria\r\n }, countTimeout).then(function (data) {\r\n scope.recordsTotal = data;\r\n });\r\n }\r\n };\r\n if (attrs.service != null && attrs.service != \"\") {\r\n scope.dynamic = true;\r\n var service = $injector.get(attrs.service);\r\n timeouts.push($timeout(function () {\r\n scope.getCount();\r\n scope.getRecords();\r\n scope.$watch(\"criteria\", function (criteria, oldCriteria) {\r\n if (criteria != null && criteria != oldCriteria) {\r\n ctrl.filterChanged();\r\n }\r\n }, true);\r\n }, 400));\r\n }\r\n\r\n scope.evaluateField = function (record, field, type, showDashes, revertTimeZone, dateTimeFlag) {\r\n var value = \"\";\r\n if (type == \"empty\") {\r\n return value;\r\n }\r\n //can set json to be comma list to show more values.all depend on each other(ie: if one is null all becomes '')\r\n var i = 0;\r\n var broke = false;\r\n field.split(\",\").forEach(function (f) {\r\n if (!broke) {\r\n var v = \"\";\r\n if (f.indexOf(\"'\") >= 0) {\r\n v = f.replace(/['\"]+/g, \"\");\r\n } else {\r\n // If record is a vehicle without a revertTimeZone flag, set it to true & Vehicle primary certification issue/expiration date translate correctly\r\n if (record.vehicles_serial_number !== undefined && revertTimeZone === undefined) revertTimeZone = true;\r\n\r\n v = Format.evaluateJSON(record, f, revertTimeZone);\r\n if (angular.isArray(v)) {\r\n var arrayValue = \"\";\r\n v.forEach(function (obj) {\r\n if (typeof obj != \"object\") {\r\n if (arrayValue == \"\" && value == \"\") {\r\n arrayValue += obj;\r\n } else {\r\n arrayValue += \", \" + obj;\r\n }\r\n } else {\r\n if (arrayValue == \"\" && value == \"\") {\r\n if (isValidDate(obj.name)) {\r\n arrayValue = $filter(\"date\")(obj.name, \"MM/dd/yyyy\");\r\n } else if (obj.fullName != null) {\r\n arrayValue += obj.fullName; // if its a list of name objects\r\n } else {\r\n arrayValue += obj.name;\r\n }\r\n } else {\r\n if (isValidDate(obj.name)) {\r\n arrayValue += \", \" + $filter(\"date\")(obj.name, \"MM/dd/yyyy\");\r\n } else if (obj.fullName != null) {\r\n arrayValue += \", \" + obj.fullName;\r\n } else {\r\n arrayValue += \", \" + obj.name; // if its a list of name objects\r\n }\r\n }\r\n }\r\n });\r\n v = arrayValue;\r\n } else if (f == \"users\" || f == \"vehicles\" || f == \"services\") {\r\n v = \"\";\r\n }\r\n }\r\n if (v != null && typeof v != \"object\") {\r\n if (i > 0 && value != \"\") {\r\n value += \" \";\r\n }\r\n value += v;\r\n } else {\r\n if (typeof v == \"object\") {\r\n value = v;\r\n } else {\r\n value = \"\";\r\n }\r\n broke = true;\r\n }\r\n }\r\n i++;\r\n });\r\n if (type == \"money\") {\r\n value = $filter(\"currency\")(value);\r\n } else if (type == \"date\") {\r\n value = $filter(\"date\")(value, \"MM/dd/yyyy\");\r\n } else if (type == \"datetime\") {\r\n if (dateTimeFlag) {\r\n var optionalTime = scope.evaluateField(record, dateTimeFlag, \"boolean\");\r\n if (optionalTime) {\r\n value = $filter(\"date\")(value, \"MM/dd/yyyy hh:mm a\");\r\n }\r\n else {\r\n value = $filter(\"date\")(value, \"MM/dd/yyyy\");\r\n }\r\n }\r\n else {\r\n value = $filter(\"date\")(value, \"MM/dd/yyyy hh:mm a\");\r\n }\r\n } else if (type == \"deficiency_total\") {\r\n if (value == \"0\") {\r\n value = \"\";\r\n }\r\n } else if (type == \"boolean\") {\r\n value = value === \"true\";\r\n } else if (type == \"entity\") {\r\n if (value == \"service\") {\r\n value = $rootScope.enterprise.serviceLabels[\"SERVICE\"];\r\n } else if (value == \"vehicle\") {\r\n value = $rootScope.enterprise.vehicleLabels[\"VEHICLE\"];\r\n }\r\n } else if (type == \"active\") {\r\n if (value === \"true\") {\r\n value = \"Active\";\r\n } else {\r\n value = \"Inactive\";\r\n }\r\n } else if (type == \"yesno\") {\r\n if (value === \"true\") {\r\n value = \"Yes\";\r\n } else {\r\n value = \"No\";\r\n }\r\n } else if (type == \"passfail\") {\r\n if (value === \"true\") {\r\n value = \"Pass\";\r\n } else if (value === \"false\") {\r\n value = \"Fail\";\r\n } else {\r\n value = \"\";\r\n }\r\n } else if (type == \"environment\") {\r\n if (value === \"true\") {\r\n value = \"Public\";\r\n } else {\r\n value = \"Internal\";\r\n }\r\n } else if (type == \"ckeditor\") {\r\n // Encode <> tags (prevent XSS), but leave
    (for display)\r\n if (value != null && (value.includes('<') || value.includes('>'))) {\r\n var dirtyVal = value;\r\n var dirtyArr = dirtyVal.split(//gi);\r\n var cleanArr = [];\r\n angular.forEach(dirtyArr, function (dirtyStr) {\r\n dirtyStr = dirtyStr.replace(//g, '>');\r\n cleanArr.push(dirtyStr);\r\n });\r\n\r\n value = cleanArr.join('
    ');\r\n }\r\n } else if (type == \"file_size\") {\r\n value = Format.fileSize(value);\r\n } else if (type == \"document\") {\r\n if (record.investigation_external_document_name === null || record.investigation_external_document_name === '') {\r\n if (record.investigation_external_document_file_name !== null) {\r\n value = record.investigation_external_document_file_name;\r\n } else {\r\n value = null;\r\n }\r\n }\r\n else\r\n {\r\n value = record.investigation_external_document_name;\r\n }\r\n }\r\n if ((value == \"\" || value == null) && showDashes != null && showDashes) {\r\n value = \"--------\";\r\n }\r\n return value;\r\n };\r\n scope.determineClasses = function (index, length, column, record) {\r\n var classes = \"\";\r\n if (column.type == \"sort_order\" || column.type == \"deficiency_total\") {\r\n classes = \"small-cell\";\r\n } else {\r\n var value = Math.floor(12 / (length - numOfSortOrderCols));\r\n var mod = 12 % (length - numOfSortOrderCols);\r\n if (index < mod) {\r\n value += 1;\r\n }\r\n classes = \"col-xs-\" + value;\r\n }\r\n if (column.classes != null && record != null) {\r\n column.classes.forEach(function (c) {\r\n if (c.compare != null && c.compare) {\r\n if (scope.evaluateField(record, c.field, \"boolean\")) {\r\n classes += \" \" + c.name;\r\n }\r\n } else {\r\n if (record.id == c.field) {\r\n classes += \" \" + c.name;\r\n }\r\n }\r\n });\r\n }\r\n return classes;\r\n };\r\n scope.getInfoFields = function (record, column) {\r\n var string = \"\";\r\n if (column.info != null && record != null) {\r\n column.info.forEach(function (i) {\r\n var value = scope.evaluateField(record, i.field);\r\n if (value != null && value != \"\") {\r\n if (string != \"\") {\r\n string += \" -- \";\r\n }\r\n string += i.label + \": \" + value;\r\n }\r\n });\r\n }\r\n return string;\r\n };\r\n scope.sort = function (column) {\r\n scope.sortBy = column.split(\",\").shift();\r\n scope.reverse = !scope.reverse;\r\n ctrl.filterChanged();\r\n };\r\n scope.clear = function () {\r\n if (scope.filters != null) {\r\n scope.filters.forEach(function (filter) {\r\n filter.value = null;\r\n });\r\n }\r\n if (scope.advancedFilters != null) {\r\n scope.advancedFilters.forEach(function (advancedFilter) {\r\n advancedFilter.value = null;\r\n });\r\n }\r\n scope.listParams.search.value = \"\";\r\n scope.listParams.alphaFilter = null;\r\n ctrl.filterChanged();\r\n };\r\n scope.advancedFilter = function () {\r\n if (scope.advancedFilterOn == true) {\r\n if (scope.advancedFilters != null) {\r\n scope.advancedFilters.forEach(function (advancedFilter) {\r\n advancedFilter.value = null;\r\n });\r\n ctrl.filterChanged();\r\n }\r\n scope.advancedFilterOn = false;\r\n } else {\r\n scope.advancedFilterOn = true;\r\n }\r\n };\r\n scope.changeState = function (link, record) {\r\n if (link != null) {\r\n var params = {};\r\n for (var i in link.params) {\r\n params[link.params[i].name] = scope.evaluateField(record, link.params[i].field);\r\n }\r\n $state.go(link.state, params);\r\n }\r\n };\r\n scope.dropDown = function (record) {\r\n if (record.open == true) {\r\n record.open = false;\r\n } else {\r\n record.open = true;\r\n }\r\n };\r\n\r\n \r\n scope.openDocument = function (id, code, url) {\r\n $window.open(url + \"&documentID=\" + id.toUpperCase() + \"&code=\" + code, \"_blank\");\r\n };\r\n scope.htmlLink = function (link, record) {\r\n if (link != null) {\r\n var params = {};\r\n for (var i in link.params) {\r\n params[link.params[i].name] = scope.evaluateField(record, link.params[i].field);\r\n }\r\n return $state.href(link.state, params);\r\n }\r\n //use the current location \r\n return $window.location.href;\r\n };\r\n scope.checkPermission = function (permission, record) {\r\n var hasPermission = false;\r\n if (permission != null) {\r\n var document_type_id = scope.evaluateField(record, permission.field);\r\n if (document_type_id == null) {\r\n hasPermission = true;\r\n } else {\r\n if (permission != null) {\r\n permission.types.forEach(function (type) {\r\n if (type.id == document_type_id) {\r\n hasPermission = true;\r\n }\r\n });\r\n }\r\n }\r\n } else {\r\n hasPermission = true;\r\n }\r\n return hasPermission;\r\n };\r\n scope.applyAll = function (records, isApplyAll) {\r\n if (scope.bulkActionItems == null) {\r\n scope.bulkActionItems = [];\r\n } else {\r\n scope.bulkActionItems.length = 0;\r\n }\r\n records.forEach(function (record) {\r\n if (!record.skipBulkAction) {\r\n record.inBulkApply = isApplyAll;\r\n if (isApplyAll) {\r\n scope.bulkActionItems.push(record.id);\r\n }\r\n }\r\n });\r\n };\r\n scope.applyOne = function (record) {\r\n if (scope.bulkActionItems == null) {\r\n scope.bulkActionItems = [];\r\n }\r\n if (record.inBulkApply) {\r\n scope.bulkActionItems.push(record.id);\r\n } else {\r\n var index = scope.bulkActionItems.indexOf(record.id);\r\n scope.bulkActionItems.splice(index, 1);\r\n }\r\n };\r\n scope.initBulkAction = function (bulkAction) {\r\n if (bulkAction.options == null && bulkAction.service != null && bulkAction.service != \"\") {\r\n var service = $injector.get(bulkAction.service);\r\n service[bulkAction.method == null ? \"get\" : bulkAction.method]().then(function (data) {\r\n bulkAction.options = data;\r\n });\r\n }\r\n };\r\n scope.showActionForRecord = function (column, record) {\r\n var show = true;\r\n if (column.hideAction != null) {\r\n show = !scope.evaluateField(record, column.hideAction, \"boolean\");\r\n }\r\n else if (column.hideActionPermission != null) {\r\n show = scope.checkPermission(column.hideActionPermission, record);\r\n }\r\n if (!show) {\r\n record.skipBulkAction = true;\r\n } else {\r\n record.skipBulkAction = false;\r\n }\r\n return show;\r\n };\r\n scope.masterFilter = function (keep) {\r\n if (scope.dynamic) {\r\n if (!keep) {\r\n scope.pageRecords = {};\r\n scope.getCount();\r\n }\r\n scope.getRecords();\r\n } else {\r\n if (scope.records != null) {\r\n if (scope.filters != null && scope.advancedFilters != null) {\r\n var filteredOut = $filter(\"listFilter\")(scope.records, scope.filters.concat(scope.advancedFilters));\r\n }\r\n else if (scope.filters != null && scope.advancedFilters == null) {\r\n var filteredOut = $filter(\"listFilter\")(scope.records, scope.filters);\r\n }\r\n else if (scope.filters == null && scope.advancedFilters != null) {\r\n var filteredOut = $filter(\"listFilter\")(scope.records, scope.advancedFilters);\r\n }\r\n else {\r\n var filteredOut = scope.records;\r\n }\r\n var reverseDefaultSort = false;\r\n if (scope.defaultSort != null) {\r\n if (scope.defaultSortOrder == 'desc') { reverseDefaultSort = true; }\r\n filteredOut = $filter(\"orderBy\")(filteredOut, scope.defaultSort, reverseDefaultSort);\r\n }\r\n filteredOut = $filter(\"orderBy\")($filter(\"filter\")($filter(\"firstLetter\")(filteredOut, scope.alphaField, scope.listParams.alphaFilter), scope.listParams.search.value), [scope.sortBy == null ? \"1\" : scope.sortBy, scope.sortBy], scope.reverse);\r\n scope.recordsTotal = filteredOut.length;\r\n scope.filteredRecords = $filter(\"limitTo\")($filter(\"startFrom\")(filteredOut, scope.listParams.currentPage * scope.listParams.numPerPage), scope.listParams.numPerPage);\r\n scope.loading = false;\r\n }\r\n }\r\n scope.cacheList();\r\n };\r\n scope.cacheList = function () {\r\n timeouts.push($timeout(function () {\r\n if (!scope.recordsLoading && attrs.cacheListAttrs) {\r\n var data = {\r\n filters: scope.filters,\r\n advancedFilters: scope.advancedFilters,\r\n sortBy: scope.sortBy,\r\n reverse: scope.reverse,\r\n search: scope.listParams.search,\r\n alphaFilter: scope.listParams.alphaFilter,\r\n numPerPage: scope.listParams.numPerPage,\r\n currentPage: scope.listParams.currentPage\r\n };\r\n Cache.setState(\"list\", data);\r\n }\r\n }, 300));\r\n };\r\n scope.isTotalUndefined = function (str) {\r\n return isUndefined(str) || str == \"0\";\r\n };\r\n scope.setCachedFilters = function (filters, cachedFilters) {\r\n filters.forEach(function (f) {\r\n if (!f.checkedCache) {\r\n cachedFilters.forEach(function (of) {\r\n if (f.field == of.field && of.value != undefined) {\r\n f.value = of.value;\r\n }\r\n });\r\n f.checkedCache = true;\r\n }\r\n });\r\n };\r\n scope.$watch(\"filters\", function (filters, oldFilters) {\r\n if (filters != null) {\r\n if (scope.cachedFilters != null) {\r\n scope.setCachedFilters(filters, scope.cachedFilters);\r\n }\r\n timeouts.push($timeout(function () {\r\n if (scope.records != null && !filtered && recordsSet) {\r\n ctrl.filterChanged();\r\n filtered = true;\r\n }\r\n }, 0));\r\n }\r\n }, true);\r\n scope.$watch(\"records\", function (records, oldRecords) {\r\n timeouts.push($timeout(function () {\r\n if (records != null) {\r\n filtered = false;\r\n ctrl.filterChanged();\r\n filtered = true;\r\n recordsSet = true;\r\n scope.loading = false;\r\n }\r\n }, 400));\r\n }, true);\r\n scope.$watch(\"columns\", function (columns, oldColumns) {\r\n if (columns != null) {\r\n numOfSortOrderCols = 0;\r\n columns.forEach(function (column) {\r\n if (column.type == \"sort_order\" || column.type == \"deficiency_total\") {\r\n numOfSortOrderCols++;\r\n }\r\n });\r\n }\r\n }, true);\r\n var cacheLoading = false;\r\n scope.$watch(\"listParams.search.value + listParams.alphaFilter\", function (old, newie) {\r\n if (old != newie && !cacheLoading) {\r\n scope.listParams.currentPage = 0;\r\n ctrl.filterChanged();\r\n }\r\n });\r\n scope.$watch(\"sortBy + reverse + listParams.numPerPage\", function (old, newie) {\r\n if (old != newie && !cacheLoading) {\r\n ctrl.filterChanged();\r\n }\r\n });\r\n scope.$watch(\"listParams.currentPage\", function (old, newie) {\r\n if (old != newie && !cacheLoading) {\r\n ctrl.filterChanged(true);\r\n }\r\n });\r\n scope.$watch(\"refresh\", function (oldValue, newValue) {\r\n if (oldValue != newValue && !cacheLoading) {\r\n ctrl.filterChanged();\r\n }\r\n });\r\n scope.$watch('defaultNumPerPage', function (newVal, oldVal) {\r\n // Hit onload / change of view\r\n if (newVal !== oldVal) {\r\n scope.listParams.numPerPage = parseInt(newVal, 10);\r\n scope.listParams.currentPage = 0; // Resets to first page on change of Internal View\r\n ctrl.filterChanged(true);\r\n ctrl.pageChanged();\r\n }\r\n });\r\n if (attrs.cacheListAttrs) {\r\n cacheLoading = true;\r\n Cache.getState(\"list\").then(function (state) {\r\n if (state != undefined) {\r\n scope.sortBy = state.sortBy;\r\n scope.reverse = state.reverse;\r\n scope.listParams.search = state.search;\r\n if (!scope.listParams.search || scope.listParams.search == \"\") {\r\n scope.listParams.search = {};\r\n scope.listParams.search.type = \"input\";\r\n }\r\n scope.listParams.alphaFilter = state.alphaFilter;\r\n scope.listParams.numPerPage = state.numPerPage;\r\n scope.listParams.currentPage = state.currentPage;\r\n scope.cachedAdvancedFilters = state.advancedFilters;\r\n scope.cachedFilters = state.filters;\r\n if (scope.cachedFilters != null && scope.filters != null) {\r\n scope.setCachedFilters(scope.filters, scope.cachedFilters);\r\n }\r\n timeouts.push($timeout(function () {\r\n cacheLoading = false;\r\n }, 50));\r\n }\r\n }).catch(function (response) {\r\n return $q.reject(response.data);\r\n });\r\n }\r\n scope.$on(\"$destroy\", function () {\r\n timeouts.forEach(function (timeout) {\r\n $timeout.cancel(timeout);\r\n });\r\n if (elem) {\r\n angular.element(elem).off();\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n}]).filter(\"listFilter\", [\"$filter\", function ($filter) {\r\n return function (records, filters) {\r\n var filtered = records;\r\n if (filtered != null) {\r\n for (var i in filters) {\r\n if (filters[i].value != null && (typeof filters[i].value === \"boolean\" || typeof filters[i].value === \"number\" || filters[i].value != \"\")) {\r\n if (filters[i].field != null && filters[i].field != \"\") {\r\n if (filters[i].type != null && filters[i].type == \"days\") {\r\n filtered = $filter(\"days\")(filtered, filters[i].value, filters[i].field);\r\n }\r\n else if (filters[i].value != null && filters[i].type == \"DateStart\") {\r\n var opts = filtered;\r\n filtered = [];\r\n for (var x in opts) {\r\n opts[x][filters[i].field].setHours(0); opts[x][filters[i].field].setMinutes(0);\r\n if (opts[x][filters[i].field] >= filters[i].value) {\r\n filtered.push(opts[x]);\r\n }\r\n }\r\n }\r\n else if (filters[i].value != null && filters[i].type == \"DateEnd\") {\r\n var opts = filtered;\r\n filtered = [];\r\n for (var x in opts) {\r\n opts[x][filters[i].field].setHours(0); opts[x][filters[i].field].setMinutes(0);\r\n if (opts[x][filters[i].field] <= filters[i].value) {\r\n filtered.push(opts[x]);\r\n }\r\n }\r\n }\r\n else {\r\n var field = null;\r\n filters[i].field.split(\".\").reverse().forEach(function (partial) {\r\n if (field == null) {\r\n field = {};\r\n field[partial] = filters[i].value;\r\n } else {\r\n var parent = {};\r\n parent[partial] = field;\r\n field = angular.copy(parent);\r\n }\r\n });\r\n if (filters[i].contains) {\r\n var opts = filtered;\r\n filtered = [];\r\n for (var x in opts) {\r\n if (opts[x][filters[i].field].includes(filters[i].value)) {\r\n filtered.push(opts[x]);\r\n }\r\n }\r\n } else {\r\n filtered = $filter(\"filter\")(filtered, field);\r\n }\r\n }\r\n } else {\r\n filtered = $filter(\"filter\")(filtered, filters[i].value);\r\n }\r\n }\r\n }\r\n }\r\n return filtered;\r\n };\r\n}]).filter(\"startFrom\", [function () {\r\n return function (input, start) {\r\n if (!input) return;\r\n start = +start;\r\n return input.slice(start);\r\n };\r\n}]).filter(\"firstLetter\", [\"Format\", function (Format) {\r\n return function (input, field, letter) {\r\n input = input || [];\r\n if (field == undefined || letter == undefined) return input;\r\n var out = [];\r\n input.forEach(function (item) {\r\n var value = Format.evaluateJSON(item, field);\r\n if (value != null && value.charAt(0).toLowerCase() == letter) {\r\n out.push(item);\r\n }\r\n });\r\n return out;\r\n };\r\n}]);","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpLoading', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n text: '@?',\r\n classes: '@?'\r\n },\r\n replace: true,\r\n templateUrl: 'templates/loading/loading.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!attrs.text) { attrs.text = 'Loading'; }\r\n if (attrs.text == \"NONE\") { attrs.text = \"\"; }\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpLongevityCreditsApprovalController', ['$scope', 'ServiceUserLongevities', 'Users', '$q', '$timeout', function ($scope, ServiceUserLongevities, Users, $q, $timeout) {\r\n\r\n $scope.service_users = [];\r\n $scope.serviceUserLongevities = {};\r\n $scope.loading = true;\r\n $scope.check_all = false;\r\n\r\n if ($scope.pdf && $scope.component.elementAnswer.length > 0) {\r\n $scope.loading = false;\r\n }\r\n else {\r\n $scope.component.elementAnswer = [];\r\n var promises = [];\r\n\r\n if ($scope.parameters != null && $scope.parameters.service_id != null && $scope.parameters.license_request_id != null) {\r\n promises.push(Users.get({ service_id: $scope.parameters.service_id, inactiveServiceUsers: true, longevityGet: true}).then(function (serviceUsers) {\r\n $scope.service_users = serviceUsers;\r\n $scope.service_users = $scope.service_users.map(function (user) {\r\n user.approved = false;\r\n return user;\r\n })\r\n }))\r\n\r\n promises.push(ServiceUserLongevities.get({ license_request_id: $scope.parameters.license_request_id }).then(function (serviceUserLongevities) {\r\n if (serviceUserLongevities != null) {\r\n serviceUserLongevities.forEach(function (sul) {\r\n if (sul.service_id == $scope.parameters.service_id && sul.user_id != null) {\r\n $scope.serviceUserLongevities[sul.user_id] = sul;\r\n }\r\n })\r\n }\r\n }))\r\n }\r\n\r\n $q.all(promises).then(function () {\r\n $scope.component.elementAnswer = $scope.service_users.map(function (user) {\r\n var answer = { service_id: $scope.parameters.service_id, user_id: user.id, license_request_id: $scope.parameters.license_request_id, nameandnumber: user.nameandnumber};\r\n if ($scope.serviceUserLongevities[user.id] != null) {\r\n answer.approve = true;\r\n }\r\n return answer;\r\n });\r\n\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n }\r\n\r\n $scope.checkAll = function (check_all) {\r\n $scope.component.elementAnswer = $scope.component.elementAnswer.map(function (answer) {\r\n answer.approve = check_all;\r\n return answer;\r\n })\r\n }\r\n }])\r\n .directive('hlpLongevityCreditsApproval', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/longevity-credits-approval/longevity-credits-approval.html',\r\n replace: true,\r\n controller: 'hlpLongevityCreditsApprovalController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?',\r\n pdf: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpMessages', ['$timeout', '$window', '$sce', function ($timeout, $window, $sce) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n messages: '=',\r\n type: '@?',\r\n focusOnChange: '=?'\r\n },\r\n replace: true,\r\n templateUrl: 'templates/messages/messages.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!attrs.type) { attrs.type = \"info\"; };\r\n if (!attrs.focusOnChange) { attrs.focusOnChange = false; } else { if (attrs.focusOnChange == 'true') { attrs.focusOnChange = true; } else { attrs.focusOnChange = false; } }\r\n\r\n scope.show = function() {\r\n return scope.messages != null && scope.messages.length > 0;\r\n }\r\n\r\n scope.trust = function(message) {\r\n return $sce.trustAsHtml(message);\r\n }\r\n\r\n if (scope.focusOnChange) {\r\n scope.$watch(\"messages\", function (newValue, oldValue) {\r\n if (newValue != null && newValue.length > 0) {\r\n $window.scrollTo(0, 0);\r\n }\r\n }, true);\r\n }\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpMonthYearSelectController', ['$scope', 'Format', function ($scope, Format) {\r\n $scope.setDate = function (month, year) {\r\n $scope.innerForm.monthYear.$setDirty();\r\n if (month == undefined || year == undefined) {\r\n $scope.ngModel = '';\r\n if (month == undefined && year == undefined) {\r\n $scope.innerForm.monthYear.$setValidity(\"monthYear\", true);\r\n }\r\n else {\r\n $scope.innerForm.monthYear.$setValidity(\"monthYear\", false);\r\n }\r\n }\r\n else {\r\n $scope.ngModel = Format.date(new Date(year, month));\r\n $scope.innerForm.monthYear.$setValidity(\"monthYear\", true);\r\n }\r\n }\r\n }])\r\n .directive('hlpMonthYearSelect', ['Format', 'Resource', function (Format, Resource) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n name: '@?',\r\n id: '@?',\r\n showLabel: '@?',\r\n isRequired: '@?',\r\n isDisabled: '=?',\r\n change: '&?',\r\n ngModel: '=',\r\n question: '=?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n classes: '@?',\r\n months: '=?',\r\n years: '=?',\r\n yearOffset: '@?',\r\n yearSpan: '@?'\r\n },\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/month-year-select/month-year-select.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.title) { attrs.title = Format.label(attrs.name); }\r\n if (!attrs.requiredText) { attrs.requiredText = 'Please enter a ' + Format.label(attrs.label || attrs.name); }\r\n if (!attrs.yearOffset) { attrs.yearOffset = 0; }\r\n if (!attrs.yearSpan) { attrs.yearSpan = 10; }\r\n if (!attrs.months) { scope.months = Resource.months(); }\r\n if (!attrs.years) { scope.years = Resource.years(attrs.yearOffset, attrs.yearSpan); }\r\n\r\n elem[0].querySelector('input').focus = function () {\r\n var firstInvalid = elem[0].querySelector('select.empty');\r\n if (firstInvalid) {\r\n firstInvalid.focus();\r\n }\r\n }\r\n },\r\n controller: 'hlpMonthYearSelectController'\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('multipleAutocomplete', [\r\n '$rootScope',\r\n '$filter',\r\n '$http',\r\n function ($rootScope, $filter, $http) {\r\n return {\r\n restrict: 'EA',\r\n require: 'ngModel',\r\n scope : {\r\n suggestionsArr : '=?',\r\n modelArr : '=ngModel',\r\n apiUrl : '@',\r\n beforeSelectItem : '=?',\r\n afterSelectItem : '=?',\r\n beforeRemoveItem : '=?',\r\n afterRemoveItem : '=?',\r\n onChangeFunction: '&?',\r\n question: '=?',\r\n optionsLoaded: '=?',\r\n existingLoaded: '=?',\r\n selectedOptions: '=?'\r\n },\r\n templateUrl: 'templates/multiple-autocomplete/multiple-autocomplete.html',\r\n link : function(scope, element, attr, ngModel){\r\n scope.objectProperty = attr.objectProperty;\r\n scope.selectedItemIndex = 0;\r\n scope.name = attr.name;\r\n scope.isRequired = attr.isRequired;\r\n scope.errMsgRequired = attr.errMsgRequired;\r\n scope.isDisabled = attr.disable;\r\n scope.isOpen = false;\r\n if (!scope.isDisabled) { scope.isDisabled = false; } else { if (scope.isDisabled == 'true' || scope.isDisabled == true) { scope.isDisabled = true; } else { scope.isDisabled = false; } }\r\n if (!scope.isRequired) { scope.isRequired = false; } else { if (scope.isRequired == 'true' || scope.isRequired == true) { scope.isRequired = true; } else { scope.isRequired = false; } }\r\n\r\n var getSuggestionsList = function () {\r\n var url = scope.apiUrl;\r\n $http({\r\n method: 'GET',\r\n url: url\r\n }).then(function (response) {\r\n scope.suggestionsArr = response.data;\r\n }, function (response) {\r\n console.log(\"*****Angular-multiple-select **** ----- Unable to fetch list\");\r\n });\r\n };\r\n\r\n if(scope.suggestionsArr == null || scope.suggestionsArr == \"\"){\r\n if (scope.apiUrl != null && scope.apiUrl != \"\") {\r\n getSuggestionsList();\r\n } \r\n }\r\n\r\n if(scope.modelArr == null || scope.modelArr == \"\"){\r\n scope.modelArr = [];\r\n }\r\n\r\n scope.$watch(\"existingLoaded\", function (existingLoaded) {\r\n if (existingLoaded) {\r\n //Setting the selected options after any api calls have been completed\r\n if (scope.selectedOptions && angular.isArray(scope.selectedOptions)) {\r\n ngModel.$setViewValue(scope.selectedOptions);\r\n }\r\n }\r\n });\r\n\r\n scope.onBlur = function (event) {\r\n if (!event.relatedTarget || !event.relatedTarget.classList.contains('autocomplete-list')) {\r\n scope.isOpen = false;\r\n }\r\n else {\r\n event.target.focus();\r\n }\r\n };\r\n\r\n scope.onChange = function () {\r\n scope.selectedItemIndex = 0;\r\n };\r\n\r\n scope.toggleOpen = function () {\r\n scope.isOpen = !scope.isOpen;\r\n }; \r\n\r\n scope.keyParser = function ($event) {\r\n var keys = {\r\n 38: 'up',\r\n 40: 'down',\r\n 8 : 'backspace',\r\n 13: 'enter',\r\n 9 : 'tab',\r\n 27: 'esc'\r\n };\r\n var key = keys[$event.keyCode];\r\n if(key == 'backspace' && scope.inputValue == \"\"){\r\n if(scope.modelArr.length != 0){\r\n scope.removeAddedValues(scope.modelArr[scope.modelArr.length-1]);\r\n //scope.modelArr.pop();\r\n }\r\n }\r\n else if(key == 'down'){\r\n var filteredSuggestionArr = $filter('filter')(scope.suggestionsArr, scope.inputValue);\r\n filteredSuggestionArr = $filter('filter')(filteredSuggestionArr, scope.alreadyAddedValues);\r\n if(scope.selectedItemIndex < filteredSuggestionArr.length -1)\r\n scope.selectedItemIndex++;\r\n }\r\n else if(key == 'up' && scope.selectedItemIndex > 0){\r\n scope.selectedItemIndex--;\r\n }\r\n else if(key == 'esc'){\r\n scope.isOpen = false;\r\n }\r\n else if(key == 'enter'){\r\n //When the multi-select is on a form, this will stop it from accidentally going to the next page or submitting the form when enter is pressed\r\n $event.preventDefault();\r\n\r\n var filteredSuggestionArr = $filter('filter')(scope.suggestionsArr, scope.inputValue);\r\n filteredSuggestionArr = $filter('filter')(filteredSuggestionArr, scope.alreadyAddedValues);\r\n if(scope.selectedItemIndex < filteredSuggestionArr.length)\r\n scope.onSuggestedItemsClick(filteredSuggestionArr[scope.selectedItemIndex]);\r\n }\r\n };\r\n\r\n scope.onSuggestedItemsClick = function (selectedValue) {\r\n if(scope.beforeSelectItem && typeof(scope.beforeSelectItem) == 'function')\r\n scope.beforeSelectItem(selectedValue);\r\n\r\n scope.modelArr.push(selectedValue);\r\n\r\n if(scope.afterSelectItem && typeof(scope.afterSelectItem) == 'function')\r\n scope.afterSelectItem(selectedValue);\r\n\r\n if(scope.onChangeFunction && typeof(scope.onChangeFunction) == 'function')\r\n scope.onChangeFunction(scope.modelArr);\r\n\r\n scope.inputValue = \"\";\r\n };\r\n\r\n var isDuplicate = function (arr, item) {\r\n var duplicate = false;\r\n if(arr == null || arr == \"\")\r\n return duplicate;\r\n\r\n for(var i=0;i 0){\r\n scope.selectedItemIndex--;\r\n }\r\n else if(key == 'esc'){\r\n scope.isHover = false;\r\n scope.isFocused=false;\r\n }\r\n else if(key == 'enter'){\r\n var filteredSuggestionArr = $filter('filter')(scope.suggestionsArr, scope.inputValue);\r\n filteredSuggestionArr = $filter('filter')(filteredSuggestionArr, scope.alreadyAddedValues);\r\n if(scope.selectedItemIndex < filteredSuggestionArr.length)\r\n scope.onSuggestedItemsClick(filteredSuggestionArr[scope.selectedItemIndex]);\r\n }\r\n };\r\n\r\n scope.onSuggestedItemsClick = function (selectedValue) {\r\n if(scope.beforeSelectItem && typeof(scope.beforeSelectItem) == 'function')\r\n scope.beforeSelectItem(selectedValue);\r\n if (!angular.isArray(scope.ngModel)) {\r\n scope.ngModel = [];\r\n }\r\n scope.ngModel.push(selectedValue);\r\n\r\n if(scope.afterSelectItem && typeof(scope.afterSelectItem) == 'function')\r\n scope.afterSelectItem(selectedValue);\r\n\r\n if(scope.onChangeFunction && typeof(scope.onChangeFunction) == 'function')\r\n scope.onChangeFunction(scope.ngModel);\r\n\r\n scope.inputValue = \"\";\r\n };\r\n\r\n var isDuplicate = function (arr, item) {\r\n var duplicate = false;\r\n if(arr == null || arr == \"\")\r\n return duplicate;\r\n\r\n for(var i=0;i 0) {\r\n $window.scrollTo(0, 0);\r\n }\r\n else {\r\n // firstInvalid = elem[0].querySelector('.ng-invalid');\r\n scope.firstInvalid = elem[0].querySelector('.ng-invalid');\r\n // if we find one, set focus\r\n if (scope.firstInvalid) {\r\n scope.firstInvalid.focus();\r\n }\r\n /*if (firstInvalid) {\r\n firstInvalid.focus();\r\n }*/\r\n scope.firstInvalid = undefined;\r\n }\r\n };\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off('submit', scope.onSubmit);\r\n angular.element(elem).off(); // deregister all event handlers\r\n angular.element(elem).remove();\r\n elem = undefined;\r\n }\r\n\r\n $timeout.cancel(scope.submissionTimer);\r\n $timeout.cancel(scope.handleDisabledTimer);\r\n\r\n scope.buttons = undefined;\r\n scope.transcludedButtons = undefined;\r\n scope.firstInvalid = undefined;\r\n\r\n scope.the_form = undefined;\r\n scope.fbForm = undefined;\r\n scope.isFb = undefined;\r\n\r\n scope.submitEventHandler = undefined;\r\n scope.submissionTimeout = undefined;\r\n scope.submissionTimer = undefined;\r\n\r\n scope.handleDisabled = undefined;\r\n scope.handleDisabledTimeout = undefined;\r\n scope.handleDisabledTimer = undefined;\r\n\r\n scope.onSubmit = undefined;\r\n });\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpNumberController', ['$scope', '$timeout', 'Format', 'Validation', function ($scope, $timeout, Format, Validation) {\r\n \r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) { $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || $scope.name)) }\r\n\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.validation) {\r\n Validation.validateQuestion($scope.innerForm.number, $scope.validation, $scope.ngModel);\r\n }\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.number.$error);\r\n }\r\n }\r\n });\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n\r\n $scope.keyPress = function (event) {\r\n var charCode = (event.which) ? event.which : event.keyCode;\r\n\r\n if(!((charCode >= 48 && charCode <= 57) || (charCode == 46 && !$scope.integerOnly) || (charCode == 45 && !$scope.positiveOnly && !$scope.integerOnly) || charCode == 8 )){\r\n event.preventDefault();\r\n }\r\n }\r\n }])\r\n .directive('hlpNumber', ['Format', 'Validation', function (Format, Validation) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=',\r\n validation: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n min: '@?',\r\n max: '@?',\r\n step: '@?',\r\n modal: '@?',\r\n\r\n //required\r\n isRequired: '=?',\r\n requiredText: '@?',\r\n integerOnly: '@?',\r\n positiveOnly: '@?',\r\n money: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //label\r\n showLabel: '@?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n pdf: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/number/number.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n scope.timeouts = [];\r\n\r\n //attributes\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.step) { attrs.step = '1'; }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n \r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.integerOnly) { attrs.integerOnly = false; } else { if (attrs.integerOnly == 'true') { attrs.integerOnly = true; } else { attrs.integerOnly = false; } }\r\n if (!attrs.positiveOnly) { attrs.positiveOnly = false; } else { if (attrs.positiveOnly == 'true') { attrs.positiveOnly = true; } else { attrs.positiveOnly = false; } }\r\n\r\n if (attrs.positiveOnly) {\r\n if (!attrs.min) { attrs.min = '0'; }\r\n } \r\n\r\n if (attrs.money == 'true') {\r\n scope.pattern = /^[0-9]+(\\.[0-9]{1,2})?$/;\r\n }\r\n else {\r\n scope.pattern = null;\r\n }\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.number, scope.validation, scope.ngModel);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.number.$error);\r\n }\r\n };\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n },\r\n controller: 'hlpNumberController'\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('PageSettingsModalController', ['$scope', '$modalInstance', 'continue_button_label', 'show_save_button', 'save_button_label', function ($scope, $modalInstance, continue_button_label, show_save_button, save_button_label) {\r\n $scope.settings = {};\r\n $scope.settings.continue_button_label = continue_button_label;\r\n $scope.settings.show_save_button = show_save_button;\r\n $scope.settings.save_button_label = save_button_label;\r\n $scope.settings.changed = false;\r\n\r\n $scope.$watch('settings.continue_button_label', function(oldValue, newValue) {\r\n if (oldValue != newValue) {\r\n $scope.settings.changed = true;\r\n }\r\n });\r\n $scope.$watch('settings.show_save_button', function (oldValue, newValue) {\r\n if (oldValue != newValue) {\r\n $scope.settings.changed = true;\r\n }\r\n });\r\n $scope.$watch('settings.save_button_label', function (oldValue, newValue) {\r\n if (oldValue != newValue) {\r\n $scope.settings.changed = true;\r\n }\r\n });\r\n\r\n $scope.save = function () {\r\n $modalInstance.close($scope.settings);\r\n }\r\n $scope.cancel = function () {\r\n $modalInstance.close(null);\r\n }\r\n\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpPhoneController', ['$scope', 'Format', '$timeout', function ($scope, Format, $timeout) {\r\n\r\n var isNumeric = function (n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n\r\n $scope.setPhone = function (boxone, boxtwo, boxthree) {\r\n $scope.innerForm.phone.$setDirty();\r\n\r\n if (isUndefined(boxone) || isUndefined(boxtwo) || isUndefined(boxthree)) {\r\n $scope.ngModel = '';\r\n if (isUndefined(boxone) && isUndefined(boxtwo) && isUndefined(boxthree)) {\r\n $scope.innerForm.phone.$setValidity(\"phone\", true);\r\n }\r\n else {\r\n $scope.innerForm.phone.$setValidity(\"phone\", false);\r\n }\r\n if (!isUndefined(boxone) && boxone.length == 3 && isUndefined(boxtwo)) {\r\n $scope.$broadcast('focustwo');\r\n }\r\n if (!isUndefined(boxtwo) && boxtwo.length == 3 && isUndefined(boxthree)) {\r\n $scope.$broadcast('focusthree');\r\n }\r\n }\r\n else {\r\n if (boxone.length == 3 && isNumeric(boxone) && boxtwo.length == 3 && isNumeric(boxtwo) && boxthree.length == 4 && isNumeric(boxthree)) {\r\n $scope.ngModel = boxone + \"-\" + boxtwo + \"-\" + boxthree;\r\n $scope.innerForm.phone.$setValidity(\"phone\", true);\r\n } else {\r\n $scope.ngModel = '';\r\n $scope.innerForm.phone.$setValidity(\"phone\", false);\r\n }\r\n \r\n }\r\n\r\n if ($scope.isRequired && ($scope.ngModel == null || $scope.ngModel == '') && !$scope.innerForm.phone.$error.phone) {\r\n $scope.innerForm.phone.$setValidity(\"required\", false);\r\n } else {\r\n $scope.innerForm.phone.$setValidity(\"required\", true);\r\n }\r\n\r\n $scope.onChange($scope.ngModel);\r\n }\r\n\r\n $scope.setFields = function (value) {\r\n var valueList = value.split('-');\r\n if (value != undefined && value.split('-').length == 3) {\r\n $scope.boxone = valueList[0];\r\n $scope.boxtwo = valueList[1];\r\n $scope.boxthree = valueList[2];\r\n }\r\n };\r\n\r\n $scope.validate = function () {\r\n if ($scope.innerForm !== undefined) {\r\n $scope.$evalAsync(function () {\r\n if ($scope.isRequired && ($scope.ngModel == null || $scope.ngModel == '') && !$scope.innerForm.phone.$error.phone) {\r\n $scope.innerForm.phone.$setValidity(\"required\", false);\r\n } else {\r\n $scope.innerForm.phone.$setValidity(\"required\", true);\r\n }\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.phone.$error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || $scope.name));\r\n }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n\r\n $scope.$watch('ngModel', function (ngModel) {\r\n if (!isUndefined(ngModel) && isUndefined($scope.boxone) && isUndefined($scope.boxtwo) && isUndefined($scope.boxthree)) {\r\n $scope.setFields(ngModel);\r\n }\r\n else if ($scope.overwriteOnChange == true) {\r\n if (!isUndefined(ngModel)) {\r\n $scope.setFields(ngModel);\r\n }\r\n else {\r\n $scope.boxone = null;\r\n $scope.boxtwo = null;\r\n $scope.boxthree = null;\r\n }\r\n }\r\n });\r\n\r\n }])\r\n .directive('hlpPhone', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n name: '@?',\r\n id: '@?',\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n isDisabled: '=?',\r\n change: '&?',\r\n ngModel: '=',\r\n question: '=?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n instructions: '@?',\r\n classes: '@?',\r\n pdf: '=?',\r\n overwriteOnChange: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/phone/phone.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n scope.$evalAsync(function () {\r\n if (!attrs.requiredText) { scope.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)) }\r\n });\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.phone.$error);\r\n }\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n },\r\n controller: 'hlpPhoneController'\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('PhotoUploadModalController', ['$scope', '$modalInstance', 'Upload', 'file_content', function ($scope, $modalInstance, Upload, file_content) {\r\n\r\n $scope.file_content = file_content;\r\n $scope.uploading = false;\r\n\r\n $scope.resizeOptions = function () {\r\n return {\r\n quality: 1.0,\r\n width: 440,\r\n height: 440\r\n }\r\n }\r\n\r\n $scope.resizeConditions = function (file, width, height) {\r\n return width > 220 || height > 100;\r\n }\r\n\r\n $scope.fileUpdated = function (file) {\r\n Upload.base64DataUrl(file).then(function (content) {\r\n $scope.file_content = content;\r\n $scope.uploading = false;\r\n });\r\n }\r\n\r\n $scope.filePicked = function () {\r\n $scope.uploading = true;\r\n }\r\n\r\n $scope.save = function (file, file_content) {\r\n if (file != null) {\r\n $modalInstance.close({\r\n file_name: file.name,\r\n file_content: file_content\r\n });\r\n }\r\n else {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('PostalCodeModalController', ['$scope', '$modalInstance', 'postalCode', 'addresses', 'FIPSLookup', function ($scope, $modalInstance, postalCode, addresses, FIPSLookup) {\r\n $scope.postalCode = postalCode;\r\n $scope.addresses = addresses;\r\n\r\n $scope.select = function (address) {\r\n $modalInstance.close(address);\r\n }\r\n\r\n $scope.no = function () {\r\n $modalInstance.close(null);\r\n }\r\n\r\n $scope.lookupZip = function () {\r\n $scope.postalSearching = true;\r\n $scope.postalCode = $scope.postalCode || \"\";\r\n FIPSLookup.getByPostalCode($scope.postalCode).then(function (data) {\r\n if (data != null) {\r\n $scope.addresses = data;\r\n } else {\r\n $scope.failMessage = \"Could not find information for this postal code.\";\r\n }\r\n $scope.postalSearching = false;\r\n });\r\n }\r\n\r\n $scope.onChange = function (item) {\r\n if ($scope.postalCode.length == 5) {\r\n $scope.lookupZip();\r\n }\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpPostalCode', ['Format', 'Validation', 'FIPSLookup', '$timeout', '$modal', function (Format, Validation, FIPSLookup, $timeout, $modal) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question:'=?',\r\n city: '=',\r\n county: '=',\r\n state: '=',\r\n validation: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n size: '@?',\r\n type: '@?',\r\n maxLength: '@?',\r\n modal: '@?',\r\n placeholder: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n pdf: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/postal-code/postal-code.html',\r\n controller: ['$scope', '$timeout', function ($scope, $timeout) {\r\n $scope.validate = function () {\r\n if (!$scope.requiredText) { $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || $scope.name)) }\r\n\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.validation) {\r\n Validation.validateQuestion($scope.innerForm.input, $scope.validation, $scope.ngModel);\r\n }\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.input.$error);\r\n }\r\n }\r\n }\r\n var validationTimeout = $timeout($scope.validate(), 0);\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n scope.timeouts = [];\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'zip'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.size) { attrs.size = '35'; }\r\n if (!attrs.type) { attrs.type = 'text' }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n\r\n scope.lookupZip = function() {\r\n scope.postalSearching = true;\r\n scope.ngModel = scope.ngModel || \"\";\r\n FIPSLookup.getByPostalCode(scope.ngModel).then(function (data) {\r\n if (data != null) {\r\n scope.failMessage = \"\";\r\n if (data.length == 1) {\r\n // Found a single match, just set values\r\n var result = data[0];\r\n scope.city = result.city_name;\r\n scope.county = result.county_name;\r\n scope.state = result.region_id;\r\n }\r\n else {\r\n // Found 0 or multiple matches, open up a modal to let them pick the one they want\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/postal-code/postal-code-modal.html',\r\n controller: 'PostalCodeModalController',\r\n resolve: {\r\n postalCode: function() {\r\n return scope.ngModel;\r\n },\r\n addresses: function () {\r\n return data;\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result != null) {\r\n scope.city = result.city_name;\r\n scope.county = result.county_name;\r\n scope.state = result.region_id;\r\n scope.ngModel = result.postal_code;\r\n }\r\n });\r\n }\r\n }\r\n else {\r\n scope.failMessage = \"Could not find information for this postal code.\";\r\n }\r\n \r\n scope.postalSearching = false;\r\n });\r\n }\r\n \r\n // see if this needs to be wrapped in a $timeout\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.ngModel.length == 5) {\r\n scope.lookupZip();\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.input, scope.validation, scope.ngModel);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.input.$error);\r\n }\r\n }\r\n ctrl.$viewChangeListeners.push(function () {\r\n scope.$eval(attrs.ngChange);\r\n });\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpQuery', ['Queries', '$state', 'Cache', function (Queries, $state, Cache) {\r\n return {\r\n restrict: 'EA',\r\n transclude: true,\r\n replace: true,\r\n scope: {\r\n // scope\r\n records: '=?',\r\n cacheRecords: '=?',\r\n recordsLoading: '=?',\r\n bulkActions: '=?',\r\n bulkActionItems: '=?',\r\n state: '@?',\r\n previewId: '=?',\r\n service: '@?',\r\n bulkActionRunning: '=?'\r\n },\r\n controller: ['$scope', 'Format', function ($scope, Format) {\r\n $scope.queryChanged = function (query) {\r\n $scope.query = query;\r\n var link = null;\r\n var columns = [];\r\n var filters = [];\r\n var advancedFilters = [];\r\n \r\n if (query != null) {\r\n if ($scope.previewId == null) {\r\n Cache.setState('query', query);\r\n }\r\n\r\n if (query.display_bulk_actions) {\r\n $scope.vm.bulkActions = angular.copy($scope.bulkActions);\r\n }\r\n \r\n if (query.query_page != null && query.query_page.link_state != null && query.query_page.query_page_parameters.length > 0) {\r\n if ($scope.previewId == null) {\r\n link = {};\r\n link.state = query.query_page.link_state;\r\n link.params = [];\r\n }\r\n query.query_page.query_page_parameters.forEach(function (queryPageParameter) {\r\n var param = {};\r\n param.name = queryPageParameter.name;\r\n param.field = queryPageParameter.json;\r\n if ($scope.previewId == null) {\r\n link.params.push(param);\r\n }\r\n })\r\n }\r\n\r\n query.query_column_values.sort(sortObjectArray('sort_order')).forEach(function (queryColumnValue) {\r\n var column = {};\r\n column.label = queryColumnValue.header;\r\n column.field = queryColumnValue.query_column.json;\r\n column.type = queryColumnValue.query_column.type;\r\n\r\n if (column.type == 'date')\r\n column.revertTimeZone = true;\r\n\r\n if (queryColumnValue.query_column.state != null) {\r\n if ($scope.previewId == null) {\r\n column.link = {};\r\n column.link.state = queryColumnValue.query_column.state;\r\n column.link.params = [];\r\n }\r\n queryColumnValue.query_column.query_column_parameters.forEach(function (queryColumnParameter) {\r\n var param = {};\r\n param.name = queryColumnParameter.name;\r\n param.field = queryColumnParameter.json; \r\n if ($scope.previewId == null) {\r\n column.link.params.push(param);\r\n }\r\n })\r\n }\r\n columns.push(column);\r\n })\r\n\r\n query.query_filter_values.sort(sortObjectArray('sort_order')).forEach(function (queryFilterValue) {\r\n var filter = {};\r\n filter.id = queryFilterValue.id;\r\n filter.name = queryFilterValue.display_label;\r\n filter.field = queryFilterValue.query_filter.json;\r\n filter.service = queryFilterValue.query_filter.service;\r\n filter.method = queryFilterValue.query_filter.method;\r\n filter.type = queryFilterValue.query_filter.type;\r\n filters.push(filter);\r\n })\r\n\r\n query.query_advanced_filter_values.sort(sortObjectArray('sort_order')).forEach(function (queryAdvancedFilterValue) {\r\n var advancedFilter = {};\r\n advancedFilter.id = queryAdvancedFilterValue.id;\r\n advancedFilter.name = queryAdvancedFilterValue.label;\r\n advancedFilter.field = queryAdvancedFilterValue.query_advanced_filter.json;\r\n advancedFilter.type = queryAdvancedFilterValue.query_advanced_filter.type;\r\n advancedFilter.exactMatch = queryAdvancedFilterValue.query_advanced_filter.exact_match;\r\n advancedFilters.push(advancedFilter);\r\n })\r\n if (query.default_sort != null) {\r\n $scope.defaultSort = query.default_sort;\r\n } else {\r\n $scope.defaultSort = \"modified_on\"; // OK if that field does not exist\r\n }\r\n if (query.default_order != null) {\r\n $scope.defaultOrder = query.default_order;\r\n }\r\n if ($scope.records != null) {\r\n var ifStatement = '';\r\n\r\n query.query_criteria.sort(sortObjectArray('sort_order')).forEach(function (queryCriteria, index) {\r\n if (index > 0) {\r\n if (queryCriteria.and_flag) {\r\n ifStatement += ' && ';\r\n }\r\n else {\r\n ifStatement += ' || ';\r\n }\r\n }\r\n\r\n for (var i = 0; i < queryCriteria.left_parenthesis; i++) {\r\n ifStatement += '(';\r\n }\r\n\r\n var criteriaValue = queryCriteria.value;\r\n var skipit = false;\r\n var doquotes = true;\r\n\r\n if (queryCriteria.query_calculated_value != null) {\r\n if (queryCriteria.query_field != null && queryCriteria.query_field.type == 'days') {\r\n skipit = true;\r\n var daysVal = Number(queryCriteria.query_calculated_value.value);\r\n if (!isNaN(daysVal)) {\r\n var now = new Date();\r\n now.setHours(0, 0, 0, 0);\r\n\r\n var compareDate = new Date();\r\n compareDate.setDate(compareDate.getDate() - daysVal);\r\n compareDate.setHours(0, 0, 0, 0);\r\n if (daysVal < 0) {\r\n //Options in the future (i.e. next 90 days)\r\n ifStatement += \"(record['\" + queryCriteria.query_field.json + \"'] != null && isValidDate(record['\" + queryCriteria.query_field.json + \"']) && \" +\r\n (queryCriteria.query_operator.name == '<>' ? \"!\" : \"\") +\r\n \"(\" + now.getTime() + \" <= record['\" + queryCriteria.query_field.json + \"'].revertTimeZone().setHours(0, 0, 0, 0) && \" + compareDate.getTime() + \" >= record['\" + queryCriteria.query_field.json + \"'].revertTimeZone().setHours(0, 0, 0, 0)))\";\r\n }\r\n else if (daysVal == 1) {\r\n //\"Yesterday\" option - excludes todays date\r\n ifStatement += \"(record['\" + queryCriteria.query_field.json + \"'] != null && isValidDate(record['\" + queryCriteria.query_field.json + \"']) && \" +\r\n (queryCriteria.query_operator.name == '<>' ? \"!\" : \"\") +\r\n \"(\" + now.getTime() + \" > record['\" + queryCriteria.query_field.json + \"'].revertTimeZone().setHours(0, 0, 0, 0) && \" + compareDate.getTime() + \" <= record['\" + queryCriteria.query_field.json + \"'].revertTimeZone().setHours(0, 0, 0, 0)))\";\r\n }\r\n else {\r\n //Options in the past (i.e. last 90 days)\r\n ifStatement += \"(record['\" + queryCriteria.query_field.json + \"'] != null && isValidDate(record['\" + queryCriteria.query_field.json + \"']) && \" +\r\n (queryCriteria.query_operator.name == '<>' ? \"!\" : \"\") +\r\n \"(\" + now.getTime() + \" >= record['\" + queryCriteria.query_field.json + \"'].revertTimeZone().setHours(0, 0, 0, 0) && \" + compareDate.getTime() + \" <= record['\" + queryCriteria.query_field.json + \"'].revertTimeZone().setHours(0, 0, 0, 0)))\";\r\n }\r\n }\r\n }\r\n else {\r\n if (queryCriteria.query_field != null && queryCriteria.query_field.type == 'boolean') {\r\n doquotes = false;\r\n }\r\n criteriaValue = queryCriteria.query_calculated_value.value;\r\n }\r\n }\r\n\r\n if (!skipit) {\r\n if (doquotes) {\r\n ifStatement += \"'\" + criteriaValue + \"'\";\r\n }\r\n else {\r\n ifStatement += criteriaValue;\r\n }\r\n if (queryCriteria.query_operator.name == '=') {\r\n ifStatement += '==';\r\n }\r\n else if (queryCriteria.query_operator.name == '<>') {\r\n ifStatement += '!=';\r\n }\r\n ifStatement += \"Format.evaluateJSON(record,'\" + queryCriteria.query_field.json + \"')\";\r\n }\r\n\r\n for (var i = 0; i < queryCriteria.right_parenthesis; i++) {\r\n ifStatement += ')';\r\n }\r\n })\r\n if (ifStatement != '' && $scope.records != null) {\r\n var filtered = [];\r\n $scope.records.forEach(function (record) {\r\n if (eval(ifStatement)) {\r\n filtered.push(record);\r\n }\r\n })\r\n $scope.filteredRecords = filtered;\r\n }\r\n else {\r\n $scope.filteredRecords = $scope.records;\r\n }\r\n }\r\n }\r\n\r\n $scope.link = link;\r\n $scope.columns = columns;\r\n $scope.filters = filters;\r\n $scope.advancedFilters = advancedFilters;\r\n\r\n } \r\n }],\r\n templateUrl: 'templates/query/query.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.link = null;\r\n scope.columns = null;\r\n scope.filters = null;\r\n scope.advancedFilters = null;\r\n scope.loading = true;\r\n scope.vm = {\r\n bulkActions: []\r\n }\r\n scope.recordsWatchInit = false;\r\n\r\n scope.$watch('query', function (query) {\r\n scope.query = query;\r\n }, true);\r\n\r\n scope.$watch('records', function (records) {\r\n if (scope.query != null && records != null && !scope.recordsWatchInit) {\r\n scope.queryChanged(scope.query);\r\n scope.recordsWatchInit = true;\r\n }\r\n }, true);\r\n\r\n if (typeof scope.previewId == 'undefined' || scope.previewId == null) {\r\n Cache.getState('query').then(function (query) {\r\n if (scope.loading) {\r\n scope.query = query;\r\n scope.queryChanged(scope.query);\r\n }\r\n }).catch(function (response) {\r\n return $q.reject(response.data);\r\n });\r\n }\r\n\r\n var queryState = $state.current.name;\r\n if (attrs.state != null) {\r\n queryState = attrs.state;\r\n }\r\n\r\n Queries.get(queryState, true).then(function (queries) {\r\n scope.queries = queries;\r\n if (scope.queries.length > 0) {\r\n if (typeof scope.previewId == 'undefined' || scope.previewId == null) {\r\n Cache.getState('query').then(function (cachedQuery) {\r\n if (cachedQuery != null) {\r\n var found = false;\r\n scope.queries.forEach(function (query) {\r\n if (query.id == cachedQuery.id && !found) {\r\n scope.query = query;\r\n found = true;\r\n }\r\n })\r\n if (scope.query == null || !found) {\r\n scope.query = scope.queries[0];\r\n }\r\n }\r\n else {\r\n // if no query is cached, use the user's default view if it exists\r\n var found = false;\r\n scope.queries.forEach(function (query) {\r\n if (query.default_view == true) {\r\n scope.query = query;\r\n found = true;\r\n }\r\n if (scope.query == null || !found) {\r\n scope.query = scope.queries[0];\r\n }\r\n })\r\n }\r\n scope.queryChanged(scope.query);\r\n scope.loading = false;\r\n }).catch(function () {\r\n //if we get into the error catch then load default view\r\n var found = false;\r\n scope.queries.forEach(function (query) {\r\n if (query.default_view == true) {\r\n scope.query = query;\r\n found = true;\r\n }\r\n if (scope.query == null || !found) {\r\n scope.query = scope.queries[0];\r\n }\r\n })\r\n scope.queryChanged(scope.query);\r\n scope.loading = false;\r\n }); \r\n }\r\n else {\r\n var found = false;\r\n scope.queries.forEach(function (query) {\r\n if (((scope.query != null && query.id == scope.query.id) || (scope.previewId != null && query.id == scope.previewId.toLowerCase())) && !found) {\r\n found = true;\r\n scope.query = query;\r\n }\r\n })\r\n if (!found) {\r\n scope.query = scope.queries[0];\r\n }\r\n scope.queryChanged(scope.query);\r\n scope.loading = false;\r\n }\r\n }\r\n else {\r\n scope.query = null;\r\n scope.queryChanged(scope.query);\r\n scope.loading = false;\r\n }\r\n })\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpRadio', ['Format', function (Format) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n radioLabel: '@?',\r\n value: '=?',\r\n index: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //label\r\n showLabel: '@?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n pdf: '=?'\r\n },\r\n transclude: true,\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/radio/radio.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'radio'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.radioLabel) { attrs.radioLabel = Format.label(attrs.name); } else { if (attrs.radioLabel == 'EMPTY') { attrs.radioLabel = ''; } }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.requiredText) { attrs.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)) }\r\n\r\n if (!attrs.index) { attrs.index = 0 }\r\n\r\n function RadioDirectiveTag() { }\r\n scope.__tag = new RadioDirectiveTag();\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n }\r\n //ctrl.$viewChangeListeners.push(function () {\r\n // scope.$eval(attrs.ngChange);\r\n //});\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.submitted = true;\r\n });\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpRadios', ['$injector', 'Format', '$timeout', function ($injector, Format, $timeout) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=?',\r\n name: '@?',\r\n id: '@?',\r\n showLabel: '@?',\r\n updateService: '@?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n options: '=?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n instructions: '@?',\r\n classes: '@?',\r\n selectShow: '@?',\r\n selectValue: '@?',\r\n service: '@?',\r\n method: '@?',\r\n isDisabled: '=?',\r\n topLabel: '=?',\r\n modal: '@?',\r\n showColon: '=?',\r\n vertical: '=?',\r\n parameters: '=?',\r\n pdf: '=?',\r\n showValue: '=?'\r\n },\r\n require: 'ngModel',\r\n transclude: true,\r\n replace: true,\r\n templateUrl: 'templates/radios/radios.html',\r\n controller: ['$scope', '$timeout', function ($scope, $timeout) {\r\n $scope.validate = function () {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.isRequired) {\r\n if ($scope.ngModel == null || $scope.ngModel.length == 0) {\r\n $scope.innerForm[$scope.name].$setValidity(\"required\", false);\r\n }\r\n else {\r\n $scope.innerForm[$scope.name].$setValidity(\"required\", true);\r\n }\r\n }\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined && $scope.innerForm != null && $scope.innerForm[$scope.name] != null) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm[$scope.name].$error);\r\n }\r\n }\r\n }\r\n var validationTimeout = $timeout(function() {\r\n if (!$scope.requiredText) { $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || 'value')) }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n\r\n if (!attrs.name) { attrs.name = 'radios'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); } \r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.updateService) { attrs.updateService = true; } else { if (attrs.updateService == true || attrs.updateService == 'true') { attrs.updateService = true; } else { attrs.updateService = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.title) { attrs.title = Format.label(attrs.name); }\r\n\r\n if (!attrs.selectShow) { attrs.selectShow = 'name'; }\r\n if (!attrs.selectValue) { attrs.selectValue = 'id'; }\r\n if (!attrs.method) { attrs.method = 'get'; }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n if (!attrs.forceString) { attrs.forceString = false; } else { if (attrs.forceString == 'true') { attrs.forceString = true; } else { attrs.forceString = false; } }\r\n if (!attrs.vertical) { attrs.vertical = false; } else { if (attrs.vertical == 'true') { attrs.vertical = true; } else { attrs.vertical = false; } }\r\n\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n if (scope.options != null && !(scope.service != null && scope.service != '' && scope.serviceOverride)) {\r\n if (Object.prototype.toString.call(scope.options) !== '[object Array]') {\r\n scope.options.split(',').forEach(function (option) {\r\n scope.dirOptions.push({ id: option.trim(), name: option.trim() });\r\n });\r\n scope.optionsLoaded = true;\r\n }\r\n else {\r\n scope.$evalAsync(function () {\r\n scope.dirOptions = scope.options;\r\n scope.optionsLoaded = true;\r\n });\r\n }\r\n }\r\n else if (scope.service != null && scope.service != '') {\r\n var service = $injector.get(scope.service);\r\n\r\n service[scope.method](scope.parameters).then(function (data) {\r\n scope.dirOptions = data;\r\n if (attrs.updateService) {\r\n scope.options = data;\r\n }\r\n scope.optionsLoaded = true;\r\n });\r\n scope.$on('$destroy', function () {\r\n service = null;\r\n });\r\n }\r\n else {\r\n scope.optionsLoaded = true;\r\n }\r\n\r\n // watch if options is coming from an array that hasn't been set yet\r\n scope.$watch('options', function (options) {\r\n if (options != null && scope.optionsLoaded && scope.service == null) {\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n\r\n if (Object.prototype.toString.call(scope.options) !== '[object Array]') {\r\n scope.options.split(',').forEach(function (option) {\r\n scope.dirOptions.push({ id: option.trim(), name: option.trim() });\r\n });\r\n }\r\n else {\r\n scope.dirOptions = scope.options;\r\n }\r\n scope.optionsLoaded = true;\r\n }\r\n });\r\n\r\n scope.$watch('optionsLoaded', function (optionsLoaded) {\r\n if (optionsLoaded && scope.showValue == null) {\r\n scope.setShowValue();\r\n }\r\n var timer = $timeout(function () {\r\n if (scope.isRequired && (scope.innerForm !== undefined)) {\r\n if (ngModel.$modelValue == null || ngModel.$modelValue.length == 0) {\r\n scope.innerForm[scope.name].$setValidity(\"required\", false);\r\n }\r\n else {\r\n scope.innerForm[scope.name].$setValidity(\"required\", true);\r\n }\r\n }\r\n }, 0);\r\n scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n })\r\n\r\n scope.setShowValue = function () {\r\n if (ngModel.$modelValue != null && scope.dirOptions != null) {\r\n scope.showValue = null;\r\n scope.dirOptions.forEach(function (opt) {\r\n if (opt.id == ngModel.$modelValue) {\r\n scope.showValue = opt.name;\r\n }\r\n })\r\n }\r\n }\r\n\r\n ngModel.$render = function () {\r\n if (ngModel.$modelValue != null) {\r\n if (scope.showValue == null && scope.optionsLoaded) {\r\n scope.setShowValue();\r\n }\r\n }\r\n }\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n scope.processingChange = true;\r\n ngModel.$setViewValue(item);\r\n scope.$evalAsync(function () {\r\n scope.setShowValue();\r\n if (scope.isRequired) {\r\n if (ngModel.$modelValue == null || ngModel.$modelValue.length == 0) {\r\n scope.innerForm[scope.name].$setValidity(\"required\", false);\r\n }\r\n else {\r\n scope.innerForm[scope.name].$setValidity(\"required\", true);\r\n }\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined && scope.innerForm != null && scope.innerForm[scope.name] != null) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm[scope.name].$error);\r\n }\r\n scope.processingChange = false;\r\n });\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n });\r\n }\r\n }\r\n }\r\n };\r\n }])\r\n\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpSelect\", [\r\n \"$rootScope\",\r\n \"$templateCache\",\r\n \"Validation\",\r\n \"$timeout\",\r\n \"$q\",\r\n \"DataElements\",\r\n function ($rootScope, $templateCache, Validation, $timeout, $q, DataElements) {\r\n // if you supply your options array objects with an is_default property (there may only be one of these set to true, but every option must have the property)\r\n // then a default option will be selected. you either pass this in on the options attribute or you can include it in the call to the service you grab your options from\r\n // edit: also you need to set the useDefault attribute...This may have been a bad idea after all, should have just set a default in the specific controller\r\n var directiveScope = angular.extend({}, $rootScope.formFieldScope, {\r\n ngModel: \"=?\",\r\n question: \"=?\",\r\n showValue: \"=?\",\r\n ngChange: \"&?\",\r\n clear: \"&?\",\r\n validation: \"=?\",\r\n options: \"=?\",\r\n parameters: \"=?\",\r\n pdf: \"=?\",\r\n useDefault: \"@?\",\r\n autoComplete: \"@?\"\r\n });\r\n return {\r\n scope: directiveScope,\r\n require: \"ngModel\",\r\n transclude: true,\r\n template: function () {\r\n return $templateCache.get(\"templates/select/select.html\");\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"$timeout\",\r\n function ($scope, $timeout) {\r\n if ($scope.question && $scope.question.parameters && $scope.question.parameters.limit_vehicle_type_ids !== null && $scope.name === 'Vehicle Type') {\r\n $scope.method = \"getVehiclesTypesWithTypeRestriction\";\r\n $scope.service = \"Vehicles\"\r\n }\r\n\r\n $scope.validate = function () {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.validation) {\r\n Validation.validateQuestion(\r\n $scope.innerForm[$scope.name],\r\n $scope.validation,\r\n $scope.ngModel\r\n ).then(function (result) {\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(\r\n $scope.innerForm[$scope.name]\r\n .$error\r\n ) ||\r\n !isEmpty($scope.innerForm.$error);\r\n }\r\n });\r\n } else {\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid = !isEmpty(\r\n $scope.innerForm[$scope.name].$error\r\n );\r\n }\r\n }\r\n }\r\n };\r\n\r\n var validationTimeout = $timeout(function () {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.isRequired) {\r\n if (\r\n $scope.ngModel == null ||\r\n $scope.ngModel.length == 0\r\n ) {\r\n $scope.innerForm[$scope.name].$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n $scope.innerForm[$scope.name].$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n $scope.validate();\r\n }\r\n }, 0);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }\r\n ],\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n scope.directiveAttributes = attrs;\r\n scope.vm = {\r\n value: null\r\n };\r\n\r\n if (scope.directiveAttributes.multiSelect) {\r\n scope.multiSelect = true;\r\n }\r\n if (!scope.directiveAttributes.selectShow) {\r\n scope.selectShow = \"name\";\r\n }\r\n if (!scope.directiveAttributes.selectValue) {\r\n scope.selectValue = \"id\";\r\n }\r\n if (!scope.directiveAttributes.useDefault) {\r\n scope.directiveAttributes.useDefault = false;\r\n } else {\r\n scope.directiveAttributes.useDefault = true;\r\n } // javascripty\r\n\r\n if (scope.selectValue == \"OBJECT\") {\r\n if (!scope.groupBy) {\r\n scope.optionClause =\r\n \"getDescendantProp(opt,selectShow) for opt in dirOptions\";\r\n } else {\r\n scope.optionClause =\r\n \"getDescendantProp(opt,selectShow) group by getDescendantProp(opt,groupBy) for opt in dirOptions\";\r\n }\r\n } else {\r\n if (!scope.groupBy) {\r\n scope.optionClause =\r\n \"getDescendantProp(opt,selectShow) disable when opt.disable for opt in dirOptions track by getDescendantProp(opt,selectValue)\";\r\n } else {\r\n scope.optionClause =\r\n \"getDescendantProp(opt,selectShow) group by getDescendantProp(opt,groupBy) for opt in dirOptions track by getDescendantProp(opt,selectValue)\";\r\n }\r\n }\r\n },\r\n post: function (scope, elem, attrs, ngModel) {\r\n scope.timeouts = [];\r\n scope.existingOptionsLoaded = false;\r\n scope.selectedArray = [];\r\n scope.autoComplete = attrs.autoComplete;\r\n\r\n scope.setShowValue = function () {\r\n if (scope.vm.value != null) {\r\n var val = scope.getDescendantProp(\r\n scope.vm.value,\r\n scope.selectValue\r\n );\r\n scope.dirOptions.forEach(function (opt) {\r\n if (\r\n val ==\r\n scope.getDescendantProp(\r\n opt,\r\n scope.selectValue\r\n )\r\n ) {\r\n scope.showValue = scope.getDescendantProp(\r\n opt,\r\n scope.selectShow\r\n );\r\n }\r\n });\r\n }\r\n };\r\n\r\n var needToChangeToString = false;\r\n\r\n scope.$watch(\"optionsLoaded\", function (optionsLoaded) {\r\n if (optionsLoaded && needToChangeToString && angular.isString(ngModel.$modelValue)) {\r\n //Options have loaded, need to match ids to corresponding name/id pair\r\n var newArray = [];\r\n if (scope.dirOptions != null && angular.isArray(scope.dirOptions)) {\r\n ngModel.$modelValue.split(',').forEach(function (item) {\r\n scope.dirOptions.forEach(function (element) {\r\n if (element.id.toString().toLowerCase() == item.toLowerCase()) {\r\n newArray.push(element);\r\n }\r\n })\r\n });\r\n scope.showValue = generateStringFromArrays(\r\n newArray,\r\n scope.dirOptions\r\n );\r\n scope.selectedArray = newArray;\r\n scope.existingOptionsLoaded = true;\r\n }\r\n }\r\n else if (optionsLoaded && scope.showValue == null) {\r\n // see if there is a default option in this list of options\r\n // slightly hacky conditional...if this array does not use the is_default property lets just skip this part,\r\n // we assume if we do use it, every option has that property, so code accordingly\r\n // ...and we have to use a for loop because ie doesn't support a few nice array methods\r\n if (\r\n scope.useDefault &&\r\n scope.options &&\r\n scope.options.length > 0 &&\r\n scope.options[0].hasOwnProperty(\r\n \"is_default\"\r\n )\r\n ) {\r\n for (\r\n var i = 0;\r\n i < scope.options.length;\r\n i++\r\n ) {\r\n if (scope.options[i].is_default) {\r\n scope.ngModel = scope.options[i].id;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (scope.multiple || scope.multiSelect) {\r\n scope.showValue = generateStringFromArrays(\r\n scope.array,\r\n scope.dirOptions\r\n );\r\n } else {\r\n scope.setShowValue();\r\n }\r\n }\r\n });\r\n\r\n ngModel.$render = function () {\r\n if (ngModel.$modelValue != null) {\r\n if (scope.multiple && !scope.multiSelect) {\r\n if (scope.method != null && scope.method != \"\" && scope.service != null && scope.service != \"\") {\r\n //If the options are already loaded we can match the ids to the corresponding name/id pair right away.\r\n if (scope.optionsLoaded) {\r\n // convert array of id's to array of objects with id and name\r\n scope.array = [];\r\n if (scope.dirOptions != null && angular.isArray(scope.dirOptions)) {\r\n if (typeof ngModel.$modelValue == \"string\") {\r\n ngModel.$modelValue.split(',').forEach(function (item) {\r\n scope.dirOptions.forEach(function (element) {\r\n if (element.id.toString().toLowerCase() == item.toLowerCase()) {\r\n scope.array.push(element);\r\n }\r\n })\r\n });\r\n }\r\n scope.showValue = generateStringFromArrays(\r\n scope.array,\r\n scope.dirOptions\r\n );\r\n scope.selectedArray = scope.array;\r\n scope.existingOptionsLoaded = true;\r\n }\r\n }\r\n else {\r\n needToChangeToString = true;\r\n }\r\n }\r\n else {\r\n scope.array = [];\r\n if (typeof ngModel.$modelValue == \"string\") {\r\n ngModel.$modelValue.split(\",\").forEach(function (option) {\r\n scope.array.push({\r\n id: option.trim(),\r\n name: option.trim()\r\n });\r\n });\r\n }\r\n scope.showValue = generateStringFromArrays(\r\n scope.array,\r\n scope.dirOptions\r\n );\r\n }\r\n } else if (scope.multiple && scope.multiSelect) {\r\n if (scope.id == \"serviceClassification\") {\r\n DataElements.getServiceClassification({}).then(function (classifications) {\r\n scope.dirOptions = classifications;\r\n scope.array = [];\r\n if (typeof ngModel.$modelValue == \"string\") {\r\n ngModel.$modelValue.split(\",\").forEach(function (option) {\r\n if (getNameFromListArray(scope.dirOptions, option.trim()) != null) {\r\n scope.array.push({\r\n id: option.trim(),\r\n name: getNameFromListArray(scope.dirOptions, option.trim())\r\n });\r\n }\r\n });\r\n }\r\n scope.showValue = generateStringFromArrays(\r\n scope.array,\r\n scope.dirOptions\r\n );\r\n\r\n })\r\n } else {\r\n scope.array = [];\r\n if (typeof ngModel.$modelValue == \"string\") {\r\n ngModel.$modelValue.split(\",\").forEach(function (option) {\r\n if (getNameFromListArray(scope.dirOptions, option.trim()) != null) {\r\n scope.array.push({\r\n id: option.trim(),\r\n name: getNameFromListArray(scope.dirOptions, option.trim())\r\n });\r\n }\r\n });\r\n }\r\n scope.showValue = generateStringFromArrays(\r\n scope.array,\r\n scope.dirOptions\r\n );\r\n }\r\n\r\n\r\n } else {\r\n if (scope.selectValue == \"OBJECT\") {\r\n scope.vm.value = ngModel.$modelValue;\r\n scope.showValue = scope.getDescendantProp(\r\n scope.vm.value,\r\n scope.selectShow\r\n );\r\n } else {\r\n scope.vm.value = {};\r\n scope.vm.value[scope.selectValue] =\r\n ngModel.$modelValue;\r\n if (\r\n scope.showValue == null &&\r\n scope.optionsLoaded\r\n ) {\r\n scope.setShowValue();\r\n }\r\n }\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm[scope.name],\r\n scope.validation,\r\n ngModel.$modelValue\r\n );\r\n }\r\n } else {\r\n scope.vm.value = null;\r\n scope.showValue = null;\r\n }\r\n };\r\n\r\n scope.onChange = function (value) {\r\n scope.submitted = false;\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n if (\r\n (scope.multiple || scope.multiSelect) &&\r\n value !== undefined &&\r\n value != null\r\n ) {\r\n scope.valueArray = [];\r\n value.forEach(function (option) {\r\n if (scope.selectValue == \"OBJECT\") {\r\n scope.valueArray.push(\r\n ngModel.$setViewValue(\r\n option\r\n )\r\n );\r\n } else {\r\n scope.valueArray.push(\r\n scope.getDescendantProp(\r\n option,\r\n scope.selectValue\r\n )\r\n );\r\n }\r\n });\r\n ngModel.$setViewValue(\r\n scope.valueArray.toString()\r\n );\r\n\r\n scope.showValue = generateStringFromArrays(\r\n ngModel.$modelValue,\r\n scope.dirOptions\r\n );\r\n } else {\r\n if (scope.selectValue == \"OBJECT\") {\r\n ngModel.$setViewValue(value);\r\n scope.showValue = scope.getDescendantProp(\r\n value,\r\n scope.selectShow\r\n );\r\n } else {\r\n ngModel.$setViewValue(\r\n scope.getDescendantProp(\r\n value,\r\n scope.selectValue\r\n )\r\n );\r\n scope.showValue = scope.getDescendantProp(\r\n value,\r\n scope.selectShow\r\n );\r\n }\r\n }\r\n\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm[scope.name],\r\n scope.validation,\r\n ngModel.$modelValue\r\n );\r\n }\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.answer !== undefined\r\n ) {\r\n scope.question.answer.invalid = !isEmpty(\r\n scope.innerForm[scope.name].$error\r\n );\r\n }\r\n }, 0)\r\n );\r\n };\r\n\r\n scope.submitted = false;\r\n scope.$on(\"form:submit\", function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on(\"$destroy\", function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n };\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpServiceTrainingReimbursementController', ['$scope', 'ServiceUserTrainings', 'TrainingUsers', 'Users', '$q', 'FBForms', function ($scope, ServiceUserTrainings, TrainingUsers, Users, $q, FBForms) {\r\n\r\n $scope.service_users = [];\r\n $scope.userTrainingUsed = {};\r\n $scope.serviceUserTrainings = {};\r\n $scope.loading = true;\r\n $scope.setUpAnswers = function () {\r\n // Add empty first row\r\n $scope.component.elementAnswer.push({\r\n service_id: $scope.parameters.service_id,\r\n license_request_id: $scope.parameters.license_request_id\r\n });\r\n\r\n $scope.service_users.forEach(function (user) {\r\n $scope.userTrainingUsed[user.id] = [];\r\n if ($scope.serviceUserTrainings[user.id] && $scope.serviceUserTrainings[user.id].length > 0) {\r\n if (!$scope.pdf) {\r\n TrainingUsers.getTrainingsForReimbursement({ user_id: user.id, license_request_id: $scope.parameters.license_request_id }).then(function (trainings) {\r\n trainings.forEach(function (training) {\r\n var answer = {\r\n service_id: $scope.parameters.service_id,\r\n user_id: user.id,\r\n first_name: user.first_name,\r\n last_name: user.last_name,\r\n nameandnumber: user.nameandnumber,\r\n license_request_id: $scope.parameters.license_request_id,\r\n reimburse: true,\r\n training_id: training.training_id,\r\n course_name: training.nameandnumber,\r\n trainings: trainings\r\n };\r\n\r\n // Get Answer\r\n var reimbursement = $scope.serviceUserTrainings[user.id].find(function (element) {\r\n return element.training_id === training.training_id;\r\n });\r\n if (reimbursement) {\r\n answer.training = training;\r\n answer.user = user;\r\n\r\n answer.reimburse_date = reimbursement.reimburse_date;\r\n answer.reimburse_amount = reimbursement.reimburse_amount;\r\n if (reimbursement.training_user != null) {\r\n answer.training_completed_on = reimbursement.training_user.completed_on;\r\n answer.training_pass_fail = reimbursement.training_user.training_attendee_status_name;\r\n }\r\n\r\n $scope.userTrainingUsed[user.id].push(answer.training.training_id);\r\n // add answer infront of empty row for new adds\r\n $scope.component.elementAnswer.splice($scope.component.elementAnswer.length - 1, 0, answer);\r\n }\r\n });\r\n\r\n // Remove the trainings from the answers on form\r\n $scope.component.elementAnswer.forEach(function (answer) {\r\n if ($scope.userTrainingUsed[answer.user_id]) {\r\n answer.trainings = answer.trainings.filter(function (training) {\r\n return $scope.userTrainingUsed[answer.user_id].indexOf(training.training_id) === -1 || training.training_id === answer.training_id;\r\n });\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n $scope.loading = false;\r\n }\r\n\r\n if ($scope.pdf && $scope.component.elementAnswer.length > 0) {\r\n $scope.loading = false;\r\n }\r\n else {\r\n $scope.component.elementAnswer = [];\r\n var promises = [];\r\n\r\n if ($scope.parameters != null && $scope.parameters.service_id != null && $scope.parameters.license_request_id != null) {\r\n promises.push(FBForms.getReimbursementRules($scope.component.form_id).then(function (reimbursement_rules) {\r\n\r\n return Users.getServiceUsersForReimbursement($scope.parameters.service_id).then(function (serviceUsers) {\r\n // Only get users where their issue date & service start date meets the rules specified in the form-builder-component\r\n $scope.service_users = serviceUsers.filter(function (user) {\r\n var certTimezoneOffset = (user.primary_cert_initial_issue_date) ? user.primary_cert_initial_issue_date.getTimezoneOffset() * 60000 : null; // getTimezoneOffset() returns in minutes\r\n var serviceTimezoneOffset = (user.service_user_start_date) ? user.service_user_start_date.getTimezoneOffset() * 60000 : null;\r\n var ruleTime = calculateReimbursementRuleTime(reimbursement_rules, certTimezoneOffset, serviceTimezoneOffset);\r\n\r\n var certLengthPass = (ruleTime.certification_rule_time === null || user.primary_cert_initial_issue_date === null) ? true : user.primary_cert_initial_issue_date <= ruleTime.certification_rule_time;\r\n var serviceLengthPass = (ruleTime.service_rule_time === null || user.service_user_start_date === null) ? true : user.service_user_start_date <= ruleTime.service_rule_time;\r\n\r\n return certLengthPass && serviceLengthPass;\r\n });\r\n });\r\n }));\r\n promises.push(ServiceUserTrainings.get({ license_request_id: $scope.parameters.license_request_id }).then(function (serviceUserTrainings) {\r\n if (serviceUserTrainings != null) {\r\n serviceUserTrainings.forEach(function (sut) {\r\n if (sut.service_id == $scope.parameters.service_id && sut.user_id != null) {\r\n if (!$scope.serviceUserTrainings[sut.user_id]) $scope.serviceUserTrainings[sut.user_id] = []\r\n $scope.serviceUserTrainings[sut.user_id].push(sut);\r\n }\r\n });\r\n }\r\n }));\r\n }\r\n\r\n $q.all(promises).then(function() {\r\n $scope.setUpAnswers();\r\n $scope.loading = false;\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n }\r\n\r\n $scope.trainingSelected = function (answer, oldAnswer, index) {\r\n if (answer.training == null) {\r\n removeTraingingFromDict(answer, oldAnswer, index); // remove training from the 'used' training list\r\n answer.training_id = null;\r\n answer.training_completed_on = null;\r\n answer.training_pass_fail = null;\r\n answer.reimburse_date = null;\r\n answer.reimburse_amount = null;\r\n answer.course_name = null;\r\n }\r\n else {\r\n answer.training_id = answer.training.training_id;\r\n answer.training_completed_on = answer.training.completed_on;\r\n answer.training_pass_fail = answer.training.training_attendee_status_name;\r\n answer.course_name = answer.training.nameandnumber;\r\n if (answer.reimburse_date == null) {\r\n answer.reimburse_date = new Date();\r\n answer.refresh = true;\r\n }\r\n addTraingingToDict(answer, oldAnswer, index);\r\n }\r\n };\r\n\r\n $scope.userSelected = function (answer, oldAnswer, index) {\r\n // Delete User\r\n if (answer.user == null) {\r\n removeTraingingFromDict(answer, oldAnswer, index);\r\n answer.user_id = null;\r\n answer.reimburse = false;\r\n answer.training = null;\r\n answer.training_id = null;\r\n answer.training_completed_on = null;\r\n answer.training_pass_fail = null;\r\n answer.reimburse_date = null;\r\n answer.reimburse_amount = null;\r\n answer.course_name = null;\r\n $scope.component.elementAnswer.splice(index, 1);\r\n }\r\n // Add user\r\n else {\r\n // User was updated & we need to update the dictionary of used Courses\r\n if (answer.user_id !== answer.user.id) { removeTraingingFromDict(answer, oldAnswer, index); }\r\n answer.reimburse = true;\r\n answer.user_id = answer.user.id;\r\n answer.name_and_number = answer.user.name_and_number;\r\n\r\n // Ensure Values are null (especially for user switch)\r\n answer.training = null;\r\n answer.training_id = null;\r\n answer.training_completed_on = null;\r\n answer.training_pass_fail = null;\r\n answer.reimburse_date = null;\r\n answer.reimburse_amount = null;\r\n answer.course_name = null;\r\n\r\n TrainingUsers.getTrainingsForReimbursement({ user_id: answer.user_id, license_request_id: $scope.parameters.license_request_id }).then(function (trainings) {\r\n answer.trainings = trainings.filter(function (training) {\r\n return !$scope.userTrainingUsed[answer.user_id].includes(training.training_id);\r\n });\r\n });\r\n\r\n // Add subsequent row\r\n if ($scope.component.elementAnswer[$scope.component.elementAnswer.length - 1].user_id) {\r\n $scope.component.elementAnswer.push({\r\n service_id: $scope.parameters.service_id,\r\n license_request_id: $scope.parameters.license_request_id\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.calculateTotalReimbursementAmount = function () {\r\n var reimbursementAmount = 0;\r\n $scope.component.elementAnswer.forEach(function (answer) {\r\n if (answer.reimburse_amount != null) {\r\n reimbursementAmount += answer.reimburse_amount;\r\n }\r\n });\r\n return reimbursementAmount;\r\n }\r\n\r\n // Used to remove a Course from the Dictionary\r\n function removeTraingingFromDict(answer, oldAnswer, index) {\r\n const userId = (oldAnswer && oldAnswer.user_id) ? oldAnswer.user_id : answer.user_id;\r\n\r\n if (oldAnswer && oldAnswer.training_id !== null) {\r\n const usedTrainingIndex = $scope.userTrainingUsed[userId].indexOf(oldAnswer.training_id);\r\n $scope.userTrainingUsed[userId].splice(usedTrainingIndex, 1);\r\n\r\n var iter = 0;\r\n // To ensure this loop needs to be ran to sort other reimbursements for a matching user (>2 since 1 row is always empty)\r\n if ($scope.component.elementAnswer.length > 2) {\r\n $scope.component.elementAnswer.forEach(function (element) {\r\n // Don't edit the reminbursement we have edited\r\n if (element.user_id === userId && iter !== index) {\r\n element.trainings.push(oldAnswer);\r\n\r\n // order list\r\n element.trainings.sort(function (a, b) {\r\n if (a.name.toLowerCase() < b.name.toLowerCase()) { return -1; }\r\n if (a.name.toLowerCase() > b.name.toLowerCase()) { return 1; }\r\n return 0;\r\n });\r\n }\r\n iter++;\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Used to add a Course to the Dictionary to keep track of used Courses\r\n function addTraingingToDict(answer, oldAnswer, index) {\r\n const userId = answer.user_id;\r\n const trainingId = answer.training.training_id;\r\n $scope.userTrainingUsed[userId].push(trainingId);\r\n\r\n var iter = 0;\r\n $scope.component.elementAnswer.forEach(function (element) {\r\n // Don't edit the reminbursement we have edited\r\n if (element.user_id === userId && iter !== index) {\r\n // Find Course to remove from training lists\r\n var removeIndex = -1;\r\n for (var i = 0; i < element.trainings.length; i++) {\r\n if (element.trainings[i].training_id === trainingId) {\r\n removeIndex = i;\r\n break;\r\n }\r\n }\r\n if(removeIndex !== -1) element.trainings.splice(removeIndex, 1);\r\n\r\n // If course selection was switched from one to another, add course back to training lists\r\n if (oldAnswer && !element.trainings.includes(oldAnswer)) {\r\n element.trainings.push(oldAnswer);\r\n element.trainings.sort(function (a, b) {\r\n if (a.name.toLowerCase() < b.name.toLowerCase()) { return -1; }\r\n if (a.name.toLowerCase() > b.name.toLowerCase()) { return 1; }\r\n return 0;\r\n });\r\n }\r\n }\r\n iter++;\r\n });\r\n }\r\n\r\n // Calculates Dates for Primary Certification Issue Date & Service User Created On Reimbursement Rules.\r\n // Using user's timezone offset so times can match when dates are compared (user's dates are timezone adjusted from server-side).\r\n function calculateReimbursementRuleTime(reimbursement_rules, certOffset, serviceOffset) {\r\n var certRuleTime = new Date();\r\n var serviceRuleTime = new Date();\r\n var timezoneOffset = (certOffset !== null) ? certOffset : certRuleTime.getTimezoneOffset() * 60000;\r\n // User Primary Cert\r\n certRuleTime.setHours(0, 0, 0, 0);\r\n certRuleTime = setRuleDate(certRuleTime, reimbursement_rules.reimbursement_certification_length, reimbursement_rules.reimbursement_certification_length_type);\r\n certRuleTime = (certRuleTime !== null) ? new Date(certRuleTime.getTime() - timezoneOffset) : null;\r\n\r\n // Service Primary Cert\r\n timezoneOffset = (serviceOffset !== null) ? serviceOffset : serviceRuleTime.getTimezoneOffset() * 60000;\r\n serviceRuleTime.setHours(0, 0, 0, 0);\r\n serviceRuleTime = setRuleDate(serviceRuleTime, reimbursement_rules.reimbursement_service_length, reimbursement_rules.reimbursement_service_length_type);\r\n serviceRuleTime = (serviceRuleTime !== null) ? new Date(serviceRuleTime.getTime() - timezoneOffset) : null;\r\n\r\n return { certification_rule_time: certRuleTime, service_rule_time: serviceRuleTime };\r\n }\r\n\r\n // Sets the date based on the rules\r\n function setRuleDate(ruleTime, length, type) {\r\n if (length === null) { length = 0; }\r\n switch (type) {\r\n case 'Day':\r\n ruleTime.setDate(ruleTime.getDate() - length);\r\n return ruleTime;\r\n case 'Week':\r\n ruleTime.setDate(ruleTime.getDate() - (length * 7));\r\n return ruleTime;\r\n case 'Month':\r\n ruleTime.setMonth(ruleTime.getMonth() - length);\r\n return ruleTime;\r\n case 'Year':\r\n ruleTime.setFullYear(ruleTime.getFullYear() - length);\r\n return ruleTime;\r\n default:\r\n return null;\r\n }\r\n }\r\n }])\r\n .directive('hlpServiceTrainingReimbursement', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/service-training-reimbursement/service-training-reimbursement.html',\r\n replace: true,\r\n controller: 'hlpServiceTrainingReimbursementController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?',\r\n pdf: '=?',\r\n completed: '@'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpSignature\", [\r\n \"$http\",\r\n \"$q\",\r\n \"$rootScope\",\r\n \"$stateParams\",\r\n \"Account\",\r\n \"FBResponses\",\r\n \"Format\",\r\n function(\r\n $http,\r\n $q,\r\n $rootScope,\r\n $stateParams,\r\n Account,\r\n FBResponses,\r\n Format\r\n ) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n ngModel: \"=\",\r\n question: \"=?\",\r\n\r\n //attributes\r\n name: \"@?\",\r\n id: \"@?\",\r\n classes: \"@?\",\r\n type: \"@?\",\r\n\r\n //disabled\r\n isDisabled: \"=?\",\r\n\r\n //required\r\n isRequired: \"=?\",\r\n showRequired: \"=?\",\r\n requiredText: \"@?\",\r\n\r\n //label\r\n showLabel: \"@?\",\r\n topLabel: \"=?\",\r\n label: \"@?\",\r\n title: \"@?\",\r\n\r\n //instructions\r\n instructions: \"@?\",\r\n showColon: \"=?\",\r\n\r\n pdf: \"=?\"\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: \"templates/signature/signature.html\",\r\n link: function(scope, elem, attrs, ctrl) {\r\n //attributes\r\n if (!attrs.name) {\r\n attrs.name = \"input\";\r\n }\r\n if (!attrs.id) {\r\n attrs.id = attrs.name;\r\n }\r\n if (!attrs.type) {\r\n attrs.type = \"password\";\r\n }\r\n\r\n //label\r\n if (!attrs.label) {\r\n attrs.label = Format.label(attrs.name);\r\n }\r\n if (!attrs.showLabel) {\r\n attrs.showLabel = attrs.label.length > 0;\r\n } else {\r\n if (attrs.showLabel == \"true\") {\r\n attrs.showLabel = true;\r\n } else {\r\n attrs.showLabel = false;\r\n }\r\n }\r\n if (!attrs.title) {\r\n attrs.title = attrs.label;\r\n }\r\n if (!attrs.topLabel) {\r\n attrs.topLabel = false;\r\n } else {\r\n if (attrs.topLabel == true || attrs.topLabel == \"true\") {\r\n attrs.topLabel = true;\r\n } else {\r\n attrs.topLabel = false;\r\n }\r\n }\r\n if (!attrs.showColon) {\r\n attrs.showColon = true;\r\n } else {\r\n if (attrs.showColon == true || attrs.showColon == \"true\") {\r\n attrs.showColon = true;\r\n } else {\r\n attrs.showColon = false;\r\n }\r\n }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.requiredText) {\r\n scope.requiredText = \"Please enter your password\";\r\n }\r\n\r\n scope.$evalAsync(function() {\r\n scope.innerForm.innerForm.pass.$asyncValidators.invalid = function(\r\n modelValue,\r\n viewValue\r\n ) {\r\n var d = $q.defer();\r\n if (\r\n scope.type == \"password\" &&\r\n (typeof modelValue !== \"undefined\" ||\r\n typeof viewValue !== \"undefined\")\r\n ) {\r\n $http\r\n .post(apiLocation + \"/api/account/validate\", {\r\n password: modelValue || viewValue,\r\n user_name: $rootScope.userAccount.user_name,\r\n responseID: $stateParams.responseID\r\n })\r\n .then(function(response) {\r\n // since this is an asyncronous function, there's a chance the promises will resolve in a different order. Only the one that matches the actual value of pass counts\r\n if (response.data && response.data.valid) {\r\n scope.ngModel.user_id =\r\n $rootScope.userAccount.id;\r\n scope.ngModel.date = new Date();\r\n scope.ngModel.user_name =\r\n $rootScope.userAccount.user_name;\r\n scope.ngModel.first_name =\r\n $rootScope.userAccount.first_name;\r\n scope.ngModel.last_name =\r\n $rootScope.userAccount.last_name;\r\n scope.ngModel.display_name = $rootScope.userAccount.first_name + ' ' + $rootScope.userAccount.last_name;\r\n scope.question.answer.invalid = false;\r\n } else if (\r\n typeof scope.ngModel.pass !==\r\n \"undefined\"\r\n ) {\r\n // for some reason not required is sending an undefined password a second time around, so skip if password is undefined\r\n scope.ngModel.user_id = null;\r\n scope.ngModel.date = null;\r\n scope.ngModel.user_name = null;\r\n scope.question.answer.invalid = true;\r\n }\r\n return scope.question.answer.invalid ? d.reject(false) : d.resolve(true);\r\n })\r\n .catch(function(response) {\r\n d.reject(response.data);\r\n });\r\n } else {\r\n // placeholder\r\n return $q.when();\r\n }\r\n\r\n return d.promise;\r\n };\r\n });\r\n },\r\n controller: [\r\n \"$http\",\r\n \"$scope\",\r\n \"$rootScope\",\r\n \"$modal\",\r\n \"$window\",\r\n \"Authentication\",\r\n \"Account\",\r\n \"FBResponses\",\r\n \"$timeout\",\r\n \"$stateParams\",\r\n function(\r\n $http,\r\n $scope,\r\n $rootScope,\r\n $modal,\r\n $window,\r\n Authentication,\r\n Account,\r\n FBResponses,\r\n $timeout,\r\n $stateParams\r\n ) {\r\n $scope.submitted = false;\r\n if (typeof $scope.ngModel == \"undefined\") {\r\n $scope.ngModel = {};\r\n }\r\n $scope.showUsername =\r\n typeof $scope.ngModel.user_name !== \"undefined\" &&\r\n $scope.ngModel.user_name !== null\r\n ? $scope.ngModel.user_name\r\n : $rootScope.userAccount.user_name;\r\n\r\n $scope.validate = function() {\r\n // $scope.submitted = false;\r\n if ($scope.type == \"password\") {\r\n if ($scope.ngModel.user_id) {\r\n // successfully signed once\r\n if (\r\n $scope.isRequired &&\r\n $scope.innerForm.innerForm.pass\r\n .$viewValue === \"\" &&\r\n $scope.innerForm.innerForm.pass.$dirty\r\n ) {\r\n // they cleared it out\r\n $scope.question.answer.invalid = true;\r\n $scope.innerForm.innerForm.pass.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n $scope.ngModel.user_id = null;\r\n $scope.ngModel.date = null;\r\n $scope.ngModel.user_name = null;\r\n } else {\r\n $scope.question.answer.invalid = false;\r\n $scope.innerForm.innerForm.pass.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n } else if (!$scope.isRequired) {\r\n // all values are wiped out anyway so we are just going to let them pass\r\n $scope.question.answer.invalid = false;\r\n $scope.innerForm.innerForm.pass.$setValidity(\r\n \"invalid\",\r\n true\r\n );\r\n } else {\r\n $scope.question.answer.invalid = true;\r\n }\r\n }\r\n };\r\n var timer = $timeout($scope.validate(), 0);\r\n\r\n var cleanupSubmitHandler = $scope.$on(\r\n \"form:submit\",\r\n function() {\r\n $scope.validate();\r\n $scope.submitted = true;\r\n }\r\n );\r\n\r\n $scope.$on(\"$destroy\", function() {\r\n $timeout.cancel(timer);\r\n cleanupSubmitHandler();\r\n });\r\n }\r\n ]\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpSlushbox', ['$rootScope', '$templateCache', '$timeout', function ($rootScope, $templateCache, $timeout) {\r\n var directiveScope = angular.extend({}, $rootScope.formFieldScope, {\r\n ngModel: '=?',\r\n question: '=?',\r\n showValue: '=?',\r\n onChange: '&?',\r\n options: '=?',\r\n parameters: '=?'\r\n });\r\n return {\r\n scope: directiveScope,\r\n require: 'ngModel',\r\n transclude: true,\r\n template: function () {\r\n return $templateCache.get('templates/slush-box/slush-box.html');\r\n },\r\n controller: ['$filter', '$scope', '$timeout', function ($filter, $scope, $timeout) {\r\n $scope.add = function (added) {\r\n if ($scope.ngModel == null) {\r\n $scope.ngModel = [];\r\n }\r\n\r\n if (added != null) {\r\n added.forEach(function (add) {\r\n add.sort_order = $scope.ngModel.length + 1;\r\n if ($scope.compareValue != $scope.arrayValue) {\r\n add[$scope.compareValue] = add[$scope.arrayValue];\r\n }\r\n if ($scope.availableShow != $scope.selectShow) {\r\n add[$scope.selectShow] = add[$scope.availableShow];\r\n }\r\n $scope.ngModel.push(add);\r\n })\r\n }\r\n\r\n $scope.ngChange();\r\n }\r\n\r\n $scope.addAll = function () {\r\n if ($scope.ngModel == null) {\r\n $scope.ngModel = [];\r\n }\r\n\r\n $filter('filter')($scope.dirOptions, $scope.filterFn).forEach(function (add) {\r\n add.sort_order = $scope.ngModel.length + 1;\r\n if ($scope.compareValue != $scope.arrayValue) {\r\n add[$scope.compareValue] = add[$scope.arrayValue];\r\n }\r\n if ($scope.availableShow != $scope.selectShow) {\r\n add[$scope.selectShow] = add[$scope.availableShow];\r\n }\r\n $scope.ngModel.push(add);\r\n })\r\n\r\n $scope.ngChange();\r\n }\r\n\r\n $scope.remove = function (removed) {\r\n if ($scope.ngModel == null) {\r\n $scope.ngModel = [];\r\n }\r\n\r\n if (removed != null) {\r\n removed.forEach(function (remove) {\r\n removeByAttr($scope.ngModel, $scope.compareValue, remove[$scope.compareValue]);\r\n })\r\n }\r\n\r\n $scope.ngModel.sort(sortObjectArray('sort_order')).forEach(function (item, index) {\r\n item.sort_order = index + 1;\r\n })\r\n\r\n $scope.ngChange();\r\n }\r\n\r\n $scope.removeAll = function () {\r\n $scope.ngModel = [];\r\n $scope.ngChange();\r\n }\r\n\r\n $scope.up = function (up) {\r\n $scope.ngModel.sort(sortObjectArray('sort_order')).forEach(function (item) {\r\n up.sort(sortObjectArray('sort_order')).forEach(function (upitem) {\r\n if (upitem.sort_order - item.sort_order == 1) {\r\n item.sort_order++;\r\n upitem.sort_order--;\r\n }\r\n })\r\n })\r\n $scope.ngModel.sort(sortObjectArray('sort_order'))\r\n $scope.ngChange();\r\n }\r\n\r\n $scope.down = function (down) {\r\n $scope.ngModel.sort(sortObjectArray('sort_order')).reverse().forEach(function (item) {\r\n down.sort(sortObjectArray('sort_order')).forEach(function (downitem) {\r\n if (item.sort_order - downitem.sort_order == 1) {\r\n item.sort_order--;\r\n downitem.sort_order++;\r\n }\r\n })\r\n })\r\n $scope.ngModel.sort(sortObjectArray('sort_order'))\r\n $scope.ngChange();\r\n }\r\n\r\n $scope.validate = function () {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.slushbox.$error);\r\n }\r\n }\r\n }\r\n\r\n var validationTimeout = $timeout($scope.validate(), 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n compile: function(elem, attrs){\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n\r\n scope.directiveAttributes = attrs;\r\n\r\n if (!scope.directiveAttributes.selectShow) { scope.selectShow = 'name'; }\r\n if (!scope.directiveAttributes.selectSort) { scope.selectSort = 'sort_order'; }\r\n if (!scope.directiveAttributes.selectValue) { scope.selectValue = 'id'; }\r\n if (!scope.directiveAttributes.availableShow) { scope.availableShow = 'name'; }\r\n if (!scope.directiveAttributes.availableSort) { scope.availableSort = 'name'; }\r\n if (!scope.directiveAttributes.compareValue) { scope.compareValue = 'id'; }\r\n if (!scope.directiveAttributes.arrayValue) { scope.arrayValue = 'id'; }\r\n\r\n scope.selectedOptionClause = \"getDescendantProp(opt,selectShow) for opt in ngModel | orderBy:selectSort\";\r\n scope.availableOptionClause = \"getDescendantProp(opt,availableShow) for opt in dirOptions | filter:filterFn | orderBy:availableSort\";\r\n },\r\n post: function (scope, elem, attrs, ngModel) {\r\n scope.timeouts = [];\r\n\r\n scope.setShowValue = function () {\r\n if (ngModel.$modelValue != null && angular.isArray(ngModel.$modelValue)) {\r\n scope.showValue = null;\r\n ngModel.$modelValue.forEach(function (opt) {\r\n if (scope.showValue == null) {\r\n scope.showValue = scope.getDescendantProp(opt, scope.selectShow);\r\n }\r\n else {\r\n scope.showValue += ', ' + scope.getDescendantProp(opt, scope.selectShow);\r\n }\r\n })\r\n }\r\n }\r\n\r\n var needToChangeToString = false;\r\n\r\n scope.$watch('optionsLoaded', function (optionsLoaded) {\r\n if (optionsLoaded) {\r\n if (needToChangeToString && angular.isString(ngModel.$modelValue)) {\r\n var newModel = [];\r\n if (scope.dirOptions != null && angular.isArray(scope.dirOptions)) {\r\n ngModel.$modelValue.split(',').forEach(function (item, index) {\r\n scope.dirOptions.forEach(function (element) {\r\n if (element.id.toString().toLowerCase() == item.toLowerCase()) {\r\n newModel.push(element);\r\n }\r\n })\r\n });\r\n }\r\n ngModel.$setViewValue(newModel);\r\n\r\n if (scope.showValue == null) {\r\n scope.setShowValue();\r\n }\r\n\r\n if (scope.sortable) {\r\n ngModel.$modelValue.forEach(function (item, index) {\r\n item.sort_order = index + 1;\r\n });\r\n\r\n scope.ngChange();\r\n }\r\n }\r\n else if (scope.showValue == null) {\r\n scope.setShowValue();\r\n }\r\n if (scope.isRequired && (scope.innerForm !== undefined)) {\r\n if (ngModel.$modelValue == null || ngModel.$modelValue.length == 0) {\r\n scope.innerForm.slushbox.$setValidity(\"required\", false);\r\n } else {\r\n scope.innerForm.slushbox.$setValidity(\"required\", true);\r\n }\r\n }\r\n\r\n // Set titles for the options\r\n scope.timeouts.push($timeout(function () {\r\n\r\n // potential source of memory leak?\r\n var domOptions = document.getElementById(scope.name + \"_available\").options;\r\n for (var i = 0; i < domOptions.length; i++) {\r\n var label = domOptions[i].text;\r\n domOptions[i].setAttribute('title', label);\r\n }\r\n }, 0));\r\n }\r\n });\r\n\r\n ngModel.$render = function () {\r\n if (ngModel.$modelValue != null) {\r\n if (angular.isString(ngModel.$modelValue)) {\r\n if (scope.optionsLoaded) {\r\n // convert array of id's to array of objects with id and name\r\n var newModel = [];\r\n if (scope.dirOptions != null && angular.isArray(scope.dirOptions)) {\r\n ngModel.$modelValue.split(',').forEach(function (item, index) {\r\n scope.dirOptions.forEach(function(element){\r\n if(element.id.toString().toLowerCase() == item.toLowerCase()) {\r\n newModel.push(element);\r\n }\r\n }) \r\n });\r\n }\r\n ngModel.$setViewValue(newModel);\r\n }\r\n else {\r\n needToChangeToString = true;\r\n }\r\n }\r\n\r\n if (angular.isArray(ngModel.$modelValue)) {\r\n if (scope.showValue == null) {\r\n scope.setShowValue();\r\n }\r\n \r\n if (scope.sortable) {\r\n ngModel.$modelValue.forEach(function (item, index) {\r\n item.sort_order = index + 1;\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n scope.ngChange = function () {\r\n scope.submitted = false;\r\n scope.processingChange = true;\r\n scope.setShowValue();\r\n scope.timeouts.push($timeout(function () {\r\n if (scope.isRequired) {\r\n if (ngModel.$modelValue == null || ngModel.$modelValue.length == 0) {\r\n scope.innerForm.slushbox.$setValidity(\"required\", false);\r\n }\r\n else {\r\n scope.innerForm.slushbox.$setValidity(\"required\", true);\r\n }\r\n }\r\n if (scope.onChange != null) {\r\n scope.onChange();\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.slushbox.$error);\r\n }\r\n scope.processingChange = false;\r\n }, 0));\r\n }\r\n\r\n scope.filterFn = function (record) {\r\n var filter = true;\r\n\r\n if (ngModel.$modelValue != null && angular.isArray(ngModel.$modelValue)) {\r\n ngModel.$modelValue.forEach(function (opt) {\r\n if (opt != null && record[scope.arrayValue] == opt[scope.compareValue]) {\r\n filter = false;\r\n }\r\n });\r\n }\r\n\r\n return filter;\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpSsnController', ['$scope', '$timeout', 'Format', 'Validation', 'Logger', function ($scope, $timeout, Format, Validation, Logger) {\r\n\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) { $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || $scope.name)) }\r\n\r\n if ($scope.vm.showSSN && $scope.recordId && !($scope.ngModel == null || $scope.ngModel == '')) {\r\n Logger.logAccess($scope.recordId, \"Social Security Number\");\r\n }\r\n\r\n $scope.validate = function() {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.ssn.$error);\r\n }\r\n if ($scope.validation) {\r\n Validation.validateQuestion($scope.innerForm.ssn, $scope.validation, $scope.ngModel).then(function (result) {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !result || !isEmpty($scope.innerForm.ssn.$error) || !isEmpty($scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.isRequired && ($scope.ngModel == null || $scope.ngModel == '') && !$scope.innerForm.ssn.$error.phone) {\r\n $scope.innerForm.ssn.$setValidity(\"required\", false);\r\n }\r\n else {\r\n $scope.innerForm.ssn.$setValidity(\"required\", true);\r\n }\r\n $scope.validate();\r\n }\r\n }, 0);\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n\r\n var isNumeric = function (n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n \r\n $scope.setSsn = function (boxone, boxtwo, boxthree) {\r\n $scope.innerForm.ssn.$setDirty();\r\n\r\n if (isUndefined(boxone) || isUndefined(boxtwo) || isUndefined(boxthree)) {\r\n $scope.ngModel = '';\r\n if (isUndefined(boxone) && isUndefined(boxtwo) && isUndefined(boxthree)) {\r\n $scope.innerForm.ssn.$setValidity(\"ssn\", true);\r\n }\r\n else {\r\n $scope.innerForm.ssn.$setValidity(\"ssn\", false);\r\n }\r\n if (!isUndefined(boxone) && boxone.length == 3 && isUndefined(boxtwo)) {\r\n $scope.$broadcast('focustwo');\r\n }\r\n if (!isUndefined(boxtwo) && boxtwo.length == 2 && isUndefined(boxthree)) {\r\n $scope.$broadcast('focusthree');\r\n }\r\n }\r\n else {\r\n if (boxone.length == 3 && (isNumeric(boxone) || boxone == \"\\u2022\\u2022\\u2022\") && boxtwo.length == 2 && (isNumeric(boxtwo) || boxtwo == \"\\u2022\\u2022\") && boxthree.length == 4 && isNumeric(boxthree)) {\r\n $scope.ngModel = boxone + \"-\" + boxtwo + \"-\" + boxthree;\r\n $scope.innerForm.ssn.$setValidity(\"ssn\", true);\r\n }\r\n else {\r\n $scope.ngModel = '';\r\n $scope.innerForm.ssn.$setValidity(\"ssn\", false);\r\n }\r\n }\r\n\r\n if ($scope.isRequired && ($scope.ngModel == null || $scope.ngModel == '') && !$scope.innerForm.ssn.$error.ssn) {\r\n $scope.innerForm.ssn.$setValidity(\"required\", false);\r\n }\r\n else {\r\n $scope.innerForm.ssn.$setValidity(\"required\", true);\r\n }\r\n\r\n $scope.onChange($scope.ngModel);\r\n }\r\n\r\n $scope.getSectionType = function (boxNumber) {\r\n var result = \"password\";\r\n // security is the ssn_settings value. 0 = masked, 1 = last 4 shown, 2 = all shown\r\n switch(boxNumber) {\r\n case 1:\r\n result = ($scope.security == 2 || $scope.vm.showSSN) ? \"text\" : \"password\";\r\n break;\r\n case 2:\r\n result = ($scope.security == 2 || $scope.vm.showSSN) ? \"text\" : \"password\";\r\n break;\r\n case 3:\r\n result = ($scope.security >= 1 || $scope.vm.showSSN) ? \"text\" : \"password\";\r\n break;\r\n }\r\n return result;\r\n }\r\n\r\n $scope.setFields = function (value) {\r\n var valueList = value.split('-');\r\n if (value != undefined && value.split('-').length == 3) {\r\n $scope.vm.boxone = valueList[0];\r\n $scope.vm.boxtwo = valueList[1];\r\n $scope.vm.boxthree = valueList[2];\r\n }\r\n else if (value != undefined && value.indexOf(\"-\") < 0 && value.length == 9) {\r\n $scope.vm.boxone = value.substring(0,3);\r\n $scope.vm.boxtwo = value.substring(3, 5);\r\n $scope.vm.boxthree = value.substring(5, 9);\r\n }\r\n };\r\n\r\n $scope.$watch('ngModel', function (ngModel) {\r\n if (!isUndefined(ngModel) && isUndefined($scope.vm.boxone) && isUndefined($scope.vm.boxtwo) && isUndefined($scope.vm.boxthree)) {\r\n $scope.setFields(ngModel);\r\n }\r\n });\r\n }])\r\n .directive('hlpSsn', ['Format', '$timeout', 'Validation', 'Logger', function (Format, $timeout, Validation, Logger) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n name: '@',\r\n id: '@?',\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n isDisabled: '=?',\r\n change: '&?',\r\n ngModel: '=',\r\n question: '=?',\r\n recordId: '=?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n instructions: '@?',\r\n classes: '@?',\r\n security: '@?',\r\n pdf: '=?',\r\n validation: '=?',\r\n isGenerated: '=?'\r\n },\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/ssn/ssn.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n scope.timeouts = [];\r\n\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.security) { attrs.security = 0 }\r\n scope.vm = {};\r\n scope.vm.showSSN = scope.security == 2;\r\n scope.vm.boxone = \"\";\r\n scope.vm.boxtwo = \"\";\r\n scope.vm.boxthree = \"\";\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.ssn.$error);\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.ssn, scope.validation, scope.ngModel).then(function (result) {\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !result || !isEmpty(scope.innerForm.ssn.$error) || !isEmpty(scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n }\r\n scope.log = function () {\r\n if (scope.vm.showSSN && scope.recordId && !(scope.ngModel == null || scope.ngModel == '')) {\r\n Logger.logAccess(scope.recordId, \"Social Security Number\");\r\n }\r\n }\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n },\r\n controller: 'hlpSsnController'\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpSubmit', ['Format', 'Permissions', '$rootScope', function (Format, Permissions, $rootScope) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n id: '@?',\r\n label: '@?',\r\n title: '@?',\r\n classes: '@?',\r\n //submitting: '=?',\r\n loading: '=?',\r\n loadingText: '@?',\r\n permission: '@?',\r\n permissionState: '@?',\r\n filterFound: '=?'\r\n },\r\n replace: true,\r\n require: '^hlpButtonGroup',\r\n templateUrl: 'templates/submit/submit.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n if (!attrs.id) { attrs.id = 'submit'; }\r\n if (!attrs.label) { attrs.label = 'Save'; }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.classes) { attrs.classes = 'save'; }\r\n if (!attrs.loadingText) { if (attrs.loading) { attrs.loadingText = Format.label(attrs.loading) } else { attrs.loadingText = 'Saving'; } }\r\n if (!attrs.permissionState && $rootScope.$state != null && $rootScope.$state.current != null) { attrs.permissionState = $rootScope.$state.current.name; }\r\n // Used to disable submit on Public Lookup, don't disable if the value isn't passed in (submit used elsewhere)\r\n if (scope.filterFound === undefined) { scope.filterFound = true; }\r\n\r\n if (attrs.permission != null && attrs.permissionState != null) {\r\n Permissions[attrs.permission](attrs.permissionState).then(function (access) {\r\n scope.hasPermission = access;\r\n })\r\n }\r\n else {\r\n scope.hasPermission = true;\r\n }\r\n\r\n scope.$watch('loading', function (loading) {\r\n if (loading != null) {\r\n ctrl.setLoader(loading, scope.classes, scope.loadingText);\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off(); // deregister all event handlers\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpEducationReportController', ['$scope', '$rootScope', '$modal', 'Levels', '$window', 'Trainings',\r\n function ($scope, $rootScope, $modal, Levels, $window, Trainings) {\r\n $scope.expanded = true;\r\n $scope.expandedCourse = true;\r\n $scope.currentTopic = null;\r\n $scope.zero = \"0.00\";\r\n $scope.levelsLoading = false;\r\n\r\n var certificationLevel = \"\";\r\n var applicationType = \"\";\r\n for (var answer in $scope.datapointAnswers) {\r\n if (answer == \"certification_levels\" || $scope.datapointAnswers[answer][0].data_point_code == \"certification_levels\") {\r\n certificationLevel = \"datapointAnswers['\" + answer + \"']\";\r\n }\r\n else if (answer == \"certification_application_type\" || $scope.datapointAnswers[answer][0].data_point_code == \"certification_application_type\") {\r\n applicationType = \"datapointAnswers['\" + answer + \"']\";\r\n }\r\n }\r\n $scope.$watch(applicationType, function (type) {\r\n if (type != null) {\r\n $scope.application_type = type[0].value;\r\n\r\n if ($scope.certification_levels != null) {\r\n $scope.levelsLoading = true;\r\n var cl = $scope.certification_levels;\r\n Levels.get({ certification_levels: $scope.certification_levels, application_type: $scope.application_type }).then(function (levels) {\r\n if (cl == $scope.certification_levels) {\r\n $scope.trainingLevels = levels;\r\n if (!$scope.trainingsLoading) {\r\n $scope.calculateLevels();\r\n }\r\n }\r\n $scope.levelsLoading = false;\r\n })\r\n }\r\n else {\r\n $scope.trainingLevels = [];\r\n }\r\n }\r\n }, true)\r\n\r\n $scope.$watch(certificationLevel, function (levels) {\r\n\r\n if (levels != null) {\r\n $scope.certification_levels = null;\r\n levels.forEach(function (answer) {\r\n\r\n if (answer.value != null && angular.isString(answer.value) && answer.value != '') {\r\n answer.value.split(',').forEach(function (level) {\r\n\r\n if ($scope.certification_levels == null) {\r\n $scope.certification_levels = level;\r\n }\r\n else {\r\n $scope.certification_levels += ',' + level;\r\n }\r\n })\r\n }\r\n else if (answer.value != null && angular.isArray(answer.value)) {\r\n answer.value.forEach(function (level) {\r\n if (level != null) {\r\n var l = null;\r\n if (angular.isObject(level)) {\r\n l = level.id;\r\n }\r\n else {\r\n l = level;\r\n }\r\n\r\n if (l != null) {\r\n if ($scope.certification_levels == null) {\r\n $scope.certification_levels = l;\r\n }\r\n else {\r\n $scope.certification_levels += ',' + l;\r\n }\r\n }\r\n }\r\n })\r\n }\r\n })\r\n\r\n if ($scope.certification_levels != null) {\r\n $scope.userProgress = null;\r\n var cl = $scope.certification_levels;\r\n if ($scope.application_type) {\r\n $scope.levelsLoading = true;\r\n Levels.get({ certification_levels: $scope.certification_levels, application_type: $scope.application_type }).then(function (levels) {\r\n if (cl == $scope.certification_levels) {\r\n $scope.trainingLevels = levels;\r\n if (!$scope.trainingsLoading) {\r\n $scope.calculateLevels();\r\n }\r\n }\r\n $scope.levelsLoading = false;\r\n })\r\n }\r\n }\r\n else {\r\n $scope.trainingLevels = [];\r\n }\r\n }\r\n }, true)\r\n\r\n $scope.calculateLevels = function () {\r\n if ($scope.trainingLevels && $scope.trainingLevels.length > 0) {\r\n $scope.levelsLoading = true;\r\n\r\n var userID = null;\r\n if ($scope.parameters.user_id) {\r\n userID = $scope.parameters.user_id;\r\n } else {\r\n userID = $rootScope.userID;\r\n }\r\n Levels.getUserLevelProgress({ levelID: $scope.trainingLevels[0].id, userID: userID, applicationType: $scope.parameters.license_id, responseID: $scope.parameters.response_id }).then(function (userProgress) {\r\n $scope.userProgress = userProgress;\r\n\r\n //Calculate total required and completed hours\r\n var totalRequired = 0;\r\n var totalCount = 0;\r\n if (userProgress.levelRequirementSummaries) {\r\n for (var i = 0; i < userProgress.levelRequirementSummaries.length; i++) {\r\n totalRequired += userProgress.levelRequirementSummaries[i].requiredHours || 0;\r\n totalCount += userProgress.levelRequirementSummaries[i].completedHours || 0;\r\n }\r\n userProgress.levelTotalString = totalCount.toFixed(2).toString() + \" of \" + totalRequired.toFixed(2).toString();\r\n\r\n }\r\n $scope.levelsLoading = false;\r\n });\r\n }\r\n }\r\n\r\n $scope.getWidth = function (levelRequirement) {\r\n var cHours = 0;\r\n var rHours = 0;\r\n\r\n cHours = levelRequirement.completedHours || 0;\r\n rHours = levelRequirement.requiredHours || 0;\r\n\r\n var per = (cHours / rHours) * 100;\r\n if (per > 100) {\r\n per = 100;\r\n }\r\n var progressPer = \"width: \" + per.toString() + \"%\";\r\n return progressPer;\r\n }\r\n\r\n $scope.getRemainingHours = function (topic) {\r\n var required = 0;\r\n var completedHours = 0;\r\n var remainingHours = 0;\r\n\r\n required = topic.requiredHours || 0;\r\n completedHours = topic.completedHours || 0;\r\n remainingHours = required - completedHours;\r\n\r\n if (remainingHours < 0) {\r\n remainingHours = 0;\r\n }\r\n return remainingHours.toFixed(2).toString();\r\n }\r\n\r\n $scope.openDocument = function (id, code) {\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n $window.open($rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + id.toUpperCase() + '&code=' + code, '_blank');\r\n } else {\r\n $window.open($rootScope.internalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + id.toUpperCase() + '&code=' + code, '_blank');\r\n }\r\n }\r\n\r\n $scope.removeCourse = function (courseID) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n return \"Are you sure you want to remove this course?\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n if ($scope.parameters.user_id) {\r\n Trainings.removeAttendeeFromCourse(courseID, [{ userId: $scope.parameters.user_id }]).then(function (result) {\r\n $scope.calculateLevels();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.addCourse = function (topic) {\r\n\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/supplemental-training-modal/education-report-modal.html',\r\n controller: 'EducationReportModalController',\r\n size: 'lg',\r\n resolve: {\r\n topic: topic,\r\n parameters: $scope.parameters\r\n }\r\n }).result.then(function (t) {\r\n $scope.calculateLevels();\r\n })\r\n }\r\n\r\n $scope.checkCourseOptions = function (courses, option) {\r\n var checked = false;\r\n if (courses) {\r\n courses.forEach(function (course) {\r\n if (course.selectedOptions) {\r\n var selectedOptions = course.selectedOptions.split(',');\r\n selectedOptions.forEach(function (selectedOption) {\r\n if (selectedOption.trim() == option.trim()) {\r\n checked = true;\r\n }\r\n })\r\n }\r\n })\r\n }\r\n return checked;\r\n }\r\n }])\r\n .directive('hlpEducationReport', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/supplemental-training/education-report.html',\r\n replace: true,\r\n controller: 'hlpEducationReportController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?',\r\n datapointAnswers: '=?',\r\n pdf: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpSupplementalTrainingController', ['$scope', '$rootScope', '$window', '$q', '$modal', 'Levels', 'LicenseRequestSupplementalTrainingTrainings', 'Trainings', 'LicenseRequests',\r\n function ($scope, $rootScope, $window, $q, $modal, Levels, LicenseRequestSupplementalTrainingTrainings, Trainings, LicenseRequests) {\r\n\r\n $scope.trainingsLoading = true;\r\n $scope.levelsLoading = false;\r\n $scope.trainingLevels = [];\r\n $scope.certification_levels = null;\r\n $scope.application_type = null;\r\n var promises = [];\r\n\r\n if ($scope.parameters.license_request_id != null) {\r\n if ($scope.component.elementAnswer == null) {\r\n promises.push(LicenseRequestSupplementalTrainingTrainings.get($scope.parameters).then(function (supplementalTrainings) {\r\n $scope.component.elementAnswer = supplementalTrainings;\r\n }))\r\n }\r\n\r\n var completedTrainingParameters = angular.copy($scope.parameters);\r\n completedTrainingParameters.completedOnly = true;\r\n completedTrainingParameters.otherApplications = true;\r\n promises.push(Trainings.get(completedTrainingParameters).then(function (trainings) {\r\n $scope.trainings = trainings;\r\n }))\r\n\r\n promises.push(LicenseRequests.getTrainingValidationDates($scope.parameters).then(function (validationDates) {\r\n $scope.validationDates = validationDates;\r\n }))\r\n }\r\n else {\r\n $scope.component.elementAnswer = [];\r\n }\r\n\r\n $q.all(promises).then(function () {\r\n $scope.trainingsLoading = false;\r\n $scope.calculateLevels();\r\n }).catch(function (response) {\r\n // handle error\r\n });\r\n\r\n $scope.$watch(\"datapointAnswers['certification_application_type']\", function (type) {\r\n if (type != null) {\r\n\r\n $scope.application_type = type[0].value;\r\n\r\n if ($scope.certification_levels != null) {\r\n $scope.levelsLoading = true;\r\n var cl = $scope.certification_levels;\r\n Levels.get({ certification_levels: $scope.certification_levels, application_type: $scope.application_type }).then(function (levels) {\r\n if (cl == $scope.certification_levels) {\r\n $scope.trainingLevels = levels;\r\n if (!$scope.trainingsLoading) {\r\n $scope.calculateLevels();\r\n }\r\n }\r\n $scope.levelsLoading = false;\r\n })\r\n }\r\n else {\r\n $scope.trainingLevels = [];\r\n }\r\n }\r\n }, true)\r\n\r\n $scope.$watch(\"datapointAnswers['certification_levels']\", function (levels) {\r\n\r\n if (levels != null) {\r\n \r\n $scope.certification_levels = null;\r\n levels.forEach(function (answer) {\r\n\r\n if (answer.value != null && angular.isString(answer.value) && answer.value != '') {\r\n answer.value.split(',').forEach(function (level) {\r\n\r\n if ($scope.certification_levels == null) {\r\n $scope.certification_levels = level;\r\n }\r\n else {\r\n $scope.certification_levels += ',' + level;\r\n }\r\n })\r\n }\r\n else if (answer.value != null && angular.isArray(answer.value)) {\r\n answer.value.forEach(function (level) {\r\n if (level != null) {\r\n var l = null;\r\n if (angular.isObject(level)) {\r\n l = level.id;\r\n }\r\n else {\r\n l = level;\r\n }\r\n\r\n if (l != null) {\r\n if ($scope.certification_levels == null) {\r\n $scope.certification_levels = l;\r\n }\r\n else {\r\n $scope.certification_levels += ',' + l;\r\n }\r\n }\r\n }\r\n })\r\n }\r\n })\r\n\r\n if ($scope.certification_levels != null) {\r\n $scope.levelsLoading = true;\r\n var cl = $scope.certification_levels;\r\n\r\n Levels.get({ certification_levels: $scope.certification_levels, application_type: $scope.application_type }).then(function (levels) {\r\n if (cl == $scope.certification_levels) {\r\n $scope.trainingLevels = levels;\r\n if (!$scope.trainingsLoading) {\r\n $scope.calculateLevels();\r\n }\r\n }\r\n $scope.levelsLoading = false;\r\n })\r\n }\r\n else {\r\n $scope.trainingLevels = [];\r\n }\r\n }\r\n }, true)\r\n\r\n $scope.editTraining = function (training, add, topics) {\r\n if (topics != null && topics.length > 0) {\r\n training.training_topics = [];\r\n training.training_topics.push({ topic_id: topics[0].id, topic_name: topics[0].name, availableoptions: topics[0].availableoptions, options: null });\r\n }\r\n\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/supplemental-training-modal/supplemental-training-modal.html',\r\n controller: 'SupplementTrainingModalController',\r\n size: 'lg',\r\n resolve: {\r\n training: function () {\r\n if (training.training_topics != null) {\r\n training.training_topics.forEach(function (topic) {\r\n topic.options = [];\r\n if (topic.selected_options != null) {\r\n topic.selected_options.split(',').forEach(function (option) {\r\n topic.options.push({ id: option });\r\n })\r\n }\r\n })\r\n }\r\n\r\n return training;\r\n }\r\n }\r\n }).result.then(function (t) {\r\n if (t != null && t.training_topics != null) {\r\n t.training_topics.forEach(function (training_topic) {\r\n training_topic.selected_options = null;\r\n if (training_topic.options != null) {\r\n training_topic.options.forEach(function (option) {\r\n if (training_topic.selected_options == null) {\r\n training_topic.selected_options = option.id;\r\n }\r\n else {\r\n training_topic.selected_options += ',' + option.id;\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n if (add) {\r\n $scope.component.elementAnswer.push(t);\r\n }\r\n else {\r\n training = t;\r\n }\r\n\r\n $scope.calculateLevels();\r\n })\r\n }\r\n\r\n $scope.removeTraining = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n $scope.calculateLevels();\r\n }\r\n\r\n $scope.dateCheck = function (training) {\r\n return !($scope.validationDates == null || ($scope.validationDates.start_date == null || training.end_date >= $scope.validationDates.start_date) && ($scope.validationDates.end_date == null || training.end_date <= $scope.validationDates.end_date));\r\n }\r\n\r\n $scope.calculateLevels = function () {\r\n $scope.trainingLevels.forEach(function (level) {\r\n level.complete = true;\r\n level.override_complete = false;\r\n level.required_requirement_hours = 0;\r\n level.required_requirement_flex_hours = 0;\r\n level.completed_hours = 0;\r\n level.used_hours = 0;\r\n level.completed_flex_hours = 0;\r\n level.used_flex_hours = 0;\r\n level.used_requirement_flex_hours = 0;\r\n level.missingFlexRequirements = false;\r\n\r\n level.requirements.forEach(function (requirement) {\r\n requirement.complete = true;\r\n requirement.completed_hours = 0;\r\n requirement.used_hours = 0;\r\n requirement.required_topic_hours = 0;\r\n requirement.completed_flex_hours = 0;\r\n requirement.used_flex_hours = 0;\r\n\r\n requirement.topics.forEach(function (topic) {\r\n topic.complete = true;\r\n topic.completed_hours = 0;\r\n topic.used_hours = 0;\r\n topic.selected_options = [];\r\n\r\n $scope.component.elementAnswer.forEach(function (training) {\r\n if (($scope.validationDates.start_date == null || training.end_date >= $scope.validationDates.start_date) && ($scope.validationDates.end_date == null || training.end_date <= $scope.validationDates.end_date)) {\r\n training.training_topics.forEach(function (training_topic) {\r\n if (topic.id == training_topic.topic_id) {\r\n if (training_topic.selected_options != null) {\r\n training_topic.selected_options.split(',').forEach(function (option) {\r\n if (topic.selected_options.indexOf(option) < 0) {\r\n topic.selected_options.push(option);\r\n }\r\n })\r\n }\r\n topic.completed_hours += training_topic.completed_hours;\r\n }\r\n })\r\n }\r\n })\r\n\r\n $scope.trainings.forEach(function (training) {\r\n training.training_topics.forEach(function (training_topic) {\r\n if (topic.id == training_topic.topic_id) {\r\n if (training_topic.selected_options != null) {\r\n training_topic.selected_options.split(',').forEach(function (option) {\r\n if (topic.selected_options.indexOf(option) < 0) {\r\n topic.selected_options.push(option);\r\n }\r\n })\r\n }\r\n topic.completed_hours += training_topic.completed_hours;\r\n }\r\n })\r\n })\r\n\r\n if (topic.max_hours > 0 && topic.completed_hours > topic.max_hours) {\r\n topic.all_hours = topic.completed_hours;\r\n topic.completed_hours = topic.max_hours;\r\n }\r\n\r\n if (topic.completed_hours > topic.required_hours) {\r\n topic.used_hours = topic.required_hours;\r\n }\r\n else {\r\n topic.used_hours = topic.completed_hours;\r\n }\r\n\r\n if (topic.used_hours < topic.required_hours) {\r\n topic.complete = false;\r\n requirement.complete = false;\r\n level.complete = false;\r\n }\r\n topic.remaining_hours = topic.required_hours - topic.used_hours;\r\n if (topic.remaining_hours < 0) {\r\n topic.remaining_hours = 0;\r\n }\r\n\r\n requirement.completed_hours += topic.completed_hours;\r\n //requirement.used_hours += topic.used_hours;\r\n requirement.required_topic_hours += topic.required_hours;\r\n })\r\n\r\n if (requirement.completed_hours > requirement.required_hours) {\r\n requirement.used_hours = requirement.required_hours;\r\n }\r\n else {\r\n requirement.used_hours = requirement.completed_hours;\r\n }\r\n\r\n // determine if requirement failed\r\n if (requirement.used_hours < requirement.required_hours) {\r\n requirement.complete = false;\r\n level.complete = false;\r\n }\r\n requirement.remaining_hours = requirement.required_hours - requirement.used_hours;\r\n if (requirement.remaining_hours < 0) {\r\n requirement.remaining_hours = 0;\r\n }\r\n\r\n // calculate flex hours\r\n requirement.required_flex_hours = requirement.required_hours - requirement.required_topic_hours;\r\n if (requirement.required_flex_hours < 0) {\r\n requirement.required_flex_hours = 0;\r\n }\r\n requirement.completed_flex_hours = requirement.completed_hours - requirement.required_topic_hours;\r\n if (requirement.completed_flex_hours < 0) {\r\n requirement.completed_flex_hours = 0;\r\n }\r\n if (requirement.completed_flex_hours > requirement.required_flex_hours) {\r\n requirement.used_flex_hours = requirement.required_flex_hours;\r\n }\r\n else {\r\n requirement.used_flex_hours = requirement.completed_flex_hours;\r\n }\r\n if (requirement.used_flex_hours < 0) {\r\n requirement.used_flex_hours = 0;\r\n }\r\n requirement.remaining_flex_hours = requirement.required_flex_hours - requirement.used_flex_hours;\r\n if (requirement.remaining_flex_hours < 0) {\r\n requirement.remaining_flex_hours = 0;\r\n }\r\n if (requirement.used_flex_hours < requirement.required_flex_hours) {\r\n requirement.complete = false;\r\n level.complete = false;\r\n }\r\n\r\n // handle override\r\n if (requirement.override && requirement.complete) {\r\n level.override_complete = true;\r\n }\r\n\r\n level.completed_hours += requirement.completed_hours;\r\n level.completed_flex_hours += requirement.completed_flex_hours;\r\n level.used_requirement_flex_hours += requirement.used_flex_hours;\r\n level.used_hours += requirement.used_hours;\r\n level.required_requirement_hours += requirement.required_hours;\r\n level.required_requirement_flex_hours += requirement.required_flex_hours;\r\n })\r\n\r\n level.remaining_hours = level.required_requirement_hours - level.used_hours;\r\n if (level.remaining_hours < 0) {\r\n level.remaining_hours = 0;\r\n }\r\n\r\n if (level.override_complete) {\r\n level.complete = true;\r\n }\r\n\r\n // level flex hours\r\n if (level.override_required_flex_hours && level.required_flex_hours > 0 && level.required_flex_hours > level.required_requirement_flex_hours) {\r\n level.required_flex_hours_actual = level.required_flex_hours;\r\n level.remaining_flex_hours = level.required_flex_hours - level.completed_flex_hours;\r\n if (level.remaining_flex_hours < 0) {\r\n level.remaining_flex_hours = 0;\r\n }\r\n if (level.completed_flex_hours > level.required_flex_hours) {\r\n level.used_flex_hours = level.required_flex_hours;\r\n }\r\n else {\r\n level.used_flex_hours = level.completed_flex_hours;\r\n }\r\n if (level.used_flex_hours < 0) {\r\n level.used_flex_hours = 0;\r\n }\r\n\r\n if (level.used_flex_hours < level.required_flex_hours) {\r\n level.complete = false;\r\n }\r\n\r\n if (level.required_requirement_flex_hours - level.used_requirement_flex_hours > 0) {\r\n if ((level.required_requirement_flex_hours - level.used_requirement_flex_hours) > level.remaining_flex_hours) {\r\n level.remaining_flex_hours = level.required_requirement_flex_hours - level.used_requirement_flex_hours;\r\n }\r\n level.missingFlexRequirements = true;\r\n }\r\n }\r\n else {\r\n level.required_flex_hours_actual = level.required_requirement_flex_hours;\r\n level.used_flex_hours = level.used_requirement_flex_hours;\r\n level.remaining_flex_hours = level.required_requirement_flex_hours - level.used_requirement_flex_hours;\r\n if (level.remaining_flex_hours < 0) {\r\n level.remaining_flex_hours = 0;\r\n }\r\n }\r\n\r\n //determines the value of the training requirements and corresponding validation trigger\r\n level.hasRequirements = (level.requirements.length > 0) ? true : false;\r\n if (level.hasRequirements == false) {\r\n level.hasRequirements = (level.required_flex_hours > 0) ? true : false;\r\n }\r\n })\r\n }\r\n\r\n $scope.openDocument = function (id, code) {\r\n $window.open($rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + id.toUpperCase() + '&code=' + code, '_blank');\r\n }\r\n }])\r\n .directive('hlpSupplementalTraining', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/supplemental-training/supplemental-training.html',\r\n replace: true,\r\n controller: 'hlpSupplementalTrainingController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?',\r\n datapointAnswers: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('EducationReportModalController', ['$scope', '$rootScope', '$modalInstance', 'topic', 'Topics', 'TrainingLocations', 'TrainingFields', 'Upload', 'FileTypes', 'Trainings', 'parameters', \"Levels\", function ($scope, $rootScope, $modalInstance, topic, Topics, TrainingLocations, TrainingFields, Upload, FileTypes, Trainings, parameters, Levels) {\r\n $scope.selectedTopic = topic;\r\n $scope.file = null;\r\n $scope.locationsLoading = true;\r\n $scope.documentsLoading = true;\r\n $scope.addCourse = new Object();\r\n $scope.saving = false;\r\n $scope.showWarning = false;\r\n\r\n $scope.getTopicOptions = function (training_topic, index) {\r\n if (training_topic.topicID) {\r\n Topics.get({ supplementalOnly: true, topicID: training_topic.topicID }).then(function (topic) {\r\n if (topic.length > 0 && topic[0].options) {\r\n var temp = topic[0].options.split(',');\r\n var checkBoxOptions = [];\r\n temp.forEach(function (value) {\r\n checkBoxOptions.push({ value: value, checked: false });\r\n })\r\n $scope.addCourse.courseTopics[index].options = checkBoxOptions;\r\n }\r\n else {\r\n $scope.addCourse.courseTopics[index].options = null;\r\n }\r\n })\r\n }\r\n }\r\n\r\n Levels.getEducationVerificationDates({ userID: parameters.user_id, applicationTypes: parameters.license_id }).then(function (dates) {\r\n $scope.startDate = Date.parse(dates.startDate);\r\n $scope.endDate = Date.parse(dates.endDate);\r\n });\r\n\r\n if ($scope.addCourse.courseTopics == null) {\r\n $scope.addCourse.courseTopics = [];\r\n $scope.addCourse.courseTopics.push({ $$hashKey: $scope.selectedTopic.$$hashKey, options: [], topicID: $scope.selectedTopic.id });\r\n $scope.getTopicOptions({ topicID: $scope.selectedTopic.id }, 0);\r\n }\r\n\r\n $scope.checkDate = function () {\r\n // start & end Dates are in UTC, turn current completedOn datetime to UTC\r\n var date = new Date(new Date($scope.addCourse.completedOn).setHours(new Date().getUTCHours(), new Date().getMinutes()));\r\n $scope.showWarning = ($scope.startDate <= date && date <= $scope.endDate) ? false : true;\r\n }\r\n\r\n Topics.get({ supplementalOnly: true }).then(function (topics) {\r\n $scope.topics = topics;\r\n })\r\n\r\n TrainingLocations.get().then(function (locations) {\r\n if (locations != null) {\r\n $scope.locations = locations;\r\n }\r\n $scope.locationsLoading = false;\r\n })\r\n\r\n TrainingFields.get().then(function (fields) {\r\n if (fields != null) {\r\n $scope.fields = fields.records;\r\n }\r\n })\r\n\r\n FileTypes.getByEnterprise().then(function (data) {\r\n if (data != null && data.length > 0) {\r\n $scope.extensions = data.toString();\r\n } else {\r\n $scope.extensions = \"'*'\";\r\n }\r\n $scope.documentsLoading = false;\r\n });\r\n\r\n $scope.locationChange = function () {\r\n if ($scope.selectedTopic.trainingLocation != null) {\r\n if (isValidGuid($scope.selectedTopic.trainingLocation.id)) {\r\n $scope.addCourse.locationId = $scope.selectedTopic.trainingLocation.id;\r\n }\r\n else {\r\n $scope.addCourse.locationId = null;\r\n }\r\n }\r\n }\r\n\r\n $scope.remove = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n\r\n $scope.fileChange = function () {\r\n if (!$scope.working) {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.fileUpdated = function (file) {\r\n if (file != null) {\r\n $scope.working = true;\r\n Upload.base64DataUrl(file).then(function (content) {\r\n $scope.addCourse.certificate = {\r\n fileContent: content,\r\n fileName: file.name,\r\n fileSize: file.size\r\n }\r\n $scope.working = false;\r\n $scope.uploading = false;\r\n })\r\n }\r\n else {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.filePicked = function () {\r\n $scope.uploading = true;\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n\r\n $scope.save = function () {\r\n $scope.saving = true;\r\n var userID = null;\r\n if (parameters.user_id) {\r\n userID = parameters.user_id;\r\n } else {\r\n userID = $rootScope.userID;\r\n }\r\n $scope.addCourse.userId = userID;\r\n $scope.addCourse.licenseRequestId = parameters.license_request_id;\r\n\r\n $scope.addCourse.courseTopics.forEach(function (topic) {\r\n var selectedOptions;\r\n if (topic.options && topic.options.length > 0) {\r\n selectedOptions = \"\";\r\n topic.options.forEach(function (option) {\r\n if (option.checked == true) {\r\n selectedOptions = selectedOptions + \",\" + option.value;\r\n }\r\n })\r\n if (selectedOptions != \"\") {\r\n selectedOptions = selectedOptions.substring(1, selectedOptions.length);\r\n topic.selectedOptions = selectedOptions;\r\n }\r\n }\r\n })\r\n // saved in user current time of save modal, converted to utc somewhere else\r\n $scope.addCourse.completedOn = new Date(new Date($scope.addCourse.completedOn).setHours(new Date().getHours(), new Date().getMinutes()));\r\n Trainings.postCourseUserSummary($scope.addCourse).then(function (result) {\r\n $modalInstance.close($scope.addCourse);\r\n });\r\n }\r\n }])\r\n ;\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('SupplementTrainingModalController', ['$scope', '$modalInstance', 'training', 'Topics', 'TrainingLocations', '$timeout', 'Upload', 'FileTypes', '$filter', function ($scope, $modalInstance, training, Topics, TrainingLocations, $timeout, Upload, FileTypes, $filter) {\r\n if (training.training_topics == null) {\r\n training.training_topics = [];\r\n }\r\n $scope.training = training;\r\n $scope.uploading = false;\r\n $scope.working = false;\r\n $scope.locationsLoading = true;\r\n\r\n FileTypes.getByEnterprise().then(function (data) {\r\n if (data != null && data.length > 0) {\r\n $scope.extensions = data.toString();\r\n } else {\r\n $scope.extensions = \"'*'\";\r\n }\r\n\r\n });\r\n\r\n Topics.get({ supplementalOnly: true }).then(function (topics) {\r\n $scope.topics = topics;\r\n })\r\n\r\n TrainingLocations.get().then(function (locations) {\r\n if (locations != null) {\r\n if ($scope.training.training_location_id != null) {\r\n var location = $filter('filter')(locations, $scope.training.training_location_id);\r\n if (location != null && location.length > 0) {\r\n $scope.training.training_location = location[0];\r\n }\r\n }\r\n else if ($scope.training.location != null) {\r\n var l = { id: $scope.training.location, name: $scope.training.location }\r\n locations.push(l);\r\n $scope.training.training_location = l;\r\n }\r\n $scope.locations = locations;\r\n }\r\n $scope.locationsLoading = false;\r\n })\r\n\r\n $scope.optionChange = function (training, viewValue) {\r\n training.training_location = null;\r\n training.training_location_id = null;\r\n training.training_location_name = viewValue;\r\n training.location = viewValue;\r\n }\r\n\r\n $scope.locationChange = function (training) {\r\n if (training.training_location != null) {\r\n training.training_location_name = training.training_location.name;\r\n training.location = training.training_location.name;\r\n if (isValidGuid(training.training_location.id)) {\r\n training.training_location_id = training.training_location.id; \r\n }\r\n else {\r\n training.training_location = null;\r\n training.training_location_id = null;\r\n }\r\n }\r\n }\r\n\r\n $scope.remove = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n\r\n $scope.topicChange = function (topic, topics) {\r\n topic.changing = true;\r\n topics.forEach(function (t) {\r\n if (topic.topic_id == t.id) {\r\n topic.topic_name = t.name;\r\n topic.availableoptions = t.options;\r\n topic.options = null;\r\n $timeout(function () {\r\n topic.changing = false;\r\n }, 10) \r\n }\r\n })\r\n }\r\n\r\n $scope.fileChange = function () {\r\n if (!$scope.working) {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.fileUpdated = function (file) {\r\n if (file != null) {\r\n $scope.working = true;\r\n Upload.base64DataUrl(file).then(function (content) {\r\n $scope.training.file_content = content;\r\n $scope.training.file_name = file.name;\r\n $scope.training.file_updated = true;\r\n $scope.working = false;\r\n $scope.uploading = false;\r\n })\r\n }\r\n else {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.filePicked = function () {\r\n $scope.uploading = true;\r\n }\r\n\r\n $scope.save = function () {\r\n $modalInstance.close($scope.training);\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n\r\n $scope.hasOptions = function (training) {\r\n var any = false;\r\n\r\n training.training_topics.forEach(function (topic) {\r\n if (topic.availableoptions != null) {\r\n any = true;\r\n }\r\n })\r\n\r\n return any;\r\n }\r\n }])\r\n;","/*\r\n * angular-ui-tab-scroll\r\n * https://github.com/VersifitTechnologies/angular-ui-tab-scroll\r\n *\r\n * Version: 2.3.2\r\n * License: MIT\r\n */\r\n\r\nangular.module('imagetrend.components')\r\n .provider('scrollableTabsetConfig', function(){\r\n\r\n //the default options\r\n var defaultConfig = {\r\n showDropDown: true,\r\n showTooltips: true,\r\n tooltipLeftPlacement: 'right',\r\n tooltipRightPlacement: 'left',\r\n scrollBy: '100',\r\n autoRecalculate: false\r\n };\r\n\r\n var config = angular.extend({}, defaultConfig);\r\n\r\n return {\r\n setShowDropDown : function(value){\r\n config.showDropDown = (value == true);\r\n },\r\n setShowTooltips : function(value){\r\n config.showTooltips = (value == true);\r\n },\r\n setTooltipLeftPlacement : function(value){\r\n config.tooltipLeftPlacement = value;\r\n },\r\n setTooltipRightPlacement : function(value){\r\n config.tooltipRightPlacement = value;\r\n },\r\n setScrollBy : function(value){\r\n config.scrollBy = value;\r\n },\r\n setAutoRecalculate : function(value){\r\n config.autoRecalculate = (value == true);\r\n },\r\n $get: function(){\r\n return {\r\n showDropDown: config.showDropDown,\r\n showTooltips: config.showTooltips,\r\n tooltipLeftPlacement: config.tooltipLeftPlacement,\r\n tooltipRightPlacement: config.tooltipRightPlacement,\r\n scrollBy: config.scrollBy,\r\n autoRecalculate: config.autoRecalculate\r\n };\r\n }\r\n };\r\n }\r\n )\r\n .directive('scrollableTabset', [\r\n 'scrollableTabsetConfig', '$window', '$interval', '$timeout','$sce',\r\n function(scrollableTabsetConfig, $window, $interval, $timeout, $sce) {\r\n\r\n return {\r\n restrict: 'AE',\r\n transclude: true,\r\n scope: {\r\n showDropDown: '@',\r\n showTooltips: '@',\r\n tooltipLeftPlacement: '@',\r\n tooltipRightPlacement: '@',\r\n scrollBy: '@',\r\n autoRecalculate: '@',\r\n isButtonsVisible: '=?',\r\n dropDownClass: '@?',\r\n dropDownMenuClass: '@?',\r\n dropDownHeaderTemplateUrl: '@?',\r\n dropDownHeaderClass: '@?',\r\n api: '=?'\r\n },\r\n templateUrl: 'templates/tabset-scroll/tabset-scroll.html',\r\n link: function ($scope, $el) {\r\n\r\n $scope.dropdownTabs = [];\r\n $scope.hideButtons = true;\r\n $scope.hideDropDown = true;\r\n $scope.tooltipRightHtml = '';\r\n $scope.tooltipLeftHtml = '';\r\n $scope.disableLeft = true;\r\n $scope.disableRight = true;\r\n $scope.tooltipLeftDirection = $scope.tooltipLeftPlacement ? $scope.tooltipLeftPlacement : scrollableTabsetConfig.tooltipLeftPlacement;\r\n $scope.tooltipRightDirection = $scope.tooltipRightPlacement ? $scope.tooltipRightPlacement : scrollableTabsetConfig.tooltipRightPlacement;\r\n $scope.mouseDownInterval = null;\r\n $scope.isHolding = false;\r\n $scope.winResizeTimeout;\r\n $scope.userShowDropDown = $scope.showDropDown ? $scope.showDropDown === 'true' : scrollableTabsetConfig.showDropDown;\r\n $scope.userShowTooltips = $scope.showTooltips ? $scope.showTooltips === 'true' : scrollableTabsetConfig.showTooltips == true;\r\n $scope.scrollByPixels = parseInt($scope.scrollBy ? $scope.scrollBy : scrollableTabsetConfig.scrollBy);\r\n\r\n $scope.api = {\r\n doRecalculate: function () {\r\n $timeout(function(){$scope.reCalcAll()});\r\n },\r\n\r\n scrollTabIntoView: function(arg){\r\n $timeout(function(){$scope.scrollTabIntoView(arg)});\r\n }\r\n };\r\n\r\n $scope.scrollTo = function(element, change, duration, callback, isLinear) {\r\n var start = element.scrollLeft;\r\n var increment = 20;\r\n var position = 0;\r\n\r\n var animateScroll = function(elapsedTime) {\r\n elapsedTime += increment;\r\n if(isLinear === true) {\r\n position = $scope.linearTween(elapsedTime, start, change, duration);\r\n } else {\r\n position = $scope.easeInOutQuad(elapsedTime, start, change, duration);\r\n }\r\n element.scrollLeft = position;\r\n if (elapsedTime < duration) {\r\n setTimeout(function() {\r\n animateScroll(elapsedTime);\r\n }, increment);\r\n }else{\r\n callback();\r\n }\r\n };\r\n\r\n animateScroll(0);\r\n }\r\n\r\n $scope.linearTween = function (currentTime, start, change, duration) {\r\n return change * currentTime / duration + start;\r\n };\r\n\r\n $scope.easeInOutQuad = function(currentTime, start, change, duration) {\r\n currentTime /= duration / 2;\r\n if (currentTime < 1) {\r\n return change / 2 * currentTime * currentTime + start;\r\n }\r\n currentTime --;\r\n return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;\r\n }\r\n\r\n $scope.onWindowResize = function() {\r\n // delay for a bit to avoid running lots of times.\r\n clearTimeout($scope.winResizeTimeout);\r\n $scope.winResizeTimeout = setTimeout(function(){\r\n $scope.reCalcAll();\r\n\t\t\t\t$scope.scrollTabIntoView();\r\n $scope.$apply();\r\n }, 250);\r\n };\r\n\r\n $scope.cancelMouseDownInterval = function() {\r\n $scope.isHolding = false;\r\n\r\n if($scope.mouseDownInterval) {\r\n $interval.cancel($scope.mouseDownInterval);\r\n $scope.mouseDownInterval = null;\r\n }\r\n };\r\n\r\n $scope.scrollButtonDown = function(direction, event) {\r\n event.stopPropagation();\r\n $scope.isHolding = true;\r\n\r\n var realScroll = direction === 'left' ? 0 - $scope.scrollByPixels : $scope.scrollByPixels;\r\n $scope.scrollTo($scope.tabContainer, realScroll, 100, function(){\r\n $timeout(function(){\r\n $scope.reCalcSides();\r\n });\r\n }, true);\r\n\r\n $scope.mouseDownInterval = $interval(function() {\r\n\r\n if($scope.isHolding) {\r\n $scope.scrollTo($scope.tabContainer, realScroll, 100, function(){\r\n $timeout(function(){\r\n $scope.reCalcSides();\r\n });\r\n }, true);\r\n\r\n if(event.target.disabled) {\r\n $scope.cancelMouseDownInterval();\r\n }\r\n }\r\n }, 100);\r\n }\r\n\r\n $scope.scrollButtonUp = function() {\r\n $scope.cancelMouseDownInterval();\r\n }\r\n\r\n $scope.activateTab = function(tab) {\r\n if(tab.disabled)return;\r\n tab.select();\r\n $timeout(function () {\r\n $scope.scrollTabIntoView();\r\n });\r\n }\r\n\r\n $scope.reCalcSides = function() {\r\n if(!$scope.tabContainer || $scope.hideButtons)return;\r\n $scope.disableRight = $scope.tabContainer.scrollLeft >= $scope.tabContainer.scrollWidth - $scope.tabContainer.offsetWidth;\r\n $scope.disableLeft = $scope.tabContainer.scrollLeft <= 0;\r\n\r\n if($scope.userShowTooltips){\r\n $scope.reCalcTooltips();\r\n }\r\n };\r\n\r\n $scope.reCalcTooltips = function(){\r\n if(!$scope.tabContainer || $scope.hideButtons)return;\r\n var rightTooltips = [];\r\n var leftTooltips = [];\r\n\r\n var allTabs = $scope.tabContainer.querySelectorAll('div > div > div.tab-header > li');\r\n angular.forEach(allTabs, function(tab) {\r\n\r\n var rightPosition = parseInt(tab.getBoundingClientRect().left + tab.getBoundingClientRect().width - $scope.tabContainer.getBoundingClientRect().left);\r\n var leftPosition = tab.getBoundingClientRect().left - $scope.tabContainer.getBoundingClientRect().left;\r\n var heading = tab.getAttribute(\"data-tabScrollHeading\");\r\n var ignore = tab.getAttribute(\"data-tabScrollIgnore\");\r\n\r\n if(rightPosition > $scope.tabContainer.offsetWidth && !ignore ) {\r\n if(heading) {\r\n rightTooltips.push(heading)\r\n } else if (tab.textContent)rightTooltips.push(tab.textContent);\r\n }\r\n\r\n if (leftPosition < 0 && !ignore ) {\r\n if(heading) {\r\n leftTooltips.push(heading)\r\n } else if (tab.textContent)leftTooltips.push(tab.textContent);\r\n }\r\n\r\n });\r\n\r\n var rightTooltipsHtml = rightTooltips.join('
    ');\r\n $scope.tooltipRightHtml = $sce.trustAsHtml(rightTooltipsHtml);\r\n\r\n var leftTooltipsHtml = leftTooltips.join('
    ');\r\n $scope.tooltipLeftHtml = $sce.trustAsHtml(leftTooltipsHtml);\r\n };\r\n\r\n $scope.scrollTabIntoView = function(arg){\r\n if(!$scope.tabContainer || $scope.hideButtons)return;\r\n\r\n var argInt = parseInt(arg);\r\n var tabToScroll;\r\n\r\n // first we find the tab element.\r\n if(argInt) { // scroll tab index into view\r\n var allTabs = $scope.tabContainer.querySelectorAll('div > div > div.tab-header > li');\r\n if(allTabs.length > argInt) { // only if its really exist\r\n tabToScroll = allTabs[argInt];\r\n }\r\n } else { // scroll selected tab into view\r\n var activeTab = $scope.tabContainer.querySelector('div > div > div.tab-header > li.active');\r\n if(activeTab) {\r\n tabToScroll = activeTab;\r\n }\r\n }\r\n\r\n // now let's scroll it into view.\r\n if(tabToScroll) {\r\n var rightPosition = parseInt(tabToScroll.getBoundingClientRect().left + tabToScroll.getBoundingClientRect().width - $scope.tabContainer.getBoundingClientRect().left);\r\n var leftPosition = tabToScroll.getBoundingClientRect().left - $scope.tabContainer.getBoundingClientRect().left;\r\n if (leftPosition < 0) {\r\n var dif = leftPosition - 20;\r\n $scope.scrollTo($scope.tabContainer, dif, 150, function(){\r\n $timeout(function(){\r\n $scope.reCalcSides();\r\n });\r\n });\r\n } else if(rightPosition > $scope.tabContainer.offsetWidth){\r\n var dif = rightPosition - $scope.tabContainer.offsetWidth + 20;\r\n $scope.scrollTo($scope.tabContainer, dif, 150, function(){\r\n $timeout(function(){\r\n $scope.reCalcSides();\r\n });\r\n });\r\n }\r\n }\r\n };\r\n\r\n // init is called only once!\r\n $scope.init = function() {\r\n $scope.tabContainer = $el[0].querySelector('.spacer div ul.nav-tabs');\r\n if(!$scope.tabContainer)return;\r\n\r\n var autoRecalc = $scope.autoRecalculate ? $scope.autoRecalculate === 'true' : scrollableTabsetConfig.autoRecalculate;\r\n if(autoRecalc) {\r\n var tabsetElement = angular.element($el[0].querySelector('.spacer div'));\r\n $scope.$watchCollection(\r\n function () {\r\n return tabsetElement.isolateScope() ? tabsetElement.isolateScope().tabs : false;\r\n },\r\n function () {\r\n $timeout(function () {\r\n $scope.reCalcAll()\r\n });\r\n }\r\n );\r\n }\r\n\r\n $scope.reCalcAll();\r\n\r\n // attaching event to window resize.\r\n angular.element($window).on('resize', $scope.onWindowResize);\r\n };\r\n\r\n // re-calculate if the scroll buttons are needed, than call re-calculate for both buttons.\r\n $scope.reCalcAll = function() {\r\n if(!$scope.tabContainer)return;\r\n\r\n $scope.hideButtons = $scope.tabContainer.scrollWidth <= $scope.tabContainer.offsetWidth;\r\n $scope.hideDropDown = $scope.userShowDropDown ? $scope.hideButtons : true;\r\n $scope.isButtonsVisible = !$scope.hideButtons;\r\n\r\n if(!$scope.hideButtons) {\r\n\r\n if(!$scope.hideDropDown) {\r\n var allTabs = $scope.tabContainer.querySelectorAll('div > div > div.tab-header > li');\r\n $scope.dropdownTabs = [];\r\n angular.forEach(allTabs, function (tab) {\r\n var ignore = tab.getAttribute(\"data-tabScrollIgnore\");\r\n if(!ignore){\r\n var heading = tab.getAttribute(\"data-tabScrollHeading\");\r\n var tabScope = angular.element(tab).isolateScope();\r\n //push new field to use as title in the drop down.\r\n tabScope.tabScrollTitle = heading ? heading : tab.textContent.trim();\r\n $scope.dropdownTabs.push(tabScope);\r\n }\r\n });\r\n }\r\n\r\n $scope.reCalcSides();\r\n }\r\n };\r\n\r\n // this is how we init for the first time.\r\n $timeout(function(){\r\n $scope.init();\r\n });\r\n\r\n // when scope destroyed\r\n $scope.$on('$destroy', function () {\r\n angular.element($window).off('resize', $scope.onWindowResize);\r\n });\r\n\r\n }\r\n };\r\n }]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpTextarea', ['$timeout', 'Format', 'Validation', function ($timeout, Format, Validation) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=',\r\n validation: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n cols: '@?',\r\n rows: '@?',\r\n maxLength: '@?',\r\n modal: '@?',\r\n placeholder: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n showColon: '=?',\r\n pdf: '=?',\r\n completed: '=?',\r\n saving: '=?'\r\n },\r\n require: 'ngModel',\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/textarea/textarea.html',\r\n controller: ['$scope', '$timeout', function ($scope, $timeout) {\r\n $scope.validate = function () {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.validation) {\r\n Validation.validateQuestion($scope.innerForm.textarea, $scope.validation, $scope.ngModel);\r\n }\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm.textarea.$error);\r\n }\r\n }\r\n }\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || $scope.name));\r\n }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.timeouts = [];\r\n\r\n //attributes\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.cols) { attrs.cols = '60'; }\r\n if (!attrs.rows) { attrs.rows = '5'; }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n if (!attrs.maxLength) { attrs.maxLength = '5000'; } else { if (attrs.maxLength == '') attrs.maxLength = '5000'; }\r\n\r\n //label\r\n if (!attrs.name) { attrs.name = 'textarea'; }\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.textarea, scope.validation, scope.ngModel);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.textarea.$error);\r\n }\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .run([\"$templateCache\", function($templateCache) {\r\n $templateCache.put(\"time/timepicker.html\",\r\n \"
      \\n\" +\r\n \"
    • \\n\" +\r\n \"
      \\n\" +\r\n \" \\n\" +\r\n \"
      \\n\" +\r\n \"
      :
      \\n\" +\r\n \"
      \\n\" +\r\n \" \\n\" +\r\n \"
      \\n\" +\r\n \"
      \\n\" +\r\n \"
    • \\n\" +\r\n \"
    \\n\" +\r\n \"\");\r\n }])\r\n .directive('hlpTime', ['Format', '$timeout', function (Format, $timeout) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n\r\n //required\r\n isRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //disabled\r\n isDisabled: '=?',\r\n\r\n //label\r\n showLabel: '@?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?'\r\n },\r\n replace: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/time/time.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'input'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n $timeout(function () {\r\n if (!attrs.requiredText) { scope.requiredText = 'Please enter a ' + Format.label((scope.label || scope.name)); }\r\n }, 0);\r\n\r\n //disabled\r\n if (scope.isDisabled == undefined) { scope.isDisabled = false; }\r\n\r\n scope.setTime = function () {\r\n scope.onChange(scope.ngModel);\r\n }\r\n\r\n scope.onChange = function (item) {\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.submitted = true;\r\n });\r\n\r\n //ctrl.$viewChangeListeners.push(function () {\r\n // scope.$eval(attrs.ngChange);\r\n //});\r\n\r\n //elem[0].querySelector('input.form-control').focus = function () {\r\n // var firstInvalid = elem[0].querySelector('input.empty');\r\n // if (firstInvalid) {\r\n // firstInvalid.focus();\r\n // }\r\n //}\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpTrueFalse', ['Format', '$timeout', function (Format, $timeout) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=?',\r\n\r\n //attributes\r\n name: '@',\r\n id: '@?',\r\n classes: '@?',\r\n modal: '@?',\r\n vertical: '=?',\r\n isDisabled: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n pdf: '=?'\r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/true-false/true-false.html',\r\n controller: ['$scope', '$timeout', 'Validation', function($scope, $timeout, Validation) {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm[$scope.name].$error);\r\n }\r\n }\r\n\r\n $scope.validate = function() {\r\n if ($scope.isRequired && $scope.ngModel == null && $scope.innerForm !== undefined) {\r\n $scope.innerForm[$scope.name].$setValidity('required', false);\r\n\r\n Validation.validateQuestion($scope.innerForm[$scope.name], $scope.validation, $scope.ngModel);\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm[$scope.name].$error);\r\n }\r\n }\r\n }\r\n\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || 'value'));\r\n }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'true_false'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (attrs.modal == undefined) { attrs.modal = false; }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n\r\n // make string a boolean\r\n scope.$watch('ngModel', function(newValue, oldValue) {\r\n if (newValue != null && angular.isString(newValue)) {\r\n scope.ngModel = (newValue.toLowerCase() === \"true\" || newValue.toLowerCase() === \"1\");\r\n }\r\n if (scope.isRequired && scope.ngModel != null) {\r\n scope.innerForm[scope.name].$setValidity(\"required\", true);\r\n }\r\n });\r\n\r\n scope.onChange = function (item) {\r\n scope.processingChange = true;\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n var timer = $timeout(function() {\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm[scope.name].$error);\r\n }\r\n scope.processingChange = false;\r\n }, 0);\r\n scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n //ctrl.$viewChangeListeners.push(function () {\r\n // scope.$eval(attrs.ngChange);\r\n //});\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpTypeahead', ['$rootScope', '$templateCache', 'Validation', '$q', '$filter', '$injector', '$timeout', function ($rootScope, $templateCache, Validation, $q, $filter, $injector, $timeout) {\r\n return {\r\n scope: {\r\n // strings\r\n name: '@?',\r\n id: '@?',\r\n label: '@?',\r\n title: '@?',\r\n requiredText: '@?',\r\n classes: '@?',\r\n instructions: '@?',\r\n blankText: '@?',\r\n selectShow: '@?',\r\n selectSort: '@?',\r\n selectValue: '@?',\r\n availableShow: '@?',\r\n availableSort: '@?',\r\n compareValue: '@?',\r\n arrayValue: '@?',\r\n service: '@?',\r\n method: '@?',\r\n groupBy: '@?',\r\n size: '@?',\r\n maxLength: '@?',\r\n placeholder: '@?',\r\n needed: '@?',\r\n\r\n // bools\r\n showBlank: '=?',\r\n showLabel: '=?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n modal: '=?',\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n isDisabled: '=?',\r\n forceString: '=?',\r\n serviceOverride: '=?',\r\n multiple: '=?',\r\n sortable: '=?',\r\n vertical: '=?',\r\n pdf: '=?',\r\n innerForm: '=?',\r\n addCourseModal: '=?',\r\n\r\n // typahead.js\r\n ngModel: '=?',\r\n question: '=?',\r\n showValue: '=?',\r\n ngChange: '&?',\r\n validation: '=?',\r\n options: '=?',\r\n parameters: '=?',\r\n filterArray: '=?',\r\n onType: '&?',\r\n searchBy: '=?'//For when the options are objects but you only need to search by one property in that object\r\n },\r\n require: 'ngModel',\r\n transclude: true,\r\n template: function () {\r\n return $templateCache.get('templates/typeahead/typeahead.html');\r\n },\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n\r\n scope.directiveAttributes = attrs;\r\n\r\n if (!scope.directiveAttributes.selectShow) { scope.selectShow = 'name'; }\r\n if (!scope.directiveAttributes.selectValue) { scope.selectValue = 'id'; }\r\n\r\n if (scope.directiveAttributes.service != null && scope.directiveAttributes.service != '' && (scope.directiveAttributes.method == 'search' || scope.directiveAttributes.method == 'searchByService' || scope.directiveAttributes.method == 'searchUsersNotInService' || scope.directiveAttributes.method == 'searchVehiclesNotInService' || scope.directiveAttributes.method == 'getServiceVehicles')) {\r\n if (!scope.directiveAttributes.groupBy) {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) as getDescendantProp(opt,selectShow) for opt in getOptions($viewValue)\";\r\n }\r\n else if (scope.parameters === 'Services' || scope.parameters === 'Vehicles') {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) for opt in dirOptions | filter:$viewValue | filter:filterAdded | filter:parameters | limitTo:8\";\r\n }\r\n else {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) as getDescendantProp(opt,selectShow) group by getDescendantProp(opt,groupBy) for opt in getOptions($viewValue)\";\r\n }\r\n }\r\n else {\r\n if (!scope.directiveAttributes.groupBy) {\r\n if (scope.directiveAttributes.searchBy) {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) for opt in dirOptions | filter:{\" + scope.directiveAttributes.searchBy + \":$viewValue} | filter:filterAdded | limitTo:8\";\r\n }\r\n else if (scope.parameters === 'Services' || scope.parameters === 'Vehicles') {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) for opt in dirOptions | filter:$viewValue | filter:filterAdded | filter:parameters | limitTo:8\";\r\n }\r\n else {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) for opt in dirOptions | filter:$viewValue | filter:filterAdded | limitTo:8\";\r\n }\r\n }\r\n else {\r\n scope.optionClause = \"getDescendantProp(opt,selectShow) group by getDescendantProp(opt,groupBy) for opt in dirOptions | filter:$viewValue | filter:filterAdded | limitTo:8\";\r\n }\r\n }\r\n },\r\n post: function (scope, elem, attrs, ngModel) {\r\n scope.timeouts = [];\r\n\r\n scope.valueChange = function (viewValue) {\r\n scope.ngModel = null;\r\n scope.showValue = null;\r\n if (scope.onType != null) {\r\n scope.onType({ viewValue: viewValue });\r\n }\r\n scope.timeouts.push($timeout(function () {\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.input, scope.validation, ngModel.$modelValue);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.input.$error);\r\n }\r\n }, 0));\r\n }\r\n\r\n var searchTimeout = null;\r\n scope.getOptions = function (viewValue) {\r\n if (scope.service != null && scope.service != '' && (scope.method == 'search' || scope.method == 'searchByService' || scope.method == 'searchUsersNotInService' || scope.directiveAttributes.method == 'searchVehiclesNotInService' || scope.directiveAttributes.method == 'getServiceVehicles')) {\r\n var service = $injector.get(scope.service);\r\n if (searchTimeout != null) {\r\n searchTimeout.resolve();\r\n searchTimeout = null; \r\n }\r\n searchTimeout = $q.defer();\r\n\r\n if (scope.method == 'searchByService') {\r\n if (scope.service == 'Vehicles') {\r\n return service[scope.method]({\r\n search: viewValue,\r\n service_id: scope.parameters.service_id,\r\n limit_vehicle_type_ids: scope.question.parameters.limit_vehicle_type_ids,\r\n show_vehicles_without_type: scope.question.parameters.show_vehicles_without_type\r\n }, searchTimeout).then(function (data) {\r\n searchTimeout = null;\r\n if (data != null) {\r\n scope.dirOptions = data;\r\n scope.options = data;\r\n return $filter('limitTo')($filter('filter')(scope.dirOptions, scope.filterAdded), 8);\r\n }\r\n });\r\n }\r\n else\r\n {\r\n return service[scope.method]({\r\n search: viewValue,\r\n service_id: scope.parameters.service_id\r\n }, searchTimeout).then(function (data) {\r\n searchTimeout = null;\r\n if (data != null) {\r\n scope.dirOptions = data;\r\n scope.options = data;\r\n return $filter('limitTo')($filter('filter')(scope.dirOptions, scope.filterAdded), 8);\r\n }\r\n });\r\n }\r\n }\r\n if (scope.method == 'searchUsersNotInService' || scope.method == 'searchVehiclesNotInService') {\r\n return service[scope.method]({ search: viewValue, service_id: scope.parameters.service_id, vehicle_restrict_services: scope.parameters.vehicle_restrict_services }, searchTimeout).then(function (data) {\r\n searchTimeout = null;\r\n if (data != null) {\r\n scope.dirOptions = data;\r\n scope.options = data;\r\n return $filter('limitTo')($filter('filter')(scope.dirOptions, scope.filterAdded), 8);\r\n }\r\n });\r\n }\r\n else {\r\n return service[scope.method]({ search: viewValue }, searchTimeout).then(function (data) {\r\n searchTimeout = null;\r\n if (data != null) {\r\n scope.dirOptions = data;\r\n scope.options = data;\r\n return $filter('limitTo')($filter('filter')(scope.dirOptions, scope.filterAdded), 8);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n scope.filterAdded = function (item) {\r\n var show = true;\r\n\r\n if (scope.filterArray != null) {\r\n scope.filterArray.forEach(function (f) {\r\n if (!f.license_category_level_id && f.id == item.id) {\r\n show = false;\r\n } else if (f.license_category_level_id && f.license_category_level_id === item.license_category_level_id) {\r\n show = false;\r\n }\r\n })\r\n }\r\n\r\n return show;\r\n }\r\n\r\n scope.setShowValue = function () {\r\n if (ngModel.$modelValue != null) {\r\n var val = scope.selectValue == \"OBJECT\" ? scope.getDescendantProp(ngModel.$modelValue, scope.selectValue) : ngModel.$modelValue;\r\n scope.dirOptions.forEach(function (opt) {\r\n var optVal = scope.getDescendantProp(opt, scope.selectValue);\r\n if (val == optVal || ngModel.$modelValue == optVal) {\r\n scope.showValue = scope.getDescendantProp(opt, scope.selectShow);\r\n scope.viewValue = scope.showValue;\r\n }\r\n })\r\n }\r\n }\r\n\r\n scope.$watch('optionsLoaded', function (optionsLoaded) {\r\n if (optionsLoaded && scope.showValue == null) {\r\n scope.setShowValue();\r\n } else if (scope.showValue != null) {\r\n scope.viewValue = scope.showValue;\r\n }\r\n scope.timeouts.push($timeout(function () {\r\n if (scope.innerForm !== undefined) {\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.input, scope.validation, ngModel.$modelValue);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.input.$error);\r\n }\r\n }\r\n }, 0));\r\n });\r\n\r\n ngModel.$render = function () {\r\n scope.timeouts.push($timeout(function() {\r\n if (ngModel.$modelValue != null) {\r\n if (scope.selectValue == \"OBJECT\") {\r\n scope.viewValue = scope.getDescendantProp(ngModel.$modelValue, scope.selectShow);\r\n scope.showValue = scope.viewValue;\r\n }\r\n else {\r\n if (scope.showValue == null && scope.optionsLoaded) {\r\n scope.setShowValue();\r\n }\r\n else if (scope.showValue != null) {\r\n scope.viewValue = scope.showValue;\r\n }\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.input, scope.validation, ngModel.$modelValue);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.input.$error);\r\n }\r\n }\r\n else {\r\n scope.valueChange(null);\r\n }\r\n }, 0));\r\n }\r\n\r\n scope.intialValidation = function () {\r\n if (scope.innerForm !== undefined) {\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.input.$error);\r\n }\r\n }\r\n };\r\n\r\n scope.onChange = function (value, viewValue) {\r\n scope.submitted = false;\r\n if (scope.selectValue == \"OBJECT\") {\r\n ngModel.$setViewValue(value);\r\n scope.showValue = viewValue;\r\n }\r\n else {\r\n ngModel.$setViewValue(scope.getDescendantProp(value, scope.selectValue));\r\n scope.ngModel = ngModel.$modelValue;\r\n scope.showValue = viewValue;\r\n }\r\n scope.timeouts.push($timeout(function() {\r\n if (scope.validation) {\r\n Validation.validateQuestion(scope.innerForm.input, scope.validation, ngModel.$modelValue);\r\n }\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm.input.$error);\r\n }\r\n }, 0));\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.intialValidation();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpVoucherPayController', ['$scope', 'DataElements', 'VoucherPay',\r\n function ($scope, DataElements, VoucherPay) {\r\n $scope.component.elementAnswer = [];\r\n\r\n $scope.compareAmounts = function (a, b) {\r\n if (parseFloat(a.amount) < parseFloat(b.amount)) { return -1; }\r\n if (parseFloat(a.amount) > parseFloat(b.amount)) { return 1; }\r\n return 0;\r\n }\r\n\r\n VoucherPay.getExistingVouchersByLicenseRequestID($scope.parameters.license_request_id).then(function (existingVouchers) {\r\n DataElements.getVoucherAmounts({}).then(function (voucherAmounts) {\r\n if (voucherAmounts) {\r\n //Match existing amounts to data elements\r\n voucherAmounts.forEach(function (voucherAmount) {\r\n if (existingVouchers) {\r\n var found = false;\r\n existingVouchers.forEach(function (existingVoucher) {\r\n if (!found && existingVoucher.amount.toFixed(2).toString() == voucherAmount.name) {\r\n $scope.component.elementAnswer.push({ \"amount\": voucherAmount.name, \"quantity\": existingVoucher.quantity });\r\n found = true;\r\n existingVoucher.found = true;\r\n }\r\n });\r\n if (!found) {\r\n $scope.component.elementAnswer.push({ \"amount\": voucherAmount.name, \"quantity\": 0 });\r\n }\r\n }\r\n else {\r\n $scope.component.elementAnswer.push({ \"amount\": voucherAmount.name, \"quantity\": 0 });\r\n }\r\n })\r\n var reorder = false;\r\n //For situations where the data element amounts have been changed but vouchers were already requested with the old amounts\r\n existingVouchers.forEach(function (existingVoucher) {\r\n if (existingVoucher.found != true) {\r\n reorder = true;\r\n $scope.component.elementAnswer.push({ \"amount\": existingVoucher.amount.toFixed(2).toString(), \"quantity\": existingVoucher.quantity });\r\n }\r\n });\r\n if (reorder == true) {\r\n $scope.component.elementAnswer.sort($scope.compareAmounts);\r\n }\r\n }\r\n });\r\n });\r\n }])\r\n .directive('hlpVoucherPay', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/voucher-pay/voucher-pay.html',\r\n replace: true,\r\n controller: 'hlpVoucherPayController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?',\r\n pdf: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpYesNo', ['Format', '$timeout', function (Format, $timeout) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n ngModel: '=',\r\n question: '=?',\r\n\r\n //attributes\r\n name: '@?',\r\n id: '@?',\r\n classes: '@?',\r\n modal: '@?',\r\n vertical: '=?',\r\n isDisabled: '=?',\r\n activeInactive: '=?',\r\n\r\n //required\r\n isRequired: '=?',\r\n showRequired: '=?',\r\n requiredText: '@?',\r\n\r\n //label\r\n showLabel: '@?',\r\n topLabel: '=?',\r\n showColon: '=?',\r\n label: '@?',\r\n title: '@?',\r\n\r\n //instructions\r\n instructions: '@?',\r\n instructions2: '@?',\r\n pdf: '=?'\r\n \r\n },\r\n replace: true,\r\n transclude: true,\r\n require: 'ngModel',\r\n templateUrl: 'templates/yes-no/yes-no.html',\r\n controller: ['$scope', '$timeout', 'Validation', function ($scope, $timeout, Validation) {\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm[$scope.name].$error);\r\n }\r\n }\r\n\r\n $scope.validate = function () {\r\n if ($scope.isRequired && $scope.ngModel == null && $scope.innerForm !== undefined) {\r\n $scope.innerForm[$scope.name].$setValidity('required', false);\r\n\r\n Validation.validateQuestion($scope.innerForm[$scope.name], $scope.validation, $scope.ngModel);\r\n if ($scope.question !== undefined && $scope.question.answer !== undefined) {\r\n $scope.question.answer.invalid = !isEmpty($scope.innerForm[$scope.name].$error);\r\n }\r\n }\r\n }\r\n\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText = 'Please enter a ' + Format.label(($scope.label || 'value'));\r\n }\r\n $scope.validate();\r\n }, 0);\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n }],\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n //attributes\r\n if (!attrs.name) { attrs.name = 'yes_no'; }\r\n if (!attrs.id) { attrs.id = attrs.name; }\r\n if (!attrs.modal) { attrs.modal = false; } else { if (attrs.modal == 'true') { attrs.modal = true; } else { attrs.modal = false; } }\r\n\r\n //label\r\n if (!attrs.label) { attrs.label = Format.label(attrs.name); }\r\n if (!attrs.showLabel) { attrs.showLabel = attrs.label.length > 0; } else { if (attrs.showLabel == 'true') { attrs.showLabel = true; } else { attrs.showLabel = false; } }\r\n if (!attrs.topLabel) { attrs.topLabel = false; } else { if (attrs.topLabel == true || attrs.topLabel == 'true') { attrs.topLabel = true; } else { attrs.topLabel = false; } }\r\n if (!attrs.showColon) { attrs.showColon = true; } else { if (attrs.showColon == true || attrs.showColon == 'true') { attrs.showColon = true; } else { attrs.showColon = false; } }\r\n if (!attrs.title) { attrs.title = attrs.label; }\r\n\r\n //required\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n\r\n // make string a boolean\r\n scope.$watch('ngModel', function(newValue, oldValue) {\r\n if (newValue != null && angular.isString(newValue)) {\r\n scope.ngModel = (newValue.toLowerCase() === \"true\" || newValue.toLowerCase() === \"1\");\r\n }\r\n if (scope.isRequired && scope.ngModel != null) {\r\n scope.innerForm[scope.name].$setValidity(\"required\", true);\r\n }\r\n });\r\n\r\n scope.onChange = function (item) {\r\n scope.processingChange = true;\r\n scope.submitted = false;\r\n ctrl.$setViewValue(item);\r\n var timer = $timeout(function () {\r\n if (scope.question !== undefined && scope.question.answer !== undefined) {\r\n scope.question.answer.invalid = !isEmpty(scope.innerForm[scope.name].$error);\r\n }\r\n scope.processingChange = false;\r\n }, 0);\r\n scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n }\r\n\r\n scope.submitted = false;\r\n scope.$on('form:submit', function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n }\r\n };\r\n }])\r\n\r\n;","'use strict';\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormBuilderComponent\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\",\r\n parentQuestion: \"=?\",\r\n parentComponent: \"=?\",\r\n formType: \"=?\",\r\n sets: \"=?\",\r\n elements: \"=?\",\r\n form: \"=?\",\r\n resultSet: \"=?\",\r\n parameters: \"=?\",\r\n attachments: \"=?\",\r\n inspectionChecklist: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n function ($scope) {\r\n $scope.calculatedFieldCalculationTypeOptions = [\r\n { id: 0, name: \"Count\" }\r\n ];\r\n $scope.reimburseLengthTypes = [\r\n { id: 'Day', name: 'Day' },\r\n { id: 'Week', name: 'Week' },\r\n { id: 'Month', name: 'Month' },\r\n { id: 'Year', name: 'Year' }\r\n ];\r\n\r\n if ($scope.parameters.contentOptions == null) {\r\n $scope.contentTypeOptions = [\r\n { id: 0, name: \"Text Editor\" },\r\n { id: 1, name: \"Attachment\" },\r\n { id: 2, name: \"PDF Preview\" }\r\n ];\r\n } else {\r\n $scope.contentTypeOptions =\r\n $scope.parameters.contentOptions;\r\n }\r\n $scope.componentTypeInit = function(component, types) {\r\n types.forEach(function(type) {\r\n if (\r\n type.code == \"form_element\" &&\r\n component.component_type_id != type.id &&\r\n ($scope.elements == null ||\r\n $scope.elements.length == 0)\r\n ) {\r\n updateArray(types, type, true);\r\n }\r\n });\r\n if (\r\n component.component_type_id == null &&\r\n types.length > 0\r\n ) {\r\n component.component_type_id = types[0].id;\r\n component.component_type = {};\r\n types.forEach(function(type) {\r\n if (type.id == component.component_type_id) {\r\n component.component_type = type;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.formElementInit = function(\r\n component,\r\n form_elements\r\n ) {\r\n if (\r\n component.element_id == null &&\r\n form_elements.length > 0\r\n ) {\r\n component.element_id = form_elements[0].id;\r\n form_elements.forEach(function(element) {\r\n if (element.id == component.element_id) {\r\n component.element_code = element.code;\r\n component.element_instructions =\r\n element.description;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.componentTypeChange = function(component, types) {\r\n component.questions = [];\r\n component.data_set_id = null;\r\n component.component_conditions = [];\r\n component.calculation_type = null;\r\n\r\n if (component.component_type_id == null) {\r\n component.component_type = {};\r\n } else {\r\n types.forEach(function(type) {\r\n if (type.id == component.component_type_id) {\r\n component.component_type = type;\r\n }\r\n });\r\n if (component.initialQuestions != null\r\n && component.initialQuestions[component.component_type_id] != null) {\r\n component.questions = component.initialQuestions[component.component_type_id];\r\n } else if (component.component_type.code == \"calculated_field\" && component.initialQuestions[component.component_type_id] == undefined)\r\n {\r\n component.calculation_type = 0;\r\n\r\n var calcFieldConditions = {\r\n id: guid(),\r\n and_flag: true,\r\n operator: \"=\",\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1\r\n }\r\n\r\n var question = {\r\n id: guid(),\r\n section_id: component.section_id,\r\n component_id: component.id,\r\n sort_order: component.questions.length,\r\n sub_components: [],\r\n edit: true,\r\n required: false,\r\n vertical: true,\r\n multiple: false,\r\n ssn_setting: 0,\r\n display_blank_zero: false,\r\n file_upload_description: true,\r\n file_upload_existing_docs: false,\r\n disabled: false,\r\n default_value: 0,\r\n label_position: false,\r\n update_from_form: false,\r\n share_files: false,\r\n show_in_grid: false,\r\n masked_setting: false,\r\n showValidation: true,\r\n question_type_id: \"b2932f47-8938-4999-92a6-f4a33ee55f8a\" //calculated_field\r\n }\r\n question.question_type = {};\r\n question.validation = {};\r\n question.validation.validation_type_id = \"8bff2877-d993-46a8-a850-751bde002f87\"; //numeric\r\n question.validation.type_message = \"Value must be numeric\";\r\n\r\n component.component_conditions.push(calcFieldConditions);\r\n component.questions.push(question);\r\n }\r\n }\r\n };\r\n \r\n $scope.dataSetInit = function(component, sets) {\r\n component.data_points = [];\r\n if (component.data_set_id == null && sets.length > 0) {\r\n component.data_set_id = sets[0].id;\r\n }\r\n\r\n if (component.data_set_id == null) {\r\n component.data_set = {};\r\n } else {\r\n sets.forEach(function(set) {\r\n if (set.id == component.data_set_id) {\r\n component.data_set = angular.copy(set);\r\n if (component.license_category_id == null) {\r\n component.license_category_id =\r\n set.default_license_category_id;\r\n } else {\r\n if (\r\n component.parameters\r\n .orignalLicenseID == null &&\r\n component.parameters.license_id !=\r\n null\r\n ) {\r\n component.parameters.orignalLicenseID =\r\n component.parameters.license_id;\r\n }\r\n\r\n component.parameters.license_category_id =\r\n component.license_category_id;\r\n\r\n if (\r\n component.data_set\r\n .default_license_category_id ==\r\n component.license_category_id\r\n ) {\r\n component.parameters.license_id =\r\n component.parameters.orignalLicenseID;\r\n } else {\r\n component.parameters.license_id = null;\r\n if (\r\n component.data_set.code ==\r\n \"certification\"\r\n ) {\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n point.code ==\r\n \"certification_application_type\"\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length -\r\n 1 -\r\n index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n component.data_set\r\n .license_category_specific &&\r\n point.license_category_id !=\r\n null &&\r\n point.license_category_id !=\r\n component.license_category_id\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length - 1 - index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n });\r\n // limit positions\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n component.limit_position_ids_array =\r\n component.limit_position_ids == null\r\n ? []\r\n : component.limit_position_ids;\r\n // limit vehicle types\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n component.limit_vehicle_type_ids_array =\r\n component.limit_vehicle_type_ids == null\r\n ? []\r\n : component.limit_vehicle_type_ids;\r\n // limit document types\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n component.limit_document_type_ids_array =\r\n component.limit_document_type_ids == null\r\n ? []\r\n : component.limit_document_type_ids;\r\n\r\n if (component.questions.length > 0) {\r\n component.questions.forEach(function(question) {\r\n component.data_set.data_points.forEach(\r\n function(data_point) {\r\n if (\r\n data_point.id ==\r\n question.data_point_id &&\r\n data_point.attribute_id ==\r\n question.attribute_id\r\n ) {\r\n data_point.sort_order =\r\n question.sort_order;\r\n question.point = data_point;\r\n component.data_points.push(\r\n data_point\r\n );\r\n }\r\n }\r\n );\r\n });\r\n } else {\r\n component.data_set.data_points.forEach(function(\r\n point\r\n ) {\r\n var question = {};\r\n\r\n if (point.visible) {\r\n question.id = guid();\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id =\r\n component.section_id;\r\n question.sort_order = point.sort_order;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.required = point.required;\r\n question.component_id = component.id;\r\n question.question_type =\r\n point.question_type;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show =\r\n point.select_show;\r\n question.options = point.options;\r\n question.vertical = true;\r\n question.multiple = false;\r\n question.disabled = false;\r\n question.update_from_form =\r\n point.table_name != null\r\n ? true\r\n : false;\r\n question.share_files = false;\r\n question.ssn_setting = 0;\r\n question.masked_setting = false;\r\n question.file_upload_description = true;\r\n question.show_in_grid =\r\n point.question_type.encrypted ==\r\n true\r\n ? 0\r\n : 1;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id =\r\n point.attribute_id;\r\n question.compound_id =\r\n point.compound_id;\r\n question.instruction_text =\r\n point.instruction_text;\r\n question.point = point;\r\n\r\n if (\r\n point.name ==\r\n \"CTCSS Receive Tone\" ||\r\n point.name ==\r\n \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n\r\n component.questions.push(question);\r\n component.data_points.push(point);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.dataSetChange = function(component, sets) {\r\n component.questions = [];\r\n component.data_points = [];\r\n\r\n if (component.data_set_id == null) {\r\n component.data_set = {};\r\n } else {\r\n sets.forEach(function(set) {\r\n if (set.id == component.data_set_id) {\r\n component.data_set = angular.copy(set);\r\n if (component.license_category_id == null) {\r\n component.license_category_id =\r\n set.default_license_category_id;\r\n } else {\r\n if (\r\n component.parameters\r\n .orignalLicenseID == null &&\r\n component.parameters.license_id !=\r\n null\r\n ) {\r\n component.parameters.orignalLicenseID =\r\n component.parameters.license_id;\r\n }\r\n\r\n component.parameters.license_category_id =\r\n component.license_category_id;\r\n\r\n if (\r\n component.data_set\r\n .default_license_category_id ==\r\n component.license_category_id\r\n ) {\r\n component.parameters.license_id =\r\n component.parameters.orignalLicenseID;\r\n } else {\r\n component.parameters.license_id = null;\r\n if (\r\n component.data_set.code ==\r\n \"certification\"\r\n ) {\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n point.code ==\r\n \"certification_application_type\"\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length -\r\n 1 -\r\n index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n component.data_set\r\n .license_category_specific &&\r\n point.license_category_id !=\r\n null &&\r\n point.license_category_id !=\r\n component.license_category_id\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length - 1 - index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n });\r\n\r\n // limit positions\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n component.limit_position_ids_array = component.limit_position_ids_array =\r\n component.limit_position_ids == null\r\n ? []\r\n : component.limit_position_ids;\r\n // limit vehicle types\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n component.limit_vehicle_type_ids_array = component.limit_vehicle_type_ids_array =\r\n component.limit_vehicle_type_ids == null\r\n ? []\r\n : component.limit_vehicle_type_ids;\r\n // limit document types\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n component.limit_document_type_ids_array = component.limit_document_type_ids_array =\r\n component.limit_document_type_ids == null\r\n ? []\r\n : component.limit_document_type_ids;\r\n // skills\r\n component.parameters.skill_question_ids =\r\n component.skill_question_ids;\r\n component.parameters.skill_show_points =\r\n component.skill_show_points;\r\n component.parameters.skill_default =\r\n component.skill_default;\r\n\r\n if (\r\n component.initialQuestions != null &&\r\n component.initialQuestions[\r\n component.component_type_id\r\n ] != null\r\n ) {\r\n component.initialQuestions[\r\n component.component_type_id\r\n ].forEach(function(initialQuestion) {\r\n component.data_set.data_points.forEach(\r\n function(data_point) {\r\n if (\r\n data_point.id ==\r\n initialQuestion.data_point_id &&\r\n data_point.attribute_id ==\r\n initialQuestion.attribute_id\r\n ) {\r\n data_point.initialFound = true;\r\n data_point.sort_order =\r\n initialQuestion.sort_order;\r\n initialQuestion.point = data_point;\r\n component.questions.push(\r\n initialQuestion\r\n );\r\n component.data_points.push(\r\n data_point\r\n );\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n var initialLength = component.questions.length;\r\n\r\n component.data_set.data_points.forEach(function(\r\n point\r\n ) {\r\n var question = {};\r\n\r\n if (!point.initialFound && point.visible) {\r\n question.id = guid();\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id = component.section_id;\r\n question.sort_order = ++initialLength;\r\n point.sort_order = question.sort_order;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.required = point.required;\r\n question.component_id = component.id;\r\n question.question_type =\r\n point.question_type;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show = point.select_show;\r\n question.options = point.options;\r\n question.vertical = true;\r\n question.multiple = false;\r\n question.disabled = false;\r\n question.update_from_form =\r\n point.table_name != null ? true : false;\r\n question.share_files = false;\r\n question.ssn_setting = 0;\r\n question.masked_setting = false;\r\n question.file_upload_description = true;\r\n question.show_in_grid =\r\n point.question_type.encrypted == true\r\n ? 0\r\n : 1;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id = point.attribute_id;\r\n question.compound_id = point.compound_id;\r\n question.instruction_text =\r\n point.instruction_text;\r\n question.point = point;\r\n\r\n if (\r\n point.name == \"CTCSS Receive Tone\" ||\r\n point.name == \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n\r\n component.questions.push(question);\r\n component.data_points.push(point);\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.foreignDataSetInit = function(component, set) {\r\n component.data_points = [];\r\n\r\n if (component.data_set_id == null) {\r\n component.data_set = {};\r\n } else {\r\n component.data_set = set;\r\n\r\n component.questions.forEach(function(question) {\r\n component.data_set.data_points.forEach(function(\r\n data_point\r\n ) {\r\n if (\r\n data_point.id ==\r\n question.data_point_id &&\r\n data_point.attribute_id ==\r\n question.attribute_id\r\n ) {\r\n data_point.sort_order =\r\n question.sort_order;\r\n question.point = data_point;\r\n component.data_points.push(data_point);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n $scope.foreignDataSetChange = function(\r\n allow_add,\r\n allow_edit,\r\n question,\r\n componentTypes\r\n ) {\r\n var old_data_points =\r\n question.sub_components !== undefined &&\r\n question.sub_components[0] !== undefined\r\n ? question.sub_components[0].data_points\r\n : null;\r\n var old_questions =\r\n question.sub_components !== undefined &&\r\n question.sub_components[0] !== undefined\r\n ? question.sub_components[0].questions\r\n : null;\r\n\r\n if (\r\n (allow_add || allow_edit) &&\r\n (old_data_points != null || old_questions != null)\r\n ) {\r\n // One or the other has already been selected, no need to re-load all the data points\r\n question.sub_components[0].component_conditions = [];\r\n if (allow_add) {\r\n var condition = {\r\n id: guid(),\r\n component_id: question.sub_components[0].id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1,\r\n operator: \"=\"\r\n };\r\n question.sub_components[0].component_conditions.push(\r\n condition\r\n );\r\n }\r\n if (allow_edit) {\r\n var guidCondition = {\r\n id: guid(),\r\n component_id: question.sub_components[0].id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: allow_add ? false : true,\r\n left_parenthesis: 1,\r\n right_parenthesis: 0,\r\n sort_order: 2,\r\n operator: \"<>\"\r\n };\r\n question.sub_components[0].component_conditions.push(\r\n guidCondition\r\n );\r\n var nullCondition = {\r\n id: guid(),\r\n component_id: question.sub_components[0].id,\r\n question_id: question.id,\r\n value: null,\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 1,\r\n sort_order: 3,\r\n operator: \"<>\"\r\n };\r\n question.sub_components[0].component_conditions.push(\r\n nullCondition\r\n );\r\n }\r\n } else if (allow_add || allow_edit) {\r\n // First time clicking one\r\n question.sub_components = [];\r\n var component_type = {};\r\n componentTypes.forEach(function(componentType) {\r\n if (componentType.code == \"dataset\") {\r\n component_type = componentType;\r\n }\r\n });\r\n\r\n var component = {\r\n id: guid(),\r\n section_id: question.section_id,\r\n sort_order: question.sub_components.length,\r\n parent_question_id: question.id,\r\n questions: [],\r\n data_points: [],\r\n edit: true,\r\n component_conditions: [],\r\n limit_document_type_ids: null,\r\n limit_position_ids: null,\r\n limit_vehicle_type_ids: null,\r\n skill_question_ids: null,\r\n skill_show_points: null,\r\n skill_default: null\r\n };\r\n\r\n component.data_set_id =\r\n question.point.foreign_data_set_id;\r\n component.data_set =\r\n question.point.foreign_data_set;\r\n component.isForeignDataSet = true;\r\n\r\n component.component_type_id = component_type.id;\r\n component.component_type = component_type;\r\n\r\n if (allow_add) {\r\n var condition = {\r\n id: guid(),\r\n component_id: component.id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1,\r\n operator: \"=\"\r\n };\r\n component.component_conditions.push(condition);\r\n }\r\n if (allow_edit) {\r\n var guidCondition = {\r\n id: guid(),\r\n component_id: component.id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: allow_add ? false : true,\r\n left_parenthesis: 1,\r\n right_parenthesis: 0,\r\n sort_order: 2,\r\n operator: \"<>\"\r\n };\r\n component.component_conditions.push(\r\n guidCondition\r\n );\r\n var nullCondition = {\r\n id: guid(),\r\n component_id: component.id,\r\n question_id: question.id,\r\n value: null,\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 1,\r\n sort_order: 3,\r\n operator: \"<>\"\r\n };\r\n component.component_conditions.push(\r\n nullCondition\r\n );\r\n }\r\n\r\n var initialLength = 0;\r\n\r\n component.data_set.data_points\r\n .sort(sortObjectArray(\"sort_order\"))\r\n .forEach(function(point) {\r\n var question = {};\r\n\r\n if (point.visible) {\r\n question.id = guid();\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id =\r\n component.section_id;\r\n question.sort_order = ++initialLength;\r\n point.sort_order = question.sort_order;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.required = point.required;\r\n question.component_id = component.id;\r\n question.question_type =\r\n point.question_type;\r\n question.update_from_form =\r\n point.table_name != null\r\n ? true\r\n : false;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show =\r\n point.select_show;\r\n question.options = point.options;\r\n question.point = point;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id =\r\n point.attribute_id;\r\n question.compound_id =\r\n point.compound_id;\r\n\r\n if (\r\n point.name ==\r\n \"CTCSS Receive Tone\" ||\r\n point.name ==\r\n \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n\r\n component.questions.push(question);\r\n component.data_points.push(point);\r\n }\r\n });\r\n question.sub_components.push(component);\r\n } else {\r\n // Both deselected\r\n question.sub_components = [];\r\n }\r\n };\r\n\r\n $scope.dataPointChange = function(component) {\r\n component.questions = [];\r\n\r\n component.data_points.forEach(function(point) {\r\n var setProperties = true;\r\n var question = {};\r\n\r\n if (\r\n component.initialQuestions != null &&\r\n component.initialQuestions[\r\n component.component_type_id\r\n ] != null\r\n ) {\r\n component.initialQuestions[\r\n component.component_type_id\r\n ].forEach(function(initialQuestion) {\r\n if (\r\n initialQuestion.data_point_id ==\r\n point.id &&\r\n point.attribute_id ==\r\n initialQuestion.attribute_id\r\n ) {\r\n question = initialQuestion;\r\n setProperties = false;\r\n }\r\n });\r\n }\r\n\r\n if (setProperties) {\r\n question.id = guid();\r\n question.required = point.required;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id = component.section_id;\r\n question.sort_order = point.sort_order;\r\n question.component_id = component.id;\r\n question.question_type = point.question_type;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show = point.select_show;\r\n question.options = point.options;\r\n question.vertical = true;\r\n question.multiple = false;\r\n question.disabled = false;\r\n question.update_from_form =\r\n point.table_name != null ? true : false;\r\n question.share_files = false;\r\n question.ssn_setting = 0;\r\n question.masked_setting = false;\r\n question.file_upload_description = true;\r\n question.show_in_grid =\r\n point.question_type.encrypted == true\r\n ? 0\r\n : 1;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id = point.attribute_id;\r\n question.compound_id = point.compound_id;\r\n question.instruction_text =\r\n point.instruction_text;\r\n }\r\n\r\n question.point = point;\r\n if (\r\n point.name == \"CTCSS Receive Tone\" ||\r\n point.name == \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n component.questions.push(question);\r\n });\r\n };\r\n\r\n $scope.limitPositionsChange = function(component) {\r\n if (component.limit_position_ids_array != null) {\r\n component.limit_position_ids = null;\r\n\r\n component.limit_position_ids_array\r\n .sort()\r\n .forEach(function(position) {\r\n if (component.limit_position_ids == null) {\r\n component.limit_position_ids =\r\n position.id;\r\n } else {\r\n component.limit_position_ids +=\r\n \",\" + position.id;\r\n }\r\n });\r\n\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n }\r\n // get positions question and let it know to refresh its values\r\n var question = getByAttr(\r\n component.questions,\r\n \"data_point_code\",\r\n \"service_users_position\"\r\n );\r\n if (question != null) {\r\n question.refreshOptions =\r\n component.limit_position_ids;\r\n }\r\n };\r\n\r\n $scope.limitVehicleTypesChange = function (component) {\r\n if (component.limit_vehicle_type_ids_array != null) {\r\n component.limit_vehicle_type_ids = null;\r\n\r\n component.limit_vehicle_type_ids_array\r\n .sort()\r\n .forEach(function (vehicle_types) {\r\n if (component.limit_vehicle_type_ids == null) {\r\n component.limit_vehicle_type_ids =\r\n vehicle_types.id;\r\n } else {\r\n component.limit_vehicle_type_ids +=\r\n \",\" + vehicle_types.id;\r\n }\r\n });\r\n\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n }\r\n // get service_vehicle_type_restriction question and let it know to refresh its values\r\n var question = getByAttr(\r\n component.questions,\r\n \"data_point_code\",\r\n \"service_vehicle_type_restriction\"\r\n );\r\n if (question != null) {\r\n question.refreshOptions =\r\n component.limit_vehicle_type_ids;\r\n }\r\n };\r\n\r\n $scope.limitDocumentTypesChange = function (component) {\r\n if (component.limit_document_type_ids_array != null) {\r\n component.limit_document_type_ids = null;\r\n\r\n component.limit_document_type_ids_array\r\n .sort()\r\n .forEach(function (document_types) {\r\n if (component.limit_document_type_ids == null) {\r\n component.limit_document_type_ids =\r\n document_types.id;\r\n } else {\r\n component.limit_document_type_ids +=\r\n \",\" + document_types.id;\r\n }\r\n });\r\n\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n }\r\n // get service_document_type_restriction question and let it know to refresh its values\r\n var question = getByAttr(\r\n component.questions,\r\n \"data_point_code\",\r\n \"service_financials_supporting_documents\"\r\n );\r\n if (question != null) {\r\n question.refreshOptions =\r\n component.limit_document_type_ids;\r\n }\r\n };\r\n\r\n $scope.conditionalChange = function (component) {\r\n if (component.conditional) {\r\n component.component_conditions.push({\r\n id: guid(),\r\n and_flag: true,\r\n operator: \"=\",\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1\r\n });\r\n } else {\r\n component.component_conditions = [];\r\n }\r\n };\r\n\r\n $scope.formElementChange = function(\r\n component,\r\n form_elements\r\n ) {\r\n form_elements.forEach(function(element) {\r\n if (element.id == component.element_id) {\r\n component.element_code = element.code;\r\n component.element_instructions =\r\n element.description;\r\n }\r\n });\r\n };\r\n\r\n $scope.allowMultipleGroupChange = function(component) {\r\n component.update_from_form_update = false;\r\n component.update_from_form_delete = false;\r\n };\r\n \r\n $scope.showShareFiles = function(component) {\r\n var show = false;\r\n\r\n if (\r\n component.questions.length == 1 &&\r\n component.questions[0].question_type != null &&\r\n component.questions[0].question_type.code ==\r\n \"file_upload\"\r\n ) {\r\n show = true;\r\n } else {\r\n component.share_files = false;\r\n }\r\n\r\n return show;\r\n };\r\n\r\n $scope.revertElement = function(element) {\r\n angular.copy(element.original, element);\r\n element.edit = false;\r\n };\r\n\r\n // Ckeditor Setup\r\n $scope.cke_skin = 'bootstrapck';\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-component/form-builder-component.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormBuilderComponentConditions', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n component: '=?',\r\n form: '=?',\r\n isDisabled: '=?'\r\n },\r\n controller: ['$scope', 'ApplicationTypes', '$injector', '$filter', function ($scope, ApplicationTypes, $injector, $filter) {\r\n $scope.$watchGroup(['form', 'component'], function (newValues, oldValues) {\r\n var form = newValues[0];\r\n var conditionalComponent = newValues[1];\r\n\r\n if (form != null && conditionalComponent != null) {\r\n $scope.questions = [];\r\n var hitComponent = false;\r\n\r\n form.pages.forEach(function (page) {\r\n if (!hitComponent) {\r\n page.sections.forEach(function (section) {\r\n if (!hitComponent) {\r\n section.components.forEach(function (component) {\r\n hitComponent = $scope.getComponentQuestion(component, hitComponent, conditionalComponent, section, page);\r\n })\r\n }\r\n })\r\n }\r\n })\r\n\r\n $scope.component.component_conditions.forEach(function (condition) {\r\n $scope.questionChange($filter('filter')($scope.questions, { id: condition.question_id })[0], condition, true);\r\n })\r\n }\r\n })\r\n \r\n $scope.getComponentQuestion = function (component, hitComponent, conditionalComponent, section, page) {\r\n if (component.id == conditionalComponent.id) {\r\n hitComponent = true;\r\n }\r\n\r\n if (!hitComponent) {\r\n if (component.questions != null) {\r\n component.questions.forEach(function (question) {\r\n question.group = page.name + ': ' + section.name;\r\n $scope.questions.unshift(question);\r\n\r\n if (!hitComponent) {\r\n if (question.sub_components == null) {\r\n question.sub_components = [];\r\n }\r\n\r\n question.sub_components.forEach(function (subComponent) {\r\n hitComponent = $scope.getComponentQuestion(subComponent, hitComponent, conditionalComponent, section, page);\r\n })\r\n }\r\n })\r\n }\r\n }\r\n\r\n return hitComponent;\r\n }\r\n\r\n $scope.getComponentFromID = function (componentID) {\r\n var result = null;\r\n\r\n if ($scope.form != null) {\r\n $scope.form.pages.forEach(function (page) {\r\n if (result == null) {\r\n page.sections.forEach(function (section) {\r\n if (result == null) {\r\n section.components.forEach(function (component) {\r\n if (component.id == componentID) {\r\n result = component;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n $scope.andOrOptions = [\r\n { id: true, name: 'and' },\r\n { id: false, name: 'or' }\r\n ];\r\n $scope.leftParenOptions = [\r\n { id: 0, name: '' },\r\n { id: 1, name: '(' },\r\n { id: 2, name: '((' }\r\n ];\r\n $scope.rightParenOptions = [\r\n { id: 0, name: '' },\r\n { id: 1, name: ')' },\r\n { id: 2, name: '))' }\r\n ];\r\n $scope.dateOptions = [\r\n { id: 0, name: 'Reference Date' },\r\n { id: 1, name: 'Days From Today' },\r\n { id: 2, name: 'Months From Today' }\r\n ];\r\n\r\n $scope.questionChange = function (question, condition, initial) {\r\n condition.loading = true;\r\n if (question != null) {\r\n if (question.question_type.code == 'date') {\r\n condition.operators = [\r\n { id: '=', name: '=' },\r\n { id: '<>', name: '<>' },\r\n { id: '>', name: '>' },\r\n { id: '<', name: '<' }\r\n ];\r\n if (condition.date_option > 0) {\r\n condition.value = parseInt(condition.value);\r\n if (isNaN(condition.value)) {\r\n condition.value = null;\r\n }\r\n }\r\n }\r\n else {\r\n condition.operators = [\r\n { id: '=', name: '=' },\r\n { id: '<>', name: '<>' }\r\n ];\r\n }\r\n\r\n condition.options = [];\r\n condition.selectValue = 'id';\r\n condition.selectShow = 'name';\r\n condition.question_type = question.question_type.code;\r\n\r\n if (!initial) {\r\n condition.value = null;\r\n }\r\n\r\n if (question.question_type.code == 'yesno') {\r\n condition.options = [\r\n { id: true, name: 'Yes' },\r\n { id: false, name: 'No' }\r\n ];\r\n condition.loading = false;\r\n }\r\n else if (question.service != null) {\r\n var service = $injector.get(question.service);\r\n if (question.method == null) {\r\n question.method = 'get';\r\n }\r\n var arg = {};\r\n if (question.service == 'LicenseCategoryLevels' || question.service == 'LicenseCategoryCertificationStatuses') {\r\n //Get the license category of the component question\r\n var component = $scope.getComponentFromID(question.component_id);\r\n if (component) {\r\n arg.license_category_id = component.license_category_id;\r\n }\r\n //Pass along the license_id in case the license is the same license category\r\n if ($scope.component.parameters) {\r\n arg.current_license_id = $scope.component.parameters.license_id || $scope.component.parameters.orignalLicenseID;\r\n }\r\n }\r\n service[question.method](arg).then(function (data) { //data_section_name is being set as parameter dynamically based on question.method \r\n condition.options = data;\r\n condition.loading = false;\r\n });\r\n }\r\n else if (question.question_type.code == 'application_type') {\r\n //Application type will always be the same license category as the current license, so only need to pass along the license_id\r\n var parameters = {};\r\n if ($scope.component.parameters) {\r\n parameters.license_id = $scope.component.parameters.license_id || $scope.component.parameters.orignalLicenseID;\r\n }\r\n ApplicationTypes.get(parameters).then(function (types) {\r\n types.forEach(function (type) {\r\n condition.options.push({ id: type.id, name: type.label || type.name });\r\n });\r\n condition.loading = false;\r\n });\r\n }\r\n else if (question.options != null){\r\n if (angular.isString(question.options)) {\r\n question.options.split(',').forEach(function (value) {\r\n condition.options.push({ id: value.trim(), name: value.trim() });\r\n })\r\n }\r\n else{\r\n condition.options = question.options;\r\n }\r\n\r\n condition.loading = false;\r\n }\r\n else {\r\n condition.loading = false;\r\n }\r\n }\r\n else {\r\n condition.loading = false;\r\n }\r\n }\r\n\r\n $scope.add = function (array, order) {\r\n array.push({ and_flag: true, left_parenthesis: 0, operator: '=', right_parenthesis: 0, sort_order: order });\r\n }\r\n\r\n $scope.remove = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n }],\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder/form-builder-component-conditions/form-builder-component-conditions.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n \r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormBuilderQuestionList', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n form: '=?',\r\n component: '=?',\r\n question: '=?',\r\n index: '@?'\r\n },\r\n controller: ['$scope', function ($scope) {\r\n $scope.$watch('form.allDisabled', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.disabled = $scope.form.allDisabled;\r\n }\r\n });\r\n $scope.$watch('form.allUpdateFromForm', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.update_from_form = $scope.form.allUpdateFromForm;\r\n }\r\n });\r\n $scope.$watch('form.allShowInGrid', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.show_in_grid = $scope.form.allShowInGrid;\r\n }\r\n });\r\n $scope.$watch('form.allRequired', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.required = $scope.form.allRequired;\r\n }\r\n });\r\n $scope.applicationTypeExists = function (question) {\r\n var exists = false;\r\n if (question.data_point_code == 'certification_levels') {\r\n $scope.component.questions.forEach(function (q) {\r\n if (q.question_type.code == 'application_type') {\r\n $scope.question.required = q.required;\r\n $scope.question.disabled = q.disabled;\r\n $scope.question.update_from_form = q.update_from_form;\r\n exists = true;\r\n }\r\n })\r\n }\r\n\r\n return exists;\r\n }\r\n }],\r\n\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder/form-builder-question-list/form-builder-question-list.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormBuilderQuestionShow', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n form: '=?',\r\n question: '=?',\r\n resultSet: '=?',\r\n component: '=?',\r\n parameters: '=?'\r\n },\r\n controller: ['$scope', function ($scope) {\r\n $scope.$watch('form.apply_label_position', function (newValue, oldValue) {\r\n if (newValue != oldValue) {\r\n $scope.question.label_position = $scope.form.label_position;\r\n }\r\n });\r\n\r\n $scope.applicationTypeExists = function (question) {\r\n var exists = false;\r\n\r\n if (question.data_point_code == 'certification_levels') {\r\n $scope.component.questions.forEach(function (q) {\r\n if (q.question_type.code == 'application_type') {\r\n exists = true;\r\n }\r\n })\r\n }\r\n\r\n return exists;\r\n }\r\n }],\r\n\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder/form-builder-question-show/form-builder-question-show.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","\"use strict\";\r\n\r\nangular\r\n .module(\"imagetrend.components\")\r\n .directive(\"hlpFormBuilderQuestionsEdit\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\",\r\n formType: \"=?\",\r\n sets: \"=?\",\r\n elements: \"=?\",\r\n form: \"=?\",\r\n resultSet: \"=?\",\r\n parentComponent: \"=?\",\r\n parameters: \"=?\",\r\n attachments: \"=?\",\r\n foreignDataSetChange: \"&?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"$modal\",\r\n \"DocumentTypes\",\r\n \"$rootScope\",\r\n function($scope, $modal, DocumentTypes, $rootScope) {\r\n $scope.ssn_setting_options = [\r\n { id: 0, name: \"Masked\" },\r\n { id: 1, name: \"Last 4 Visible\" },\r\n { id: 2, name: \"Visible\" }\r\n ];\r\n\r\n $scope.label_position_options = [\r\n { id: true, name: \"Top\" },\r\n { id: false, name: \"Left\" }\r\n ];\r\n $scope.true_false_options = [\r\n { id: \"true\", name: \"True\" },\r\n { id: \"false\", name: \"False\" }\r\n ];\r\n $scope.yes_no_options = [\r\n { id: \"true\", name: \"Yes\" },\r\n { id: \"false\", name: \"No\" }\r\n ];\r\n\r\n $scope.changeUpdateFromFormBasedOnDisabled = function (question) {\r\n if (question.disabled === true) {\r\n question.update_from_form = false;\r\n }\r\n else {\r\n // Clear out the warning message\r\n question.updateFromFormInstructions = null;\r\n }\r\n }\r\n\r\n $scope.setUpdateFromFormInstructions = function (question) {\r\n if (question.disabled === true && question.update_from_form === true) {\r\n question.updateFromFormInstructions = \"Warning: using update from form with disabled fields is not guaranteed to prevent users from updating values.\";\r\n }\r\n else {\r\n question.updateFromFormInstructions = null;\r\n }\r\n }\r\n \r\n $scope.applicationTypeExists = function(\r\n component,\r\n question\r\n ) {\r\n var exists = false;\r\n\r\n if (\r\n question.data_point_code ==\r\n \"certification_levels\"\r\n ) {\r\n component.questions.forEach(function(q) {\r\n if (\r\n q.question_type.code ==\r\n \"application_type\"\r\n ) {\r\n question.required = q.required;\r\n question.disabled = q.disabled;\r\n question.update_from_form =\r\n q.update_from_form;\r\n exists = true;\r\n }\r\n });\r\n }\r\n\r\n return exists;\r\n };\r\n\r\n DocumentTypes.getForForm().then(function(data) {\r\n $scope.document_types = data;\r\n });\r\n\r\n $scope.questionOrderChanged = function(component) {\r\n component.questions.forEach(function(\r\n question,\r\n index\r\n ) {\r\n question.sort_order = index + 1;\r\n question.point.sort_order = index + 1;\r\n });\r\n };\r\n\r\n $scope.saveQuestion = function(question) {\r\n if (\r\n !question.question_type.allow_sub_components &&\r\n !question.allow_dynamic_addition &&\r\n !question.allow_dynamic_edit &&\r\n question.sub_components != null &&\r\n question.sub_components.length > 0\r\n ) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return (\r\n \"The \" +\r\n question.question_type\r\n .name +\r\n \" question type does not allow sub questions.\\nAre you sure you want to save, which will remove all sub questions?\"\r\n );\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n question.sub_components = [];\r\n question.edit = false;\r\n } else {\r\n return;\r\n }\r\n });\r\n } else {\r\n question.edit = false;\r\n }\r\n };\r\n\r\n $scope.addQuestion = function(component) {\r\n if (component.questions == null) {\r\n component.questions = [];\r\n }\r\n\r\n var label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n\r\n component.questions.push({\r\n id: guid(),\r\n section_id: component.section_id,\r\n component_id: component.id,\r\n sort_order: component.questions.length,\r\n sub_components: [],\r\n edit: true,\r\n required: false,\r\n vertical: true,\r\n multiple: false,\r\n ssn_setting: 0,\r\n file_upload_description: true,\r\n file_upload_existing_docs: false,\r\n disabled: false,\r\n default_value: null,\r\n label_position: label_position,\r\n update_from_form: false,\r\n share_files: false,\r\n show_in_grid: false,\r\n masked_setting: false\r\n });\r\n };\r\n\r\n $scope.addSubComponent = function(question, component) {\r\n if (question.sub_components == null) {\r\n question.sub_components = [];\r\n }\r\n\r\n question.sub_components.push({\r\n id: guid(),\r\n parent_question_id: question.id,\r\n sort_order: question.sub_components.length,\r\n questions: [],\r\n edit: true,\r\n section_id: question.section_id,\r\n component_conditions: [],\r\n limit_document_type_ids: null,\r\n limit_position_ids: null,\r\n limit_vehicle_type_ids: null,\r\n skill_question_ids: null,\r\n skill_show_points: null,\r\n skill_default: null\r\n });\r\n };\r\n\r\n $scope.removeComponent = function(components, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this component?\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n components.splice(index, 1);\r\n }\r\n });\r\n };\r\n\r\n $scope.questionTypeInit = function (question, types) {\r\n if (types.length > 0) {\r\n if (question.question_type_id == null) {\r\n question.question_type_id = types[1].id;\r\n question.question_type = {};\r\n }\r\n types.forEach(function (type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n if (type.code == \"deficiency\") {\r\n question.required = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.questionTypeInit = function (question, types) {\r\n // question type id for calculated_field\r\n if (question.question_type_id == \"b2932f47-8938-4999-92a6-f4a33ee55f8a\" && types.length > 0) {\r\n types.forEach(function (type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n }\r\n });\r\n }\r\n else if (\r\n question.question_type_id == null &&\r\n types.length > 0\r\n ) {\r\n question.question_type_id = types[1].id;\r\n question.question_type = {};\r\n types.forEach(function (type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n if (type.code == \"deficiency\") {\r\n question.required = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.questionTypeChange = function(question, types) {\r\n if (question.question_type_id == null) {\r\n question.question_type = {};\r\n } else {\r\n types.forEach(function(type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n if (type.code == \"deficiency\") {\r\n question.required = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.questionNameChange = function(question) {\r\n if (question.old_name == question.label) {\r\n question.label = question.name;\r\n }\r\n question.old_name = question.name;\r\n };\r\n\r\n $scope.removeQuestion = function(questions, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this question? Note that if this question is included in a form condition and/or conditional license charge, deleting it may cause unexpected results for the condition or charge. Please adjust any associated conditions and charges to remove this question.\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n questions.splice(index, 1);\r\n }\r\n });\r\n };\r\n\r\n // Functions for editing and cancelling out of questions and components (works for both)\r\n $scope.editElement = function(element) {\r\n element.edit = true;\r\n element.original = angular.copy(element);\r\n };\r\n $scope.revertElement = function(element) {\r\n angular.copy(element.original, element);\r\n element.edit = false;\r\n };\r\n\r\n $scope.questionOptions = function(component) {\r\n return {\r\n containment: \"#component_\" + component.id,\r\n scrollableContainer:\r\n \"#component_\" + component.id,\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope\r\n .sortableScope.$id ===\r\n destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n if (\r\n component.component_type.code ==\r\n \"dataset\"\r\n ) {\r\n $scope.questionOrderChanged(component);\r\n $scope.form.the_form.$setDirty();\r\n }\r\n }\r\n };\r\n };\r\n\r\n $scope.subComponentOptions = function(question) {\r\n return {\r\n containment: \"#subComponents_\" + question.id,\r\n scrollableContainer:\r\n \"#subComponents_\" + question.id,\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope\r\n .sortableScope.$id ===\r\n destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n }\r\n };\r\n };\r\n\r\n $scope.toggleValidation = function(question) {\r\n question.showValidation =\r\n typeof question.showValidation == \"undefined\"\r\n ? true\r\n : !question.showValidation;\r\n };\r\n\r\n $scope.getDocumentURL = function(component) {\r\n return (\r\n $rootScope.internalURL +\r\n \"controller.cfm?method=publicPortalService.openDocument\" +\r\n \"&documentID=\" +\r\n component.document_id.toUpperCase() +\r\n \"&code=\" +\r\n component.document_code\r\n );\r\n };\r\n\r\n $scope.checkIfImageOrPDF = function (component) {\r\n if (component.document_file_name) {\r\n var extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf'];\r\n return extensions.includes(component.document_file_name.split('.').pop().toLowerCase());\r\n }\r\n return false;\r\n };\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-questions-edit/form-builder-questions-edit.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n ]);\r\n","\"use strict\";\r\n\r\nangular\r\n .module(\"imagetrend.components\")\r\n .directive(\"hlpFormBuilderExamSkillsEdit\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"EXSkill\",\r\n \"EXSkillCategory\",\r\n function($scope, EXSkill, EXSkillCategory) {\r\n $scope.skillsloading = true;\r\n $scope.SkillCategoriesFilter = [];\r\n $scope.selectedskills = [];\r\n $scope.bulkActionItems = [];\r\n $scope.showScores = false;\r\n $scope.skillDefault = 0;\r\n $scope.skills = [];\r\n $scope.allSKills = [];\r\n\r\n $scope.skillsDefaultOptions = [\r\n { id: 0, name: \"Unselected\", is_default: true },\r\n { id: 1, name: \"Pass\" },\r\n { id: 2, name: \"Fail\" }\r\n ];\r\n\r\n if ($scope.allSKills.length == 0) {\r\n EXSkill.getActive().then(function(Skills) {\r\n if ($scope.component.skill_show_points != null)\r\n $scope.showScores =\r\n $scope.component.skill_show_points;\r\n if ($scope.component.skill_default != null)\r\n $scope.skillDefault =\r\n $scope.component.skill_default;\r\n for (var x in Skills) {\r\n for (var y in Skills[x].options) {\r\n Skills[x].total_points +=\r\n Skills[x].options[y].points;\r\n }\r\n }\r\n $scope.skills = angular.copy(Skills);\r\n $scope.allSKills = angular.copy(Skills);\r\n\r\n $scope.updateBothLists();\r\n $scope.skillsloading = false;\r\n });\r\n }\r\n\r\n $scope.updateBothLists = function() {\r\n $scope.selectedskills = [];\r\n if ($scope.component.skill_question_ids != null) {\r\n $scope.bulkActionItems = $scope.component.skill_question_ids.split(\r\n \",\"\r\n );\r\n }\r\n\r\n $scope.addSelecteSkills();\r\n $scope.skillsloading = false;\r\n };\r\n\r\n EXSkillCategory.get().then(function(SkillCategories) {\r\n $scope.SkillCategories = SkillCategories;\r\n\r\n var x, format;\r\n for (x in $scope.SkillCategories) {\r\n format = {\r\n name: $scope.SkillCategories[x].name,\r\n id: $scope.SkillCategories[x].name\r\n };\r\n $scope.SkillCategoriesFilter.push(format);\r\n }\r\n\r\n $scope.loading = false;\r\n });\r\n\r\n $scope.skillscolumns = [\r\n {\r\n label: \"Name\",\r\n field: \"name\"\r\n },\r\n {\r\n label: \"Code\",\r\n field: \"code\"\r\n },\r\n {\r\n label: \"Critical\",\r\n field: \"critical\",\r\n type: \"yesno\"\r\n },\r\n {\r\n label: \"Category\",\r\n field: \"exam_skill_category_name\"\r\n },\r\n {\r\n label: \"Total Points\",\r\n field: \"total_points\"\r\n },\r\n {\r\n label: \"Last Modified\",\r\n field: \"modifiedon\",\r\n type: \"datetime\"\r\n }\r\n ];\r\n\r\n $scope.skillfilters = [\r\n {\r\n name: \"Critical\",\r\n field: \"critical\",\r\n options: [\r\n { name: \"Not Critical\", id: false },\r\n { name: \"Critical\", id: true }\r\n ]\r\n },\r\n {\r\n name: \"Category\",\r\n field: \"exam_skill_category_name\",\r\n options: $scope.SkillCategoriesFilter\r\n }\r\n ];\r\n\r\n $scope.addSelecteSkills = function() {\r\n $scope.bulkActionItems.forEach(function(skillid) {\r\n $scope.skills.forEach(function(skill) {\r\n if (skill.id == skillid.trim()) {\r\n $scope.selectedskills.push(skill);\r\n $scope.skills.splice(\r\n $scope.skills.indexOf(skill),\r\n 1\r\n );\r\n }\r\n });\r\n });\r\n $scope.setSelectedIDs();\r\n };\r\n\r\n $scope.setSelectedIDs = function() {\r\n $scope.component.skill_show_points =\r\n $scope.showScores;\r\n $scope.component.skill_default =\r\n $scope.skillDefault;\r\n $scope.component.skill_question_ids = null;\r\n $scope.selectedskills.forEach(function(skill) {\r\n if ($scope.component.skill_question_ids == null)\r\n $scope.component.skill_question_ids =\r\n skill.id;\r\n else\r\n $scope.component.skill_question_ids +=\r\n \",\" + skill.id;\r\n });\r\n $scope.component.updateSelectedList = true;\r\n };\r\n\r\n $scope.$watch(\"component.updateEditList\", function(\r\n newList,\r\n oldList\r\n ) {\r\n if ($scope.component.updateEditList) {\r\n $scope.component.updateEditList = false;\r\n $scope.component.updateSelectedList = false;\r\n $scope.skills = [];\r\n\r\n $scope.skills = angular.copy($scope.allSKills);\r\n $scope.updateBothLists();\r\n }\r\n });\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-skills-edit/form-builder-skills-edit.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n ]);\r\n","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormBuilderSkillsList\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"EXSkill\",\r\n \"$sce\",\r\n function ($scope, EXSkill, $sce) {\r\n $scope.skillsloading = true;\r\n $scope.selectedskills = [];\r\n $scope.skills = [];\r\n\r\n $scope.trust = function (htmlText) {\r\n if (htmlText != null) {\r\n //removing first pair of

    tags to keep description on first line of skill\r\n htmlText = (htmlText !== null) ? htmlText.replace('

    ', '').replace('

    ', '') : '';\r\n }\r\n return $sce.trustAsHtml(htmlText);\r\n }\r\n\r\n if ($scope.skills.length == 0) {\r\n $scope.skillsloading = true;\r\n EXSkill.get().then(function(Skills) {\r\n for (var x in Skills) {\r\n for (var y in Skills[x].options) {\r\n Skills[x].total_points +=\r\n Skills[x].options[y].points;\r\n }\r\n\r\n if (Skills[x].max_points > 0)\r\n if (Skills[x].max_points < Skills[x].total_points)\r\n Skills[x].total_points = Skills[x].max_points;\r\n }\r\n $scope.skills = angular.copy(Skills);\r\n $scope.setSelectedValues();\r\n });\r\n }\r\n\r\n $scope.setSelectedValues = function() {\r\n $scope.selectedskills = [];\r\n if ($scope.component.skill_question_ids !== null) {\r\n $scope.component.skill_question_ids\r\n .split(\",\")\r\n .forEach(function (skillid) {\r\n $scope.skills.forEach(function (skill) {\r\n if (skill.id == skillid.trim()) {\r\n $scope.selectedskills.push(skill);\r\n }\r\n });\r\n });\r\n }\r\n $scope.skillsloading = false;\r\n };\r\n\r\n $scope.updateOrder = function() {\r\n $scope.component.skill_question_ids = \"\";\r\n $scope.selectedskills.forEach(function(skill) {\r\n if ($scope.component.skill_question_ids == \"\")\r\n $scope.component.skill_question_ids = skill.id;\r\n else\r\n $scope.component.skill_question_ids +=\r\n \",\" + skill.id;\r\n });\r\n };\r\n\r\n $scope.removeSkill = function(id) {\r\n $scope.selectedskills.splice(id, 1);\r\n $scope.component.skill_question_ids = \"\";\r\n $scope.selectedskills.forEach(function(skill) {\r\n if ($scope.component.skill_question_ids == \"\")\r\n $scope.component.skill_question_ids = skill.id;\r\n else\r\n $scope.component.skill_question_ids +=\r\n \",\" + skill.id;\r\n });\r\n $scope.component.updateEditList = true;\r\n };\r\n\r\n $scope.determineClasses = function(isEven) {\r\n var classes = \"selectedSkill row no-margin\";\r\n if (isEven) classes += \" even\";\r\n\r\n return classes;\r\n };\r\n\r\n $scope.getPassButtonClass = function() {\r\n var classes =\r\n \"btn btn-group ng-pristine ng-untouched ng-valid ng-binding ng-scope ng-empty btn-default\";\r\n if ($scope.component.skill_default == \"1\")\r\n classes += \" pass\";\r\n return classes;\r\n };\r\n\r\n $scope.getFailButtonClass = function() {\r\n var classes =\r\n \"btn btn-group ng-pristine ng-untouched ng-valid ng-binding ng-scope ng-empty btn-default\";\r\n if ($scope.component.skill_default == \"2\")\r\n classes += \" fail\";\r\n return classes;\r\n };\r\n\r\n $scope.selectedSkillOptions = function(selectedSkill) {\r\n return {\r\n containment: \"#selectedskill_\" + selectedSkill.id,\r\n scrollableContainer:\r\n \"#selectedskill_\" + selectedSkill.id,\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope\r\n .sortableScope.$id ===\r\n destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function() {\r\n $scope.updateOrder();\r\n }\r\n };\r\n };\r\n\r\n $scope.$watch(\"component.updateSelectedList\", function(\r\n newList,\r\n oldList\r\n ) {\r\n if ($scope.component.updateSelectedList) {\r\n $scope.component.updateEditList = false;\r\n $scope.component.updateSelectedList = false;\r\n $scope.setSelectedValues();\r\n }\r\n $scope.component.updateSelectedList = false;\r\n });\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-skills-list/form-builder-skills-list.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormComponent\", [\r\n \"$compile\",\r\n \"$templateCache\",\r\n \"$filter\",\r\n function($compile, $templateCache, $filter) {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\",\r\n parentGroup: \"=?\",\r\n initializeAnswers: \"&\",\r\n parameters: \"=?\",\r\n resultSet: \"=?\",\r\n deficiencies: \"=?\",\r\n pdf: \"=?\",\r\n datapointAnswers: \"=?\",\r\n completed: \"=?\",\r\n saving: \"=?\",\r\n deficiencyScore: \"=?\",\r\n inspectionChecklist: \"=?\"\r\n },\r\n replace: true,\r\n transclude: true,\r\n //templateUrl: 'templates/form-builder-form/form-component/form-component.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.initComponent = function (component) {\r\n component.parameters = angular.copy(scope.parameters);\r\n if (component.parameters != null) {\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n component.parameters.show_documents_without_type =\r\n component.show_documents_without_type;\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n component.parameters.show_vehicles_without_type =\r\n component.show_vehicles_without_type;\r\n component.parameters.skill_question_ids =\r\n component.skill_question_ids;\r\n component.parameters.skill_show_points =\r\n component.skill_show_points;\r\n component.parameters.skill_default =\r\n component.skill_default;\r\n\r\n if (component.license_category_id != null) {\r\n if (\r\n component.parameters.orignalLicenseID == null &&\r\n component.parameters.license_id != null\r\n ) {\r\n component.parameters.orignalLicenseID =\r\n component.parameters.license_id;\r\n }\r\n\r\n component.parameters.license_category_id =\r\n component.license_category_id;\r\n\r\n if (\r\n component.parameters\r\n .default_license_category_id ==\r\n component.license_category_id\r\n ) {\r\n component.parameters.license_id =\r\n component.parameters.orignalLicenseID;\r\n } else {\r\n component.parameters.license_id = null;\r\n }\r\n }\r\n }\r\n };\r\n elem.append(\r\n $compile(\r\n $templateCache.get(\r\n \"templates/form-builder-form/form-component/form-component.html\"\r\n )\r\n )(scope)\r\n );\r\n\r\n scope.$on(\"$destroy\", function() {\r\n if (elem) {\r\n angular.element(elem).off(); // deregister all event handlers\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n\r\n scope.$watch(\"parentGroup.parameters.limit_document_type_ids\", function (limit_document_type_ids) {\r\n if (limit_document_type_ids != null) {\r\n if (scope.component && scope.component.parameters) {\r\n scope.component.parameters.limit_document_type_ids = limit_document_type_ids;\r\n }\r\n }\r\n });\r\n\r\n scope.$watch(\"parentGroup.parameters.show_documents_without_type\", function (show_documents_without_type) {\r\n if (show_documents_without_type != null) {\r\n if (scope.component && scope.component.parameters) {\r\n scope.component.parameters.show_documents_without_type = show_documents_without_type;\r\n }\r\n }\r\n });\r\n\r\n scope.$watch(\"parentGroup.parameters.limit_vehicle_type_ids\", function (limit_vehicle_type_ids) {\r\n if (limit_vehicle_type_ids != null) {\r\n if (scope.component && scope.component.parameters) {\r\n scope.component.parameters.limit_vehicle_type_ids = limit_vehicle_type_ids;\r\n }\r\n }\r\n });\r\n\r\n scope.$watch(\"parentGroup.parameters.show_vehicles_without_type\", function (show_vehicles_without_type) {\r\n if (show_vehicles_without_type != null) {\r\n if (scope.component && scope.component.parameters) {\r\n scope.component.parameters.show_vehicles_without_type = show_vehicles_without_type;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormGroup', ['$rootScope', function ($rootScope) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n group: '=?',\r\n initializeAnswers: '&',\r\n parameters: '=?',\r\n checkboxOrRadio: '=?',\r\n resultSet: '=?',\r\n deficiencies: '=?',\r\n pdf: '=?',\r\n datapointAnswers: '=?',\r\n completed: '=?',\r\n saving: '=?',\r\n deficiencyScore: \"=?\",\r\n inspectionChecklist: \"=?\",\r\n defaultGroup: \"=?\",\r\n groups: \"=?\"\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder-form/form-group/form-group.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n scope.getDocumentURL = function (component) {\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n return $rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + component.document_id.toUpperCase() + '&code=' + component.document_code;\r\n }\r\n else {\r\n return $rootScope.internalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + component.document_id.toUpperCase() + '&code=' + component.document_code;\r\n }\r\n }\r\n\r\n scope.checkIfImageOrPDF = function (component) {\r\n if (component.document_file_name) {\r\n var extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf'];\r\n return extensions.includes(component.document_file_name.split('.').pop().toLowerCase());\r\n }\r\n return false;\r\n };\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off(); // deregister all event handlers\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n }); \r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormGroups', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n component: '=?',\r\n initializeAnswers: '&',\r\n parameters: '=?',\r\n resultSet: '=?',\r\n deficiencies: '=?',\r\n pdf: '=?',\r\n datapointAnswers: '=?',\r\n completed: '=?',\r\n saving: '=?',\r\n deficiencyScore: \"=?\",\r\n inspectionChecklist: \"=?\",\r\n defaultGroup: \"=?\"\r\n },\r\n controller: ['$q', '$scope', '$rootScope', '$filter', '$modal', '$window', function ($q, $scope, $rootScope, $filter, $modal, $window) {\r\n $scope.addGroup = function (component) {\r\n component.groups.forEach(function (group) {\r\n $scope.setEdit(group);\r\n });\r\n\r\n var defaultGroup = null;\r\n if (component.default_group != null) {\r\n defaultGroup = component.default_group;\r\n }\r\n else {\r\n defaultGroup = component.groups[0];\r\n }\r\n\r\n var group = {};\r\n group.id = guid();\r\n group.edit = true;\r\n group.added = true; \r\n group.sort_order = component.groups.length + 1;\r\n group.component_id = component.id;\r\n group.component_data_set_code = component.data_set_code;\r\n group.questions = [];\r\n defaultGroup.questions.forEach(function (defaultQuestion) {\r\n var question = angular.copy(defaultQuestion);\r\n var document_type_copy = null;\r\n var document_name_copy = null;\r\n if (typeof question.answer.document_type !== 'undefined') {\r\n document_type_copy = question.answer.document_type;\r\n document_name_copy = question.answer.document_name;\r\n }\r\n question.answer = {};\r\n question.answer.document_type = document_type_copy;\r\n question.answer.document_name = document_name_copy;\r\n question.answer.id = guid();\r\n question.answer.value = question.default_value;\r\n question.answer.show_value = null;\r\n question.answer.note = null;\r\n question.answer.phone_ext = null;\r\n question.answer.document_id = null;\r\n question.answer.result_set_id = null;\r\n question.answer.fail = null;\r\n question.answer.show_comments = null;\r\n question.answer.group_id = group.id;\r\n question.answer.question_id = question.id;\r\n question.answer.encrypted = question.question_type.encrypted;\r\n question.answer.data_point_id = question.data_point_id;\r\n question.answer.data_point_code = question.data_point_code;\r\n question.answer.required = question.required;\r\n $scope.initializeSubComponentAnswers(question);\r\n\r\n group.questions.push(question);\r\n })\r\n component.groups.push(group);\r\n $scope.initializeAnswers();\r\n }\r\n\r\n $scope.initializeSubComponentAnswers = function (question) {\r\n question.sub_components.forEach(function (component) {\r\n var defaultGroup = null;\r\n if (component.default_group != null) {\r\n defaultGroup = component.default_group;\r\n }\r\n else {\r\n defaultGroup = component.groups[0];\r\n }\r\n\r\n component.groups = [];\r\n var group = {};\r\n group.id = guid();\r\n group.sort_order = 1;\r\n group.component_id = component.id;\r\n group.component_data_set_code = component.data_set_code;\r\n group.questions = [];\r\n\r\n defaultGroup.questions.forEach(function (defaultQuestion) {\r\n var question = angular.copy(defaultQuestion);\r\n var document_type_copy = null;\r\n if (typeof question.answer.document_type !== 'undefined') { document_type_copy = question.answer.document_type; }\r\n question.answer = {};\r\n question.answer.document_type = document_type_copy;\r\n question.answer.id = guid();\r\n question.answer.value = question.default_value;\r\n question.answer.show_value = null;\r\n question.answer.note = null;\r\n question.answer.phone_ext = null;\r\n question.answer.document_id = null;\r\n question.answer.result_set_id = null;\r\n question.answer.fail = null;\r\n question.answer.show_comments = null;\r\n question.answer.group_id = group.id;\r\n question.answer.question_id = question.id;\r\n question.answer.encrypted = question.question_type.encrypted;\r\n question.answer.data_point_id = question.data_point_id;\r\n question.answer.data_point_code = question.data_point_code;\r\n question.answer.required = question.required;\r\n $scope.initializeSubComponentAnswers(question);\r\n\r\n group.questions.push(question);\r\n })\r\n\r\n component.groups.push(group);\r\n })\r\n }\r\n\r\n $scope.getAnswer = function (question, group) {\r\n var value = question.answer.show_value == null ? question.answer.value : question.answer.show_value;\r\n\r\n if (value != null && question.question_type.code == 'date') {\r\n value = $filter('date')(new Date(value), 'MMMM d, y');\r\n }\r\n if (value != null && angular.isArray(value)) {\r\n var stringVal = null;\r\n value.forEach(function (val) {\r\n if (typeof val != \"undefined\") {\r\n if (stringVal == null) {\r\n stringVal = val.name;\r\n } else {\r\n stringVal += ', ' + val.name;\r\n }\r\n }\r\n })\r\n value = stringVal;\r\n }\r\n if (question.answer.file_name != null && question.question_type.code == 'file_upload') {\r\n if (question.answer.document_name != null && question.answer.document_name != \"\") {\r\n value = question.answer.document_name + \": \";\r\n } else if (!isUndefined(question.answer.file_name) && question.answer.file_name != null) {\r\n // Do not require Document Name\r\n value = question.answer.file_name + \": \";\r\n }\r\n }\r\n if (value != null && question.question_type.code == 'yesno') {\r\n value = (value == true || value.toString().toLowerCase() == 'true') ? 'Yes' : 'No';\r\n }\r\n\r\n var valid = true;\r\n if (question.required) {\r\n if (value == null || value.length == 0) {\r\n valid = false;\r\n }\r\n }\r\n if ($scope.validation) {\r\n valid = valid && Validation.validateQuestion(null, question.validation, value);\r\n }\r\n\r\n if (question !== null && question.answer !== undefined) {\r\n question.answer.invalid = !valid;\r\n }\r\n\r\n // Only require that there is a file uploaded.\r\n if (question.question_type.code == 'file_upload' && question.required && (question.answer.document_id == null && (isUndefined(question.answer.file_content) || question.answer.file_content == null))) {\r\n question.answer.invalid = true;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n $scope.openDocument = function (question) {\r\n if (question.answer.document_id != null) {\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n $window.open($rootScope.portalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + question.answer.document_id.toUpperCase() + '&code=' + question.answer.document_code, '_blank');\r\n }\r\n else {\r\n $window.open($rootScope.internalURL + 'controller.cfm?method=publicPortalService.openDocument' + '&documentID=' + question.answer.document_id.toUpperCase() + '&code=' + question.answer.document_code, '_blank');\r\n }\r\n }\r\n }\r\n\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n if ($rootScope.enterprise && $rootScope.enterprise.website) {\r\n $scope.portalURL = $rootScope.enterprise.website;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.portalURL;\r\n }\r\n }\r\n else {\r\n if ($rootScope.enterprise && $rootScope.enterprise.site_location) {\r\n $scope.portalURL = $rootScope.enterprise.site_location;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.internalURL;\r\n }\r\n }\r\n\r\n\r\n $scope.removeGroup = function (groups, index, group) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/confirm/confirm.html',\r\n controller: 'ConfirmModalController',\r\n resolve: {\r\n message: function () {\r\n var record = \"group\";\r\n var dataset = \"\";\r\n if (groups[index].component_data_set_code && groups[index].component_data_set_code.length > 1) {\r\n if (groups[index].component_data_set_code == \"criminal_history\") {\r\n record = \"criminal history\";\r\n dataset = \"\";\r\n } else {\r\n record = groups[index].component_data_set_code.substring(groups[index].component_data_set_code.indexOf(\"_\") + 1, groups[index].component_data_set_code.length - 1) + \"'s affiliation\";\r\n record = record.replace(\"policie\", \"policy\").replace(\"training_location\", \"location\");\r\n dataset = \" from the \" + groups[index].component_data_set_code.substring(0, groups[index].component_data_set_code.indexOf(\"_\"));\r\n }\r\n }\r\n return \"Are you sure you would like to remove this \" + record + dataset + \"?\";\r\n }\r\n }\r\n }).result.then(function (result) {\r\n if (result) {\r\n if (index == null) {\r\n updateArray(groups, group, true);\r\n }\r\n else {\r\n groups.splice(index, 1);\r\n }\r\n // If we just removed the last record, we want add it back but with blank answers (effectively functioning like clearing out the answers)\r\n if (groups.length == 0) {\r\n $scope.addGroup($scope.component);\r\n }\r\n $scope.initializeAnswers();\r\n }\r\n });\r\n }\r\n\r\n $scope.initGroup = function (group, component, setHeaders) {\r\n group.parameters = angular.copy(component.parameters);\r\n\r\n if (setHeaders) {\r\n group.headers = [];\r\n group.questions.forEach(function (question) {\r\n if (question.show_in_grid && (typeof $scope.globalHeaders == \"undefined\" || typeof $scope.globalHeaders[question.id] != \"undefined\")) {\r\n group.headers.push(question);\r\n }\r\n question.sub_components.forEach(function (subComponent) {\r\n subComponent.groups[0].questions.forEach(function (subQuestion) {\r\n if (subQuestion.show_in_grid && (typeof $scope.globalHeaders == \"undefined\" || typeof $scope.globalHeaders[subQuestion.id] != \"undefined\")) {\r\n group.headers.push(subQuestion);\r\n }\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n $scope.initComponent = function (component) {\r\n if (component.groups != null && component.groups.length == 1 && component.other_file_groups.length > 0) {\r\n component.groups[0].edit = true;\r\n }\r\n\r\n component.headers = [];\r\n $scope.globalHeaders = {};\r\n component.groups[0].questions.forEach(function (question) {\r\n if (question.show_in_grid) {\r\n component.headers.push(question);\r\n $scope.globalHeaders[question.id] = question;\r\n }\r\n if (question.sub_components != null) {\r\n question.sub_components.forEach(function (subComponent) {\r\n subComponent.groups[0].questions.forEach(function (subQuestion) {\r\n if (subQuestion.show_in_grid) {\r\n component.headers.push(subQuestion);\r\n $scope.globalHeaders[subQuestion.id] = subQuestion;\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n $scope.$watch('component', function (component) {\r\n $scope.initComponent(component);\r\n component.groups.forEach(function (group) {\r\n $scope.initGroup(group, component, true);\r\n });\r\n });\r\n\r\n $scope.collapsed = function (component) {\r\n return component.allow_multiple_groups && component.groups_until_list != null && component.groups != null && component.groups_until_list <= (component.groups.length + component.other_file_groups.length);\r\n }\r\n\r\n $scope.setEdit = function (group) {\r\n if ($scope.groupForms[group.id] != null) {\r\n group.edit = !$scope.groupForms[group.id].$valid;\r\n }\r\n }\r\n\r\n $scope.closeGroup = function (group) {\r\n // It's really dumb, but we can't actually submit the group's form, because in IE that submits the entire form as well\r\n // But we need the form for validation, so we'll just fake it a bit\r\n var form = $scope.groupForms[group.id];\r\n if (form != null && form.$valid) {\r\n group.edit = false;\r\n group.changed = true;\r\n } else {\r\n $scope.$broadcast(\"form:submit\");\r\n }\r\n }\r\n }],\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder-form/form-groups/form-groups.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n scope.groupForms = {};\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off(); // deregister all event handlers\r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormQuestion', ['$q', '$rootScope', 'Vehicles', 'Users', 'Trainings', function ($q, $rootScope, Vehicles, Users, Trainings) {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n question: '=?',\r\n parameters: '=?',\r\n checkboxOrRadio: '=?',\r\n resultSet: '=?',\r\n deficiencies: '=?',\r\n pdf: '=?',\r\n group: '=?',\r\n datapointAnswers: '=?',\r\n completed: '=?',\r\n saving: '=?',\r\n deficiencyScore: \"=?\",\r\n inspectionChecklist: \"=?\",\r\n defaultGroup: \"=?\",\r\n groups: \"=?\" // for service user affiliations (positions)\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder-form/form-question/form-question.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n scope.dynamicDelete = function (question) {\r\n question.answer.value = null;\r\n question.answer.show_value = null;\r\n scope.group.added = true;\r\n scope.answerChanged(question);\r\n }\r\n scope.previousAction = '';\r\n\r\n scope.dynamicDeleteShow = function (question) {\r\n return question.answer.value != null && (question.allow_dynamic_addition || question.allow_dynamic_edit) && (scope.group.added || question.answer.value == nullGuid());\r\n }\r\n\r\n scope.dynamicAdd = function (question) {\r\n question.answer.value = nullGuid();\r\n question.answer.show_value = '[New]';\r\n }\r\n\r\n scope.dynamicAddShow = function (question) {\r\n return question.answer.value == null && question.allow_dynamic_addition;\r\n }\r\n\r\n scope.dynamicDisabled = function (question) {\r\n return (question.answer.value != null && (question.allow_dynamic_addition || question.allow_dynamic_edit));\r\n }\r\n\r\n scope.childServiceDisabled = function (question) {\r\n return (scope.group.component_data_set_code == 'service_relationships' && question.parameters.child_service == true);\r\n }\r\n\r\n scope.actionChanged = function (group, question) {\r\n if ((group.single_group_action == 'undefined' && scope.previousAction != '') || (group.single_group_action == 'a' && scope.previousAction != '' && scope.previousAction != 'a') || (group.single_group_action != 'a' && scope.previousAction == 'a')) {\r\n // The question that's been sent in is the service_user_vehicle_id or service_user_user_id\r\n // We need to clear it and everything under it, as though the user cleared it.\r\n question.answer.value = null;\r\n question.answer.show_value = null;\r\n scope.previousAction = group.single_group_action;\r\n // This clears out everything under the User or Vehicle\r\n // and the service_user/service_vehicle questions\r\n scope.answerChanged(question);\r\n // The question record is cleared, but the inner form text remains.\r\n\r\n }\r\n else {\r\n scope.previousAction = group.single_group_action;\r\n }\r\n }\r\n\r\n scope.setupAddress = function (question) {\r\n question.address = {};\r\n // Get the questions for the address tied to this postal code question \r\n scope.group.questions.forEach(function (q) {\r\n if (q.data_point_address_field != null && q.data_point_address_field != 'postal_code' && q.data_point_address_postal_data_point_id == scope.question.data_point_id) {\r\n question.address[q.data_point_address_field] = q;\r\n }\r\n });\r\n }\r\n\r\n // Custom validation functions for some questions - scope.parameters.service_id != null added to not limit positions in user/service affiliations because it was being done incorrectly [Bug 173688] //\r\n scope.requiredPositions = [];\r\n if (scope.question.data_point_code == 'service_users_position' && scope.parameters.service_id != null) {\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n scope.$evalAsync(function () {\r\n scope.requiredPositions = [];\r\n // if this is the positions question for service users, we need a count of each position on the form, and we need to hide or force positions so as to meet the min/max settings for the positions. \r\n // Build a list of all selected positions as they are \r\n var positionsAnswers = scope.datapointAnswers['service_users_position'];\r\n if (typeof positionsAnswers != 'undefined' && positionsAnswers != null) {\r\n var positionsOnForm = [];\r\n positionsAnswers.forEach(function (positionAnswer) {\r\n if (typeof (positionAnswer.value) == \"string\") {\r\n var values = positionAnswer.value != null ? positionAnswer.value.split(',') : null;\r\n var newValues = [];\r\n values.forEach(function (val) {\r\n newValues.push({ id: val });\r\n });\r\n if (newValues != null && newValues.length > 0) {\r\n positionsOnForm.push.apply(positionsOnForm, newValues);\r\n }\r\n } else {\r\n if (positionAnswer.value != null && positionAnswer.value.length > 0) {\r\n positionsOnForm.push.apply(positionsOnForm, positionAnswer.value);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (scope.question.options != null) {\r\n // turn comma-separated list into array of objects so we can add hidden flag if need be. \r\n var tempOptions = scope.question.options;\r\n if (Object.prototype.toString.call(scope.question.options) !== '[object Array]') {\r\n var tempOptions = [];\r\n scope.question.options.split(',').forEach(function (option) {\r\n tempOptions.push({ id: option.trim(), name: option.trim() });\r\n });\r\n }\r\n // loop through the position options, and check how many of each there are \r\n tempOptions.forEach(function (position) {\r\n var positionCount = positionsOnForm.filter(function (x) { return x.id == position.id }).length;\r\n if (position.min != null && positionCount < position.min) {\r\n position.hide = false;\r\n scope.requiredPositions.push(position);\r\n }\r\n else if (position.max != null && positionCount >= position.max) {\r\n position.hide = true;\r\n }\r\n else {\r\n position.hide = false;\r\n }\r\n });\r\n scope.question.options = tempOptions;\r\n // minimum check\r\n var comparisonResults = [];\r\n positionsOnForm.forEach(function (positionOnForm) {\r\n var match = scope.requiredPositions.find(function (requiredPosition) {\r\n return requiredPosition.id === positionOnForm;\r\n });\r\n if (match) {\r\n comparisonResults.push({ positionOnForm: positionOnForm, requiredPosition: match });\r\n }\r\n });\r\n\r\n if (scope.requiredPositions.length > 0 && scope.requiredPositions.length != comparisonResults.length) {\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n if (scope.question.answer.data_point_code == 'certification_expiration_date' && scope.question.answer.value == null && scope.question.default_value != null) {\r\n scope.question.answer.value = scope.question.default_value;\r\n }\r\n\r\n if (scope.question.data_point_code == 'user_training_training_id') {\r\n scope.question.retrieveCourseInfo = function (question) {\r\n if (question.answer != null) {\r\n if (question.answer.value != null) {\r\n Trainings.getByID(question.answer.value).then(function (courseInfo) {\r\n question.courseInfo = courseInfo;\r\n if (question.courseInfo.attendee_count == null) { question.courseInfo.attendee_count = 0 }\r\n if (question.courseInfo.attendee_max_count != null) {\r\n question.courseInfo.remainingSpots = Math.max(question.courseInfo.attendee_max_count - question.courseInfo.attendee_count, 0);\r\n }\r\n question.address = \"\";\r\n if (question.courseInfo.locationinfo != null && question.courseInfo.locationinfo.length > 0) {\r\n if (question.courseInfo.locationinfo[0].street1 != null) { question.address = question.address + \", \" + question.courseInfo.locationinfo[0].street1 }\r\n if (question.courseInfo.locationinfo[0].street2 != null) { question.address = question.address + \", \" + question.courseInfo.locationinfo[0].street2 }\r\n if (question.courseInfo.locationinfo[0].municipality != null) { question.address = question.address + \", \" + question.courseInfo.locationinfo[0].municipality }\r\n if (question.courseInfo.locationinfo[0].regioninfo != null && question.courseInfo.locationinfo[0].regioninfo.length > 0 && question.courseInfo.locationinfo[0].regioninfo[0].abbreviation != null) { question.address = question.address + \", \" + question.courseInfo.locationinfo[0].regioninfo[0].abbreviation }\r\n if (question.courseInfo.locationinfo[0].postal_code != null) { question.address = question.address + \", \" + question.courseInfo.locationinfo[0].postal_code }\r\n }\r\n question.address = question.address.substring(1);\r\n });\r\n }\r\n }\r\n }\r\n scope.question.retrieveCourseInfo(scope.question);\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n scope.$evalAsync(function () {\r\n if (scope.question.answer.value != null) {\r\n Trainings.checkPrerequisites(scope.question.answer.value, $rootScope.userID).then(function (failedPrerequisites) {\r\n if (failedPrerequisites == true) {\r\n scope.question.validation.customFunctionMessage = \"You do not meet the course prerequisite requirements.\";\r\n d.resolve(false);\r\n } else {\r\n if (scope.question.courseInfo.attendee_max_count != null && scope.question.courseInfo.attendee_count != null && scope.question.courseInfo.attendee_count >= scope.question.courseInfo.attendee_max_count) {\r\n scope.question.validation.customFunctionMessage = \"This course has reached its maximum capacity.\";\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n });\r\n }\r\n else { d.resolve(true); }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n if (scope.question.data_point_code == 'vehicle_certification_number') {\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n scope.$evalAsync(function () {\r\n var permitNumber = scope.question.answer ? scope.question.answer.value : \"\";\r\n var vehicleID = scope.group.vehicle_id || scope.group.record_id || null;\r\n if (permitNumber !== undefined && permitNumber != null && permitNumber != \"\") {\r\n // See if this is a duplicate permit number \r\n Vehicles.getCertificationByNumber(permitNumber, vehicleID).then(function (result) {\r\n if (result.length > 0) {\r\n scope.question.validation.customFunctionMessage = \"There is already a vehicle with this permit number.\";\r\n d.resolve(false);\r\n }\r\n else {\r\n // check vehicles we just added \r\n var permitNumberCount = scope.datapointAnswers.vehicle_certification_number.filter(function (vcn) {\r\n return (vcn.value == permitNumber && vcn.has_content == true);\r\n }).length;\r\n\r\n // more than 1 from above reduce means there are duplicate certification numbers added in the form, throw validation error \r\n if (permitNumberCount > 1) {\r\n scope.question.validation.customFunctionMessage = \"You may not add two vehicles with the same permit number: \" + permitNumber;\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n });\r\n }\r\n else { d.resolve(true); }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n if (scope.question.data_point_code == 'vehicle_serial_number') {\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n scope.$evalAsync(function () {\r\n var serialNumber = scope.question.answer ? scope.question.answer.value : \"\";\r\n var vehicleID = scope.group.vehicle_id || scope.group.record_id || null;\r\n if (serialNumber !== undefined && serialNumber != null && serialNumber != \"\") {\r\n // See if this is a duplicate permit number \r\n Vehicles.getVehicleBySerialNumber(serialNumber, vehicleID).then(function (result) {\r\n if (result.length > 0) {\r\n scope.question.validation.customFunctionMessage = \"There is already a vehicle with this serial number.\";\r\n d.resolve(false);\r\n }\r\n else {\r\n // check vehicles we just added \r\n var serialNumberCount = scope.datapointAnswers.vehicle_serial_number.filter(function (vsn) {\r\n return (vsn.value == serialNumber && vsn.has_content == true);\r\n }).length;\r\n\r\n // more than 1 from above reduce means there are duplicate serial numbers added in the form, throw validation error \r\n if (serialNumberCount > 1) {\r\n scope.question.validation.customFunctionMessage = \"You may not add two vehicles with the same serial number: \" + serialNumber;\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n });\r\n }\r\n else { d.resolve(true); }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n if (scope.question.data_point_code == 'user_email') {\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n scope.$evalAsync(function () {\r\n var email = scope.question.answer ? scope.question.answer.value : \"\";\r\n var userID = scope.group.user_id || scope.group.record_id || null;\r\n if (email !== undefined && email != null && email != \"\") {\r\n // See if this is a duplicate email \r\n Users.getUserbyEmail(email, userID).then(function (result) {\r\n if (result.length > 0) {\r\n scope.question.validation.customFunctionMessage = \"There is already a user with this email.\";\r\n d.resolve(false);\r\n }\r\n else {\r\n // a form with data point 'user_email' belongs to a single user, so do not throw validation error if same email is present more than once in the form\r\n d.resolve(true);\r\n }\r\n });\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n if (scope.question.data_point_code == 'calendar_year') {\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n scope.$evalAsync(function () {\r\n var year = scope.question.answer ? scope.question.answer.value : \"\";\r\n\r\n if (year !== undefined && year != null && year != \"\") {\r\n // Make sure there are no duplicate years\r\n var yearCount = scope.datapointAnswers.calendar_year.filter(function (vsn) {\r\n return (vsn.value == year && vsn.has_content == true);\r\n }).length;\r\n // more than 1 from above reduce means there are duplicate years added in the form, throw validation error\r\n if (yearCount > 1) {\r\n scope.question.validation.customFunctionMessage = \"You may not add two statistics with the same year: \" + year;\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n\r\n if (scope.question.data_point_code == 'service_users_personnel_id') {\r\n if (scope.question.validation == null) {\r\n scope.question.validation = {};\r\n }\r\n scope.question.validation.function = function () {\r\n var d = $q.defer();\r\n\r\n scope.$evalAsync(function () {\r\n var personnelID = scope.question.answer ? scope.question.answer.value : \"\";\r\n var serviceID = scope.group.service_id || scope.parameters.service_id || null;\r\n var userID = scope.group.user_id || scope.parameters.user_id || null;\r\n for (var i = 0; i < scope.group.questions.length; i++) {\r\n if (scope.group.questions[i].data_point_code == 'service_users_user_id' && scope.group.questions[i].answer.value !== null) {\r\n userID = scope.group.questions[i].answer.value; //user on form\r\n }\r\n }\r\n if (personnelID !== undefined && personnelID != null && personnelID != \"\" && serviceID !== undefined && serviceID != null) {\r\n // See if this is a duplicate personnelID in the service\r\n Users.getUserByServicePersonnelID(personnelID, serviceID).then(function (result) {\r\n if (result.length > 0) {\r\n var coreRosterUser = result[0].user_id;\r\n if (userID !== coreRosterUser) {\r\n scope.question.validation.customFunctionMessage = \"The Personnel ID entered is already taken by a user in this Service.\";\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n else {\r\n // check PersonnelID we just added\r\n var userCount = scope.datapointAnswers.service_users_personnel_id.filter(function (sup) {\r\n return (sup.value == personnelID && sup.has_content == true);\r\n }).length;\r\n if (userCount > 1) {\r\n scope.question.validation.customFunctionMessage = \"The Personnel ID entered is already taken by a user in this Service.\";\r\n d.resolve(false);\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n }\r\n });\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n });\r\n return d.promise;\r\n }\r\n }\r\n // End custom validation functions //\r\n\r\n scope.$on('$destroy', function () {\r\n if (elem) {\r\n angular.element(elem).off(); // deregister all event handlers \r\n angular.element(elem).remove();\r\n elem = null;\r\n }\r\n });\r\n },\r\n controller: ['$scope', '$modal', 'FBResponses', 'ServiceAreaCities', 'ServiceAreaCounties', 'ServiceAreaPostalCodes', 'ServiceAreaCensusTracts', 'Format', '$filter', '$injector', '$q', '$rootScope', 'IPComment', 'Positions', function ($scope, $modal, FBResponses, ServiceAreaCities, ServiceAreaCounties, ServiceAreaPostalCodes, ServiceAreaCensusTracts, Format, $filter, $injector, $q, $rootScope, IPComment, Positions) {\r\n $scope.isPortal = $rootScope.isPortal.toLowerCase() === 'true';\r\n $scope.showReviewComment = false;\r\n $scope.showDynamicComment = false;\r\n $scope.currComment = \"\";\r\n if ($scope.question.question_type.code === 'number' && $scope.question.answer.value && typeof ($scope.question.question_type.code) !== 'number') { $scope.question.answer.value = Number($scope.question.answer.value); }\r\n\r\n // Get comments for Inspection Checklist\r\n if ($scope.inspectionChecklist != null && $scope.inspectionChecklist.administrative_review === true && $scope.question.id != null && $scope.inspectionChecklist.inspectionID != null && $scope.inspectionChecklist.comments === undefined) {\r\n IPComment.getAdministrativeCommentsByQuestionId($scope.question.id, $scope.inspectionChecklist.inspectionID).then(function (comments) {\r\n $scope.comments = comments;\r\n // Update createdon & createdby to work with hlp-edit-history\r\n for (var i = 0; i < $scope.comments.length; i++) {\r\n $scope.comments[i].createdon = $scope.comments[i].createdOn;\r\n $scope.comments[i].createdby = $scope.comments[i].fullName;\r\n }\r\n });\r\n // Comments are passed in, assign correct comments to this question (generatePDF)\r\n } else if ($scope.inspectionChecklist != null && $scope.inspectionChecklist.comments !== undefined) {\r\n const questionId = $scope.question.id;\r\n $scope.comments = [];\r\n\r\n for (var i = 0; i < $scope.inspectionChecklist.comments.records.length; i++) {\r\n if (questionId === $scope.inspectionChecklist.comments.records[i].fbQuestionId) {\r\n $scope.comments.push($scope.inspectionChecklist.comments.records[i]);\r\n }\r\n }\r\n }\r\n\r\n $scope.setAutoCompleteByDisabled = function (isDisabled) {\r\n if (isDisabled) {\r\n /* This set autoComplete to a dummy string \"auto-complete-off\", so it doesn't mapping\r\n the field to any of auto-complete field saved in the browser. This effectively turn\r\n off the auto-fill from browser feature. We do this because html attribute\r\n autocomplete=\"off\" isn't work as expected.\r\n */\r\n return \"auto-complete-off\"\r\n }\r\n }\r\n\r\n // Open Review comment box\r\n $scope.toggleReviewComment = function () {\r\n $scope.showReviewComment = !$scope.showReviewComment;\r\n };\r\n\r\n // Open original comment box\r\n $scope.toggleDynamicComment = function () {\r\n $scope.showDynamicComment = !$scope.showDynamicComment;\r\n };\r\n $scope.enableAdminComments = function () {\r\n if ($scope.inspectionChecklist != null && $scope.inspectionChecklist.administrative_review == 1 && !$scope.isPortal && $scope.inspectionChecklist.inspectionID != null) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n $scope.saveReviewComment = function () {\r\n var comment = $scope.currComment;\r\n\r\n if (comment) {\r\n IPComment.saveAdministrativeComment(comment, $scope.question.id, $scope.inspectionChecklist.inspectionID).then(function (response) {\r\n $scope.currComment = ''; // reset comment box\r\n\r\n // After saving comment, update the deficency for comments\r\n IPComment.getAdministrativeCommentsByQuestionId($scope.question.id, $scope.inspectionChecklist.inspectionID).then(function (comments) {\r\n $scope.comments = comments;\r\n });\r\n });\r\n }\r\n };\r\n\r\n $scope.resolveComment = function (id, comment) {\r\n IPComment.resolveAdministrativeComment(id, comment).then(function (resolve) {\r\n // After resolving comment, update the deficency for comments\r\n IPComment.getAdministrativeCommentsByQuestionId($scope.question.id, $scope.inspectionChecklist.inspectionID).then(function (comments) {\r\n $scope.comments = comments;\r\n });\r\n });\r\n comment.resolved = true;\r\n };\r\n\r\n $scope.toggleShowOnPdf = function (id, comment) {\r\n IPComment.toggleShowOnPdf(id, comment).then(function (response) {\r\n\r\n });\r\n };\r\n\r\n // for images \r\n $scope.openImageModal = function (question) {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/photo-upload/photo-upload.html',\r\n controller: 'PhotoUploadModalController',\r\n resolve: {\r\n file_content: function () {\r\n return question.answer.file_content;\r\n }\r\n }\r\n }).result.then(function (upload) {\r\n if (upload != null) {\r\n question.answer.file_content = upload.file_content;\r\n question.answer.file_name = upload.file_name;\r\n question.answer.file_updated = true;\r\n }\r\n });\r\n }\r\n\r\n $scope.showServiceRosterList = function (question) {\r\n\r\n if ((question.data_point_code == 'service_users_user_id' || question.data_point_code == 'service_vehicles_vehicle_id') && $scope.group.component_allow_multiple_groups != \"undefined\" && $scope.group.component_allow_multiple_groups != null && $scope.group.component_allow_multiple_groups == false) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n $scope.applicationTypeExists = function (question) {\r\n var exists = false;\r\n\r\n if (question.data_point_code == 'certification_levels') {\r\n $scope.group.questions.forEach(function (q) {\r\n if (q.question_type.code == 'application_type') {\r\n exists = true;\r\n }\r\n })\r\n }\r\n\r\n return exists;\r\n }\r\n\r\n $scope.clearQuestion = function (question) {\r\n question.answer.value = null;\r\n question.answer.show_value = null;\r\n if (question.options != null) {\r\n for (var i = 0; i < question.options.length; i++) {\r\n if (question.options[i].checked != null) {\r\n question.options[i].checked = false;\r\n }\r\n };\r\n }\r\n }\r\n\r\n $scope.numberCheck = function (keyEvent) {\r\n if (isNaN(keyEvent.key) || keyEvent.key === ' ' || keyEvent.key === '') {\r\n keyEvent.returnValue = '';\r\n }\r\n }\r\n\r\n $scope.stateChanged = function (question) {\r\n\r\n var stateCode = question.answer.value;\r\n var newState = 0;\r\n\r\n if (stateCode != null) {\r\n if ($scope.group.stateCode != undefined && $scope.group.stateCode != null && $scope.group.stateCode != stateCode) {\r\n newState = 1;\r\n }\r\n $scope.group.stateCode = stateCode;\r\n\r\n $scope.group.questions.forEach(function (datasetquestion) {\r\n //If this is a state CHANGE then we'll reinitialize the questions below the state\r\n if (newState == 1 && (datasetquestion.data_point_code == 'service_area_cities'\r\n || datasetquestion.data_point_code == 'service_area_counties'\r\n || datasetquestion.data_point_code == 'service_area_postal_codes'\r\n || datasetquestion.data_point_code == 'service_area_censustracts')) {\r\n\r\n $scope.clearQuestion(datasetquestion);\r\n\r\n if (datasetquestion.data_point_code == 'service_area_cities') {\r\n ServiceAreaCities.getByStateCode(stateCode).then(function (data) {\r\n datasetquestion.dirOptions = data;\r\n datasetquestion.options = data;\r\n $scope.initQuestion(datasetquestion);\r\n });\r\n }\r\n if (datasetquestion.data_point_code == 'service_area_counties') {\r\n ServiceAreaCounties.getByStateCode(stateCode).then(function (data) {\r\n datasetquestion.dirOptions = data;\r\n datasetquestion.options = data;\r\n $scope.initQuestion(datasetquestion);\r\n });\r\n }\r\n if (datasetquestion.data_point_code == 'service_area_postal_codes') {\r\n ServiceAreaPostalCodes.getByStateCode(stateCode).then(function (data) {\r\n datasetquestion.dirOptions = data;\r\n datasetquestion.options = data;\r\n $scope.initQuestion(datasetquestion);\r\n });\r\n }\r\n if (datasetquestion.data_point_code == 'service_area_censustracts') {\r\n ServiceAreaCensusTracts.getByStateCode(stateCode).then(function (data) {\r\n datasetquestion.dirOptions = data;\r\n datasetquestion.options = data;\r\n $scope.initQuestion(datasetquestion);\r\n });\r\n }\r\n\r\n\r\n }\r\n\r\n });\r\n\r\n }\r\n }\r\n\r\n $scope.answerChanged = function (question) {\r\n //The question here has subcomponent questions that already hold the previous vehicle/user answers and they're not clearing out consistently\r\n //within the populateSubComponent function if the new one doesn't have a value. I've tried everything I can think of and it's not working\r\n //Since we know the value has changed, or it wouldn't have gotten in here, let's clear all the answers up front\r\n if ((question.data_point_code == 'service_users_user_id' || question.data_point_code == 'service_vehicles_vehicle_id') && $scope.group.component_allow_multiple_groups == false) {\r\n if (question.sub_components != null && question.sub_components.length > 0) {\r\n question.sub_components[0].groups[0].questions.forEach(function (subQuestion) {\r\n if (subQuestion != null && subQuestion.answer != null) {\r\n subQuestion.answer.value = null;\r\n subQuestion.answer.show_value = null;\r\n }\r\n });\r\n }\r\n }\r\n\r\n $scope.populateSubComponent(question).then(function () {\r\n if (question.data_point_foreign_data_set_code != null && question.sub_components != null && question.sub_components.length > 0 && question.sub_components[0] != null && question.sub_components[0].groups != null &&\r\n question.sub_components[0].groups.length > 0 && question.sub_components[0].groups[0] != null && question.sub_components[0].groups[0].questions != null) {\r\n question.sub_components[0].groups[0].questions.forEach(function (q) {\r\n if (q != null) {\r\n q.refreshValidation = true;\r\n }\r\n });\r\n }\r\n });\r\n\r\n if (question.data_point_code == 'user_training_training_id') {\r\n question.retrieveCourseInfo(question);\r\n }\r\n\r\n if ((question.data_point_code == 'service_users_user_id' || question.data_point_code == 'service_vehicles_vehicle_id') && $scope.group.component_allow_multiple_groups == false) {\r\n var d = $q.defer();\r\n\r\n //clear out the previous answers\r\n $scope.group.questions.forEach(function (datasetquestion) {\r\n //If this is the user or the vehicle question, don't clear the answer value\r\n if (datasetquestion.name != 'User' && datasetquestion.name != 'Vehicle') {\r\n $scope.clearQuestion(datasetquestion);\r\n }\r\n });\r\n\r\n // This will update the service user/service vehicle fields. The user/vehicle fields were already being filled in by the sub_component update above.\r\n FBResponses.populateGroup($scope.group.component_data_set_code, question.answer.value, $scope.parameters.service_id, !$scope.group.component_allow_multiple_groups).then(function (data) {\r\n if (data != null) {\r\n $scope.group.questions.forEach(function (datasetquestion) {\r\n // don't bother if it's the service_users_user_id question or the service_vehicles_vehicle_id question, because that one's already populated.\r\n if (datasetquestion.data_point_code != question.data_point_code && datasetquestion != null && datasetquestion.answer != null) {\r\n if (data[datasetquestion.data_point_code] instanceof Date) {\r\n datasetquestion.answer.value = Format.convertDateToUTC(data[datasetquestion.data_point_code]);\r\n }\r\n else {\r\n if (datasetquestion.data_point_code === \"service_users_position\") {\r\n datasetquestion.answer.value = (data[datasetquestion.data_point_code]) ? data[datasetquestion.data_point_code].split(',') : null;\r\n $scope.group.questions[$scope.group.hasPositions].original_value = angular.copy(datasetquestion.answer.value);\r\n } else {\r\n datasetquestion.answer.value = data[datasetquestion.data_point_code];\r\n }\r\n }\r\n if (data[datasetquestion.data_point_code] == null) {\r\n datasetquestion.answer.value = null;\r\n datasetquestion.answer.show_value = null;\r\n $scope.clearQuestion(datasetquestion);\r\n\r\n }\r\n }\r\n });\r\n }\r\n d.resolve(true);\r\n });\r\n }\r\n }\r\n\r\n $scope.populateSubComponent = function (question) {\r\n var d = $q.defer();\r\n if (question.data_point_foreign_data_set_code != null && question.sub_components != null && question.sub_components.length > 0 && question.sub_components[0] != null && question.sub_components[0].groups != null &&\r\n question.sub_components[0].groups.length > 0 && question.sub_components[0].groups[0] != null && question.sub_components[0].groups[0].questions != null) {\r\n\r\n if (question.answer.value == null) {\r\n question.sub_components[0].groups[0].questions.forEach(function (question) {\r\n if (question != null && question.answer != null) {\r\n question.answer.value = null;\r\n }\r\n });\r\n d.resolve(true);\r\n }\r\n else {\r\n question.sub_components[0].loading = true;\r\n question.sub_components[0].groups[0].record_id = question.answer.value;\r\n FBResponses.populateGroup(question.data_point_foreign_data_set_code, question.answer.value, $scope.parameters.service_id, false).then(function (data) {\r\n if (data != null) {\r\n question.sub_components[0].groups[0].questions.forEach(function (question) {\r\n if (question != null && question.answer != null && data[question.data_point_code] != null) {\r\n if (data[question.data_point_code] instanceof Date) {\r\n question.answer.value = Format.convertDateToUTC(data[question.data_point_code]);\r\n }\r\n else {\r\n question.answer.value = data[question.data_point_code];\r\n if (data[question.data_point_code] == null) {\r\n question.answer.value = null;\r\n question.answer.show_value = null;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n question.sub_components[0].loading = false;\r\n d.resolve(true);\r\n });\r\n }\r\n }\r\n else {\r\n d.resolve(true);\r\n }\r\n return d.promise;\r\n }\r\n\r\n $scope.filterOptions = function () {\r\n var promises = [];\r\n var opts = $scope.question.originalOptions;\r\n $scope.question.filters.forEach(function (filter) {\r\n if (filter != null && filter.value != null || filter.data_point_code == \"service_users_classification\" || filter.data_point_code == \"service_users_county\") {\r\n if ($scope.question.data_point_code == \"service_users_certification_level\") {\r\n if ($scope.question.custom_filter) {\r\n var service = $injector.get($scope.question.service);\r\n var params = angular.copy($scope.question.parameters);\r\n params.filter = true;\r\n params.service_id = filter.value;\r\n promises.push(service[$scope.question.method](params).then(function (data) {\r\n if (data != null) {\r\n opts = data;\r\n }\r\n }));\r\n }\r\n }\r\n else {\r\n switch (filter.data_point_code) {\r\n case 'service_users_classification':\r\n opts = $filter('classification')(opts, filter.value, 'classification');\r\n break;\r\n case 'service_users_county':\r\n // Only done for County Filter for Maryland's SOW\r\n opts = $filter('county')(opts, filter.value, 'county');\r\n var newOpts = [];\r\n opts.forEach(function (opt) {\r\n if (opt.children !== undefined) {\r\n var childAdded = false;\r\n opt.children.forEach(function (child) {\r\n if (!child.disable) {\r\n // Add parent on first child added\r\n if (!childAdded) newOpts.push(opt);\r\n newOpts.push(child);\r\n childAdded = true;\r\n }\r\n });\r\n // No Children, add service though\r\n if (!opt.disable && !childAdded) newOpts.push(opt);\r\n }\r\n });\r\n opts = newOpts;\r\n break;\r\n default:\r\n opts = $filter('filter')(opts, filter.value);\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n $q.all(promises).then(function () {\r\n $scope.question.options = opts;\r\n }).catch(function (response) {\r\n // handle error\r\n });;\r\n }\r\n\r\n $scope.initQuestion = function (question) {\r\n\r\n // Initialize deficiency score\r\n if (question.deficiency.score != 'undefined' && typeof question.deficiency.score == 'number') {\r\n if (question.answer.fail != null) {\r\n if (question.answer.fail == 0) {\r\n $scope.deficiencyScore.score += question.deficiency.score;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.group.parameters != null) {\r\n question.parameters = angular.copy($scope.group.parameters);\r\n } else {\r\n question.parameters = angular.copy($scope.parameters);\r\n }\r\n\r\n if (question.data_point_code != null && question.data_point_code != '') {\r\n question.filters = [];\r\n $scope.group.questions.forEach(function (q) {\r\n if (question.data_point_code == q.filter_data_point_code) {\r\n question.filters.push(q.answer);\r\n }\r\n })\r\n\r\n if (question.filters.length > 0) {\r\n $scope.$watch('question.filters', function () {\r\n if ($scope.question.originalOptions != null) {\r\n $scope.filterOptions();\r\n }\r\n }, true)\r\n\r\n if (question.options == null) {\r\n $scope.$watch('question.options', function () {\r\n if ($scope.question.options != null && $scope.question.originalOptions == null) {\r\n $scope.question.originalOptions = $scope.question.options;\r\n $scope.filterOptions();\r\n }\r\n }, true)\r\n }\r\n else {\r\n question.originalOptions = question.options;\r\n }\r\n }\r\n\r\n //Avoid browser autofill\r\n if (question.data_point_code == 'service_name') {\r\n question.name = 'serviceName';\r\n }\r\n else if (question.data_point_code == 'service_owner_name') {\r\n question.name = 'serviceOwnerName';\r\n }\r\n\r\n if (question.data_point_code == 'user_training_training_id' && question.answer != null && question.answer.value != null && isValidGuid(question.answer.value)) {\r\n question.parameters.current_training_id = question.answer.value;\r\n }\r\n\r\n if (question.data_point_code == 'service_vehicles_vehicle_id' && question.vehicle_restrict_services == true) {\r\n $scope.group.parameters.vehicle_restrict_services = true;\r\n }\r\n\r\n if (question.data_point_code == 'service_area_states' && question.answer != \"undefined\" && question.answer != null && question.answer.value != null) {\r\n $scope.stateChanged(question);\r\n }\r\n\r\n if ((question.data_point_code == 'service_users_user_id' || question.data_point_code == 'service_vehicles_vehicle_id') && $scope.group.component_allow_multiple_groups != \"undefined\" && $scope.group.component_allow_multiple_groups != null && $scope.group.component_allow_multiple_groups == false) {\r\n\r\n $scope.actionOptions = [];\r\n\r\n if ($scope.group.component_group_add == true) {\r\n $scope.actionOptions = [{ id: 'a', name: 'Add record to the service' }];\r\n if ($scope.group.component_group_update == true) {\r\n $scope.actionOptions = [\r\n { id: 'a', name: 'Add record to the service' },\r\n { id: 'u', name: 'Update record in the service' }];\r\n if ($scope.group.component_group_remove == true) {\r\n $scope.actionOptions = [\r\n { id: 'a', name: 'Add record to the service' },\r\n { id: 'u', name: 'Update record in the service' },\r\n { id: 'r', name: 'Remove record from the service' }];\r\n }\r\n }\r\n else if ($scope.group.component_group_remove == true) {\r\n $scope.actionOptions = [\r\n { id: 'a', name: 'Add record to the service' },\r\n { id: 'r', name: 'Remove record from the service' }];\r\n }\r\n }\r\n else {\r\n if ($scope.group.component_group_update == true) {\r\n $scope.actionOptions = [{ id: 'u', name: 'Update record in the service' }];\r\n if ($scope.group.component_group_remove == true) {\r\n $scope.actionOptions = [\r\n { id: 'u', name: 'Update record in the service' },\r\n { id: 'r', name: 'Remove record from the service' }];\r\n }\r\n }\r\n else if ($scope.group.component_group_remove == true) {\r\n $scope.actionOptions = [{ id: 'r', name: 'Remove record from the service' }];\r\n }\r\n\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n // Used on continue & save so it doesn't error, would read value as a string.\r\n // service_financials number fields (fiscal year, total revenue, total income, other income)\r\n const financialNumberIds = [\"b50c8157-489f-4a2b-bf76-3023e2c39710\", \"ef1a6290-8cf9-42cf-9863-ed2802d836fe\", \"227be11c-1f70-4194-9d6a-000507882729\", \"3317f3bd-f560-4c02-836d-c03e9cb6ceae\"];\r\n $scope.$watch('question.answer', function (newValue, oldValue) {\r\n if (financialNumberIds.includes(newValue.data_point_id) && newValue.value !== oldValue.value) {\r\n $scope.question.answer.value = parseFloat(newValue.value);\r\n }\r\n });\r\n\r\n // for deficiency \r\n $scope.parentDeficiencies = 0;\r\n $scope.counter = function (deficiency) {\r\n deficiency.list_count = ++$scope.count;\r\n }\r\n\r\n if ($scope.group.questions !== undefined && $scope.group.questions.length > 0) {\r\n var iter = 0;\r\n $scope.group.questions.forEach(function (q) {\r\n if (q.data_point_id === '3c9ae5ea-c8d6-4656-80d9-1b2242b0cbe2') { // service_users_service id\r\n $scope.group.hasService = iter;\r\n }\r\n if (q.data_point_id === 'ba99ae16-280a-4fe5-9dd1-755e03733ded') { // service_users_position id\r\n $scope.group.hasPositions = iter;\r\n $scope.group.questions[iter].original_value = \"\";\r\n }\r\n if (q.data_point_id === '36efca21-228e-4e15-b085-8f1a74df7c21') { // service_users_user_id id\r\n $scope.group.hasUser = iter;\r\n }\r\n iter++;\r\n });\r\n }\r\n // 81739: add watch if (provider data set \"service affiliation\") service & position are on form, connected by group (data set).\r\n if (($scope.group.hasService !== undefined || $scope.group.hasUser !== undefined) && $scope.group.hasPositions) {\r\n\r\n // Ensures we keep selected values and (preloaded) original values togglable when position is full\r\n if (($scope.group.questions[$scope.group.hasPositions].answer.value || $scope.group.position_original_value !== undefined) && ($scope.group.questions[$scope.group.hasPositions].original_value.length === 0)) {\r\n $scope.group.questions[$scope.group.hasPositions].original_value = ($scope.group.position_original_value !== undefined) ? $scope.group.position_original_value : $scope.group.questions[$scope.group.hasPositions].answer.value;\r\n if ($scope.group.position_original_value === undefined) $scope.group.position_original_value = $scope.group.questions[$scope.group.hasPositions].original_value;\r\n }\r\n\r\n $scope.$watch('question.answer.value', function (newValue, oldValue) {\r\n // Service switched, reset position values\r\n if ($scope.question === $scope.group.questions[$scope.group.hasService] && newValue != oldValue) {\r\n $scope.group.questions[$scope.group.hasPositions].answer.value = null;\r\n $scope.group.questions[$scope.group.hasPositions].answer.show_value = null;\r\n }\r\n\r\n // Switching user will reset original_value\r\n if (newValue === null) { $scope.group.questions[$scope.group.hasPositions].original_value = null; }\r\n\r\n // When new answer added, add only ID instead of whole object\r\n if (newValue && newValue !== oldValue && newValue.length - 1 >= 0 && typeof (newValue[newValue.length - 1]) !== 'string') {\r\n if (typeof ($scope.group.questions[$scope.group.hasPositions].answer.value) === 'string') {\r\n $scope.group.questions[$scope.group.hasPositions].answer.value += (',' + newValue[newValue.length - 1].id);\r\n }\r\n else {\r\n newValue[newValue.length - 1] = newValue[newValue.length - 1].id;\r\n }\r\n }\r\n\r\n var service_id = '';\r\n if (newValue !== null && newValue !== undefined) {\r\n if ($scope.group.hasService !== undefined && $scope.group.questions[$scope.group.hasService].answer.value === newValue) {\r\n service_id = newValue;\r\n } else if ($scope.group.hasUser !== undefined && $scope.group.questions[$scope.group.hasUser].answer.value === newValue) {\r\n service_id = $scope.parameters.service_id;\r\n }\r\n\r\n if (service_id !== '') {\r\n Positions.getServiceDesignation({ service_id: service_id, limit_position_ids: $scope.group.parameters.limit_position_ids }).then(function (positions) {\r\n $scope.group.questions[$scope.group.hasPositions].options = positions;\r\n });\r\n }\r\n }\r\n }, true);\r\n }\r\n\r\n $scope.resultClick = function (question) {\r\n\r\n var questionDefScore = null;\r\n if (question.deficiency.score != 'undefined' && typeof question.deficiency.score == 'number') {\r\n questionDefScore = question.deficiency.score;\r\n }\r\n\r\n var result = question.answer.newResult;\r\n question.answer.show_comments = result.show_comments;\r\n if (result.id != question.answer.result_set_id) {\r\n if (result.fail == 1) {\r\n if (question.answer.fail != null) {\r\n if (question.answer.fail == 1) {\r\n $scope.deficiencies.fail--;\r\n }\r\n else if (question.answer.fail == 0) {\r\n $scope.deficiencies.pass--;\r\n if (questionDefScore != null) {\r\n $scope.deficiencyScore.score -= questionDefScore;\r\n }\r\n }\r\n else if (question.answer.fail == 2) {\r\n $scope.deficiencies.ignore--;\r\n }\r\n }\r\n\r\n $scope.deficiencies.fail++;\r\n\r\n if (question.sub_components != null && question.sub_components.length > 0) {\r\n question.sub_components.forEach(function (subComponent) {\r\n if (subComponent.groups != null && subComponent.groups.length > 0) {\r\n subComponent.groups.forEach(function (subGroup) {\r\n if (subGroup.questions != null && subGroup.questions.length > 0) {\r\n subGroup.questions.forEach(function (subQuestion) {\r\n if (subQuestion.question_type.code == 'deficiency') {\r\n if (subQuestion.answer.fail != null) {\r\n if (subQuestion.answer.fail == 1) {\r\n $scope.deficiencies.fail--;\r\n } else if (subQuestion.answer.fail == 0) {\r\n $scope.deficiencies.pass--;\r\n } else if (subQuestion.answer.fail == 2) {\r\n $scope.deficiencies.ignore--;\r\n }\r\n }\r\n\r\n subQuestion.answer.fail = null;\r\n subQuestion.answer.result_set_id = null;\r\n }\r\n })\r\n }\r\n })\r\n }\r\n });\r\n }\r\n\r\n question.answer.fail = 1;\r\n }\r\n else if (result.fail == 0) {\r\n if (question.answer.fail != null) {\r\n if (question.answer.fail == 1) {\r\n $scope.deficiencies.fail--;\r\n }\r\n else if (question.answer.fail == 0) {\r\n $scope.deficiencies.pass--;\r\n }\r\n else if (question.answer.fail == 2) {\r\n $scope.deficiencies.ignore--;\r\n\r\n }\r\n }\r\n\r\n if (questionDefScore != null && question.answer.fail != 0) {\r\n $scope.deficiencyScore.score += questionDefScore;\r\n }\r\n $scope.deficiencies.pass++;\r\n\r\n if (question.sub_components != null && question.sub_components.length > 0) {\r\n question.sub_components.forEach(function (subComponent) {\r\n if (subComponent.groups != null && subComponent.groups.length > 0) {\r\n subComponent.groups.forEach(function (subGroup) {\r\n if (subGroup.questions != null && subGroup.questions.length > 0) {\r\n subGroup.questions.forEach(function (subQuestion) {\r\n if (subQuestion.question_type.code == 'deficiency') {\r\n if (subQuestion.answer.fail != null) {\r\n if (subQuestion.answer.fail == 1) {\r\n $scope.deficiencies.fail--;\r\n } else if (subQuestion.answer.fail == 0) {\r\n $scope.deficiencies.pass--;\r\n } else if (subQuestion.answer.fail == 2) {\r\n $scope.deficiencies.ignore--;\r\n }\r\n }\r\n\r\n $scope.deficiencies.pass++;\r\n subQuestion.answer.fail = 0;\r\n subQuestion.answer.result_set_id = result.id;\r\n }\r\n })\r\n }\r\n })\r\n }\r\n });\r\n }\r\n\r\n question.answer.fail = 0;\r\n }\r\n else if (result.fail == 2) {\r\n\r\n if (question.answer.fail != null) {\r\n if (question.answer.fail == 1) {\r\n $scope.deficiencies.fail--;\r\n }\r\n else if (question.answer.fail == 0) {\r\n $scope.deficiencies.pass--;\r\n if (questionDefScore != null) {\r\n $scope.deficiencyScore.score -= questionDefScore;\r\n }\r\n }\r\n else if (question.answer.fail == 2) {\r\n $scope.deficiencies.ignore--;\r\n }\r\n }\r\n\r\n $scope.deficiencies.ignore++;\r\n\r\n if (question.sub_components != null && question.sub_components.length > 0) {\r\n question.sub_components.forEach(function (subComponent) {\r\n if (subComponent.groups != null && subComponent.groups.length > 0) {\r\n subComponent.groups.forEach(function (subGroup) {\r\n if (subGroup.questions != null && subGroup.questions.length > 0) {\r\n subGroup.questions.forEach(function (subQuestion) {\r\n if (subQuestion.question_type.code == 'deficiency') {\r\n if (subQuestion.answer.fail != null) {\r\n if (subQuestion.answer.fail == 1) {\r\n $scope.deficiencies.fail--;\r\n } else if (subQuestion.answer.fail == 0) {\r\n $scope.deficiencies.pass--;\r\n } else if (subQuestion.answer.fail == 2) {\r\n $scope.deficiencies.ignore--;\r\n }\r\n }\r\n\r\n $scope.deficiencies.ignore++;\r\n subQuestion.answer.fail = 2;\r\n subQuestion.answer.result_set_id = result.id;\r\n }\r\n })\r\n }\r\n })\r\n }\r\n });\r\n }\r\n\r\n question.answer.fail = 2;\r\n }\r\n }\r\n\r\n question.answer.result_set_id = result.id;\r\n }\r\n }]\r\n };\r\n }])\r\n ;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormSkill\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"EXSkill\",\r\n \"$sce\",\r\n function ($scope, EXSkill, $sce) {\r\n $scope.skillsloading = true;\r\n $scope.selectedskills = [];\r\n $scope.skills = [];\r\n\r\n $scope.trust = function (htmlText) {\r\n //removing first pair of

    tags to keep description on first line of skill\r\n htmlText = (htmlText !== null) ? htmlText.replace('

    ', '').replace('

    ', '') : '';\r\n return $sce.trustAsHtml(htmlText);\r\n }\r\n\r\n if ($scope.skills.length == 0) {\r\n $scope.skillsloading = true;\r\n EXSkill.get().then(function(Skills) {\r\n for (var x in Skills) {\r\n for (var y in Skills[x].options) {\r\n Skills[x].total_points +=\r\n Skills[x].options[y].points;\r\n }\r\n \r\n if (Skills[x].max_points != null && Skills[x].max_points > 0)\r\n if (Skills[x].max_points < Skills[x].total_points)\r\n Skills[x].total_points = Skills[x].max_points;\r\n }\r\n $scope.skills = angular.copy(Skills);\r\n $scope.setSelectedValues();\r\n });\r\n }\r\n\r\n $scope.setSelectedValues = function() {\r\n $scope.selectedskills = [];\r\n $scope.component.skill_question_ids\r\n .split(\",\")\r\n .forEach(function(skillid) {\r\n $scope.skills.forEach(function (skill) {\r\n if (skill.id == skillid.trim()) {\r\n skill.options.forEach(function (option) {\r\n if ($scope.component.skill_default == \"1\") {\r\n option.passed = 1;\r\n }\r\n if ($scope.component.skill_default == \"2\") {\r\n option.passed = 2;\r\n }\r\n })\r\n $scope.selectedskills.push(skill);\r\n }\r\n });\r\n });\r\n $scope.tallyScores();\r\n $scope.skillsloading = false;\r\n };\r\n\r\n $scope.determineClasses = function(isEven) {\r\n var classes = \"selectedSkill row no-margin\";\r\n if (isEven) classes += \" even\";\r\n\r\n return classes;\r\n };\r\n\r\n $scope.getPassButtonClass = function (option) {\r\n var classes = \"btn btn-group ng-pristine ng-untouched ng-valid ng-binding ng-scope ng-empty btn-default\";\r\n if (option.passed == \"1\")\r\n classes += \" pass\";\r\n return classes;\r\n };\r\n $scope.getFaillButtonClass = function (option) {\r\n var classes = \"btn btn-group ng-pristine ng-untouched ng-valid ng-binding ng-scope ng-empty btn-default\";\r\n if (option.passed == \"2\")\r\n classes += \" fail\";\r\n return classes;\r\n };\r\n\r\n $scope.updateScore = function (option, passed) {\r\n option.passed = passed\r\n $scope.tallyScores();\r\n };\r\n\r\n $scope.tallyScores = function () {\r\n $scope.selectedskills.forEach(function (skill) {\r\n skill.talliedPoints = 0;\r\n skill.options.forEach(function (option) {\r\n if (option.passed == 1) {\r\n skill.talliedPoints += option.points;\r\n if (skill.talliedPoints > skill.total_points)\r\n skill.talliedPoints = skill.total_points;\r\n }\r\n })\r\n })\r\n };\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder-form/form-skill/form-skill.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n]);\r\n","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpAlphaFilter\", [\r\n \"Resource\",\r\n function(Resource) {\r\n return {\r\n restrict: \"AE\",\r\n transclude: true,\r\n replace: true,\r\n scope: {\r\n //attributes\r\n alphaFilter: \"=?\"\r\n },\r\n require: \"^hlpList\",\r\n templateUrl: \"templates/list/alpha-filter/alpha-filter.html\",\r\n link: function(scope, elem, attrs, ctrl) {\r\n scope.options = Resource.alpha();\r\n\r\n scope.change = ctrl.alphaFilterChanged;\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFilter', [function () {\r\n return {\r\n restrict: 'E',\r\n transclude: true,\r\n replace: true,\r\n scope: {\r\n //attributes\r\n filter: '=?'\r\n },\r\n require: '^hlpList',\r\n templateUrl: 'templates/list/filter/filter.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n if (!scope.filter) { scope.filter = {}; }\r\n if (!scope.filter.type) { scope.filter.type = 'select'; }\r\n if (!scope.filter.name) { scope.filter.name = scope.filter.type; }\r\n if (!scope.filter.options) { scope.filter.options = []; }\r\n if (scope.filter.showBlank == null) { scope.filter.showBlank = true; }\r\n if (scope.filter.type == 'userObj') {\r\n scope.selectValue = 'user_id';\r\n } else {\r\n scope.selectValue = 'id';\r\n }\r\n if (scope.filter.type == 'licenseLevel') {\r\n scope.selectShow = 'combined_name';\r\n } else {\r\n scope.selectShow = 'name';\r\n }\r\n\r\n scope.filterChanged = ctrl.filterChanged;\r\n }\r\n };\r\n }])\r\n ;","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"paginationList\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n replace: true,\r\n scope: {\r\n numPerPage: \"=?\",\r\n currentPage: \"=?\",\r\n length: \"=?\"\r\n },\r\n //?^someDirective : Pass someDirective controller if available on one of parent elements to linking function. If not, pass null.\r\n require: \"?^hlpList\",\r\n templateUrl: \"templates/list/pagination/pagination.html\",\r\n link: function(scope, elem, attrs, ctrl) {\r\n scope.perPages = [\r\n { id: 10, name: 10 },\r\n { id: 15, name: 15 },\r\n { id: 20, name: 20 },\r\n { id: 25, name: 25 },\r\n { id: 50, name: 50 },\r\n { id: 100, name: 100 },\r\n { id: 250, name: 250 }\r\n ];\r\n\r\n scope.numOfPages = function(length) {\r\n return Math.ceil(length / scope.numPerPage) - 1;\r\n };\r\n\r\n if (ctrl) {\r\n scope.setCurrentPage = ctrl.pageChanged;\r\n\r\n scope.setPerPage = ctrl.perPageChanged;\r\n } else {\r\n scope.setCurrentPage = function (page) {\r\n scope.currentPage = page;\r\n };\r\n scope.setPerPage = function (perPage) {\r\n scope.numPerPage = perPage;\r\n scope.currentPage = 0;\r\n };\r\n }\r\n\r\n scope.$watch(\"length + numPerPage\", function () {\r\n //Recalculate the number of pages when the total records changes or when the number of records per page changes\r\n scope.pages = [];\r\n\r\n if (scope.length > 0) {\r\n var i = 0;\r\n for (i = 0; i <= scope.numOfPages(scope.length); i++) {\r\n scope.pages.push({ id: i, name: i + 1 });\r\n }\r\n } else {\r\n scope.pages.push({ id: 0, name: 0 });\r\n }\r\n scope.currentPage = 0;\r\n });\r\n }\r\n };\r\n }\r\n]);\r\n"]}