{"version":3,"sources":["components.js","alert-modal/alert-modal.js","application-response/application-response.js","application-type/application-type.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","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","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","$stateParams","$modal","$q","FBResponses","LicenseRequests","Triggers","$state","$filter","$window","Session","portal","current","data","isPortal","saving","loading","progressing","completed","parameters","advance","timeouts","submitting","loadingMessage","vm","api","formsApi","CheckSession","then","validSession","checkIn","responseID","getByID","response","progress","response_id","license_request_id","license_id","user_id","service_id","vehicle_id","child_service","default_license_category_id","license_category_id","display_changed_answers","form","fireStartTrigger","started_on","Date","save","start_trigger_name","fire","triggerID","start_trigger_id","licenseRequestID","setProgress","the_form","review","go","newContinuePage","portal_pages","visible","applicationID","submitRequest","d","defer","isUndefined","pages","length","tab_active","foundMatch","activePage","forEach","page","disabled","has_content","i","scrollTo","resolve","promise","showSave","currentPage","show_save_button","showSaveAndContinue","activePageIndex","pagesCount","showSubmit","copyCustomResponseFields","j","sections","section","expanded","k","components","component","undefined","elementAnswer","l","groups","group","edit","m","questions","question","answer","invalid","document_description","document_name","document_type","validation","n","sub_components","subcomponent","o","subgroup","p","subquestion","deferred","answerRefresh","saveByForm","absoluteFurthestPageIndex","documentErrors","documentNames","map","error","join","open","animation","templateUrl","setupValidationMessages","hasContent","a","b","all","$evalAsync","doRecalculate","scrollTabIntoView","result","waitToFinish","loopCount","promiseFuncs","push","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","restrict","replace","ApplicationTypes","LicenseCategoryLevels","typeLevels","typeLevel","isRenewal","promises","typeOptions","hasLevels","defaultGroup","data_point_code","defaultApplicationType","value","defaultCertificationLevel","get","types","application_types","levels","typeID","type","level","sprocValueFound","defaultValueFound","answerShowVal","typeAnswerVal","default_value","renewal","applicationTypeID","applicationTypeName","renewalTypeId","show_value","levelAnswerVal","license_category_levels","split","v","typeOptionsMapped","row","has_levels","showLevel","show","typeChange","levelsChange","key","hasOwnProperty","$setValidity","isArray","validate","levelChange","isEmpty","file","$error","hideRadioBtn","Format","Validation","checkboxOrRadio","link","elem","ctrl","submitted","AutoNumbers","licenseId","licenseCategoryId","autoNumber","showLinks","$watch","auto_number","Array","dateFormats","ruleFormats","FormatNumber","number","rule","numberFormatted","toString","FormatDate","dateFormat","format","back","from","navigationBack","params","state","remove","LicenseRequestLevels","CertificationLevels","LicenseRequestApplicationTypes","LicenseLevelConfigurations","data_type","allLevels","currentLevels","applicationTypes","certLevels","certificationLevels","lrat","licenseRequestApplicationTypes","config","levelConfig","initProms","renewalType","application_type_id","license_request_level_id","checked","curLevel","license_category_level_id","data_element_id","certLevel","clear","indexOf","Permissions","loadingText","permission","permissionState","transclude","require","access","hasPermission","setLoader","off","this","text","groupLoading","buttonClass","ngModel","checkboxLabel","changeFunction","index","hideLabel","array","checkboxItem","wasEmpty","contains","updateArray","item","wasString","isString","splice","arr","toLowerCase","onChange","$setViewValue","isFunction","$injector","updateService","options","showValue","requiredPositions","additional_id","group_id","validateQuestion","validationTimeout","data_point_id","newValue","answerList","original_value","includes","concat","option","checkbox","document","getElementById","full_position","max","valueArr","compile","pre","optionsLoaded","dirOptions","getOptions","Object","prototype","call","trim","refresh","limit_position_ids","refreshOptions","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","file_content","uploading","working","fileChange","fileUpdated","base64DataUrl","content","filePicked","file_name","dismiss","Clinicians","Documents","preview","enterprise","website","portalURL","site_location","internalURL","getDocumentByResponseID","document_id","fileUpload","document_code","code","downloadClinicians","downloading","downloadExcel","createElement","href","download","click","importClinicians","upload","file_updated","saved","yes","no","Licenses","settings","licenseID","licenses","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","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","filter","getCreditCardTypes","creditCardTypes","getDebitCardTypes","debitCardTypes","$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","oldValue","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","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","component_allow_multiple_groups","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","newElem","getServiceDesignation","positions","questionDefScore","newResult","passed","tallyScores","getFaillButtonClass","updateScore","talliedPoints","alpha","perPages","numOfPages","setCurrentPage","setPerPage"],"mappings":"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","file":"components-24.12.2.1.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 .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 .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('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 },\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) {\r\n if (newValue !== null && Array.isArray(newValue)) {\r\n // List of answers & original answers to allow checkboxes to be re-toggled when position is full\r\n var answerList = [];\r\n if ($scope.question.original_value !== null) {\r\n if ($scope.question.original_value.includes(',')) { $scope.question.original_value = $scope.question.original_value.split(',') }\r\n answerList = answerList.concat($scope.question.original_value);\r\n }\r\n if ($scope.question.answer.value !== null) {\r\n if ($scope.question.answer.value.includes(',')) { $scope.question.answer.value = $scope.question.answer.value.split(',') }\r\n answerList = answerList.concat($scope.question.answer.value);\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 user holds the position and not to disable when .\r\n checkbox.disabled = $scope.isDisabled || !$scope.show(option) || (((!answerList.includes(option.id) && option.checked !== true && option.full_position === 1) || option.max === 0) && option.max !== null);\r\n\r\n if (option.max === 0 || answerList.length === 0) {\r\n checkbox.checked = false;\r\n } else if ($scope.question.answer.value.includes(option.id)) {\r\n checkbox.checked = true;\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 if (typeof (valueArr) === 'string') { valueArr = [valueArr]; }\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 .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 .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 },\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 },\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 if (scope.requiredPositions.length > 0) {\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] && !$scope.group.component_allow_multiple_groups && newValue != oldValue) {\r\n $scope.group.questions[$scope.group.hasPositions].answer.value = '';\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 = []; }\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 const newElem = newValue.pop()\r\n newValue.push(newElem.id);\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"]}