{"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-scheduling/inspections-scheduling.js","inspections-schedule/inspections-schedule.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","slush-box/slush-box.js","submit/submit.js","ssn/ssn.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","verify-password/verify-password.js","voucher-pay/voucher-pay.js","yes-no/yes-no.js","service-training-reimbursement/service-training-reimbursement.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","signatureError","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","oldValue","full_position","groupsBool","component_allow_multiple_groups","answerList","currQuestion","includes","concat","original_value","option","checkbox","document","getElementById","isFull","max","filter","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","reponseBaseUrl","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","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","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","DocumentTypes","creating","getOtherDocuments","otherTypes","messages","documents","pass","service_template","data_object_id","removeInspector","addGroup","added","removeGroup","closeGroup","setEdit","cacheListAttrs","defaultSort","defaultSortOrder","showPagination","showAlpha","alphaField","showSearch","defaultNumPerPage","records","columns","filters","advancedFilters","clickable","bulkActions","recordsLoading","listLoading","showBulkAction","bulkActionRunning","linkDisabled","hidePdf","criteria","stopPropagation","subList","subRecords","subColumns","pdfLinkDisabled","alphaFilterChanged","letter","alphaFilter","masterFilter","pageChanged","perPageChanged","perPage","filterChanged","keep","advancedFilterOn","isApplyAll","filtered","recordsSet","numOfSortOrderCols","sublist","subcolumns","subrecords","documentURL","recordsTotal","dynamic","pageRecords","searchTimeout","getRecords","filteredRecords","countTimeout","getCount","oldCriteria","evaluateField","dateTimeFlag","broke","f","vehicles_serial_number","evaluateJSON","fullName","optionalTime","dirtyVal","dirtyArr","cleanArr","dirtyStr","fileSize","investigation_external_document_name","investigation_external_document_file_name","determineClasses","column","floor","mod","c","getInfoFields","shift","advancedFilter","changeState","dropDown","openDocument","htmlLink","checkPermission","applyAll","skipBulkAction","applyOne","initBulkAction","bulkAction","showActionForRecord","hideAction","hideActionPermission","filteredOut","reverseDefaultSort","isTotalUndefined","setCachedFilters","cachedFilters","checkedCache","of","oldFilters","oldRecords","oldColumns","cacheLoading","old","newie","newVal","oldVal","cachedAdvancedFilters","opts","x","partial","parent","input","out","ServiceUserLongevities","Users","service_users","serviceUserLongevities","check_all","inactiveServiceUsers","longevityGet","serviceUsers","user","approved","sul","nameandnumber","approve","focusOnChange","trust","year","monthYear","months","years","yearOffset","yearSpan","$http","suggestionsArr","modelArr","apiUrl","beforeSelectItem","afterSelectItem","beforeRemoveItem","afterRemoveItem","onChangeFunction","existingLoaded","selectedOptions","objectProperty","selectedItemIndex","errMsgRequired","disable","isOpen","getSuggestionsList","onBlur","relatedTarget","classList","target","toggleOpen","keyParser","$event","keys","38","40","8","13","9","27","keyCode","inputValue","removeAddedValues","filteredSuggestionArr","alreadyAddedValues","onSuggestedItemsClick","selectedValue","isDuplicate","duplicate","equals","isAdded","itemIndex","mouseEnterOnItem","cachedArr","isHover","isFocused","onFocus","onMouseEnter","onMouseLeave","keyPress","charCode","which","integerOnly","positiveOnly","step","money","pattern","isNumeric","isFinite","setPhone","boxtwo","boxthree","phone","valueList","overwriteOnChange","resizeOptions","quality","width","resizeConditions","postalCode","addresses","FIPSLookup","select","address","lookupZip","postalSearching","getByPostalCode","failMessage","city","county","city_name","county_name","region_id","postal_code","$viewChangeListeners","$eval","ngChange","Queries","cacheRecords","previewId","queryChanged","query","display_bulk_actions","query_page","link_state","query_page_parameters","queryPageParameter","param","json","query_column_values","sortObjectArray","queryColumnValue","query_column","query_column_parameters","queryColumnParameter","query_filter_values","queryFilterValue","display_label","query_filter","query_advanced_filter_values","queryAdvancedFilterValue","query_advanced_filter","exactMatch","exact_match","default_sort","default_order","defaultOrder","query_criteria","queryCriteria","criteriaValue","skipit","doquotes","query_calculated_value","query_field","daysVal","Number","compareDate","query_operator","recordsWatchInit","queryState","queries","cachedQuery","found","default_view","radioLabel","RadioDirectiveTag","__tag","directiveScope","extend","useDefault","multiSelect","optionClause","existingOptionsLoaded","selectedArray","needToChangeToString","newArray","getNameFromListArray","valueArray","add","addAll","filterFn","removed","removeByAttr","removeAll","up","upitem","down","downitem","slushbox","selectedOptionClause","availableOptionClause","newModel","domOptions","setAttribute","filterFound","showSSN","ssn","setSsn","security","substring","isGenerated","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","userId","addCourse","t","checkCourseOptions","courses","course","selectedOption","LicenseRequestSupplementalTrainingTrainings","supplementalTrainings","completedTrainingParameters","completedOnly","otherApplications","trainings","getTrainingValidationDates","validationDates","editTraining","training","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","viewValue","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","$asyncValidators","modelValue","apiLocation","password","user_name","userAccount","first_name","last_name","display_name","showUsername","$dirty","cleanupSubmitHandler","VoucherPay","compareAmounts","getExistingVouchersByLicenseRequestID","existingVouchers","getVoucherAmounts","voucherAmounts","voucherAmount","existingVoucher","quantity","reorder","activeInactive","instructions2","ServiceUserTrainings","TrainingUsers","FBForms","removeTraingingFromDict","oldAnswer","training_id","usedTrainingIndex","userTrainingUsed","iter","addTraingingToDict","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","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","parentQuestion","parentComponent","calculatedFieldCalculationTypeOptions","reimburseLengthTypes","contentOptions","contentTypeOptions","componentTypeInit","formElementInit","form_elements","element_id","element_code","element_instructions","componentTypeChange","calculation_type","calcFieldConditions","component_id","ssn_setting","update_from_form","share_files","show_in_grid","masked_setting","showValidation","question_type_id","question_type","validation_type_id","type_message","dataSetInit","license_category_specific","data_point","attribute_id","table_name","encrypted","data_point_table_name","compound_id","instruction_text","expression","expression_message","dataSetChange","initialQuestion","initialFound","initialLength","foreignDataSetInit","foreignDataSetChange","allow_add","allow_edit","componentTypes","old_data_points","old_questions","componentType","parent_question_id","foreign_data_set_id","foreign_data_set","isForeignDataSet","nullGuid","guidCondition","nullCondition","dataPointChange","setProperties","limitPositionsChange","getByAttr","limitVehicleTypesChange","vehicle_types","limitDocumentTypesChange","document_types","conditionalChange","conditional","formElementChange","allowMultipleGroupChange","update_from_form_update","update_from_form_delete","showShareFiles","cke_skin","$watchGroup","newValues","oldValues","conditionalComponent","hitComponent","getComponentQuestion","questionChange","getComponentFromID","componentID","andOrOptions","leftParenOptions","rightParenOptions","initial","operators","current_license_id","order","applicationTypeExists","exists","q","ssn_setting_options","true_false_options","yes_no_options","changeUpdateFromFormBasedOnDisabled","updateFromFormInstructions","setUpdateFromFormInstructions","getForForm","questionOrderChanged","saveQuestion","allow_sub_components","allow_dynamic_addition","allow_dynamic_edit","addQuestion","addSubComponent","questionTypeInit","questionTypeChange","questionNameChange","old_name","removeQuestion","questionOptions","subComponentOptions","toggleValidation","EXSkill","EXSkillCategory","skillsloading","SkillCategoriesFilter","selectedskills","showScores","skillDefault","skills","allSKills","skillsDefaultOptions","getActive","Skills","y","total_points","points","updateBothLists","addSelecteSkills","SkillCategories","skillscolumns","skillfilters","skillid","skill","setSelectedIDs","newList","oldList","htmlText","max_points","setSelectedValues","updateOrder","removeSkill","isEven","getPassButtonClass","getFailButtonClass","selectedSkillOptions","selectedSkill","parentGroup","show_documents_without_type","append","default_group","component_data_set_code","data_set_code","defaultQuestion","document_type_copy","document_name_copy","note","phone_ext","show_comments","initializeSubComponentAnswers","getAnswer","stringVal","dataset","initGroup","setHeaders","headers","globalHeaders","collapsed","groupForms","$valid","Vehicles","dynamicDelete","answerChanged","previousAction","dynamicDeleteShow","dynamicAdd","dynamicAddShow","dynamicDisabled","childServiceDisabled","actionChanged","single_group_action","setupAddress","data_point_address_field","data_point_address_postal_data_point_id","positionsAnswers","positionsOnForm","positionAnswer","values","apply","tempOptions","positionCount","comparisonResults","positionOnForm","match","requiredPosition","retrieveCourseInfo","courseInfo","attendee_count","attendee_max_count","remainingSpots","locationinfo","street1","street2","municipality","regioninfo","abbreviation","checkPrerequisites","failedPrerequisites","customFunctionMessage","permitNumber","vehicleID","record_id","getCertificationByNumber","permitNumberCount","vehicle_certification_number","vcn","serialNumber","getVehicleBySerialNumber","serialNumberCount","vehicle_serial_number","vsn","email","getUserbyEmail","yearCount","calendar_year","personnelID","serviceID","getUserByServicePersonnelID","coreRosterUser","userCount","service_users_personnel_id","sup","ServiceAreaCities","ServiceAreaCounties","ServiceAreaPostalCodes","ServiceAreaCensusTracts","IPComment","Positions","showReviewComment","showDynamicComment","currComment","administrative_review","getAdministrativeCommentsByQuestionId","createdon","createdOn","createdby","questionId","fbQuestionId","setAutoCompleteByDisabled","toggleReviewComment","toggleDynamicComment","enableAdminComments","saveReviewComment","comment","saveAdministrativeComment","resolveComment","resolveAdministrativeComment","resolved","toggleShowOnPdf","openImageModal","showServiceRosterList","clearQuestion","numberCheck","keyEvent","stateChanged","stateCode","newState","datasetquestion","getByStateCode","initQuestion","populateSubComponent","data_point_foreign_data_set_code","populateGroup","convertDateToUTC","hasPositions","filterOptions","originalOptions","custom_filter","newOpts","children","childAdded","child","filter_data_point_code","current_training_id","actionOptions","component_group_add","component_group_update","component_group_remove","financialNumberIds","parentDeficiencies","counter","list_count","hasService","hasUser","position_original_value","getServiceDesignation","positions","onCanvasDrawn","_isEmpty","clearSignature","onEnd","questionDefScore","newResult","passed","tallyScores","getFaillButtonClass","updateScore","talliedPoints","alpha","perPages","numOfPages","setCurrentPage","setPerPage"],"mappings":"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","file":"components-25.3.0.0.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 if (response != null && response.signatureError) {\r\n deferred.resolve(response.signatureError);\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 && response.signatureError) {\r\n // signature required but missing\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 return response.signatureError;\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 groups: \"=?\" // for service user affiliations (positions)\r\n },\r\n require: \"ngModel\",\r\n transclude: true,\r\n replace: true,\r\n templateUrl: \"templates/checkboxes/checkboxes.html\",\r\n controller: [\r\n \"$scope\",\r\n \"$timeout\",\r\n function ($scope, $timeout) {\r\n $scope.additional_id = ($scope.question && $scope.question.group_id) ? $scope.question.group_id + ',' : '';\r\n $scope.validate = function () {\r\n if ($scope.validation) {\r\n Validation.validateQuestion(\r\n $scope.innerForm,\r\n $scope.validation,\r\n $scope.ngModel\r\n ).then(function (result) {\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty($scope.innerForm.$error);\r\n }\r\n });\r\n } else {\r\n if (\r\n $scope.question !== undefined &&\r\n $scope.question.answer !== undefined\r\n ) {\r\n $scope.question.answer.invalid = !isEmpty(\r\n $scope.innerForm.$error\r\n );\r\n }\r\n }\r\n };\r\n var validationTimeout = $timeout(function () {\r\n if (!$scope.requiredText) {\r\n $scope.requiredText =\r\n \"Please select a \" +\r\n Format.label($scope.label || \"value\");\r\n }\r\n\r\n if ($scope.innerForm !== undefined) {\r\n if ($scope.isRequired) {\r\n if (\r\n $scope.ngModel == null ||\r\n $scope.ngModel.length == 0\r\n ) {\r\n $scope.innerForm.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n $scope.innerForm.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n $scope.validate();\r\n }\r\n }, 0);\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n $timeout.cancel(validationTimeout);\r\n });\r\n\r\n if ($scope.question !== undefined && $scope.question.data_point_id === 'ba99ae16-280a-4fe5-9dd1-755e03733ded') { // service_users_position Data Point\r\n // When options are updated, usually a user or service was change, update checkboxes as needed\r\n $scope.$watch('options', function (newValue, oldValue) {\r\n // case for multiple provider positions where full_position can be dropped\r\n if (newValue && oldValue && typeof (newValue[0]) !== \"string\" && newValue[0].full_position === null && newValue.length === oldValue.length) {\r\n for (var i = 0; i < newValue.length; i++) {\r\n newValue[i].full_position = oldValue[i].full_position;\r\n }\r\n }\r\n if (newValue !== null && Array.isArray(newValue)) {\r\n var groupsBool = $scope.groups && $scope.groups[0].component_allow_multiple_groups && $scope.groups[0].service_id !== null;\r\n // List of answers & original answers to allow checkboxes to be re-toggled when position is full\r\n $scope.answerList = [];\r\n // multiple service users & position from service license\r\n if (groupsBool) {\r\n for (var i = 0; i < $scope.groups.length; i++) {\r\n for (var j = 0; j < $scope.groups[i].questions.length; j++) {\r\n var currQuestion = $scope.groups[i].questions[j];\r\n // skip the question if it doesn't match the current checkbox question\r\n if (currQuestion.data_point_id !== 'ba99ae16-280a-4fe5-9dd1-755e03733ded') { continue; }\r\n\r\n // only check values on form in this instance\r\n if (currQuestion.answer.value !== null) {\r\n if (currQuestion.answer.value.includes(',')) {\r\n $scope.answerList = $scope.answerList.concat(currQuestion.answer.value.split(','));\r\n } else {\r\n $scope.answerList = $scope.answerList.concat(currQuestion.answer.value);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n if ($scope.question.original_value !== null) {\r\n if ($scope.question.original_value.includes(',')) {\r\n $scope.answerList = $scope.answerList.concat($scope.question.original_value.split(','));\r\n }\r\n else {\r\n $scope.answerList = $scope.answerList.concat($scope.question.original_value);\r\n }\r\n }\r\n if ($scope.question.answer.value !== null) {\r\n if ($scope.question.answer.value.includes(',')) {\r\n $scope.answerList = $scope.answerList.concat($scope.question.answer.value.split(','));\r\n }\r\n else {\r\n $scope.answerList = $scope.answerList.concat($scope.question.answer.value);\r\n }\r\n }\r\n }\r\n\r\n for (var i = 0; i < newValue.length; i++) {\r\n const option = newValue[i];\r\n var checkbox = document.getElementById($scope.additional_id + option.id + '_checkbox');\r\n if (checkbox !== null) {\r\n // Inside of () is a check for Service User/Service Affiliation Data Set (position)\r\n // allow a \"Full\" position to be re-checked if the position isn't full.\r\n var isFull = (groupsBool) ? (option.max && option.max <= $scope.answerList.filter(function (id) { return id === option.id; }).length) : option.full_position;\r\n\r\n // uncheck checkbox if needed and handle disabling\r\n if ((option.max === 0 || $scope.answerList.length === 0) && checkbox.checked === true) {\r\n checkbox.checked = false;\r\n $scope.ngModel = []; // needed for single position forms, switching users then checking a previous box held; then click any position, can cause some fields to lose data\r\n }\r\n if (groupsBool) {\r\n checkbox.disabled = $scope.isDisabled || !$scope.show(option) || option.max === 0 || (isFull && checkbox.checked !== true);\r\n }\r\n else {\r\n checkbox.disabled = $scope.isDisabled || !$scope.show(option) || ((($scope.answerList.indexOf(option.id) === -1 && option.checked !== true && option.full_position === 1 && isFull) || option.max === 0) && option.max !== null);\r\n }\r\n }\r\n }\r\n }\r\n }, true);\r\n\r\n // Only do this for non-preview\r\n if ($scope.question.answer) {\r\n // Value can sometimes be updated after options & ensure no double click needed\r\n $scope.$watch('question.answer.value', function (newValue) {\r\n if (newValue !== null && newValue.length !== 0) {\r\n var valueArr = newValue.includes(',') ? newValue.split(',') : newValue;\r\n\r\n if (typeof (valueArr) === 'string') { valueArr = [valueArr]; }\r\n\r\n valueArr.forEach(function (answer) {\r\n var checkbox = document.getElementById($scope.additional_id + answer + '_checkbox');\r\n if (checkbox !== null) { checkbox.checked = true; }\r\n });\r\n }\r\n }, true);\r\n }\r\n }\r\n }\r\n ],\r\n compile: function (elem, attrs) {\r\n return {\r\n pre: function (scope, elem, attrs, ngModel) {\r\n scope.timeouts = [];\r\n\r\n if (!attrs.name) {\r\n attrs.name = \"checkboxes\";\r\n }\r\n if (!attrs.id) {\r\n attrs.id = attrs.name;\r\n }\r\n if (!attrs.label) {\r\n attrs.label = Format.label(attrs.name);\r\n }\r\n if (!attrs.showLabel) {\r\n attrs.showLabel = attrs.label.length > 0;\r\n } else {\r\n if (attrs.showLabel == \"true\") {\r\n attrs.showLabel = true;\r\n } else {\r\n attrs.showLabel = false;\r\n }\r\n }\r\n if (!attrs.topLabel) {\r\n attrs.topLabel = false;\r\n } else {\r\n if (\r\n attrs.topLabel == true ||\r\n attrs.topLabel == \"true\"\r\n ) {\r\n attrs.topLabel = true;\r\n } else {\r\n attrs.topLabel = false;\r\n }\r\n }\r\n if (!attrs.updateService) {\r\n attrs.updateService = true;\r\n } else {\r\n if (\r\n attrs.updateService == true ||\r\n attrs.updateService == \"true\"\r\n ) {\r\n attrs.updateService = true;\r\n } else {\r\n attrs.updateService = false;\r\n }\r\n }\r\n if (!attrs.showColon) {\r\n attrs.showColon = true;\r\n } else {\r\n if (\r\n attrs.showColon == true ||\r\n attrs.showColon == \"true\"\r\n ) {\r\n attrs.showColon = true;\r\n } else {\r\n attrs.showColon = false;\r\n }\r\n }\r\n //if (!attrs.isRequired) { attrs.isRequired = false; } else { if (attrs.isRequired == 'true') { attrs.isRequired = true; } else { attrs.isRequired = false; } }\r\n if (!attrs.title) {\r\n attrs.title = attrs.label;\r\n }\r\n\r\n if (!attrs.selectShow) {\r\n attrs.selectShow = \"name\";\r\n }\r\n if (!attrs.selectValue) {\r\n attrs.selectValue = \"id\";\r\n }\r\n if (!attrs.method) {\r\n attrs.method = \"get\";\r\n }\r\n if (!attrs.modal) {\r\n attrs.modal = false;\r\n } else {\r\n if (attrs.modal == \"true\") {\r\n attrs.modal = true;\r\n } else {\r\n attrs.modal = false;\r\n }\r\n }\r\n if (!attrs.forceString) {\r\n attrs.forceString = false;\r\n } else {\r\n if (attrs.forceString == \"true\") {\r\n attrs.forceString = true;\r\n } else {\r\n attrs.forceString = false;\r\n }\r\n }\r\n if (!attrs.vertical) {\r\n attrs.vertical = false;\r\n } else {\r\n if (attrs.vertical == \"true\") {\r\n attrs.vertical = true;\r\n } else {\r\n attrs.vertical = false;\r\n }\r\n }\r\n\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n scope.getOptions = function () {\r\n if (\r\n scope.options != null &&\r\n !(\r\n scope.service != null &&\r\n scope.service != \"\" &&\r\n scope.serviceOverride\r\n )\r\n ) {\r\n if (\r\n Object.prototype.toString.call(\r\n scope.options\r\n ) !== \"[object Array]\"\r\n ) {\r\n scope.options\r\n .split(\",\")\r\n .forEach(function (option) {\r\n scope.dirOptions.push({\r\n id: option.trim(),\r\n name: option.trim()\r\n });\r\n });\r\n scope.optionsLoaded = true;\r\n } else {\r\n scope.$evalAsync(function () {\r\n scope.dirOptions = scope.options;\r\n scope.optionsLoaded = true;\r\n });\r\n }\r\n } else if (\r\n scope.service != null &&\r\n scope.service != \"\"\r\n ) {\r\n var service = $injector.get(scope.service);\r\n\r\n service[scope.method](scope.parameters).then(\r\n function (data) {\r\n scope.dirOptions = data;\r\n if (attrs.updateService) {\r\n scope.options = data;\r\n }\r\n scope.optionsLoaded = true;\r\n }\r\n );\r\n } else {\r\n scope.optionsLoaded = true;\r\n }\r\n };\r\n scope.getOptions();\r\n\r\n // watch for signal to refresh the options\r\n scope.$watch(\r\n \"question.refreshOptions\",\r\n function (refresh) {\r\n if (scope.question !== undefined) {\r\n if (\r\n refresh !== undefined &&\r\n refresh !== null &&\r\n refresh.length &&\r\n (scope.service != null &&\r\n scope.service.length)\r\n ) {\r\n scope.parameters.limit_position_ids = refresh;\r\n scope.optionsLoaded = false;\r\n scope.getOptions();\r\n }\r\n scope.question.refreshOptions = null;\r\n }\r\n },\r\n true\r\n );\r\n\r\n // watch for signal to refresh the validation\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.data_point_code ==\r\n \"service_users_position\"\r\n ) {\r\n scope.$watch(\r\n \"question.refreshValidation\",\r\n function (refresh) {\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n if (\r\n refresh !== undefined &&\r\n refresh !== null &&\r\n refresh.length\r\n ) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n scope.ngModel\r\n ).then(function (result) {\r\n if (\r\n scope.question !==\r\n undefined &&\r\n scope.question\r\n .answer !==\r\n undefined\r\n ) {\r\n scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(\r\n scope.innerForm\r\n .$error\r\n );\r\n }\r\n });\r\n }\r\n scope.question.refreshValidation = null;\r\n }, 0)\r\n );\r\n },\r\n true\r\n );\r\n }\r\n\r\n // watch if options is coming from an array that hasn't been set yet\r\n scope.$watch(\"options\", function (options) {\r\n if (\r\n options != null &&\r\n scope.optionsLoaded &&\r\n scope.service == null\r\n ) {\r\n scope.optionsLoaded = false;\r\n scope.dirOptions = [];\r\n\r\n if (\r\n Object.prototype.toString.call(\r\n scope.options\r\n ) !== \"[object Array]\"\r\n ) {\r\n scope.options\r\n .split(\",\")\r\n .forEach(function (option) {\r\n scope.dirOptions.push({\r\n id: option.trim(),\r\n name: option.trim()\r\n });\r\n });\r\n } else {\r\n scope.dirOptions = scope.options;\r\n }\r\n scope.optionsLoaded = true;\r\n }\r\n });\r\n\r\n scope.$watch(\"optionsLoaded\", function (optionsLoaded) {\r\n if (optionsLoaded && scope.showValue == null) {\r\n scope.dirOptions.forEach(function (opt) {\r\n opt.checked = false;\r\n });\r\n if (scope.showValue == null) {\r\n scope.setShowValue();\r\n }\r\n }\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n if (\r\n scope.isRequired &&\r\n scope.innerForm !== undefined\r\n ) {\r\n if (\r\n ngModel.$modelValue == null ||\r\n ngModel.$modelValue.length == 0\r\n ) {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n if (scope.question !== undefined) {\r\n scope.question.refreshvalidation = true;\r\n }\r\n }, 0)\r\n );\r\n\r\n // validate questions on options loaded - allows maxed positions to be disabled\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n ngModel.$modelValue\r\n ).then(function (result) {\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.answer !== undefined\r\n ) {\r\n scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(scope.innerForm.$error);\r\n }\r\n });\r\n }\r\n });\r\n\r\n scope.setShowValue = function () {\r\n if (\r\n ngModel.$modelValue != null &&\r\n scope.dirOptions != null\r\n ) {\r\n scope.showValue = generateStringFromArrays(\r\n ngModel.$modelValue,\r\n scope.dirOptions\r\n );\r\n }\r\n };\r\n\r\n // see if this needs to be wrapped in a $timeout\r\n ngModel.$render = function () {\r\n if (ngModel.$modelValue != null) {\r\n if (\r\n scope.showValue == null &&\r\n scope.optionsLoaded\r\n ) {\r\n scope.setShowValue();\r\n }\r\n }\r\n\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n ngModel.$modelValue\r\n );\r\n }\r\n };\r\n\r\n scope.show = function (item) {\r\n return (\r\n typeof item.hide == \"undefined\" ||\r\n item.hide == null ||\r\n item.hide == false ||\r\n item.checked != false\r\n );\r\n };\r\n scope.getTitle = function (item) {\r\n return scope.show(item)\r\n ? scope.title\r\n : \"Maximum number of positions reached\";\r\n };\r\n\r\n scope.onChange = function () {\r\n scope.submitted = false;\r\n scope.processingChange = true;\r\n scope.timeouts.push(\r\n $timeout(function () {\r\n scope.setShowValue();\r\n if (scope.isRequired) {\r\n if (\r\n ngModel.$modelValue == null ||\r\n ngModel.$modelValue.length == 0\r\n ) {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n false\r\n );\r\n } else {\r\n scope.innerForm.$setValidity(\r\n \"required\",\r\n true\r\n );\r\n }\r\n }\r\n if (scope.validation) {\r\n Validation.validateQuestion(\r\n scope.innerForm,\r\n scope.validation,\r\n ngModel.$modelValue\r\n ).then(function (result) {\r\n if (\r\n scope.question !== undefined &&\r\n scope.question.answer !==\r\n undefined\r\n ) {\r\n scope.question.answer.invalid =\r\n !result ||\r\n !isEmpty(\r\n scope.innerForm.$error\r\n );\r\n }\r\n });\r\n }\r\n\r\n scope.processingChange = false;\r\n }, 0)\r\n );\r\n };\r\n\r\n scope.submitted = false;\r\n scope.$on(\"form:submit\", function () {\r\n scope.validate();\r\n scope.submitted = true;\r\n });\r\n\r\n scope.$on(\"$destroy\", function () {\r\n scope.timeouts.forEach(function (timer) {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n }\r\n };\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('ckEditor', ['$timeout', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n scope: {\r\n height: '@?',\r\n toolbarGroups: '=?',\r\n skin: '=?',\r\n remove: '=?'\r\n },\r\n link: function (scope, elm, attr, ngModel) {\r\n if (!ngModel) return;\r\n if (!scope.height) {\r\n scope.height = 250;\r\n }\r\n if (!scope.toolbarGroups) {\r\n scope.toolbarGroups = [\r\n { name: 'clipboard', groups: ['clipboard', 'undo'] },\r\n { name: 'links' },\r\n { name: 'insert', groups: ['Image', 'Table', 'HorizontalRule', 'SpecialChar', 'PageBreak'] },\r\n { name: 'tools', groups: ['Maximize'] },\r\n { name: 'others' },\r\n '/',\r\n { name: 'basicstyles', groups: ['basicstyles', 'cleanup'] },\r\n { name: 'paragraph', groups: ['list', 'indent', 'blocks', 'align'] },\r\n { name: 'styles' },\r\n { name: 'colors' },\r\n { name: 'about' }\r\n ];\r\n }\r\n\r\n // Set Skin\r\n if (!scope.skin && scope.$root.$state.current.name === \"portal.menus.login\") {\r\n scope.skin = 'bootstrapck';\r\n }\r\n else if (!scope.skin || scope.skin == '')\r\n {\r\n scope.skin = 'moono';\r\n }\r\n\r\n // Remove any plugins (mostly toolbar things)\r\n if (!scope.remove || scope.remove == '')\r\n {\r\n scope.remove = 'liststyle,exportpdf,smiley,iframe,showblocks,copyformatting';\r\n }\r\n else\r\n {\r\n scope.remove += 'liststyle,exportpdf,smiley,iframe,showblocks,copyformatting';\r\n }\r\n\r\n var ck = CKEDITOR.replace(elm[0], {\r\n toolbar: 'Regular',\r\n forcePasteAsPlainText: 'true',\r\n height: scope.height,\r\n toolbarGroups: scope.toolbarGroups,\r\n skin: scope.skin,\r\n removePlugins: scope.remove\r\n });\r\n\r\n ck.on('instanceReady', function () {\r\n ck.setData(ngModel.$viewValue);\r\n });\r\n\r\n ck.on('change', function () {\r\n var timer = $timeout(function() {\r\n ngModel.$setViewValue(ck.getData());\r\n }, 0);\r\n scope.$on('$destroy', function () {\r\n $timeout.cancel(timer);\r\n });\r\n });\r\n\r\n ngModel.$render = function (value) {\r\n ck.setData(ngModel.$viewValue);\r\n };\r\n\r\n elm.bind('$destroy', function () {\r\n ck.destroy();\r\n });\r\n }\r\n }\r\n }])\r\n .directive('ckHtml', ['$sce', function ($sce) {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n htmlSrc: '@?',\r\n id: '@?'\r\n },\r\n transclude: true,\r\n template:\r\n '
    ',\r\n link: function (scope, elm, attr) {\r\n attr.$observe(\"htmlSrc\", function () {\r\n scope.newHtml = $sce.trustAsHtml(scope.htmlSrc);\r\n });\r\n }\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('ImportCliniciansModalController', ['$scope', '$modalInstance', 'Upload', function ($scope, $modalInstance, Upload) {\r\n\r\n $scope.vm = {\r\n file: null,\r\n file_content: null\r\n }\r\n $scope.uploading = false;\r\n $scope.working = false;\r\n\r\n $scope.fileChange = function () {\r\n if (!$scope.working) {\r\n $scope.uploading = false;\r\n }\r\n }\r\n\r\n $scope.fileUpdated = function (file) {\r\n $scope.working = true;\r\n Upload.base64DataUrl(file).then(function (content) {\r\n $scope.vm.file_content = content;\r\n $scope.working = false;\r\n $scope.uploading = false;\r\n })\r\n }\r\n\r\n $scope.filePicked = function () {\r\n $scope.uploading = true;\r\n }\r\n\r\n $scope.save = function () {\r\n if ($scope.vm.file != null) {\r\n $modalInstance.close({\r\n file_name: $scope.vm.file.name,\r\n file_content: $scope.vm.file_content\r\n });\r\n }\r\n else {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }\r\n\r\n $scope.close = function () {\r\n $modalInstance.dismiss('cancel');\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('hlpCliniciansImportController', ['$scope', '$rootScope', '$modal', 'Clinicians', 'Documents',\r\n function ($scope, $rootScope, $modal, Clinicians, Documents) {\r\n $scope.preview = false;\r\n if ($rootScope.isPortal && $rootScope.isPortal == \"True\") {\r\n if ($rootScope.enterprise && $rootScope.enterprise.website) {\r\n $scope.portalURL = $rootScope.enterprise.website;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.portalURL;\r\n }\r\n }\r\n else {\r\n if ($rootScope.enterprise && $rootScope.enterprise.site_location) {\r\n $scope.portalURL = $rootScope.enterprise.site_location;\r\n }\r\n else {\r\n $scope.portalURL = $rootScope.internalURL;\r\n }\r\n }\r\n\r\n if ($scope.parameters.response_id) {\r\n Clinicians.getDocumentByResponseID($scope.parameters.response_id).then(function (document_id) {\r\n if (document_id) {\r\n Documents.getByID(document_id).then(function (file) {\r\n $scope.fileUpload = {\r\n file_name: file.file_name,\r\n document_id: file.id,\r\n document_code: file.code,\r\n service_id: $scope.parameters.service_id\r\n };\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n });\r\n }\r\n else {\r\n $scope.fileUpload = {\r\n file_content: null,\r\n file_name: null,\r\n service_id: $scope.parameters.service_id\r\n };\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n }\r\n });\r\n } else {\r\n $scope.fileUpload = {\r\n file_content: null,\r\n file_name: null,\r\n service_id: $scope.parameters.service_id\r\n };\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n }\r\n\r\n $scope.downloadClinicians = function () {\r\n $scope.downloading = true;\r\n if ($scope.parameters.service_id) {\r\n Clinicians.downloadExcel($scope.parameters.service_id).then(function (data) {\r\n data = \"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,\" + data;\r\n var link = document.createElement(\"a\");\r\n link.href = data;\r\n link.download = \"clinicians.xlsx\"\r\n link.click();\r\n\r\n $scope.downloading = false;\r\n });\r\n }\r\n else {\r\n //Form is in preview mode\r\n $scope.downloading = false;\r\n $scope.preview = true;\r\n }\r\n }\r\n\r\n $scope.importClinicians = function () {\r\n $modal.open({\r\n animation: true,\r\n templateUrl: 'templates/clinicians-import/clinicians-import-modal.html',\r\n controller: 'ImportCliniciansModalController',\r\n resolve: {\r\n }\r\n }).result.then(function (upload) {\r\n if (upload != null) {\r\n $scope.fileUpload.file_content = upload.file_content;\r\n $scope.fileUpload.file_name = upload.file_name;\r\n $scope.fileUpload.file_updated = true;\r\n $scope.fileUpload.saved = false;\r\n $scope.component.elementAnswer = [$scope.fileUpload];\r\n }\r\n });\r\n }\r\n }])\r\n .directive('hlpCliniciansImport', [function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'templates/clinicians-import/clinicians-import.html',\r\n replace: true,\r\n controller: 'hlpCliniciansImportController',\r\n scope: {\r\n parameters: '=?',\r\n component: '=?'\r\n },\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('ConfirmModalController', ['$scope', '$modalInstance', 'message', function ($scope, $modalInstance, message) {\r\n $scope.message = message;\r\n\r\n $scope.yes = function () {\r\n $modalInstance.close(true);\r\n }\r\n\r\n $scope.no = function () {\r\n $modalInstance.close(false);\r\n }\r\n\r\n $scope.$on('$destroy', function () {\r\n });\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .controller('CopyFormModalController', ['$scope', '$modalInstance', 'name', 'license_id', 'license_category_id', 'Licenses', function ($scope, $modalInstance, name, license_id, license_category_id, Licenses) {\r\n $scope.settings = {};\r\n $scope.settings.name = name;\r\n $scope.settings.licenseID = license_id;\r\n $scope.settings.license_category_id = license_category_id;\r\n $scope.licenses = [];\r\n\r\n // Get other licenses from the same category\r\n Licenses.get({ license_category_id: license_category_id }).then(function (result) {\r\n if (result != null) {\r\n $scope.licenses = result;\r\n }\r\n });\r\n\r\n $scope.save = function () {\r\n $modalInstance.close($scope.settings);\r\n }\r\n $scope.cancel = function () {\r\n $modalInstance.close(null);\r\n }\r\n\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .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 $scope.preSaveCyberSourceObject.reponseBaseUrl = $window.location.href;\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.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.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\").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\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\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 .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 .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('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 .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\").directive(\"hlpVerifyPassword\", [\r\n \"$http\",\r\n \"$q\",\r\n \"$rootScope\",\r\n \"$stateParams\",\r\n \"Format\",\r\n function(\r\n $http,\r\n $q,\r\n $rootScope,\r\n $stateParams,\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/verify-password/verify-password.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 \"$scope\",\r\n \"$rootScope\",\r\n \"$timeout\",\r\n function(\r\n $scope,\r\n $rootScope,\r\n $timeout\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 .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')\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(\"hlpFormBuilderComponent\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\",\r\n parentQuestion: \"=?\",\r\n parentComponent: \"=?\",\r\n formType: \"=?\",\r\n sets: \"=?\",\r\n elements: \"=?\",\r\n form: \"=?\",\r\n resultSet: \"=?\",\r\n parameters: \"=?\",\r\n attachments: \"=?\",\r\n inspectionChecklist: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n function ($scope) {\r\n $scope.calculatedFieldCalculationTypeOptions = [\r\n { id: 0, name: \"Count\" }\r\n ];\r\n $scope.reimburseLengthTypes = [\r\n { id: 'Day', name: 'Day' },\r\n { id: 'Week', name: 'Week' },\r\n { id: 'Month', name: 'Month' },\r\n { id: 'Year', name: 'Year' }\r\n ];\r\n\r\n if ($scope.parameters.contentOptions == null) {\r\n $scope.contentTypeOptions = [\r\n { id: 0, name: \"Text Editor\" },\r\n { id: 1, name: \"Attachment\" },\r\n { id: 2, name: \"PDF Preview\" }\r\n ];\r\n } else {\r\n $scope.contentTypeOptions =\r\n $scope.parameters.contentOptions;\r\n }\r\n $scope.componentTypeInit = function(component, types) {\r\n types.forEach(function(type) {\r\n if (\r\n type.code == \"form_element\" &&\r\n component.component_type_id != type.id &&\r\n ($scope.elements == null ||\r\n $scope.elements.length == 0)\r\n ) {\r\n updateArray(types, type, true);\r\n }\r\n });\r\n if (\r\n component.component_type_id == null &&\r\n types.length > 0\r\n ) {\r\n component.component_type_id = types[0].id;\r\n component.component_type = {};\r\n types.forEach(function(type) {\r\n if (type.id == component.component_type_id) {\r\n component.component_type = type;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.formElementInit = function(\r\n component,\r\n form_elements\r\n ) {\r\n if (\r\n component.element_id == null &&\r\n form_elements.length > 0\r\n ) {\r\n component.element_id = form_elements[0].id;\r\n form_elements.forEach(function(element) {\r\n if (element.id == component.element_id) {\r\n component.element_code = element.code;\r\n component.element_instructions =\r\n element.description;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.componentTypeChange = function(component, types) {\r\n component.questions = [];\r\n component.data_set_id = null;\r\n component.component_conditions = [];\r\n component.calculation_type = null;\r\n\r\n if (component.component_type_id == null) {\r\n component.component_type = {};\r\n } else {\r\n types.forEach(function(type) {\r\n if (type.id == component.component_type_id) {\r\n component.component_type = type;\r\n }\r\n });\r\n if (component.initialQuestions != null\r\n && component.initialQuestions[component.component_type_id] != null) {\r\n component.questions = component.initialQuestions[component.component_type_id];\r\n } else if (component.component_type.code == \"calculated_field\" && component.initialQuestions[component.component_type_id] == undefined)\r\n {\r\n component.calculation_type = 0;\r\n\r\n var calcFieldConditions = {\r\n id: guid(),\r\n and_flag: true,\r\n operator: \"=\",\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1\r\n }\r\n\r\n var question = {\r\n id: guid(),\r\n section_id: component.section_id,\r\n component_id: component.id,\r\n sort_order: component.questions.length,\r\n sub_components: [],\r\n edit: true,\r\n required: false,\r\n vertical: true,\r\n multiple: false,\r\n ssn_setting: 0,\r\n display_blank_zero: false,\r\n file_upload_description: true,\r\n file_upload_existing_docs: false,\r\n disabled: false,\r\n default_value: 0,\r\n label_position: false,\r\n update_from_form: false,\r\n share_files: false,\r\n show_in_grid: false,\r\n masked_setting: false,\r\n showValidation: true,\r\n question_type_id: \"b2932f47-8938-4999-92a6-f4a33ee55f8a\" //calculated_field\r\n }\r\n question.question_type = {};\r\n question.validation = {};\r\n question.validation.validation_type_id = \"8bff2877-d993-46a8-a850-751bde002f87\"; //numeric\r\n question.validation.type_message = \"Value must be numeric\";\r\n\r\n component.component_conditions.push(calcFieldConditions);\r\n component.questions.push(question);\r\n }\r\n }\r\n };\r\n \r\n $scope.dataSetInit = function(component, sets) {\r\n component.data_points = [];\r\n if (component.data_set_id == null && sets.length > 0) {\r\n component.data_set_id = sets[0].id;\r\n }\r\n\r\n if (component.data_set_id == null) {\r\n component.data_set = {};\r\n } else {\r\n sets.forEach(function(set) {\r\n if (set.id == component.data_set_id) {\r\n component.data_set = angular.copy(set);\r\n if (component.license_category_id == null) {\r\n component.license_category_id =\r\n set.default_license_category_id;\r\n } else {\r\n if (\r\n component.parameters\r\n .orignalLicenseID == null &&\r\n component.parameters.license_id !=\r\n null\r\n ) {\r\n component.parameters.orignalLicenseID =\r\n component.parameters.license_id;\r\n }\r\n\r\n component.parameters.license_category_id =\r\n component.license_category_id;\r\n\r\n if (\r\n component.data_set\r\n .default_license_category_id ==\r\n component.license_category_id\r\n ) {\r\n component.parameters.license_id =\r\n component.parameters.orignalLicenseID;\r\n } else {\r\n component.parameters.license_id = null;\r\n if (\r\n component.data_set.code ==\r\n \"certification\"\r\n ) {\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n point.code ==\r\n \"certification_application_type\"\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length -\r\n 1 -\r\n index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n component.data_set\r\n .license_category_specific &&\r\n point.license_category_id !=\r\n null &&\r\n point.license_category_id !=\r\n component.license_category_id\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length - 1 - index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n });\r\n // limit positions\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n component.limit_position_ids_array =\r\n component.limit_position_ids == null\r\n ? []\r\n : component.limit_position_ids;\r\n // limit vehicle types\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n component.limit_vehicle_type_ids_array =\r\n component.limit_vehicle_type_ids == null\r\n ? []\r\n : component.limit_vehicle_type_ids;\r\n // limit document types\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n component.limit_document_type_ids_array =\r\n component.limit_document_type_ids == null\r\n ? []\r\n : component.limit_document_type_ids;\r\n\r\n if (component.questions.length > 0) {\r\n component.questions.forEach(function(question) {\r\n component.data_set.data_points.forEach(\r\n function(data_point) {\r\n if (\r\n data_point.id ==\r\n question.data_point_id &&\r\n data_point.attribute_id ==\r\n question.attribute_id\r\n ) {\r\n data_point.sort_order =\r\n question.sort_order;\r\n question.point = data_point;\r\n component.data_points.push(\r\n data_point\r\n );\r\n }\r\n }\r\n );\r\n });\r\n } else {\r\n component.data_set.data_points.forEach(function(\r\n point\r\n ) {\r\n var question = {};\r\n\r\n if (point.visible) {\r\n question.id = guid();\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id =\r\n component.section_id;\r\n question.sort_order = point.sort_order;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.required = point.required;\r\n question.component_id = component.id;\r\n question.question_type =\r\n point.question_type;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show =\r\n point.select_show;\r\n question.options = point.options;\r\n question.vertical = true;\r\n question.multiple = false;\r\n question.disabled = false;\r\n question.update_from_form =\r\n point.table_name != null\r\n ? true\r\n : false;\r\n question.share_files = false;\r\n question.ssn_setting = 0;\r\n question.masked_setting = false;\r\n question.file_upload_description = true;\r\n question.show_in_grid =\r\n point.question_type.encrypted ==\r\n true\r\n ? 0\r\n : 1;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id =\r\n point.attribute_id;\r\n question.compound_id =\r\n point.compound_id;\r\n question.instruction_text =\r\n point.instruction_text;\r\n question.point = point;\r\n\r\n if (\r\n point.name ==\r\n \"CTCSS Receive Tone\" ||\r\n point.name ==\r\n \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n\r\n component.questions.push(question);\r\n component.data_points.push(point);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.dataSetChange = function(component, sets) {\r\n component.questions = [];\r\n component.data_points = [];\r\n\r\n if (component.data_set_id == null) {\r\n component.data_set = {};\r\n } else {\r\n sets.forEach(function(set) {\r\n if (set.id == component.data_set_id) {\r\n component.data_set = angular.copy(set);\r\n if (component.license_category_id == null) {\r\n component.license_category_id =\r\n set.default_license_category_id;\r\n } else {\r\n if (\r\n component.parameters\r\n .orignalLicenseID == null &&\r\n component.parameters.license_id !=\r\n null\r\n ) {\r\n component.parameters.orignalLicenseID =\r\n component.parameters.license_id;\r\n }\r\n\r\n component.parameters.license_category_id =\r\n component.license_category_id;\r\n\r\n if (\r\n component.data_set\r\n .default_license_category_id ==\r\n component.license_category_id\r\n ) {\r\n component.parameters.license_id =\r\n component.parameters.orignalLicenseID;\r\n } else {\r\n component.parameters.license_id = null;\r\n if (\r\n component.data_set.code ==\r\n \"certification\"\r\n ) {\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n point.code ==\r\n \"certification_application_type\"\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length -\r\n 1 -\r\n index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n component.data_set.data_points\r\n .slice()\r\n .reverse()\r\n .forEach(function(\r\n point,\r\n index,\r\n object\r\n ) {\r\n if (\r\n component.data_set\r\n .license_category_specific &&\r\n point.license_category_id !=\r\n null &&\r\n point.license_category_id !=\r\n component.license_category_id\r\n ) {\r\n component.data_set.data_points.splice(\r\n object.length - 1 - index,\r\n 1\r\n );\r\n }\r\n });\r\n }\r\n });\r\n\r\n // limit positions\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n component.limit_position_ids_array = component.limit_position_ids_array =\r\n component.limit_position_ids == null\r\n ? []\r\n : component.limit_position_ids;\r\n // limit vehicle types\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n component.limit_vehicle_type_ids_array = component.limit_vehicle_type_ids_array =\r\n component.limit_vehicle_type_ids == null\r\n ? []\r\n : component.limit_vehicle_type_ids;\r\n // limit document types\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n component.limit_document_type_ids_array = component.limit_document_type_ids_array =\r\n component.limit_document_type_ids == null\r\n ? []\r\n : component.limit_document_type_ids;\r\n // skills\r\n component.parameters.skill_question_ids =\r\n component.skill_question_ids;\r\n component.parameters.skill_show_points =\r\n component.skill_show_points;\r\n component.parameters.skill_default =\r\n component.skill_default;\r\n\r\n if (\r\n component.initialQuestions != null &&\r\n component.initialQuestions[\r\n component.component_type_id\r\n ] != null\r\n ) {\r\n component.initialQuestions[\r\n component.component_type_id\r\n ].forEach(function(initialQuestion) {\r\n component.data_set.data_points.forEach(\r\n function(data_point) {\r\n if (\r\n data_point.id ==\r\n initialQuestion.data_point_id &&\r\n data_point.attribute_id ==\r\n initialQuestion.attribute_id\r\n ) {\r\n data_point.initialFound = true;\r\n data_point.sort_order =\r\n initialQuestion.sort_order;\r\n initialQuestion.point = data_point;\r\n component.questions.push(\r\n initialQuestion\r\n );\r\n component.data_points.push(\r\n data_point\r\n );\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n var initialLength = component.questions.length;\r\n\r\n component.data_set.data_points.forEach(function(\r\n point\r\n ) {\r\n var question = {};\r\n\r\n if (!point.initialFound && point.visible) {\r\n question.id = guid();\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id = component.section_id;\r\n question.sort_order = ++initialLength;\r\n point.sort_order = question.sort_order;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.required = point.required;\r\n question.component_id = component.id;\r\n question.question_type =\r\n point.question_type;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show = point.select_show;\r\n question.options = point.options;\r\n question.vertical = true;\r\n question.multiple = false;\r\n question.disabled = false;\r\n question.update_from_form =\r\n point.table_name != null ? true : false;\r\n question.share_files = false;\r\n question.ssn_setting = 0;\r\n question.masked_setting = false;\r\n question.file_upload_description = true;\r\n question.show_in_grid =\r\n point.question_type.encrypted == true\r\n ? 0\r\n : 1;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id = point.attribute_id;\r\n question.compound_id = point.compound_id;\r\n question.instruction_text =\r\n point.instruction_text;\r\n question.point = point;\r\n\r\n if (\r\n point.name == \"CTCSS Receive Tone\" ||\r\n point.name == \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n\r\n component.questions.push(question);\r\n component.data_points.push(point);\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.foreignDataSetInit = function(component, set) {\r\n component.data_points = [];\r\n\r\n if (component.data_set_id == null) {\r\n component.data_set = {};\r\n } else {\r\n component.data_set = set;\r\n\r\n component.questions.forEach(function(question) {\r\n component.data_set.data_points.forEach(function(\r\n data_point\r\n ) {\r\n if (\r\n data_point.id ==\r\n question.data_point_id &&\r\n data_point.attribute_id ==\r\n question.attribute_id\r\n ) {\r\n data_point.sort_order =\r\n question.sort_order;\r\n question.point = data_point;\r\n component.data_points.push(data_point);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n $scope.foreignDataSetChange = function(\r\n allow_add,\r\n allow_edit,\r\n question,\r\n componentTypes\r\n ) {\r\n var old_data_points =\r\n question.sub_components !== undefined &&\r\n question.sub_components[0] !== undefined\r\n ? question.sub_components[0].data_points\r\n : null;\r\n var old_questions =\r\n question.sub_components !== undefined &&\r\n question.sub_components[0] !== undefined\r\n ? question.sub_components[0].questions\r\n : null;\r\n\r\n if (\r\n (allow_add || allow_edit) &&\r\n (old_data_points != null || old_questions != null)\r\n ) {\r\n // One or the other has already been selected, no need to re-load all the data points\r\n question.sub_components[0].component_conditions = [];\r\n if (allow_add) {\r\n var condition = {\r\n id: guid(),\r\n component_id: question.sub_components[0].id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1,\r\n operator: \"=\"\r\n };\r\n question.sub_components[0].component_conditions.push(\r\n condition\r\n );\r\n }\r\n if (allow_edit) {\r\n var guidCondition = {\r\n id: guid(),\r\n component_id: question.sub_components[0].id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: allow_add ? false : true,\r\n left_parenthesis: 1,\r\n right_parenthesis: 0,\r\n sort_order: 2,\r\n operator: \"<>\"\r\n };\r\n question.sub_components[0].component_conditions.push(\r\n guidCondition\r\n );\r\n var nullCondition = {\r\n id: guid(),\r\n component_id: question.sub_components[0].id,\r\n question_id: question.id,\r\n value: null,\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 1,\r\n sort_order: 3,\r\n operator: \"<>\"\r\n };\r\n question.sub_components[0].component_conditions.push(\r\n nullCondition\r\n );\r\n }\r\n } else if (allow_add || allow_edit) {\r\n // First time clicking one\r\n question.sub_components = [];\r\n var component_type = {};\r\n componentTypes.forEach(function(componentType) {\r\n if (componentType.code == \"dataset\") {\r\n component_type = componentType;\r\n }\r\n });\r\n\r\n var component = {\r\n id: guid(),\r\n section_id: question.section_id,\r\n sort_order: question.sub_components.length,\r\n parent_question_id: question.id,\r\n questions: [],\r\n data_points: [],\r\n edit: true,\r\n component_conditions: [],\r\n limit_document_type_ids: null,\r\n limit_position_ids: null,\r\n limit_vehicle_type_ids: null,\r\n skill_question_ids: null,\r\n skill_show_points: null,\r\n skill_default: null\r\n };\r\n\r\n component.data_set_id =\r\n question.point.foreign_data_set_id;\r\n component.data_set =\r\n question.point.foreign_data_set;\r\n component.isForeignDataSet = true;\r\n\r\n component.component_type_id = component_type.id;\r\n component.component_type = component_type;\r\n\r\n if (allow_add) {\r\n var condition = {\r\n id: guid(),\r\n component_id: component.id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1,\r\n operator: \"=\"\r\n };\r\n component.component_conditions.push(condition);\r\n }\r\n if (allow_edit) {\r\n var guidCondition = {\r\n id: guid(),\r\n component_id: component.id,\r\n question_id: question.id,\r\n value: nullGuid(),\r\n and_flag: allow_add ? false : true,\r\n left_parenthesis: 1,\r\n right_parenthesis: 0,\r\n sort_order: 2,\r\n operator: \"<>\"\r\n };\r\n component.component_conditions.push(\r\n guidCondition\r\n );\r\n var nullCondition = {\r\n id: guid(),\r\n component_id: component.id,\r\n question_id: question.id,\r\n value: null,\r\n and_flag: true,\r\n left_parenthesis: 0,\r\n right_parenthesis: 1,\r\n sort_order: 3,\r\n operator: \"<>\"\r\n };\r\n component.component_conditions.push(\r\n nullCondition\r\n );\r\n }\r\n\r\n var initialLength = 0;\r\n\r\n component.data_set.data_points\r\n .sort(sortObjectArray(\"sort_order\"))\r\n .forEach(function(point) {\r\n var question = {};\r\n\r\n if (point.visible) {\r\n question.id = guid();\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id =\r\n component.section_id;\r\n question.sort_order = ++initialLength;\r\n point.sort_order = question.sort_order;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.required = point.required;\r\n question.component_id = component.id;\r\n question.question_type =\r\n point.question_type;\r\n question.update_from_form =\r\n point.table_name != null\r\n ? true\r\n : false;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show =\r\n point.select_show;\r\n question.options = point.options;\r\n question.point = point;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id =\r\n point.attribute_id;\r\n question.compound_id =\r\n point.compound_id;\r\n\r\n if (\r\n point.name ==\r\n \"CTCSS Receive Tone\" ||\r\n point.name ==\r\n \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n\r\n component.questions.push(question);\r\n component.data_points.push(point);\r\n }\r\n });\r\n question.sub_components.push(component);\r\n } else {\r\n // Both deselected\r\n question.sub_components = [];\r\n }\r\n };\r\n\r\n $scope.dataPointChange = function(component) {\r\n component.questions = [];\r\n\r\n component.data_points.forEach(function(point) {\r\n var setProperties = true;\r\n var question = {};\r\n\r\n if (\r\n component.initialQuestions != null &&\r\n component.initialQuestions[\r\n component.component_type_id\r\n ] != null\r\n ) {\r\n component.initialQuestions[\r\n component.component_type_id\r\n ].forEach(function(initialQuestion) {\r\n if (\r\n initialQuestion.data_point_id ==\r\n point.id &&\r\n point.attribute_id ==\r\n initialQuestion.attribute_id\r\n ) {\r\n question = initialQuestion;\r\n setProperties = false;\r\n }\r\n });\r\n }\r\n\r\n if (setProperties) {\r\n question.id = guid();\r\n question.required = point.required;\r\n question.name = point.name;\r\n question.label = point.label;\r\n question.label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n question.question_type_id =\r\n point.question_type_id;\r\n question.section_id = component.section_id;\r\n question.sort_order = point.sort_order;\r\n question.component_id = component.id;\r\n question.question_type = point.question_type;\r\n question.service = point.service;\r\n question.method = point.method;\r\n question.select_show = point.select_show;\r\n question.options = point.options;\r\n question.vertical = true;\r\n question.multiple = false;\r\n question.disabled = false;\r\n question.update_from_form =\r\n point.table_name != null ? true : false;\r\n question.share_files = false;\r\n question.ssn_setting = 0;\r\n question.masked_setting = false;\r\n question.file_upload_description = true;\r\n question.show_in_grid =\r\n point.question_type.encrypted == true\r\n ? 0\r\n : 1;\r\n question.data_point_id = point.id;\r\n question.data_point_code = point.code;\r\n question.data_point_table_name =\r\n point.table_name;\r\n question.attribute_id = point.attribute_id;\r\n question.compound_id = point.compound_id;\r\n question.instruction_text =\r\n point.instruction_text;\r\n }\r\n\r\n question.point = point;\r\n if (\r\n point.name == \"CTCSS Receive Tone\" ||\r\n point.name == \"CTCSS Transmit Frequency\"\r\n ) {\r\n question.validation = {};\r\n question.validation.expression =\r\n \"^[0-9]{3}\\\\.[0-9]{1}$\";\r\n question.validation.expression_message =\r\n \"Please enter the value in 999.9 format.\";\r\n }\r\n component.questions.push(question);\r\n });\r\n };\r\n\r\n $scope.limitPositionsChange = function(component) {\r\n if (component.limit_position_ids_array != null) {\r\n component.limit_position_ids = null;\r\n\r\n component.limit_position_ids_array\r\n .sort()\r\n .forEach(function(position) {\r\n if (component.limit_position_ids == null) {\r\n component.limit_position_ids =\r\n position.id;\r\n } else {\r\n component.limit_position_ids +=\r\n \",\" + position.id;\r\n }\r\n });\r\n\r\n component.parameters.limit_position_ids =\r\n component.limit_position_ids;\r\n }\r\n // get positions question and let it know to refresh its values\r\n var question = getByAttr(\r\n component.questions,\r\n \"data_point_code\",\r\n \"service_users_position\"\r\n );\r\n if (question != null) {\r\n question.refreshOptions =\r\n component.limit_position_ids;\r\n }\r\n };\r\n\r\n $scope.limitVehicleTypesChange = function (component) {\r\n if (component.limit_vehicle_type_ids_array != null) {\r\n component.limit_vehicle_type_ids = null;\r\n\r\n component.limit_vehicle_type_ids_array\r\n .sort()\r\n .forEach(function (vehicle_types) {\r\n if (component.limit_vehicle_type_ids == null) {\r\n component.limit_vehicle_type_ids =\r\n vehicle_types.id;\r\n } else {\r\n component.limit_vehicle_type_ids +=\r\n \",\" + vehicle_types.id;\r\n }\r\n });\r\n\r\n component.parameters.limit_vehicle_type_ids =\r\n component.limit_vehicle_type_ids;\r\n }\r\n // get service_vehicle_type_restriction question and let it know to refresh its values\r\n var question = getByAttr(\r\n component.questions,\r\n \"data_point_code\",\r\n \"service_vehicle_type_restriction\"\r\n );\r\n if (question != null) {\r\n question.refreshOptions =\r\n component.limit_vehicle_type_ids;\r\n }\r\n };\r\n\r\n $scope.limitDocumentTypesChange = function (component) {\r\n if (component.limit_document_type_ids_array != null) {\r\n component.limit_document_type_ids = null;\r\n\r\n component.limit_document_type_ids_array\r\n .sort()\r\n .forEach(function (document_types) {\r\n if (component.limit_document_type_ids == null) {\r\n component.limit_document_type_ids =\r\n document_types.id;\r\n } else {\r\n component.limit_document_type_ids +=\r\n \",\" + document_types.id;\r\n }\r\n });\r\n\r\n component.parameters.limit_document_type_ids =\r\n component.limit_document_type_ids;\r\n }\r\n // get service_document_type_restriction question and let it know to refresh its values\r\n var question = getByAttr(\r\n component.questions,\r\n \"data_point_code\",\r\n \"service_financials_supporting_documents\"\r\n );\r\n if (question != null) {\r\n question.refreshOptions =\r\n component.limit_document_type_ids;\r\n }\r\n };\r\n\r\n $scope.conditionalChange = function (component) {\r\n if (component.conditional) {\r\n component.component_conditions.push({\r\n id: guid(),\r\n and_flag: true,\r\n operator: \"=\",\r\n left_parenthesis: 0,\r\n right_parenthesis: 0,\r\n sort_order: 1\r\n });\r\n } else {\r\n component.component_conditions = [];\r\n }\r\n };\r\n\r\n $scope.formElementChange = function(\r\n component,\r\n form_elements\r\n ) {\r\n form_elements.forEach(function(element) {\r\n if (element.id == component.element_id) {\r\n component.element_code = element.code;\r\n component.element_instructions =\r\n element.description;\r\n }\r\n });\r\n };\r\n\r\n $scope.allowMultipleGroupChange = function(component) {\r\n component.update_from_form_update = false;\r\n component.update_from_form_delete = false;\r\n };\r\n \r\n $scope.showShareFiles = function(component) {\r\n var show = false;\r\n\r\n if (\r\n component.questions.length == 1 &&\r\n component.questions[0].question_type != null &&\r\n component.questions[0].question_type.code ==\r\n \"file_upload\"\r\n ) {\r\n show = true;\r\n } else {\r\n component.share_files = false;\r\n }\r\n\r\n return show;\r\n };\r\n\r\n $scope.revertElement = function(element) {\r\n angular.copy(element.original, element);\r\n element.edit = false;\r\n };\r\n\r\n // Ckeditor Setup\r\n $scope.cke_skin = 'bootstrapck';\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-component/form-builder-component.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormBuilderComponentConditions', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n component: '=?',\r\n form: '=?',\r\n isDisabled: '=?'\r\n },\r\n controller: ['$scope', 'ApplicationTypes', '$injector', '$filter', function ($scope, ApplicationTypes, $injector, $filter) {\r\n $scope.$watchGroup(['form', 'component'], function (newValues, oldValues) {\r\n var form = newValues[0];\r\n var conditionalComponent = newValues[1];\r\n\r\n if (form != null && conditionalComponent != null) {\r\n $scope.questions = [];\r\n var hitComponent = false;\r\n\r\n form.pages.forEach(function (page) {\r\n if (!hitComponent) {\r\n page.sections.forEach(function (section) {\r\n if (!hitComponent) {\r\n section.components.forEach(function (component) {\r\n hitComponent = $scope.getComponentQuestion(component, hitComponent, conditionalComponent, section, page);\r\n })\r\n }\r\n })\r\n }\r\n })\r\n\r\n $scope.component.component_conditions.forEach(function (condition) {\r\n $scope.questionChange($filter('filter')($scope.questions, { id: condition.question_id })[0], condition, true);\r\n })\r\n }\r\n })\r\n \r\n $scope.getComponentQuestion = function (component, hitComponent, conditionalComponent, section, page) {\r\n if (component.id == conditionalComponent.id) {\r\n hitComponent = true;\r\n }\r\n\r\n if (!hitComponent) {\r\n if (component.questions != null) {\r\n component.questions.forEach(function (question) {\r\n question.group = page.name + ': ' + section.name;\r\n $scope.questions.unshift(question);\r\n\r\n if (!hitComponent) {\r\n if (question.sub_components == null) {\r\n question.sub_components = [];\r\n }\r\n\r\n question.sub_components.forEach(function (subComponent) {\r\n hitComponent = $scope.getComponentQuestion(subComponent, hitComponent, conditionalComponent, section, page);\r\n })\r\n }\r\n })\r\n }\r\n }\r\n\r\n return hitComponent;\r\n }\r\n\r\n $scope.getComponentFromID = function (componentID) {\r\n var result = null;\r\n\r\n if ($scope.form != null) {\r\n $scope.form.pages.forEach(function (page) {\r\n if (result == null) {\r\n page.sections.forEach(function (section) {\r\n if (result == null) {\r\n section.components.forEach(function (component) {\r\n if (component.id == componentID) {\r\n result = component;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n return result;\r\n }\r\n\r\n $scope.andOrOptions = [\r\n { id: true, name: 'and' },\r\n { id: false, name: 'or' }\r\n ];\r\n $scope.leftParenOptions = [\r\n { id: 0, name: '' },\r\n { id: 1, name: '(' },\r\n { id: 2, name: '((' }\r\n ];\r\n $scope.rightParenOptions = [\r\n { id: 0, name: '' },\r\n { id: 1, name: ')' },\r\n { id: 2, name: '))' }\r\n ];\r\n $scope.dateOptions = [\r\n { id: 0, name: 'Reference Date' },\r\n { id: 1, name: 'Days From Today' },\r\n { id: 2, name: 'Months From Today' }\r\n ];\r\n\r\n $scope.questionChange = function (question, condition, initial) {\r\n condition.loading = true;\r\n if (question != null) {\r\n if (question.question_type.code == 'date') {\r\n condition.operators = [\r\n { id: '=', name: '=' },\r\n { id: '<>', name: '<>' },\r\n { id: '>', name: '>' },\r\n { id: '<', name: '<' }\r\n ];\r\n if (condition.date_option > 0) {\r\n condition.value = parseInt(condition.value);\r\n if (isNaN(condition.value)) {\r\n condition.value = null;\r\n }\r\n }\r\n }\r\n else {\r\n condition.operators = [\r\n { id: '=', name: '=' },\r\n { id: '<>', name: '<>' }\r\n ];\r\n }\r\n\r\n condition.options = [];\r\n condition.selectValue = 'id';\r\n condition.selectShow = 'name';\r\n condition.question_type = question.question_type.code;\r\n\r\n if (!initial) {\r\n condition.value = null;\r\n }\r\n\r\n if (question.question_type.code == 'yesno') {\r\n condition.options = [\r\n { id: true, name: 'Yes' },\r\n { id: false, name: 'No' }\r\n ];\r\n condition.loading = false;\r\n }\r\n else if (question.service != null) {\r\n var service = $injector.get(question.service);\r\n if (question.method == null) {\r\n question.method = 'get';\r\n }\r\n var arg = {};\r\n if (question.service == 'LicenseCategoryLevels' || question.service == 'LicenseCategoryCertificationStatuses') {\r\n //Get the license category of the component question\r\n var component = $scope.getComponentFromID(question.component_id);\r\n if (component) {\r\n arg.license_category_id = component.license_category_id;\r\n }\r\n //Pass along the license_id in case the license is the same license category\r\n if ($scope.component.parameters) {\r\n arg.current_license_id = $scope.component.parameters.license_id || $scope.component.parameters.orignalLicenseID;\r\n }\r\n }\r\n service[question.method](arg).then(function (data) { //data_section_name is being set as parameter dynamically based on question.method \r\n condition.options = data;\r\n condition.loading = false;\r\n });\r\n }\r\n else if (question.question_type.code == 'application_type') {\r\n //Application type will always be the same license category as the current license, so only need to pass along the license_id\r\n var parameters = {};\r\n if ($scope.component.parameters) {\r\n parameters.license_id = $scope.component.parameters.license_id || $scope.component.parameters.orignalLicenseID;\r\n }\r\n ApplicationTypes.get(parameters).then(function (types) {\r\n types.forEach(function (type) {\r\n condition.options.push({ id: type.id, name: type.label || type.name });\r\n });\r\n condition.loading = false;\r\n });\r\n }\r\n else if (question.options != null){\r\n if (angular.isString(question.options)) {\r\n question.options.split(',').forEach(function (value) {\r\n condition.options.push({ id: value.trim(), name: value.trim() });\r\n })\r\n }\r\n else{\r\n condition.options = question.options;\r\n }\r\n\r\n condition.loading = false;\r\n }\r\n else {\r\n condition.loading = false;\r\n }\r\n }\r\n else {\r\n condition.loading = false;\r\n }\r\n }\r\n\r\n $scope.add = function (array, order) {\r\n array.push({ and_flag: true, left_parenthesis: 0, operator: '=', right_parenthesis: 0, sort_order: order });\r\n }\r\n\r\n $scope.remove = function (array, item) {\r\n array.splice(array.indexOf(item), 1);\r\n }\r\n }],\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder/form-builder-component-conditions/form-builder-component-conditions.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n \r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormBuilderQuestionList', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n form: '=?',\r\n component: '=?',\r\n question: '=?',\r\n index: '@?'\r\n },\r\n controller: ['$scope', function ($scope) {\r\n $scope.$watch('form.allDisabled', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.disabled = $scope.form.allDisabled;\r\n }\r\n });\r\n $scope.$watch('form.allUpdateFromForm', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.update_from_form = $scope.form.allUpdateFromForm;\r\n }\r\n });\r\n $scope.$watch('form.allShowInGrid', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.show_in_grid = $scope.form.allShowInGrid;\r\n }\r\n });\r\n $scope.$watch('form.allRequired', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n $scope.question.required = $scope.form.allRequired;\r\n }\r\n });\r\n $scope.applicationTypeExists = function (question) {\r\n var exists = false;\r\n if (question.data_point_code == 'certification_levels') {\r\n $scope.component.questions.forEach(function (q) {\r\n if (q.question_type.code == 'application_type') {\r\n $scope.question.required = q.required;\r\n $scope.question.disabled = q.disabled;\r\n $scope.question.update_from_form = q.update_from_form;\r\n exists = true;\r\n }\r\n })\r\n }\r\n\r\n return exists;\r\n }\r\n }],\r\n\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder/form-builder-question-list/form-builder-question-list.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('imagetrend.components')\r\n .directive('hlpFormBuilderQuestionShow', [function () {\r\n return {\r\n restrict: 'AE',\r\n scope: {\r\n form: '=?',\r\n question: '=?',\r\n resultSet: '=?',\r\n component: '=?',\r\n parameters: '=?'\r\n },\r\n controller: ['$scope', function ($scope) {\r\n $scope.$watch('form.apply_label_position', function (newValue, oldValue) {\r\n if (newValue != oldValue) {\r\n $scope.question.label_position = $scope.form.label_position;\r\n }\r\n });\r\n\r\n $scope.applicationTypeExists = function (question) {\r\n var exists = false;\r\n\r\n if (question.data_point_code == 'certification_levels') {\r\n $scope.component.questions.forEach(function (q) {\r\n if (q.question_type.code == 'application_type') {\r\n exists = true;\r\n }\r\n })\r\n }\r\n\r\n return exists;\r\n }\r\n }],\r\n\r\n replace: true,\r\n transclude: true,\r\n templateUrl: 'templates/form-builder/form-builder-question-show/form-builder-question-show.html',\r\n link: function (scope, elem, attrs, ctrl) {\r\n\r\n }\r\n };\r\n }])\r\n;","\"use strict\";\r\n\r\nangular\r\n .module(\"imagetrend.components\")\r\n .directive(\"hlpFormBuilderQuestionsEdit\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\",\r\n formType: \"=?\",\r\n sets: \"=?\",\r\n elements: \"=?\",\r\n form: \"=?\",\r\n resultSet: \"=?\",\r\n parentComponent: \"=?\",\r\n parameters: \"=?\",\r\n attachments: \"=?\",\r\n foreignDataSetChange: \"&?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"$modal\",\r\n \"DocumentTypes\",\r\n \"$rootScope\",\r\n function($scope, $modal, DocumentTypes, $rootScope) {\r\n $scope.ssn_setting_options = [\r\n { id: 0, name: \"Masked\" },\r\n { id: 1, name: \"Last 4 Visible\" },\r\n { id: 2, name: \"Visible\" }\r\n ];\r\n\r\n $scope.label_position_options = [\r\n { id: true, name: \"Top\" },\r\n { id: false, name: \"Left\" }\r\n ];\r\n $scope.true_false_options = [\r\n { id: \"true\", name: \"True\" },\r\n { id: \"false\", name: \"False\" }\r\n ];\r\n $scope.yes_no_options = [\r\n { id: \"true\", name: \"Yes\" },\r\n { id: \"false\", name: \"No\" }\r\n ];\r\n\r\n $scope.changeUpdateFromFormBasedOnDisabled = function (question) {\r\n if (question.disabled === true) {\r\n question.update_from_form = false;\r\n }\r\n else {\r\n // Clear out the warning message\r\n question.updateFromFormInstructions = null;\r\n }\r\n }\r\n\r\n $scope.setUpdateFromFormInstructions = function (question) {\r\n if (question.disabled === true && question.update_from_form === true) {\r\n question.updateFromFormInstructions = \"Warning: using update from form with disabled fields is not guaranteed to prevent users from updating values.\";\r\n }\r\n else {\r\n question.updateFromFormInstructions = null;\r\n }\r\n }\r\n \r\n $scope.applicationTypeExists = function(\r\n component,\r\n question\r\n ) {\r\n var exists = false;\r\n\r\n if (\r\n question.data_point_code ==\r\n \"certification_levels\"\r\n ) {\r\n component.questions.forEach(function(q) {\r\n if (\r\n q.question_type.code ==\r\n \"application_type\"\r\n ) {\r\n question.required = q.required;\r\n question.disabled = q.disabled;\r\n question.update_from_form =\r\n q.update_from_form;\r\n exists = true;\r\n }\r\n });\r\n }\r\n\r\n return exists;\r\n };\r\n\r\n DocumentTypes.getForForm().then(function(data) {\r\n $scope.document_types = data;\r\n });\r\n\r\n $scope.questionOrderChanged = function(component) {\r\n component.questions.forEach(function(\r\n question,\r\n index\r\n ) {\r\n question.sort_order = index + 1;\r\n question.point.sort_order = index + 1;\r\n });\r\n };\r\n\r\n $scope.saveQuestion = function(question) {\r\n if (\r\n !question.question_type.allow_sub_components &&\r\n !question.allow_dynamic_addition &&\r\n !question.allow_dynamic_edit &&\r\n question.sub_components != null &&\r\n question.sub_components.length > 0\r\n ) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return (\r\n \"The \" +\r\n question.question_type\r\n .name +\r\n \" question type does not allow sub questions.\\nAre you sure you want to save, which will remove all sub questions?\"\r\n );\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n question.sub_components = [];\r\n question.edit = false;\r\n } else {\r\n return;\r\n }\r\n });\r\n } else {\r\n question.edit = false;\r\n }\r\n };\r\n\r\n $scope.addQuestion = function(component) {\r\n if (component.questions == null) {\r\n component.questions = [];\r\n }\r\n\r\n var label_position =\r\n typeof $scope.form != \"undefined\" &&\r\n $scope.form.label_position != null\r\n ? $scope.form.label_position\r\n : true;\r\n\r\n component.questions.push({\r\n id: guid(),\r\n section_id: component.section_id,\r\n component_id: component.id,\r\n sort_order: component.questions.length,\r\n sub_components: [],\r\n edit: true,\r\n required: false,\r\n vertical: true,\r\n multiple: false,\r\n ssn_setting: 0,\r\n file_upload_description: true,\r\n file_upload_existing_docs: false,\r\n disabled: false,\r\n default_value: null,\r\n label_position: label_position,\r\n update_from_form: false,\r\n share_files: false,\r\n show_in_grid: false,\r\n masked_setting: false\r\n });\r\n };\r\n\r\n $scope.addSubComponent = function(question, component) {\r\n if (question.sub_components == null) {\r\n question.sub_components = [];\r\n }\r\n\r\n question.sub_components.push({\r\n id: guid(),\r\n parent_question_id: question.id,\r\n sort_order: question.sub_components.length,\r\n questions: [],\r\n edit: true,\r\n section_id: question.section_id,\r\n component_conditions: [],\r\n limit_document_type_ids: null,\r\n limit_position_ids: null,\r\n limit_vehicle_type_ids: null,\r\n skill_question_ids: null,\r\n skill_show_points: null,\r\n skill_default: null\r\n });\r\n };\r\n\r\n $scope.removeComponent = function(components, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this component?\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n components.splice(index, 1);\r\n }\r\n });\r\n };\r\n\r\n $scope.questionTypeInit = function (question, types) {\r\n if (types.length > 0) {\r\n if (question.question_type_id == null) {\r\n question.question_type_id = types[1].id;\r\n question.question_type = {};\r\n }\r\n types.forEach(function (type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n if (type.code == \"deficiency\") {\r\n question.required = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.questionTypeInit = function (question, types) {\r\n // question type id for calculated_field\r\n if (question.question_type_id == \"b2932f47-8938-4999-92a6-f4a33ee55f8a\" && types.length > 0) {\r\n types.forEach(function (type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n }\r\n });\r\n }\r\n else if (\r\n question.question_type_id == null &&\r\n types.length > 0\r\n ) {\r\n question.question_type_id = types[1].id;\r\n question.question_type = {};\r\n types.forEach(function (type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n if (type.code == \"deficiency\") {\r\n question.required = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.questionTypeChange = function(question, types) {\r\n if (question.question_type_id == null) {\r\n question.question_type = {};\r\n } else {\r\n types.forEach(function(type) {\r\n if (type.id == question.question_type_id) {\r\n question.question_type = type;\r\n if (type.code == \"deficiency\") {\r\n question.required = null;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.questionNameChange = function(question) {\r\n if (question.old_name == question.label) {\r\n question.label = question.name;\r\n }\r\n question.old_name = question.name;\r\n };\r\n\r\n $scope.removeQuestion = function(questions, index) {\r\n $modal\r\n .open({\r\n animation: true,\r\n templateUrl:\r\n \"templates/confirm/confirm.html\",\r\n controller: \"ConfirmModalController\",\r\n resolve: {\r\n message: function() {\r\n return \"Are you sure you want to delete this question? Note that if this question is included in a form condition and/or conditional license charge, deleting it may cause unexpected results for the condition or charge. Please adjust any associated conditions and charges to remove this question.\";\r\n }\r\n }\r\n })\r\n .result.then(function(result) {\r\n if (result) {\r\n questions.splice(index, 1);\r\n }\r\n });\r\n };\r\n\r\n // Functions for editing and cancelling out of questions and components (works for both)\r\n $scope.editElement = function(element) {\r\n element.edit = true;\r\n element.original = angular.copy(element);\r\n };\r\n $scope.revertElement = function(element) {\r\n angular.copy(element.original, element);\r\n element.edit = false;\r\n };\r\n\r\n $scope.questionOptions = function(component) {\r\n return {\r\n containment: \"#component_\" + component.id,\r\n scrollableContainer:\r\n \"#component_\" + component.id,\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope\r\n .sortableScope.$id ===\r\n destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n if (\r\n component.component_type.code ==\r\n \"dataset\"\r\n ) {\r\n $scope.questionOrderChanged(component);\r\n $scope.form.the_form.$setDirty();\r\n }\r\n }\r\n };\r\n };\r\n\r\n $scope.subComponentOptions = function(question) {\r\n return {\r\n containment: \"#subComponents_\" + question.id,\r\n scrollableContainer:\r\n \"#subComponents_\" + question.id,\r\n containerPositioning: \"relative\",\r\n accept: function(\r\n sourceItemHandleScope,\r\n destSortableScope\r\n ) {\r\n return (\r\n sourceItemHandleScope.itemScope\r\n .sortableScope.$id ===\r\n destSortableScope.$id\r\n );\r\n },\r\n orderChanged: function(event) {\r\n $scope.form.the_form.$setDirty();\r\n }\r\n };\r\n };\r\n\r\n $scope.toggleValidation = function(question) {\r\n question.showValidation =\r\n typeof question.showValidation == \"undefined\"\r\n ? true\r\n : !question.showValidation;\r\n };\r\n\r\n $scope.getDocumentURL = function(component) {\r\n return (\r\n $rootScope.internalURL +\r\n \"controller.cfm?method=publicPortalService.openDocument\" +\r\n \"&documentID=\" +\r\n component.document_id.toUpperCase() +\r\n \"&code=\" +\r\n component.document_code\r\n );\r\n };\r\n\r\n $scope.checkIfImageOrPDF = function (component) {\r\n if (component.document_file_name) {\r\n var extensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'pdf'];\r\n return extensions.includes(component.document_file_name.split('.').pop().toLowerCase());\r\n }\r\n return false;\r\n };\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-questions-edit/form-builder-questions-edit.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n ]);\r\n","\"use strict\";\r\n\r\nangular\r\n .module(\"imagetrend.components\")\r\n .directive(\"hlpFormBuilderExamSkillsEdit\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"EXSkill\",\r\n \"EXSkillCategory\",\r\n function($scope, EXSkill, EXSkillCategory) {\r\n $scope.skillsloading = true;\r\n $scope.SkillCategoriesFilter = [];\r\n $scope.selectedskills = [];\r\n $scope.bulkActionItems = [];\r\n $scope.showScores = false;\r\n $scope.skillDefault = 0;\r\n $scope.skills = [];\r\n $scope.allSKills = [];\r\n\r\n $scope.skillsDefaultOptions = [\r\n { id: 0, name: \"Unselected\", is_default: true },\r\n { id: 1, name: \"Pass\" },\r\n { id: 2, name: \"Fail\" }\r\n ];\r\n\r\n if ($scope.allSKills.length == 0) {\r\n EXSkill.getActive().then(function(Skills) {\r\n if ($scope.component.skill_show_points != null)\r\n $scope.showScores =\r\n $scope.component.skill_show_points;\r\n if ($scope.component.skill_default != null)\r\n $scope.skillDefault =\r\n $scope.component.skill_default;\r\n for (var x in Skills) {\r\n for (var y in Skills[x].options) {\r\n Skills[x].total_points +=\r\n Skills[x].options[y].points;\r\n }\r\n }\r\n $scope.skills = angular.copy(Skills);\r\n $scope.allSKills = angular.copy(Skills);\r\n\r\n $scope.updateBothLists();\r\n $scope.skillsloading = false;\r\n });\r\n }\r\n\r\n $scope.updateBothLists = function() {\r\n $scope.selectedskills = [];\r\n if ($scope.component.skill_question_ids != null) {\r\n $scope.bulkActionItems = $scope.component.skill_question_ids.split(\r\n \",\"\r\n );\r\n }\r\n\r\n $scope.addSelecteSkills();\r\n $scope.skillsloading = false;\r\n };\r\n\r\n EXSkillCategory.get().then(function(SkillCategories) {\r\n $scope.SkillCategories = SkillCategories;\r\n\r\n var x, format;\r\n for (x in $scope.SkillCategories) {\r\n format = {\r\n name: $scope.SkillCategories[x].name,\r\n id: $scope.SkillCategories[x].name\r\n };\r\n $scope.SkillCategoriesFilter.push(format);\r\n }\r\n\r\n $scope.loading = false;\r\n });\r\n\r\n $scope.skillscolumns = [\r\n {\r\n label: \"Name\",\r\n field: \"name\"\r\n },\r\n {\r\n label: \"Code\",\r\n field: \"code\"\r\n },\r\n {\r\n label: \"Critical\",\r\n field: \"critical\",\r\n type: \"yesno\"\r\n },\r\n {\r\n label: \"Category\",\r\n field: \"exam_skill_category_name\"\r\n },\r\n {\r\n label: \"Total Points\",\r\n field: \"total_points\"\r\n },\r\n {\r\n label: \"Last Modified\",\r\n field: \"modifiedon\",\r\n type: \"datetime\"\r\n }\r\n ];\r\n\r\n $scope.skillfilters = [\r\n {\r\n name: \"Critical\",\r\n field: \"critical\",\r\n options: [\r\n { name: \"Not Critical\", id: false },\r\n { name: \"Critical\", id: true }\r\n ]\r\n },\r\n {\r\n name: \"Category\",\r\n field: \"exam_skill_category_name\",\r\n options: $scope.SkillCategoriesFilter\r\n }\r\n ];\r\n\r\n $scope.addSelecteSkills = function() {\r\n $scope.bulkActionItems.forEach(function(skillid) {\r\n $scope.skills.forEach(function(skill) {\r\n if (skill.id == skillid.trim()) {\r\n $scope.selectedskills.push(skill);\r\n $scope.skills.splice(\r\n $scope.skills.indexOf(skill),\r\n 1\r\n );\r\n }\r\n });\r\n });\r\n $scope.setSelectedIDs();\r\n };\r\n\r\n $scope.setSelectedIDs = function() {\r\n $scope.component.skill_show_points =\r\n $scope.showScores;\r\n $scope.component.skill_default =\r\n $scope.skillDefault;\r\n $scope.component.skill_question_ids = null;\r\n $scope.selectedskills.forEach(function(skill) {\r\n if ($scope.component.skill_question_ids == null)\r\n $scope.component.skill_question_ids =\r\n skill.id;\r\n else\r\n $scope.component.skill_question_ids +=\r\n \",\" + skill.id;\r\n });\r\n $scope.component.updateSelectedList = true;\r\n };\r\n\r\n $scope.$watch(\"component.updateEditList\", function(\r\n newList,\r\n oldList\r\n ) {\r\n if ($scope.component.updateEditList) {\r\n $scope.component.updateEditList = false;\r\n $scope.component.updateSelectedList = false;\r\n $scope.skills = [];\r\n\r\n $scope.skills = angular.copy($scope.allSKills);\r\n $scope.updateBothLists();\r\n }\r\n });\r\n }\r\n ],\r\n replace: true,\r\n transclude: true,\r\n templateUrl:\r\n \"templates/form-builder/form-builder-skills-edit/form-builder-skills-edit.html\",\r\n link: function(scope, elem, attrs, ctrl) {}\r\n };\r\n }\r\n ]);\r\n","\"use strict\";\r\n\r\nangular.module(\"imagetrend.components\").directive(\"hlpFormBuilderSkillsList\", [\r\n function() {\r\n return {\r\n restrict: \"AE\",\r\n scope: {\r\n component: \"=?\"\r\n },\r\n controller: [\r\n \"$scope\",\r\n \"EXSkill\",\r\n \"$sce\",\r\n function ($scope, EXSkill, $sce) {\r\n $scope.skillsloading = true;\r\n $scope.selectedskills = [];\r\n $scope.skills = [];\r\n\r\n $scope.trust = function (htmlText) {\r\n if (htmlText != null) {\r\n //removing first pair of

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

    ', '').replace('

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