{"version":3,"sources":["main.min.js","global.js","js/encryption.js","js/verifyPic.js","app.js","app.route.js","app.run.js","app.taishin.js","root.controller.js","directive/aTag.directive.js","directive/compile.directive.js","directive/focus.directive.js","directive/repeatEnd.js","directive/taiBulletin.directive.js","directive/taiBulletinDetail.directive.js","directive/taiEnter.directive.js","directive/taiHeader.directive.js","directive/taiMenuSite.directive.js","directive/taiMetro.directive.js","directive/taishinTimeTooltip.directive.js","directive/taiVirKeyboard.directive.js","filter/highlight.js","filter/newline.js","filter/trustHtml.js","filter/trustUrl.js","testMode/testData.service.js","service/bulletin.service.js","service/common.service.js","service/ctms.service.js","service/e2e.service.js","service/enum.service.js","service/header.service.js","service/home.service.js","service/login.service.js","service/menu.service.js","service/mobile.service.js","service/modal.service.js","service/schedule.service.js","service/translate.service.js","service/visualPage.service.js","controller/bulletin/bulletin.detail.controller.js","controller/bulletin/bulletin.more.controller.js","controller/common/common.index.controller.js","controller/external/external.index.controller.js","controller/external/external.schemaTransfer.controller.js","controller/header/header.searchResult.controller.js","controller/home/home.index.controller.js","controller/login/login.directEditPwd.controller.js","controller/login/login.forceEditPwd.controller.js","controller/login/login.forgetPwdDirectEditPwd.controller.js","controller/login/login.index.controller.js","controller/mobile/mobile.trigger.controller.js","controller/nextMenu/nextMenu.detail.controller.js","controller/nextMenu/nextMenu.index.controller.js","controller/schedule/schedule.index.controller.js","directive/modal/showRelatedFunctionsModal.controller.js","directive/datePicker/datePicker.directive.js","directive/datePicker/datePickerInput.directive.js","directive/datePicker/datePickerUtils.factory.js","directive/datePicker/dateRange.directive.js","directive/ui-bootstrap/dropdown.js","directive/ui-bootstrap/position.js","directive/ui-bootstrap/stackedMap.js","directive/ui-bootstrap/ui.bootstrap.js","service/interceptor/httpInterceptor.service.js","controller/common/modal/choicePerSerilNoModal.controller.js","controller/common/modal/contectModal.controller.js","controller/common/modal/courseDetailModalController.js","controller/common/modal/editPwdModal.controller.js","controller/common/modal/explanationModal.controller.js","controller/common/modal/forgetPwdModal.controller.js","controller/common/modal/loginModal.controller.js","controller/common/modal/phoneNumberModal.controller.js","controller/common/modal/registerModal.controller.js","controller/common/modal/settingModal.controller.js","controller/tsun/bulletin/bulletin.more.controller.js","controller/tsun/bulletin/bulletin.noticeDetail.controller.js","controller/tsun/home/home.index.controller.js","controller/tsun/training/training.inner.service.js","controller/tsun/visualpage/visualpage.controller.js","directive/ui-bootstrap/debounce/debounce.js","directive/ui-bootstrap/carousel/carousel.js","directive/ui-bootstrap/modal/modal.js","directive/ui-bootstrap/pagination/pagination.js","directive/ui-bootstrap/paging/paging.js","directive/ui-bootstrap/tabs/tabs.js","directive/ui-bootstrap/typeahead/typeahead.js","controller/common/modal/confirmDialog/confirmDialog.controller.js","controller/tsun/training/courseCollection/shoppingCart.index.controller.js","controller/tsun/training/courseCollection/shoppingCart.service.js","controller/tsun/training/course/course.index.controller.js","controller/tsun/training/course/course.service.js","controller/tsun/training/myTraining/myTraining.index.controller.js","controller/tsun/training/myTraining/taiMyTraining.bankBook.directive.js","controller/tsun/training/myTraining/taiMyTraining.courseLog.directive.js","controller/tsun/training/myTraining/taiMyTraining.exterior.directive.js","controller/tsun/training/myTraining/taiMyTraining.financial.directive.js","controller/tsun/training/myTraining/taiMyTraining.repairProject.directive.js","controller/tsun/training/recommend/recommend.Doc.controller.js","controller/tsun/training/recommend/recommend.index.controller.js","controller/tsun/training/recommend/recommend.inner.service.js","controller/tsun/training/myTraining/modal/applicationFormTypeSelector.controller.js","controller/tsun/training/myTraining/modal/courseCategorySelector.controller.js","controller/tsun/training/myTraining/modal/courseListSelector.controller.js","controller/tsun/training/myTraining/modal/myTrainingExteriorTimeModal.controller.js","controller/tsun/training/myTraining/modal/myTrainingOrganizerModal.controller.js","controller/tsun/training/myTraining/modal/myTrainingSelectActionConfirmModal.controller.js","controller/tsun/training/myTraining/modal/myTrainingSelectActionModal.controller.js","controller/tsun/training/myTraining/modal/optionSelector.controller.js","controller/tsun/training/myTraining/modal/taiAskExam.directive.js"],"names":["setSsoInfo","data","sessionStorage","setItem","Token","CName","PerSerilNo","PerserilNo","removeSsoInfo","removeItem","isAlreadyReport","mewMsg","errorMsgs","length","index","msg","isNoUseError","result","i","isNoUseErrors","indexOf","postException","exception","apiUrl","param","route","location","href","perSerilNo","getItem","push","console","log","queryString","name","AllVars","eval","p","a","c","k","e","r","toString","replace","String","RegExp","split","Vars","Var","getMenuQueryString","showSystemError","errorMessage","toastr","error","getLangCode","userLang","langSerilNo","_","toLowerCase","getDefaultUserLang","tsApiUrl","ieSystemLang","jQuery","ajax","type","url","async","intConvertTime","intTimeSpan","sec_num","parseInt","exp","hours","Math","floor","minutes","seconds","appCallback","method","params","Base64","_keyStr","encode","n","s","o","u","t","f","_utf8_encode","charCodeAt","isNaN","this","charAt","decode","fromCharCode","_utf8_decode","c1","c2","c3","encParams","JSON","stringify","match","tmpFrame","document","createElement","documentElement","appendChild","src","setTimeout","removeChild","jstr","parse","fixIeNotAbleToInput","selector","arguments","undefined","$","each","focus","select","infoDebug","Command","window","webkit","messageHandlers","msgHandler","postMessage","_toConsumableArray","arr","Array","isArray","arr2","from","str_encrypt","str","encodeURIComponent","str_decrypt","decodeURIComponent","randomNum","min","max","Date","getTime","randomColor","g","b","drawPic","parSrc","canvas","getElementById","width","height","ctx","getContext","textBaseline","fillStyle","fillRect","code","txt","substring","font","x","y","deg","translate","rotate","PI","fillText","strokeStyle","beginPath","moveTo","lineTo","stroke","arc","fill","callVerify","ajax_url","success","attr","isPass","val","SecretKey","toastrConfig","options","closeButton","onclick","showDuration","hideDuration","timeOut","progressBar","positionClass","preventDuplicates","newestOnTop","blockUIConfig","autoBlock","delay","template","execptionConfig","$provide","decorator","$delegate","cause","translateConfig","$translateProvider","useSanitizeValueStrategy","preferredLanguage","useUrlLoader","tsApi","navigator","systemLanguage","done","httpConfig","$httpProvider","interceptors","$inject","angular","module","constant","config","$locationProvider","hashPrefix","ngRouteConfig","$routeProvider","when","templateUrl","controller","resolve","viewModel","homeService","getMhr","loginService","get","getTsu","userInfo","$rootScope","getSsoInfo","then","urlParam","$routeParams","ssoInfo","activeType","visualPageService","$route","current","pageSerilNo","bulletinService","getNoticeMore","getByNoForTsun","no","enumService","getMore","siteCode","hrOutside","isHistory","getByNo","headerService","getSearchResult","keyword","scheduleService","getCalendarArea","getNext","otherwise","redirectTo","run","$location","$uibModalStack","$on","event","empty","remove","isLogin","isEmpty","currentPage","originalPath","path","search","body","scrollTop","css","dismissAll","isForce","cName","ssoApi","ctmsApi","pafUrl","DEVICE_TYPE","DEVICE_TOKEN","DEVICE_ID","USER_ID","PWD","APP_VERSION","IOS_VERSION","rootCtrl","$q","$timeout","modalService","sysCode","translateService","$window","$scope","trainingInnerService","mobileService","onInit","promiseList","loadTranslate","loadSsoInfo","all","vm","view","loaded","mobile","iOS","getDeviceInfo","checkAppVersion","self","resizeTo","screen","availWidth","availHeight","setUrl","setFontSize","styleUrl","isTest","hostname","checkSmallView","getTranslates","updateConfirmWording","iosAppUpdateConfirm","innerWidth","isSmallView","checkTokenFromOtherDomain","originUrl","urlSearch","getToken","getMenu","isMobile","token","checkToken","getLanguage","languageItems","defaultLangItem","find","selected","change","checkList","ctmsFileUrl","mhrFileUrl","VcUrl","getUrlSetting","forEach","checkItem","key","vcUrl","protocol","setFontSizeProcess","fontsize","fontSizeClass","$watch","newValue","isString","getBodyClass","small","medium","big","cn","eventBus","value","$broadcast","resize","$$phase","$apply","getConfigSetting","configData","appCurrentVersion","currentVer","appVer","Object","is","conAppVer","conCurVer","alert","appVersion","Android","userAgent","BlackBerry","Opera","Windows","any","commonService","restrict","link","scope","elem","attrs","ngClick","on","preventDefault","saveLogFlow","directive","$compile","element","$eval","compile","html","contents","urlRegEx","GotoLink","repeatEnd","$last","taiBulletin","bindToController","ControllerController","controllerAs","bulletin","noticeCenter","getHistoryBind","cache","menuItem","bulletinGetByPaggerDto","menuSerilNo","typeSerilNo","typeNo","bulletinTypeSerilNo","selectBulletinType","item","PaggerChoice","getBulletinDetail","selectFirstMenu","getMoreList","getNoticeMoreList","noticePage","dataType","setSiteCode","getTsunMoreList","notices","bulletins","concat","hasNoticeMore","bulletinParam","tsunOut","choiceType","isChoiceBulletinType","isChoiceMenu","getMoreByChoice","reBindView","menuFirstDtos","bulletinWithCountDto","bulletinSearchViews","hasMore","clickDefaultType","redirectToDetail","bulletinSerilNo","taiBulletinDetail","title","$http","attachmentSerilNo","getStampFile","el","setAttribute","click","download","setParams","saveBulletinClickingAttachment","getFileType","attachmentUrl","checkHeadStatus","getBackUrl","isBulletin","$parent","taiEnter","bind","which","taiHeader","showCtms","site","menuService","$filter","searchClick","$content","defaultLanguage","getDefault","addClass","langCode","getMenuList","getFontSize","fontSizes","fontSize","filter","isSelected","sizeCode","last","switchSearchList","menuAllList","allmenu","hasChild","menuItemStyle","background-color","color","getfirstMenuList","menuLists","parentId","level","firstmenuList","getsecMenuList","parentIdLen","secmenuList","getthirdMenuList","thirdmenuList","navmenuClick","w","$blackcover","animate","right","firstmenuItem","rootClick","secmenuItem","secmenuOpen","removeClass","languageOpen","switchClose","menuName","thirdmenuOpen","$this","$this_index","toggleClass","siblings","hasClass","scrollgoto","offset","top","anchor","firstMenuLangName","menuLangName","menuItemPath","redirectUrl","choiceLanguage","reload","login","redirecter","logout","touchWithMe","openSetting","setting","$event","getSiteCode","getSearch","searchList","specialKeywordVerification","keyWord","pattern","substr","searchChange","SKV","specialKeywords","warning","showSearchList","showFastList","doSearch","transferurl","taiMenuSite","menuId","showMode","$element","init","enumShowMode","fullPath","tsunOutside","post","menuUrl","parent","rootHove","child","globalMenuSerilNo","rootClear","childClick","partPath","taiMetro","menuItems","sort","apply","map","taishinTimeTooltip","importData","mode","textAlign","briefText","dataIint","show","moreShow","showBrief","briefIsRange","contentSperate","isForceBrief","style","contentStyle","textStyle","copy","dateBrief","dateList","logicInit","styleLoading","roughProcess","dateProcess","contentFixBr","getDateRange","rawStr","getRange","sourceStr","resultStr","matchResult","timeAry","trim","exec","rawData","exceptCheck","test","taiVirKeyboard","require","onDataChanged","getMapKey","keyMap","showKeyboard","isInitKeyboard","initKeyElement","new_keybord","getArrayItems","num","temp_array","return_array","arrIndex","splice","kbType","getLetterKeyboard","kbNum","getSymKeyboard","caps","titleName","toUpperCase","num_array","sym_arr","en_b_array","append","virData","focusObj","highlight","$sce","text","phrase","trustAsHtml","newline","trustHtml","trustUrl","trustAsResourceUrl","testData","MyTrainingPoint","year","resultDefault","resultYear2013","resultYear2014","resultYear2015","resultYear2016","Status","Data","ErrorMessage","remainPoint","trainingPoints","courseName","courseTime","courseType","point","SysTypesList","resultType2","resultType3","resultType4","resultType5","id","FCLicenseList","attTypes","organization","CourseItem","CourseItemsDownload","CourseItemsPdf","CourseItemsVideo","fileExt","ItemId","PublishedActivity","resultTW","resultCN","resultUS","classificationId","classificationName","courseId","courseTypeName","enrollBegin","enrollEnd","sessionId","sessionName","LanguageCode","compareClassficationId","ClassificationId","CourseSession","CourseSessionType1","CourseSessionType2","CourseSessionType3","CourseSessionType4","CourseSessionType5","CourseSessionType6","CourseSessionType7","costPerPerson","description","duration","enrollCount","enrollPeriod","enrollRemain","enrollTime","outline","reference","sessionTime","target","waitlistCount","waitlistRemain","intructors","place","trainingPoint","division","externalType","note","ownCost","subsidyCost","totalCost","courses","order","enumCourseType","webCourse","classCourse","externalCourse","webTest","classTest","questList","courage","ExamSurveyContent","resultTestData1","examHistoryId","itemId","limitMins","limitTimes","remainingMins","remainingTimes","questions","attachment","groupName","questionId","questionType","required","scoreRate","resultTestData2","correctAnswer","preTitle","textValue","InteractionData","resultTestData1Answer","resultTestData2Answer","questionResults","studentAnswer","score","totalQuestions","wrong","MyUnfinishedActivities","Promise","reject","enrollmentId","progress","status","MyFinishedActivities","EnrollmentAvailableAction","courseItem","resultType1","lmsItems","action","completedTime","itemName","viewedTime","attendanceRate","attendances","availableActions","courseSessions","preSurveyItemId","reportDeadline","reportSubmitted","reportTotal","reports","EnrollmentAction","resultFail","failCode","failMessage","resultSucess","IsProgram","FCCertificatedLicenseAdd","FCCertificatedLicenseList","acquireDate","applyDate","validDate","validStatus","validStatusKey","workflowDateTime","workflowItem","workflowName","workflowReason","workflowResult","FCAuthorizedHoursList","licenseId","licenseName","trainingCategory","trainingEndDate","unfinishHours","ExternalTrainingApplication","FCEnrollableActivities","resultEmpty","fcAuthHours","LearningRecordCommit","service","factory","saveEnforcementReadRecord","notifySerilNo","noticeUrl","bulletinCache","donwloadStampForUrl","format","setOneWindow","varWindow","windowChecker","open","newWindows","perWindow","close","ctmsFilePath","returnPath","menuClickLogCreatePerSerilNo","URLCheck","setCtmsParams","UserId","userAccount","tkn","fileName","showImg","attachmentType","toLocaleLowerCase","showVedio","fetchDecyrptForDirectModifyDto","newApiURL","ctmsService","isTestMode","blockUI","apiResult","Annual","callCtmsApi","returnResult","ctmsResultFormat","Type","ActivityTypesUnderClassification","CourseType","start","stop","errorMsg","errorCode","tsunErrorCourseEnroll0","tsunErrorCourseEnroll1","tsunErrorCourseEnroll2","tsunErrorCourseEnroll3","tsunErrorCourseEnroll4","tsunErrorCourseEnroll5","tsunErrorCourseEnroll6","tsunErrorCourseEnroll7","tsunErrorCourseEnroll8","tsunSendError","isSuccess","tsunErrorExternalApplication0","tsunErrorExternalApplication1","tsunErrorExternalApplication2","tsunErrorExternalApplication3","actionUrl","headers","Content-Type","apiAction","resultData","errorLog","attachmentPath","attachmentName","replaceAll","e2eService","forgetPwd","forceEditPwd","register","editPwdModal","contactMe","directEditPwd","sso","redirectType","sendTarget","notExist","disable","isLock","lockUnReslove","dwpError","tokenNotExist","notHaveEmail","notHavePhone","notFindAccount","emailAlreadyRegister","dwpMustBigThan","dwpNotSameAccount","dwpJustEnAndNumber","dwpNeedContainEnAndNumber","dwpNotContainueThree","dwpNotContainueThreeOrderAndDesc","dwpNotSameRecent","accountIsNotActive","verifyCodeNotExist","verifyCodeExpired","dwpModifyWeek","dwpErrorIsLock","mustModifydwP","verifyCodeNotPass","illegalRegister","newdwPNotSameOlddwP","userAlreadyValidate","waitForLock","verifyCodeInValid","isTaiEmail","reCaptchaFail","direct","wrap","email","sms","hrInside","hrAdmin","tsunInside","SiteCode","CurrentMenuSerilNo","headerUrl","searchResultType","needLog","searchResultEnum","needKeywordLog","getMenuName","searchMsg","getRelatedFunctions","getMenuManagers","res","saveMenuClickingAttachment","saveLearnLog","menuparam","LangSerilNo","IsNormal","IsSpecial","IsSetting","homeUrl","getNextMore","replaceFunc","editPwdErrorLogic","Result","ResultValue","basicFunc","handleSsoLogic","multipleSerNoFunc","setSsoParams","ssoCode","resultNumber","commonErrorMessage","info","ssoMustModifyPwd","ssoErrorInCommonUse","commonIsLock","commonNotExistToken","ssoNotFindAccount","commonUnLock","ssoIsTaiEmail","commonReCaptchaFail","ssoPwdMustBigThan","ssoPwdNotSameRecent","ssoPwdModifyWeek","commonPwdError","ssoPwdJustEnAndNumber","ssoPwdNeedContainEnAndNumber","ssoAccountNotExist","ssoPwdNotContainueThree","ssoPwdNotContainueThreeOrderAndDesc","ssoPwdNotSameAccount","accountNotExist","ssoVerifyCodeExpired","ssoVerifyCodeNotExist","ssoVerifyCodeInValid","ssoNotHavePhone","ssoNotHaveEmail","loginByPerSerilNo","tokenTransfer","tokenTransferByAccount","modifyUserPassword","account","forgetPWD","recaptcha","directModifyUserPassword","registerOutsideUser","editUserProfile","$emit","commonSaveSuccess","sendVerifyCodeFromPhone","verifyCodeCheckFromPhone","validateTel","getPwdConstrain","checkVerifyCode","produceVerifyCodeFromSignUp","verifyCodeCheckFromSignUp","getInformationBySerilNo","cloneItem","cloneDeep","redirectByTarget","redirectDirect","isOutSideUrl","generateUrl","host","isInitialMenu","initialData","startsWith","postMobileInfo","USER_TOKEN","isMobileApp","message","postCourseInfo","$uibModal","orientation","isIos","getTaiClass","getWindowClass","getChoicePerSerilNo","modal","size","taiClass","onDestroy","defer","reCaptchaCheckChild","reCaptchaCheck","parentElement","getElementsByClassName","promise","closed","delaySec","userData","confrimDialog","paramConfig","confirmTitle","confirmContent","textButtonOk","textButtonCancel","promiseAction","explanation","courseDetail","settingModel","defaultTabIndex","rendered","modalBootstrap","scroll","modalContent","goTop","position","display","editPwd","phoneNumber","trainingSelectAction","keyboard","backdrop","selectActionConfirm","ctmsConfirmTime","modalResult","windowClass","openOptionSelector","isCycle","titleTranslate","keyValueList","thisMonth","calendarAreaNo","calAreaSerilNo","donwloadIcs","downloadUrl","calendarSerilNo","$translate","isWrite","callApi","selectedItem","languageCode","use","urlTranslate","visualPageUrl","bulletinDetailController","bulletinMoreController","commonController","externalController","isEmbed","externalSchemaTransferController","schema","getSchemaQueryString","headerSearchResultController","searchedKeyword","redirectMenuSearchResult","redirectContentSearchResult","serilNo","pageChange","newPage","newType","currentSearchResultType","menuMetroResults","contentResults","bulletinContentResults","formContentResults","tabChange","initTotal","checkLastMenu","menu","menuSize","keys","Number","homeController","loginDirectEditPwdController","iAmNotRobot","textChanged","newPwd","$e","triggerHandler","showVirKey","isShowVirKey","mobilTel","verifyCode","form2","form1","tel","validCode","issend","submit","confirmPwd","commonEditPwdSuccess","autoFill","sendVerifyCodeFromSignUp","commonAlreadySendSMS","checkVerify","PhoneNumber","alreadyVerifyPhoneNumber","isShowConfirmUpdate","canSend","getFocusNewPwd","getFocusConfirmPwd","checkPassword","loginForceEditPwdController","loginForgetPwdDirectEditPwdController","isValidLink","ResultMsg","isShowConfirmPwdVirKey","loginController","mobileTriggerController","nextMenuDetailController","nextMenuController","scheduleController","calendarAreas","schedule","moment","add","getSchedule","changeDate","clickDay","calendarArea","calendarAreaSerilNo","dateItem","scheduleTodays","trigger","outputFile","txtContent","isAllDay","begin","startDate","end","endDate","reminder","isEveryDay","tshrExportScheduleMessage","changeArea","getStartForList","getEndForList","subtract","getAllDay","allDay","showButton","now","eventDte","showRelatedFunctionsModalController","$uibModalInstance","relatedInfo","cancel","dismiss","Module","views","momentNames","month","date","viewConfig","step","m","tz","isMoment","datePickerConfig","datePickerUtils","model","after","before","choiceDate","ngModel","firstDay","prepareViews","slice","maxView","minView","getDate","setDate","notEmit","callbackOnSetDate","datePicker","update","arrowClick","createMoment","years","getVisibleYears","months","getVisibleMonths","weekdays","getDaysOfWeek","weeks","getVisibleWeeks","getVisibleHours","getVisibleMinutes","initChoiceDate","translateWeek","weekday","weekdayName","0","tsunWeekSunday","1","tsunWeekMonday","2","tsunWeekTuesday","3","tsunWeekWednesday","4","tsunWeekThusday","5","tsunWeekFriday","6","tsunWeekSaturday","j","week","classes","classList","choiceDateArr","prev2Month","next1Month","next2Month","limitDate","range","schedules","isAfter","contains","dateRange","chain","hour","toDate","toArray","flatten","uniq","sortBy","watch","prepareViewData","isSame","clipDate","isNow","inValidRange","timezone","eventIsForPicker","partial","minDate","maxDate","pickerID","autoclose","autoClose","day","minute","ceil","second","watchDirectChanges","dateChange","findFunction","setView","nextView","selectDate","disabled","dates","compareFunc","next","delta","valid","isBefore","date1","date2","prev","pickerIDs","updateViews","updateViewData","isDefined","PRISTINE_CLASS","DIRTY_CLASS","onSetDate","oldValue","formatConfig","newValueDate","oldValueDate","defaultValue","$document","dateTimeConfig","$parse","dateFilter","appendAlign","onEvent","unshift","setMin","findParam","$validators","minValid","setMax","maxValid","picker","validateRequired","$validate","$modelValue","dateRequired","$invalid","setDateProcess","clear","showPicker","resultDate","configs","stopPropagation","blur","container","bodyHeight","scrollHeight","evt","$digest","pos","getBoundingClientRect","pickerHeight","offsetHeight","showTop","left","insertBefore","inheritedData","createNewDate","utc","UTC","pushedDate","utcOffset","startYear","startMonth","d","actualOffset","getWeekDays","days","unix","isSameYear","isSameMonth","isSameDay","isSameHour","isSameMinutes","zone","fd","scopeSearch","comparisonFn","parentScope","nameArray","isFunction","isValid","targetIDs","matches","some","getTemplate","extend","randomName","pickerRangeID","modelName","newDate","$watchGroup","appendToOpenClass","openClass","openScope","dropdownScope","closeDropdown","keybindFilter","isOpen","off","getAutoClose","toggleElement","getToggleElement","dropdownElement","getDropdownElement","focusToggleElement","isKeynavEnabled","focusDropdownEntry","$attrs","dropdownConfig","uibDropdownService","$animate","$position","$templateRequest","templateScope","getIsOpen","$new","setIsOpen","noop","toggleInvoker","onToggle","appendToBody","appendTo","keynavEnabled","assign","dropdownAppendTo","appendToEl","dropdownAppendToBody","keyboardNav","dropdownMenu","toggle","getElement","keyCode","elems","eq","isNumber","selectedOption","wasOpen","rightalign","positionElements","prop","appendOffset","openContainer","hasOpenClass","dropdownMenuTemplateUrl","tplContent","newEl","replaceWith","$destroy","dropdownCtrl","dropdownNested","tplUrl","toggleDropdown","aria-haspopup","aria-expanded","unbind","SCROLLBAR_WIDTH","BODY_SCROLLBAR_WIDTH","OVERFLOW_REGEX","normal","hidden","PLACEMENT_REGEX","auto","primary","secondary","vertical","BODY_REGEX","getRawNode","nodeName","parseStyle","parseFloat","isFinite","offsetParent","isStaticPositioned","getComputedStyle","scrollbarWidth","isBody","isUndefined","bodyElem","clientWidth","scrollElem","offsetWidth","scrollbarPadding","elemStyle","paddingRight","paddingBottom","scrollParent","tagName","widthOverflow","scrollWidth","originalRight","heightOverflow","clientHeight","bottom","originalBottom","isScrollable","includeHidden","overflowRegex","overflow","overflowY","overflowX","includeSelf","documentEl","excludeStatic","spStyle","includeMagins","elemOffset","marginTop","marginLeft","parentOffset","clientTop","clientLeft","scrollLeft","round","elemBCR","pageYOffset","pageXOffset","viewportOffset","useDocument","includePadding","offsetBCR","offsetParentBCR","offsetParentStyle","paddingTop","paddingLeft","parsePlacement","placement","autoPlace","hostElem","targetElem","targetWidth","targetHeight","hostElemPos","targetElemPos","targetElemStyle","adjustedSize","abs","marginRight","marginBottom","xOverflow","yOverflow","positionArrow","innerElem","querySelector","isTooltip","arrowElem","arrowCss","borderProp","borderWidth","borderRadiusProp","borderRadius","createNew","stack","idx","removeTop","httpInterceptor","$httpParamSerializer","response","responseError","pleaseSetNo","canNotAccess","tokenIsTimeout","isConfirm","confirm","statu","request","contentType","transformRequest","LangCode","choicePerSerilNoModalController","choiceSeirlNo","contectModalController","commonName","content","commonContent","sendMailSuccess","inputVerify","validateCode","paramsData","commonIncorrectFormat","courseDetailModalController","$anchorScroll","dataInit","enroll","importCourse","importCourseActivities","sessionItem","sessionDetail","courageItem","courageDetail","enrollQuestionItem","enrollActivity","tabIndex","enrollQuestionMode","isEnroll","hasEnrollQuestion","contentCourage","contentCourse","pageLoad","couragePage","sessionPage","sessionInit","selectActive","getSelectActive","Accordion","importItem","getCourseDetail","courseDetailResult","detailFormat","sourceData","detailData","brCheck","isInt","isAsNull","hash","postSessionAction","sessionChoice","setPathUrl","filePath","pathUrl","dropDown","closest","not","slideUp","slideToggle","editPwdModalController","oldPwd","getFocusOldPwd","explanationModalController","forgetPwdModalController","state","specialKeywordVerificationUserAccount","sendMail","tsdgLoginAccount","commonAlreadySendMail","forgetAutoFill","loginModalController","pwdChanged","deviceToken","myDeviceToken","paramsLogin","btoa","pwd","UserAccount","loginToEditOrHome","loginBefore","IsForce","isFirstLogin","autoFill2","openForgetPwd","openRegister","openExplanation","enableLogin","getFocusUserAccount","getFocusUserPwd","phoneNumberModalController","isSended","registerModalController","sendType","commonSMS","phoneKeywordVerification","tsdgName","perTel","commonMobile","settingModalController","settings","isEmployee","perTelcheck","moblieIsVerify","enableperTel","openEditPwd","openPhoneNumber","isperTel","tsunBulletinMoreController","redirect","tsunBulletinNoticeDetailController","tsunHomeController","getCourseLog","lang","StartIndex","EndIndex","getUnfinishedActivities","SessionId","getFinancial","getAuthorizedHours","LicenseId","getCourseItems","activityItem","AttachmentSerilNo","getBankBook","bankBook","getFullYear","getExterior","getEffectives","stateList","tsunFinacialCertificationStatusAll","tsunFinacialCertificationStatusInactive","tsunFinacialCertificationStatusActive","tsunFinacialCertificationStatusCancel","tsunFinacialCertificationStatusRemove","getCertificateType","getLicensesNames","licenseCategoryId","LicenseCategoryId","getExternaltype","commonPleaseSelect","allowanceRate","sortIndex","tsunExternalType1","tsunExternalType2","tsunExternalType3","tsunExternalType4","tsunExternalType0","getCurrency","getExamSurveyContent","postExamSurveyContent","examContent","ExamHistoryId","UserResponse","answers","Finish","finish","activeItemtype","postExterior","CourseName","Name","OrganizationId","Outline","CourseDate","CourseTime","Location","Place","Course_Cost_Currency_1","currency","Course_Cost_Amount_1","coursePrice","Transportation_Cost_Amount_1","travelPrice","Course_Converting_Amount_1","totalPrice","CourseRemark","Remark","dateSettingList","perDateStr","innerDataDate","dateValue","innerDataTime","timeValue","organizer","perOrg","tsunSuccessExternalApplication","postFinancial","licenses","AcquireDate","getDay","LicenseCode","licensesNO","Comment","otherMark","postLearningRecord","isAlert","Duration","tsunSendSuccess","reason","getYears","minYear","thisYear","getAuthorizedHoursCourse","Action","ActionType","getCourseList","getCourseListAll","catagoryId","loadLangs","langs","coursePromist","resultCourseList","courseList","orderBy","prototype","uniqBy","checkCourseWithMenu","getCollectionList","sysLang","collectionList","addCollection","collectionSessionId","delCollection","getCarousel","postUrl","fileUrl","visualpageController","viewInit","localValue","localValueInit","treeInit","menuAlterInit","menuAlterNodes","selectedMenuText","selectedMenuIndex","showSelected","node","treeOptions","nodeChildren","dirSelectable","treeNodeView","treeNode","preSymbol","_preSymbol","isEmptyUrl","menuAlterText","children","treeNodeChild","treeView","menuNo","menuSelectedIndex","menuAlterClick","isInit","targetNode","isError","MenuClickAttachmentId","callback","debounceTime","timeoutPromise","args","call","$interval","clearBufferedTransitions","bufferedTransitions","shift","getSlideByIndex","slides","l","goNext","slide","direction","destroyed","active","currentSlide","enabled","$currentTransition","SLIDE_DIRECTION","phase","nextSlide","pop","nextIndex","indexOfSlide","nextDirection","getCurrentIndex","currentIndex","restartTimer","resetTimer","currentInterval","resetTransition","interval","timerFn","isPlaying","pause","addSlide","play","newIndex","noWrap","removeSlide","bufferedIndex","isActive","noPause","noTransition","$watchCollection","transclude","showBar","showArrow","actual","carouselCtrl","animation","$animateCss","className","beforeAddClass","stopped","directionClass","removeClassFn","beforeRemoveClass","entries","hasKey","put","values","provider","resolver","setResolver","$get","$injector","invocables","locals","promises","invoke","resolves","resolveObj","resolveIter","$modalStack","linkFn","modalInClass","NOW_CLOSING_EVENT","setIsAsync","modalOptions","tElement","tAttrs","backdropClass","windowTopClass","getTop","currentTarget","$isRendered","modalRenderDeferObj","$observe","animationPromise","modalRendered","activeElement","inputWithAutofocus","modalAnimation","uibModalAnimationClass","clone","$$multiMap","$$stackedMap","$uibPosition","isVisible","getClientRects","backdropIndex","topBackdropIndex","opened","openedWindows","topModalIndex","removeModalWindow","modalInstance","elementToReceiveFocus","modalWindow","appendToElement","previousTopOpenedModal","modalDomEl","removeAfterAnimate","modalScope","modalBodyClass","openedClass","OPENED_MODAL_CLASS","openedClasses","toggleTopWindowClass","closedDeferred","checkRemoveBackdrop","toggleSwitch","backdropDomEl","backdropScopeRef","backdropScope","domEl","afterAnimating","leave","asyncDeferred","asyncPromise","keydownListener","isDefaultPrevented","list","loadFocusElementList","focusChanged","shiftKey","isFocusInFirstItem","isModalFocused","focusLastFocusableElement","isFocusInLastItem","focusFirstFocusableElement","broadcastClosing","resultOrReason","closing","defaultPrevented","tabableSelector","newBackdropIndex","modalOpener","deferred","renderDeferred","currBackdropIndex","Error","enter","angularDomEl","template-url","windowTemplateUrl","window-class","window-top-class","tai-class","$$uibDestructionScheduled","topModal","srcElement","modalDomE1","elements","querySelectorAll","$modalProvider","$controller","$uibResolve","getTemplatePromise","$modal","promiseChain","getPromiseChain","resolveWithTemplate","templateAndResolvePromise","modalResultDeferred","modalOpenedDeferred","modalClosedDeferred","modalRenderDeferred","samePromise","tplAndVars","providedScope","$close","$dismiss","ctrlInstance","ctrlInstantiate","ctrlLocals","instance","$onInit","uibPaging","uibPaginationConfig","makePage","number","getPages","totalPages","pages","startPage","endPage","isMaxSized","maxSize","page","pageLabel","forceEllipses","boundaryLinkNumbers","previousPageSet","secondPageLink","firstPageLink","nextPageSet","secondToLastPageLink","lastPageLink","ctrl","$page","identity","boundaryLinks","directionLinks","create","_watchers","render","originalRender","itemsPerPage","firstText","previousText","nextText","lastText","totalItems","ngDisabled","ctrls","paginationCtrl","ngModelCtrl","setNumPages","numPages","$setViewValue","$render","calculateTotalPages","updatePage","newTotal","oldTotal","$viewValue","selectPage","clickAllowed","getText","noPrevious","noNext","findTabIndex","tabs","oldIndex","previousIndex","previousSelected","tab","onDeselect","onSelect","addTab","t1","t2","newActiveIndex","removeTab","newActiveTabIndex","isNohover","justified","heading","elm","tabsetCtrl","$transcludeFn","isTabHeading","hasAttribute","uibTabContentTransclude","headingElement","TYPEAHEAD_REGEXP","input","source","viewMapper","modelMapper","originalScope","$$debounce","typeaheadParser","fireRecalculating","moveInProgress","debouncedRecalculate","recalculatePosition","modelCtrl","ngModelOptions","HOT_KEYS","eventDebounceTime","minLength","typeaheadMinLength","newVal","waitTime","typeaheadWaitMs","isEditable","typeaheadEditable","hasFocus","isLoadingSetter","typeaheadLoading","onSelectCallback","typeaheadOnSelect","isSelectOnBlur","typeaheadSelectOnBlur","isNoResultsSetter","typeaheadNoResults","inputFormatter","typeaheadInputFormatter","typeaheadAppendToBody","typeaheadAppendTo","focusFirst","typeaheadFocusFirst","selectOnExact","typeaheadSelectOnExact","isOpenSetter","typeaheadIsOpen","showHint","typeaheadShowHint","parsedModel","invokeModelSetter","$setModelValue","$options","getterSetter","$$$p","parserResult","uibTypeahead","offDestroy","popupId","$id","aria-autocomplete","aria-owns","inputsContainer","hintInputElem","border-color","box-shadow","opacity","background","vertical-align","popUpEl","move-in-progress","query","assign-is-open","debounce","typeaheadTemplateUrl","typeaheadPopupTemplateUrl","resetHint","resetMatches","activeIdx","getMatchId","removeAttr","inputIsExactMatch","inputValue","label","getMatchesAsync","onCurrentRequest","debounceUpdate","isObject","firstLabel","scheduleSearchWithTimeout","cancelPreviousTimeout","assignIsOpen","$setValidity","$item","$model","$label","typeaheadFocusOnSelect","parentNode","offsetTop","$error","editable","dismissClickHandler","$popup","_modelCtrl","_ngModelOptions","$parsers","$formatters","modelValue","candidateViewValue","emptyViewValue","popupTemplateUrl","isDropdownOpen","matchIdx","selectMatch","tplEl","$log","escapeRegexp","queryToEscape","containsHtml","matchItem","isSanitizePresent","has","warn","confirmDialogController","eventInit","styleInit","hasTitle","hasContent","titleStyle","padding","word-break","footerStyle","isBusy","tsunButtonConfirmOk","commonCancel","ok","bodyStyle","tsunShoppingCartController","items","collectionEmpty","pageLoading","pageLoaded","loadCollections","checkIsEmpty","courseCollection","resultSessionItems","dataCourseCollection","dataCourseList","collectionItem","findIndex","setTypeClass","openCourseModal","enrollSuccess","confirmDialog","tsunConfirmRemove","itemIndex","tsunEnrollInfoNoQuestion","shoppingCartService","tsunCourseController","menuInit","menuSlide","courseEmpty","urlParamFormat","courseListFilter","courseCatagories","courseCatagoriesSelectedItemName","commonAll","viewShow","menuIndex","menuChildIndex","loadMenu","loadCourseList","checkCourseID","courseid","checkSessionID","sessionid","keyString","slideNum","chunk","slideItem","categoryId","langItem","courseCategory","loadCollection","promisList","loadUserCollection","courseListChecked","collectionCheck","openCourseDetail","addToShoppingCar","isAdd","indexFind","openCourseCategorySelector","categoryItem","categoryName","courseService","tsunMyTrainingController","methodList","menuType","menuClick","menuList","menuLoad","menuSeletedText","menuNameEdit","nameValue","tsunRepairProject","tsunCourseLog","tsunFinancial","tsunExterior","tsunBankBook","menuStyleChange","langSelected","nameLength","numLineChange","taiMyTrainingBankBook","taiMyTrainingBankBookController","isFocus","bankBookEmpty","isInited","promiseEvt","yearChanged","loadBankBook","bankBookItem","openYearSelector","taiMyTrainingCourseLog","taiMyTrainingCourseLogController","translatePool","yearChange","statusConvert","courseLogEmpty","courseLogSource","courseLog","courseLogFilter","filterSessionTimeByYear","statusCode","tsunPassStatusValueNotCourage","tsunPassStatusValueNA","tsunPassStatusValueExemption","tsunPassStatusValueOK","tsunPassStatusValueNotOK","taiMyTrainingExterior","taiMyTrainingExteriorController","mustRemark","openOrganizer","removeOrganizer","removeTime","openTime","plusTotalPricer","openApplicationFormTypeSelector","applicationForm","applicationFormInit","exteriorData","Externaltype","head","organizerOther","times","allowance","$valid","tsunFormMsgRequiredEmpty","exteriorType","isAllowance","isFeeEmpty","errorMsgEmptyFee","tsunErrorExternalApplicateEmptyFee","bankBookData","recentPoint","isPointEmpty","errorMsgEmptyPoint","tsunErrorExternalApplicateAllowance","confirmText","tsunConfirmExternalApplicate","postFormData","postExteriorSuccess","$submitted","organizerResult","choiceList","renderInit","buttonHide","adjustOrgNameWidth","buttonShowTrigger","triggerResult","checkboxEvent","scrollEvent","allShowArea","modalBootstrapContent","checkButtonCanShow","footerDiv","paddingHeight","checkHeight","showDiv","buttonInContent","buttonShow","topLocation","outerHeight","margin-left","margin-right","saveList","_typeof","Symbol","iterator","obj","constructor","taiMyTrainingFinancial","taiMyTrainingFinancialController","finacialLicicense","effectiveChange","openCertificateStatusSelector","openCertificateTypeSelector","openCourseListSelector","licenseKeyUp","certificateChange","courseListSelectChange","getcourseList","licenseBlur","financial","UserInfo","empId","UserDept","depName","recordEmpty","licienceEmpty","financialFilter","authorizedHours","authorizedHoursFilter","isInited_Page1","pageLoaded_Page1","pageLoading_Page1","isInited_Page2","pageLoaded_Page2","pageLoading_Page2","isInited_Page3","pageLoaded_Page3","pageLoading_Page3","logicInit_Page1","logicInit_Page2","logicInit_Page3","receiveData","effectives","workflow","workflowFormat","effective","activeTabIndex","certificateType","certificate","courseTypeInternal","tsunInternalCourse","courseTypeExternal","tsunExternalCourse","courseListGroup","groupBy","groupByIndex","showName","tsunEmptyCourse","tsunExternalCourseNotAllowForWeb","financialItem","propName","licensesItem","postFinancialSucess","licensesNames","List","dataList","keyValue","regExpCompare","perItem","compareString","taiMyTrainingRepairProject","taiMyTrainingRepairProjectController","openDetail","setPercentStyle","timeConfig","sessionSelected","repairProject","repairProjectInFilter","loadConfig","loadItemList","perReceiveData","openModal","percentage","directToCourse","tsunRecommendDocController","innerHtml","loadData","recommendHtml","tsunRecommendController","carousel","carouselSelected","showCarousel","showEmbed","recommendEmpty","recommendEmptyType2","recommendEmptyType3","isMulitiData","viewChange","showArea","backList","carouselClick","carouselItem","newWindow","isUrl","activityContent","write","activityTitle","recommendInnerService","applicationFormTypeSelectorController","TypeSelected","courseCategorySelectorController","itemSelected","courseListSelectorController","myTrainingExteriorTimeModalController","checkView","classDateValid","classTimeValid","LunchTimeValid","weekDayValid","formSubmited","mins","cycleTypeList","tsunWeek","tsunMonth","tsunYear","checked","cycleList","cycleValue","cycleType","hasRestTime","classDateStart","classDateEnd","sessionTimeStartHour","sessionTimeStartMin","sessionTimeEndHour","sessionTimeEndMin","restTimeStartHour","restTimeStartMin","restTimeEndHour","restTimeEndMin","clearPageData","tabDayOfMonth","cycleWeek","tabDayOfWeek","checkFormData","pushDataToStore","saveAndNext","classDateStartDate","classDateEndDate","singleData","showText","selectWeekday","selectedWeekDayText","cycleTimes","classTime","cycleCompareValue","cycleBaseValue","getMonth","dateString","dateYear","dateMonth","dateDay","classTimeIndex","commonEvery","calssTimeStart","calssTimeEnd","isClassLunchTime","classLunchTimeStart","classLunchTimeEnd","tsunErrorExteriorTimeEmpty","removeClassRange","openTimeSelector","myTrainingOrganizerModalController","checkedList","listData","emptyParams","staticButtonShow","orgSearchEmpty","CheckValue","isApp","Jquery","send","Check","searchData","checkboxClick","itemChecked","checkHasClick","checkedItemIndex","searchResultEnd","myTrainingSelectActionConfirmModalController","DEFUALT_CONFIRMTIME","containu","myTrainingSelectActionModalController","_sessionDecaySecs","durationView","viewTime","viewTimeInterval","sessionTimeInterval","timer","pdfUrl","iframeUrl","studyActivity","courageActive","courageAction","sessionActives","sessionLms","sessionAction","ctmsTime","DEFAULT_POPUPTIME","ctmsCourseTimeInterval","default_ctmsCourseTimeInterval","sources","tracks","kind","srclang","default","isDownload","isShowPdf","isShowVideo","isShowExam","isShowIframe","activeContent","activeList","vgApi","tabSelected","courageInit","selectActiveResult","actionItemFormat","lmsItemsFormat","actionList","tsunActionEnroll","tsunActionCancel","tsunActionLeave","tsunActionExemption","activeItem","isAction","tsunAttendanceRate","extraInfo","tsunReportsInfo","tsunClassReportNote","refreshViewTime","viewTimeStop","viewTimeStart","countTimeStart","confirmForDesktop","closeFullScreen","vgPlayReady","api","vgComplete","reset","actionSubmit","enrollTarget","initViewState","clearAll","changeActivityType","changeExam","sessionLm","asSeconds","setSession","fileExist","fileExtension","getFileExtension","downloadItem","clearActive","clearActiveView","choiceSelectActive","returnActiveList","postToIos","ctmsSeekTime","Tkn","FileUrl","CtmsTime","CtmsConfirmTime","CtmsCourseTimeInterval","CtmsSeekTime","pdfIsDone","addEventListener","confirmationMessage","returnValue","optionSelectorController","isKeyValueList","GetList","isPrototypeOf","dataSelected","taiAskExam","showView","courseActiveItem","elementLoad","countingSecsInterval","examInfo","resultTest","resultQuest","dataLoadSucess","dataLoadFail","hasSubmit","canRetry","countingSecs","examContentGroup","examContentRefer","examItemOrder","limitTimesText","limitTimesFormat","submitExam","remainingMinsFormat","examList","examItem","typeText","isCorrect","showOrder","choiceStyle","Line","Layer","optionItem","tsunTestTypeMulti","tsunTestTypeEssay","tsunTestTypeBlankFill","tsunTestTypeSingle","countingTimeShowing","timeSpan","forceSubmit","itemType","questRequiredUnAnswer","questRequiredUnAnswerPerGroup","questUnAnswer","questUnAnswerPerGroup","strEmptyGroupName","otherAns","lenght","perAnswer","examItemAnswer","valueIndex","tsunTest","tsunTestRequiredAlert","tsunTestComfirm","resultPost","viewShowContentFormat","resultItem","referData","resultCorrectAnswerForMulti","resultStudentAnswer","answerItem","optionOrder","retryTest","reviewContent","reviewResult","tsunNoLimit","remainMins"],"mappings":"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","file":"main.min.js","sourcesContent":["'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service', []);\n angular.module('app.directive', []);\n angular.module('app.filter', ['ngSanitize']);\n angular.module('app', ['ui.bootstrap', 'ngMessages', 'ngAnimate', 'angular-loading-bar', 'ngTouch', 'ngRoute', 'pascalprecht.translate', 'ngSanitize', 'datePicker', 'vcRecaptcha', 'treeControl', 'blockUI', \"com.2fdevs.videogular\", \"com.2fdevs.videogular.plugins.controls\", \"com.2fdevs.videogular.plugins.overlayplay\", \"com.2fdevs.videogular.plugins.poster\", 'app.service', 'app.directive', 'app.filter']).constant('finacialLicicense', true).constant('sysCode', 'MHR').constant('_sessionDecaySecs', 1200000).config(toastrConfig).config(execptionConfig).config(translateConfig).config(httpConfig).config(blockUIConfig).config(['$locationProvider', function ($locationProvider) {\n $locationProvider.hashPrefix('');\n }]);\n\n function toastrConfig() {\n toastr.options = {\n 'closeButton': true,\n 'onclick': null,\n 'showDuration': '300',\n 'hideDuration': '1000',\n 'timeOut': '4000',\n 'progressBar': true,\n 'positionClass': 'toast-top-right',\n 'preventDuplicates': true,\n 'newestOnTop': true\n };\n }\n\n function blockUIConfig(blockUIConfig) {\n // Disable automatically blocking of the user interface\n blockUIConfig.autoBlock = false;\n // Change the default delay to 100ms before the blocking is visible \n blockUIConfig.delay = 100;\n // Provide a custom template to use\n blockUIConfig.template = '\\n
\\n
\\n\\n
\\n
\\n
\\n
\\n
\\n \\n
\\n ';\n }\n\n function execptionConfig($provide, apiUrl) {\n $provide.decorator('$exceptionHandler', function ($delegate) {\n return function (exception, cause) {\n $delegate(exception, cause);\n postException(exception, apiUrl);\n };\n });\n }\n\n function translateConfig($translateProvider, apiUrl) {\n\n if (!sessionStorage.getItem('userLang')) {\n\n getDefaultUserLang(apiUrl.tsApi, navigator.systemLanguage).done(function (data) {\n\n var userLang = data;\n sessionStorage.setItem('userLang', _.replace(userLang, '_', '-'));\n sessionStorage.setItem('langCode', getLangCode(userLang));\n\n $translateProvider.useSanitizeValueStrategy('escapeParameters');\n $translateProvider.preferredLanguage(sessionStorage['userLang']);\n $translateProvider.useUrlLoader(apiUrl.tsApi + 'getTranslationResource');\n });\n } else {\n $translateProvider.useSanitizeValueStrategy('escapeParameters');\n $translateProvider.preferredLanguage(sessionStorage['userLang']);\n $translateProvider.useUrlLoader(apiUrl.tsApi + 'getTranslationResource');\n }\n }\n\n function httpConfig($httpProvider) {\n $httpProvider.interceptors.push('httpInterceptor');\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').config(ngRouteConfig);\n\n function ngRouteConfig($routeProvider) {\n $routeProvider.when('/', {\n templateUrl: 'controller/home/home.index.html',\n controller: 'homeController as vm',\n resolve: {\n viewModel: function viewModel(homeService) {\n return homeService.getMhr();\n }\n }\n }).when('/login', {\n controller: 'loginController as vm',\n templateUrl: 'controller/login/login.index.html',\n resolve: {\n viewModel: function viewModel(loginService) {\n return loginService.get();\n }\n }\n }).when('/token:token', {\n controller: 'rootController as vm'\n }).when('/verifyCode/:verifyCode/:email/:sysCode', {\n controller: 'verifyCodeController as vm',\n templateUrl: 'controller/login/login.verifyCode.html'\n }).when('/login/forceEditPwd', {\n controller: 'loginForceEditPwdController as vm',\n templateUrl: 'controller/login/login.forceEditPwd.html'\n }).when('/login/directEditPwd/:userAccount/:verifyCode/:mobilTel?', {\n controller: 'loginDirectEditPwdController as vm',\n templateUrl: 'controller/login/login.directEditPwd.html'\n }).when('/login/forgetPwdDirectEditPwd/:userAccount/:verifyCode', {\n templateUrl: 'controller/login/login.forgetPwdDirectEditPwd.html',\n controller: 'loginForgetPwdDirectEditPwdController as vm'\n }).when('/tsu/', {\n controller: 'tsunHomeController as vm',\n templateUrl: 'controller/tsun/home/home.index.html',\n resolve: {\n viewModel: function viewModel(homeService) {\n return homeService.getTsu();\n }\n }\n }).when('/tsu/course', {\n templateUrl: 'controller/tsun/training/course/course.index.html',\n controller: 'tsunCourseController as vm',\n resolve: {\n // translate: function (translateService) {\n // return translateService.getTranslates()\n // .then(function (data) { return data; });\n // },\n userInfo: function userInfo(loginService, $rootScope) {\n return loginService.getSsoInfo().then(function (data) {\n $rootScope.userInfo = data.data;\n return $rootScope.userInfo;\n });\n },\n urlParam: function urlParam($routeParams) {\n return $routeParams;\n }\n }\n }).when('/tsu/training', {\n templateUrl: 'controller/tsun/training/myTraining/myTraining.index.html',\n controller: 'tsunMyTrainingController as vm',\n resolve: {\n // translate: function (translateService) {\n // return translateService.getTranslates()\n // .then(function (data) { return data; });\n // },\n ssoInfo: function ssoInfo(loginService, $rootScope) {\n return loginService.getSsoInfo().then(function (data) {\n $rootScope.userInfo = data.data;\n return data.data;\n });\n }\n }\n }).when('/tsu/shoppingCart', {\n templateUrl: 'controller/tsun/training/courseCollection/shoppingCart.index.html',\n controller: 'tsunShoppingCartController as vm',\n resolve: {\n // translate: function (translateService) {\n // return translateService.getTranslates()\n // .then(function (data) { return data; });\n // },\n ssoInfo: function ssoInfo(loginService, $rootScope) {\n return loginService.getSsoInfo().then(function (data) {\n $rootScope.userInfo = data.data;\n return data.data;\n });\n }\n }\n }).when('/tsu/recommend2', {\n templateUrl: 'controller/tsun/training/recommend/recommend.index.html',\n controller: 'tsunRecommendController as vm',\n resolve: {\n // translate: function (translateService) {\n // return translateService.getTranslates()\n // .then(function (data) { return data; });\n // },\n activeType: function activeType() {\n return 2;\n }\n }\n }).when('/tsu/recommend3', {\n templateUrl: 'controller/tsun/training/recommend/recommend.index.html',\n controller: 'tsunRecommendController as vm',\n resolve: {\n // translate: function (translateService) {\n // return translateService.getTranslates()\n // .then(function (data) { return data; });\n // },\n activeType: function activeType() {\n return 3;\n }\n }\n }).when('/tsu/recommendHTML', {\n templateUrl: 'controller/tsun/training/recommend/recommend.Doc.html',\n controller: 'tsunRecommendDocController as vm',\n resolve: {}\n }).when('/tsu/visualpage/:pageSerilNo', {\n templateUrl: 'controller/tsun/visualpage/visualpage.index.html',\n controller: 'visualpageController as vm',\n resolve: {\n viewModel: function viewModel(visualPageService, $route) {\n return visualPageService.get($route.current.params.pageSerilNo);\n }\n }\n }).when('/tsu/bulletin/more', {\n templateUrl: 'controller/tsun/bulletin/bulletin.more.html',\n controller: 'tsunBulletinMoreController as vm',\n resolve: {\n viewModel: function viewModel(bulletinService) {\n return bulletinService.getNoticeMore();\n }\n }\n }).when('/tsu/bulletin/noticeDetail/:no?/:isBulletin?', {\n templateUrl: 'controller/tsun/bulletin/bulletin.noticeDetail.html',\n controller: 'tsunBulletinNoticeDetailController as vm',\n resolve: {\n viewModel: function viewModel(bulletinService, $route) {\n return bulletinService.getByNoForTsun($route.current.params.no);\n }\n }\n }).when('/bulletin/more/:isHistory?', {\n templateUrl: 'controller/bulletin/bulletin.more.html',\n controller: 'bulletinMoreController as vm',\n resolve: {\n viewModel: function viewModel(bulletinService, enumService, $route) {\n return bulletinService.getMore(enumService.siteCode.hrOutside, $route.current.params.isHistory);\n }\n }\n }).when('/bulletin/detail/:no', {\n templateUrl: 'controller/bulletin/bulletin.detail.html',\n controller: 'bulletinDetailController as vm',\n resolve: {\n viewModel: function viewModel(bulletinService, $route) {\n return bulletinService.getByNo($route.current.params.no);\n }\n }\n }).when('/header/searchResult/:keyword?/:siteCode?', {\n templateUrl: 'controller/header/header.searchResult.html',\n controller: 'headerSearchResultController as vm',\n resolve: {\n viewModel: function viewModel(headerService, $route) {\n return headerService.getSearchResult($route.current.params.keyword, 1 /*page*/, 1 /*all*/, $route.current.params.siteCode, true /*need Keyword Log*/);\n },\n siteCode: function siteCode($route) {\n return $route.current.params.siteCode;\n }\n }\n }).when('/schedule', {\n templateUrl: 'controller/schedule/schedule.index.html',\n controller: 'scheduleController as vm',\n resolve: {\n viewModel: function viewModel(scheduleService) {\n return scheduleService.getCalendarArea();\n }\n }\n }).when('/nextMenu', {\n templateUrl: 'controller/nextMenu/nextMenu.index.html',\n controller: 'nextMenuController as vm',\n resolve: {\n viewModel: function viewModel(homeService) {\n return homeService.getNext();\n }\n }\n }).when('/nextMenu/detail/:no', {\n templateUrl: 'controller/nextMenu/nextMenu.detail.html',\n controller: 'nextMenuDetailController as vm',\n resolve: {\n viewModel: function viewModel(bulletinService, $route) {\n return bulletinService.getByNo($route.current.params.no);\n }\n }\n }).when('/mobile/trigger/', {\n templateUrl: 'controller/mobile/mobile.trigger.html',\n controller: 'mobileTriggerController as vm'\n }).when('/common/index/', {\n templateUrl: 'controller/common/common.index.html',\n controller: 'commonController as vm'\n }).when('/external', {\n templateUrl: 'controller/external/external.index.html',\n controller: 'externalController as vm'\n }).when('/external/schemaTransfer', {\n templateUrl: 'controller/external/external.schemaTransfer.html',\n controller: 'externalSchemaTransferController as vm'\n }).otherwise({\n redirectTo: '/'\n });\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').run(run);\n\n function run($rootScope, $location, $uibModalStack) {\n\n $rootScope.$on('$routeChangeStart', function (event, current) {\n\n $('#taishinExternal').empty().remove();\n $('#captcha iframe').empty().remove();\n\n // 如果登入後到 login 頁需要轉到預設頁面\n // 是參考 taiHeader.directive 的判斷登入邏輯\n var isLogin = !_.isEmpty(sessionStorage.getItem('perSerilNo')) && !sessionStorage.getItem('isForce');\n var currentPage = current.originalPath;\n if (currentPage === '/login' && isLogin) {\n $location.path('/').search({});\n }\n });\n\n $rootScope.$on('$routeChangeSuccess', function (event, current) {\n\n // When the user clicks on the button, scroll to the top of the document\n document.body.scrollTop = 0; // For Chrome, Safari and Opera \n document.documentElement.scrollTop = 0; // For IE and Firefox\n\n\n $(\".ui-blackCover\").css(\"display\", \"none\");\n\n // 移除目前所有 modal 視窗 (避免殘存) \n $uibModalStack.dismissAll();\n\n // 解決表單有時在IE無法輸入問題\n fixIeNotAbleToInput();\n\n var isForce = sessionStorage.getItem('isForce');\n var currentPage = current.originalPath;\n //var prevPage = prev ? prev.originalPath : null;\n $rootScope.cName = sessionStorage.getItem('cName');\n\n if (isForce) {\n $location.path('/login/forceEditPwd');\n } else {\n if (currentPage === '/login/forceEditPwd' && !isForce) {\n $location.path('/login');\n }\n }\n\n if (currentPage === '/' && !sessionStorage.getItem('token')) {\n $location.path('/login').search({});\n }\n });\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').constant('isTestMode', false).constant('iAmNotRobot', true).constant('apiUrl', {\n tsApi: '//hr.taishinholdings.com.tw/api/',\n ssoApi: '//hr.taishinholdings.com.tw/sso/api/',\n ctmsApi: '//hr.taishinholdings.com.tw/ap/ctms/',\n pafUrl: '//hr.taishinholdings.com.tw/hrapp/TSDG_PDF_Web/?pdf='\n });\n})();\n'use strict';\n\nvar DEVICE_TYPE = null; //手機裝置才會給予內容值\nvar DEVICE_TOKEN = null; //手機裝置才會給予內容值\nvar DEVICE_ID = null; //手機裝置才會給予內容值\nvar USER_ID = null; //手機裝置才會給予內容值\n//2023-07-10 Johnson 資安2023\nvar PWD = eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n}('0;', 2, 1, 'null'.split('|'), 0, {})); //手機裝置才會給予內容值\nvar APP_VERSION = -1; //\nvar IOS_VERSION = null;\n\nfunction setSsoInfo(data) {\n sessionStorage.setItem('token', data.Token);\n sessionStorage.setItem('cName', data.CName);\n sessionStorage.setItem('perSerilNo', data.PerSerilNo || data.PerserilNo);\n}\n\nfunction removeSsoInfo() {\n sessionStorage.removeItem('token');\n sessionStorage.removeItem('perSerilNo');\n sessionStorage.removeItem('cName');\n sessionStorage.removeItem('isForce');\n}\n\nvar errorMsgs = [];\n\n// 判斷相同錯誤是否已經提報伺服端\n// 避免無窮迴圈的錯誤不斷發送攻擊\nfunction isAlreadyReport(mewMsg) {\n if (errorMsgs.length > 0) {\n for (var index = 0; index < errorMsgs.length; index++) {\n var msg = errorMsgs[index];\n if (msg == mewMsg) {\n return true;\n }\n }\n }\n return false;\n}\n\n//filter the exception that no use\nvar isNoUseErrors = ['$digest already in progress'];\n\nfunction isNoUseError(msg) {\n var result = false;\n for (var i = 0; i <= isNoUseErrors.length - 1; i++) {\n if (msg.indexOf(isNoUseErrors[i]) > -1) {\n result = true;\n break;\n }\n }\n return result;\n}\n\nfunction postException(exception, apiUrl) {\n var param = {\n exception: exception,\n route: location.href,\n perSerilNo: sessionStorage.getItem('perSerilNo')\n };\n\n // 發送到後端記錄錯誤LOG (重複的LOG就不要再直直送了)\n if (isAlreadyReport(param.exception) == false && !isNoUseError(param.exception)) {\n errorMsgs.push(param.exception);\n\n console.log(\"call postException\");\n //console.log(data);\n\n // 20181002 停止使用前端 Log 機制,因為無意義的錯誤紀錄會造成誤解,此外也無法透過此機制得到任何除錯幫助\n // $.post(apiUrl.tsApi + 'log/PostFront', param).then(function(data) {\n // //console.log(\"call postException [\"+apiUrl.tsApi + 'log/PostFront'+\"],result:\", data);\n // });\n }\n}\n\nfunction queryString(name) {\n // console.log(\"queryString\");\n // console.log(\"location.href\",location.href);\n //2023-07-10 Johnson 資安2023\n var AllVars = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('3.4.5(\\'?\\')[1].0(//2,\\'&7\\').0(/\"/2,\\'&8\\').0(/\\'/2,\\' \\').0(/[<>!]|(\\\\(\\\\))|((a|b|c)\\\\d*\\\\(.*\\\\))/2,\\'\\')', 14, 14, 'replace||g|location|href|split|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}));\n var Vars = AllVars.split('&');\n for (var i = 0; i < Vars.length; i++) {\n var Var = Vars[i].split(\"=\");\n if (Var[0] == name) {\n return Var[1];\n }\n }\n return \"\";\n}\n\nfunction getMenuQueryString() {\n if (location.href.split('menu=').length > 1) {\n return location.href.split('menu=')[1];\n }\n return undefined;\n}\n\nfunction showSystemError() {\n var errorMessage;\n switch (sessionStorage['userLang']) {\n case 'zh-TW':\n errorMessage = '很抱歉!此頁面發生了一些錯誤,系統已自動通知網站管理員,將儘速為您處理,請您稍後再使用本功能。';\n break;\n case 'zh-CN':\n errorMessage = '很抱歉!此页面发生了一些错误,系统已自动通知网站管理员,将尽速为您处理,请您稍后再使用本功能。 ';\n break;\n case 'en-US':\n errorMessage = 'very sorry! Some errors occurred on this page, the system automatically notify your webmaster will process as soon as possible for you, please try again later with this function. ';\n break;\n }\n\n toastr.error(errorMessage);\n}\n// function getDefaultLangCode() {\n// var langSerilNo = 1;\n// var userLang = navigator.language || navigator.userLanguage;\n// sessionStorage.setItem('userLang', userLang);\n// userLang = _.replace(userLang, '_', '-');\n// switch (userLang.toLowerCase()) {\n// case 'zh-cn':\n// langSerilNo = 2;\n// break;\n// case 'en-us':\n// langSerilNo = 3;\n// break;\n// case 'zh-tw':\n// langSerilNo = 1;\n// break;\n// }\n// sessionStorage.setItem('langCode', langSerilNo);\n// return langSerilNo;\n// }\n\nfunction getLangCode(userLang) {\n\n var langSerilNo = 1;\n sessionStorage.setItem('userLang', userLang);\n userLang = _.replace(userLang, '_', '-');\n switch (userLang.toLowerCase()) {\n case 'zh-cn':\n langSerilNo = 2;\n break;\n case 'en-us':\n langSerilNo = 3;\n break;\n case 'zh-tw':\n langSerilNo = 1;\n break;\n }\n sessionStorage.setItem('langCode', langSerilNo);\n return langSerilNo;\n}\n\nfunction getDefaultUserLang(tsApiUrl, ieSystemLang) {\n return jQuery.ajax({\n type: \"GET\",\n url: tsApiUrl + 'header/acceptSupportedLanguage?ieSystemLang=' + ieSystemLang,\n async: false\n });\n}\n\nfunction intConvertTime(intTimeSpan) {\n var sec_num;\n try {\n sec_num = parseInt(intTimeSpan, 10); // don't forget the second param\n } catch (exp) {\n sec_num = 0;\n }\n var hours = Math.floor(sec_num / 3600);\n var minutes = Math.floor((sec_num - hours * 3600) / 60);\n var seconds = sec_num - hours * 3600 - minutes * 60;\n\n if (hours < 10) {\n hours = \"0\" + hours;\n }\n if (minutes < 10) {\n minutes = \"0\" + minutes;\n }\n if (seconds < 10) {\n seconds = \"0\" + seconds;\n }\n return hours + ':' + minutes + ':' + seconds;\n}\n\nfunction appCallback(method, params) {\n var Base64 = {\n _keyStr: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n encode: function encode(e) {\n var t = \"\";\n var n, r, i, s, o, u, a;\n var f = 0;\n e = Base64._utf8_encode(e);\n while (f < e.length) {\n n = e.charCodeAt(f++);\n r = e.charCodeAt(f++);\n i = e.charCodeAt(f++);\n s = n >> 2;\n o = (n & 3) << 4 | r >> 4;\n u = (r & 15) << 2 | i >> 6;\n a = i & 63;\n if (isNaN(r)) {\n u = a = 64;\n } else if (isNaN(i)) {\n a = 64;\n }\n t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a);\n }\n return t;\n },\n decode: function decode(e) {\n var t = \"\";\n var n, r, i;\n var s, o, u, a;\n var f = 0;\n e = e.replace(/[^A-Za-z0-9+/=]/g, \"\");\n while (f < e.length) {\n s = this._keyStr.indexOf(e.charAt(f++));\n o = this._keyStr.indexOf(e.charAt(f++));\n u = this._keyStr.indexOf(e.charAt(f++));\n a = this._keyStr.indexOf(e.charAt(f++));\n n = s << 2 | o >> 4;\n r = (o & 15) << 4 | u >> 2;\n i = (u & 3) << 6 | a;\n t = t + String.fromCharCode(n);\n if (u != 64) {\n t = t + String.fromCharCode(r);\n }\n if (a != 64) {\n t = t + String.fromCharCode(i);\n }\n }\n t = Base64._utf8_decode(t);\n return t;\n },\n _utf8_encode: function _utf8_encode(e) {\n e = e.replace(/rn/g, \"n\");\n var t = \"\";\n for (var n = 0; n < e.length; n++) {\n var r = e.charCodeAt(n);\n if (r < 128) {\n t += String.fromCharCode(r);\n } else if (r > 127 && r < 2048) {\n t += String.fromCharCode(r >> 6 | 192);\n t += String.fromCharCode(r & 63 | 128);\n } else {\n t += String.fromCharCode(r >> 12 | 224);\n t += String.fromCharCode(r >> 6 & 63 | 128);\n t += String.fromCharCode(r & 63 | 128);\n }\n }\n return t;\n },\n _utf8_decode: function _utf8_decode(e) {\n var t = \"\";\n var n = 0;\n var r = c1 = c2 = 0;\n while (n < e.length) {\n r = e.charCodeAt(n);\n if (r < 128) {\n t += String.fromCharCode(r);\n n++;\n } else if (r > 191 && r < 224) {\n c2 = e.charCodeAt(n + 1);\n t += String.fromCharCode((r & 31) << 6 | c2 & 63);\n n += 2;\n } else {\n c2 = e.charCodeAt(n + 1);\n c3 = e.charCodeAt(n + 2);\n t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\n n += 3;\n }\n }\n return t;\n }\n };\n var encParams = Base64.encode(JSON.stringify(params));\n if (method.match('CloseWebView')) {\n method = 'CloseWebView';\n };\n var tmpFrame = document.createElement(\"frame\");\n document.documentElement.appendChild(tmpFrame);\n tmpFrame.src = \"app://[method]?p=[params]\".replace(\"[method]\", method).replace(\"[params]\", encParams);\n setTimeout(function () {\n document.documentElement.removeChild(tmpFrame);\n }, 0);\n}\n\nfunction p(jstr) {\n try {\n return JSON.parse(jstr);\n } catch (e) {\n return {};\n };\n}\n\nfunction fixIeNotAbleToInput() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n\n setTimeout(function () {\n $(selector + ' input').each(function () {\n // $(this).attr(\"placeholder\", window.location);\n // $(this).css({ \"background-color\": \"blue\" });\n $(this).focus(function () {\n $(this).select();\n });\n });\n\n $(selector + ' textarea').each(function () {\n // $(this).attr(\"placeholder\", window.location);\n // $(this).css({ \"background-color\": \"blue\" });\n $(this).focus(function () {\n $(this).select();\n });\n });\n }, 500);\n}\n\nfunction infoDebug(msg) {\n var param = {\n Command: msg\n };\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(param));\n}\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('rootCtrl', rootCtrl);\n\n function rootCtrl($q, $location, $rootScope, $timeout, modalService, loginService, headerService, sysCode, translateService, $window, $scope, trainingInnerService, mobileService) {\n var vm = this;\n vm.view = {\n loaded: false //檢查是否將必要資源讀取完畢\n };\n vm.getBodyClass = getBodyClass;\n vm.appVersion = null;\n vm.appCurrentVersion = null;\n vm.getDeviceInfo = getDeviceInfo;\n vm.updateConfirmWording = null;\n vm.conAppVer = null;\n vm.conCurVer = null;\n\n var mobile = {\n Android: function Android() {\n return navigator.userAgent.match(/Android/i);\n },\n BlackBerry: function BlackBerry() {\n return navigator.userAgent.match(/BlackBerry/i);\n },\n iOS: function iOS() {\n return navigator.userAgent.match(/iPhone|iPad|iPod/i);\n },\n Opera: function Opera() {\n return navigator.userAgent.match(/Opera Mini/i);\n },\n Windows: function Windows() {\n return navigator.userAgent.match(/IEMobile/i);\n },\n any: function any() {\n return mobile.Android() || mobile.BlackBerry() || mobile.iOS() || mobile.Opera() || mobile.Windows();\n }\n };\n\n onInit();\n eventBus();\n\n function onInit() {\n var promiseList = [loadTranslate(), loadSsoInfo()];\n $q.all(promiseList).then(function () {\n vm.view.loaded = true;\n });\n\n //只在首頁判斷版本\n if (mobile.iOS() && window.webkit) {\n //if (true) {\n getDeviceInfo();\n //console.log('appVer:',APP_VERSION);\n //console.log('AppUpdateRemind:',sessionStorage.getItem('AppUpdateRemind'));\n if (!sessionStorage.getItem('AppUpdateRemind')) {\n sessionStorage.setItem('AppUpdateRemind', 'N');\n }\n console.log('AppUpdateRemind:', sessionStorage.getItem('AppUpdateRemind'));\n if (sessionStorage.getItem('AppUpdateRemind') && sessionStorage.getItem('AppUpdateRemind') === 'N') {\n //getDeviceInfo那邊設定3秒call 6 次,這邊改為5秒後再執行版本確認\n setTimeout(function () {\n checkAppVersion();\n }, 5000);\n }\n }\n\n // 外網沒有這個需求 所以不用處理跨系統轉 token 這類事情\n // 也可以避免分享網址時 就在別人家的瀏覽器自動登入了\n // checkTokenFromOtherDomain();\n\n try {\n self.moveTo(0, 0);\n self.resizeTo(screen.availWidth, screen.availHeight);\n } catch (e) {\n // 不是重要的功能(失效也不會影響網站功能)\n // 在IE有時候不知道為什麼會造成錯誤,讓畫面無法繼續進行\n // 所以針對此問題先隱蔽\n }\n\n setUrl();\n setFontSize();\n $rootScope.styleUrl = '/css/edit.css';\n $rootScope.isTest = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';\n checkSmallView();\n }\n\n function loadTranslate() {\n return translateService.getTranslates().then(function (data) {\n //console.log(data.iosAppUpdateConfirm);\n vm.updateConfirmWording = data.iosAppUpdateConfirm;\n $rootScope.translate = data;\n return true;\n });\n }\n\n function loadSsoInfo() {}\n\n function checkSmallView() {\n if ($window.innerWidth < 470) {\n $rootScope.isSmallView = true;\n } else {\n $rootScope.isSmallView = false;\n }\n }\n\n function checkTokenFromOtherDomain() {\n //undone 跨token的部份\n var originUrl = location.href.split('?tkn=')[0];\n var urlSearch = location.href.split('?tkn=')[1];\n if (urlSearch) {\n var getToken = queryString('tkn');\n var getMenu = queryString('menu');\n var isMobile = queryString('isMobile');\n if (isMobile) {\n // sessionStorage.setItem('isMobile', true);\n }\n if (getToken) {\n // removeSsoInfo();\n getToken = getToken === undefined ? sessionStorage.getItem('token') : getToken;\n sessionStorage.setItem('token', getToken);\n var params = {\n token: getToken,\n sysCode: sysCode\n };\n loginService.checkToken(params).then(function (data) {\n removeSsoInfo();\n if (data.data) {\n data.data.Token = getToken;\n setSsoInfo(data.data);\n translateService.getLanguage().then(function (languageItems) {\n var defaultLangItem = _.find(languageItems.data, {\n selected: true\n });\n translateService.change(defaultLangItem).then(function () {\n if (getMenu) {\n $window.location.href = originUrl + '?menu=' + getMenu;\n } else {\n $window.location.href = originUrl;\n }\n });\n });\n }\n });\n }\n } else {\n if (location.href.indexOf('&isMobile=') > -1) {\n originUrl = location.href.split('?menu=')[0];\n // sessionStorage.setItem('isMobile', queryString('isMobile'));\n //2023-07-10 Johnson 資安2023\n location.href = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('3+\\'?2=\\'+4(\\'2\\').0(//1,\\'&6\\').0(/\"/1,\\'&7\\').0(/\\'/1,\\'\\').0(/[<>!]|(\\\\(\\\\))|((9|a|b)\\\\c*\\\\(.*\\\\))/1,\\'\\')', 13, 13, 'replace|g|menu|originUrl|queryString|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}));\n }\n translateService.getLanguage().then(function (languageItems) {\n var defaultLangItem = _.find(languageItems.data, {\n selected: true\n });\n translateService.change(defaultLangItem);\n });\n }\n }\n\n function setUrl() {\n var checkList = {\n ctmsFileUrl: sessionStorage.getItem('ctmsFileUrl'),\n mhrFileUrl: sessionStorage.getItem('mhrFileUrl'),\n VcUrl: sessionStorage.getItem('VcUrl')\n };\n headerService.getUrlSetting().then(function (data) {\n _.forEach(checkList, function (checkItem, key) {\n switch (key) {\n case 'ctmsFileUrl':\n sessionStorage.setItem('ctmsFileUrl', data.data.ctmsFileUrl);\n break;\n case 'mhrFileUrl':\n sessionStorage.setItem('mhrFileUrl', data.data.mhrFileUrl);\n break;\n case 'VcUrl':\n if (data.data.vcUrl.indexOf(location.protocol) == -1) {\n if (location.protocol == \"https:\") sessionStorage.setItem('VcUrl', data.data.vcUrl.replace(\"http:\", location.protocol));else sessionStorage.setItem('VcUrl', data.data.vcUrl.replace(\"https:\", location.protocol));\n } else sessionStorage.setItem('VcUrl', data.data.vcUrl);\n\n break;\n default:\n checkItem = 'empty';\n break;\n }\n });\n });\n console.log(sessionStorage.getItem('VcUrl'));\n }\n\n function setFontSizeProcess(fontsize) {\n switch (fontsize) {\n case 14:\n vm.fontSizeClass = 'small';\n break;\n case 16:\n vm.fontSizeClass = 'medium';\n break;\n case 18:\n vm.fontSizeClass = 'big';\n break;\n default:\n //use recursive to process default;\n if (fontsize < 14) {\n setFontSizeProcess(14);\n } else if (fontsize > 14) {\n setFontSizeProcess(18);\n } else {\n setFontSizeProcess(14);\n }\n break;\n }\n }\n\n function setFontSize() {\n $rootScope.$watch('fontSize', function (newValue) {\n if (newValue) {\n if (_.isString(newValue)) {\n newValue = newValue.replace('px', '');\n }\n newValue = parseInt(newValue);\n if (!newValue) {\n newValue = 14;\n }\n setFontSizeProcess(newValue);\n getBodyClass();\n }\n });\n }\n\n function getBodyClass() {\n return {\n small: vm.fontSizeClass === 'small',\n medium: vm.fontSizeClass === 'medium',\n big: vm.fontSizeClass === 'big',\n cn: parseInt(sessionStorage.getItem('langCode')) === 2\n };\n }\n\n function eventBus() {\n $rootScope.$on('emitCName', function (e, value) {\n $rootScope.$broadcast('updateCName', value);\n });\n $(window).resize(function () {\n if ($scope.$$phase || $rootScope.$$phase) {\n return;\n }\n $rootScope.$apply(function () {\n checkSmallView();\n });\n });\n }\n\n function checkAppVersion() {\n console.log('checkAppVersion');\n //從DB撈取APP現行版本\n //APP_VERSION = '0.0.0.9';\n trainingInnerService.getConfigSetting().then(function (configData) {\n vm.appCurrentVersion = configData.data.appCurrentVersion;\n if (vm.appCurrentVersion && APP_VERSION !== null) {\n console.log('APP_VERSION:', APP_VERSION);\n var currentVer = parseInt(vm.appCurrentVersion.replace(/\\./g, ''));\n //var appVer = APP_VERSION ? parseInt(APP_VERSION.replace(/\\./g, '')) : -1;\n\n // 因與iosApp互動時,有可能無法抓到版本,目前改為iosAppVer的預設值為-1\n // 如是舊版APP,版本就會是-1\n // 如是新版APP,版本就會有寫入\n // 唯一例外只有版本號不見時,但不確定會不會被改為Null,待測\n var appVer = null;\n if (Object.is(APP_VERSION, -1)) {\n appVer = -1;\n } else {\n appVer = parseInt(APP_VERSION.replace(/\\./g, ''));\n }\n\n vm.conAppVer = appVer;\n vm.conCurVer = currentVer;\n\n if (appVer === currentVer) {\n //vm.appVersion = APP_VERSION;\n } else if (appVer > currentVer) {\n alert('You are using iTaishin beta version.');\n } else {}\n // $timeout(function() {\n // var confirmDialog = modalService.confrimDialog({\n // confirmContent: (vm.updateConfirmWording),\n // });\n // confirmDialog.result.then(function(result) {\n // result = !!result;\n // if (result !== true) {\n // return;\n // }\n // location.href = 'itms-services://?action=download-manifest&url=https://hr.taishinholdings.com.tw/hr-app-download/appfiles/manifest.plist';\n // });\n // }, 1000);\n\n //辨識用的flag,讓confirm只出現一次\n sessionStorage.setItem('AppUpdateRemind', 'Y');\n }\n });\n }\n\n function getDeviceInfo() {\n var param = {\n Command: 'getDeviceInfo'\n };\n ///vm.appVersion = APP_VERSION;\n\n //每500毫秒就叫一次ios傳值給我\n for (var i = 0; i < 6; i++) {\n var temp = i;\n setTimeout(function () {\n //console.log(i);\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(param));\n }, 500 * (i + 1));\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('a', a);\n\n function a(commonService) {\n return {\n restrict: 'E',\n link: function link(scope, elem, attrs) {\n if (attrs.ngClick || attrs.href === '' || attrs.href === '#') {\n elem.on('click', function (e) {\n e.preventDefault();\n });\n } else {\n elem.on('click', function () {\n if (elem.attr('href') !== undefined) {\n commonService.saveLogFlow(elem.attr('href'));\n }\n });\n }\n }\n };\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('compile', ['$compile', function ($compile) {\n return function (scope, element, attrs) {\n scope.$watch(function (scope) {\n return scope.$eval(attrs.compile);\n }, function (value) {\n element.html(value);\n $compile(element.contents())(scope);\n });\n };\n }]).controller('MyCtrl', function ($scope) {\n var str = 'hello http://www.cnn.com';\n var urlRegEx = /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)((?:\\/[\\+~%\\/\\.\\w\\-]*)?\\??(?:[\\-\\+=&;%@\\.\\w]*)#?(?:[\\.\\!\\/\\\\\\w]*))?)/g;\n result = str.replace(urlRegEx, \"$1\");\n $scope.GotoLink = function () {\n alert();\n };\n $scope.name = result;\n });\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('focus', focus);\n\n function focus() {\n var directive = {\n link: link,\n restrict: 'A'\n };\n return directive;\n\n function link(scope, element) {\n element.focus();\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('repeatEnd', repeatEnd);\n function repeatEnd() {\n // Usage:\n // EventCaller When ng-repeat Over\n // Creates:\n // Rhino,2017.01.04\n var directive = {\n restrict: \"A\",\n link: link\n };\n return directive;\n\n function link(scope, element, attrs) {\n if (scope.$last) {\n scope.$eval(attrs.repeatEnd);\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiBulletin', taiBulletin);\n\n function taiBulletin() {\n // Usage:\n //\n // Creates:\n //\n var directive = {\n bindToController: true,\n controller: ControllerController,\n controllerAs: 'vm',\n link: link,\n templateUrl: 'directive/taiBulletin.html',\n restrict: 'E',\n scope: {\n data: '=',\n type: '@'\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(modalService, bulletinService, $routeParams, $rootScope, enumService, $timeout, $location) {\n var vm = this;\n var bulletinGetByPaggerDto = {\n menuSerilNo: '',\n bulletinTypeSerilNo: '',\n PaggerChoice: 1,\n noticePage: 1\n };\n vm.isMobile = modalService.isMobile();\n vm.selectFirstMenu = selectFirstMenu;\n vm.selectBulletinType = selectBulletinType;\n vm.clickDefaultType = clickDefaultType;\n vm.getMoreList = getMoreList;\n vm.getNoticeMoreList = getNoticeMoreList;\n vm.redirectToDetail = redirectToDetail;\n\n vm.view = {\n typeNo: 0\n };\n\n onInit();\n\n function onInit() {\n //console.log('bull:',vm.data.notices.bulletins.length);\n $timeout(function () {\n vm.bulletin = $rootScope.translate.bulletin;\n vm.noticeCenter = $rootScope.translate.noticeCenter;\n }, $rootScope.translate);\n if (sessionStorage.getItem(\"perSerilNo\")) {\n vm.isLogin = true;\n } else {\n vm.isLogin = false;\n }\n getHistoryBind();\n }\n\n function getHistoryBind() {\n if ($routeParams.isHistory) {\n var cache = JSON.parse(sessionStorage.getItem('bulletinCache'));\n if (cache) {\n if (cache.menuItem) {\n vm.data.menuItem = cache.menuItem;\n bulletinGetByPaggerDto.menuSerilNo = cache.menuItem.menuSerilNo;\n }\n if (cache.typeSerilNo) {\n vm.view.typeNo = cache.typeSerilNo;\n bulletinGetByPaggerDto.bulletinTypeSerilNo = cache.typeSerilNo;\n }\n }\n }\n }\n\n function selectBulletinType(item) {\n bulletinGetByPaggerDto.PaggerChoice = 1;\n vm.view.typeNo = item.bulletinTypeSerilNo;\n bulletinGetByPaggerDto.bulletinTypeSerilNo = item.bulletinTypeSerilNo;\n getBulletinDetail(bulletinGetByPaggerDto, 'bulletinType');\n }\n\n function selectFirstMenu() {\n bulletinGetByPaggerDto.PaggerChoice = 1;\n if (vm.data.menuItem) {\n bulletinGetByPaggerDto.menuSerilNo = vm.data.menuItem.menuSerilNo;\n } else {\n if ($routeParams.menuSerilNo) {\n bulletinGetByPaggerDto.menuSerilNo = $routeParams.menuSerilNo;\n } else {\n bulletinGetByPaggerDto.menuSerilNo = null;\n }\n }\n getBulletinDetail(bulletinGetByPaggerDto, 'firstMenu');\n }\n\n function getMoreList() {\n bulletinGetByPaggerDto.PaggerChoice++;\n getBulletinDetail(bulletinGetByPaggerDto, null);\n }\n\n function getNoticeMoreList() {\n bulletinGetByPaggerDto.noticePage++;\n //2為通知中心的意思\n bulletinGetByPaggerDto.dataType = 2;\n setSiteCode(bulletinGetByPaggerDto);\n bulletinService.getTsunMoreList(bulletinGetByPaggerDto).then(function (data) {\n vm.data.notices.bulletins = _.concat(vm.data.notices.bulletins, data.data.notices.bulletins);\n vm.data.hasNoticeMore = data.data.hasNoticeMore;\n });\n }\n\n function setSiteCode(bulletinParam) {\n switch (vm.type) {\n case 'bulletin':\n bulletinParam.siteCode = enumService.siteCode.hrOutside;\n break;\n case 'notice':\n bulletinParam.siteCode = enumService.siteCode.tsunOut;\n break;\n }\n }\n\n function getBulletinDetail(bulletinParam, choiceType) {\n // 1是公佈欄的意思\n bulletinParam.dataType = 1;\n switch (choiceType) {\n case 'bulletinType':\n bulletinParam.isChoiceBulletinType = true;\n break;\n case 'firstMenu':\n bulletinParam.isChoiceMenu = true;\n break;\n }\n setSiteCode(bulletinParam);\n bulletinService.getMoreByChoice(bulletinParam).then(function (data) {\n reBindView(choiceType, bulletinParam, data);\n });\n }\n\n function reBindView(choiceType, bulletinParam, data) {\n switch (choiceType) {\n case 'bulletinType':\n vm.data.menuFirstDtos = data.data.menuFirstDtos;\n vm.data.bulletinWithCountDto.bulletins = data.data.bulletinWithCountDto.bulletins;\n break;\n case 'firstMenu':\n vm.data.bulletinSearchViews = data.data.bulletinSearchViews;\n vm.data.bulletinWithCountDto.bulletins = data.data.bulletinWithCountDto.bulletins;\n break;\n default:\n vm.data.bulletinWithCountDto.bulletins = _.concat(vm.data.bulletinWithCountDto.bulletins, data.data.bulletinWithCountDto.bulletins);\n break;\n }\n vm.data.hasMore = data.data.hasMore;\n bulletinParam.isChoiceBulletinType = false;\n bulletinParam.isChoiceMenu = false;\n return bulletinParam;\n }\n\n function clickDefaultType() {\n bulletinGetByPaggerDto.PaggerChoice = 1;\n vm.view.typeNo = 0;\n bulletinGetByPaggerDto.bulletinTypeSerilNo = 0;\n getBulletinDetail(bulletinGetByPaggerDto, 'bulletinType');\n }\n\n function redirectToDetail(item) {\n var param = {\n typeSerilNo: bulletinGetByPaggerDto.bulletinTypeSerilNo,\n menuItem: vm.data.menuItem\n };\n\n $location.path('/bulletin/detail/' + item.bulletinSerilNo).search('menu', 2);\n\n sessionStorage.setItem('bulletinCache', JSON.stringify(param));\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiBulletinDetail', taiBulletinDetail);\n\n function taiBulletinDetail() {\n // Usage:\n //\n // Creates:\n //\n var directive = {\n bindToController: true,\n controller: ControllerController,\n controllerAs: 'vm',\n link: link,\n templateUrl: 'directive/taiBulletinDetail.html',\n restrict: 'E',\n scope: {\n data: '=',\n title: '=',\n type: '@'\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(apiUrl, sysCode, commonService, headerService, $routeParams, bulletinService, $http, $scope) {\n var vm = this;\n vm.download = download;\n vm.getBackUrl = getBackUrl;\n\n // 1.8.2 父層參數 data 無法直接從 scope 引入\n // 故利用 $scope.$parent.vm 的屬性\n vm.data = $scope.$parent.vm.data;\n\n onInit();\n\n function onInit() {\n if (vm.data.attachmentSerilNo > 0) {\n vm.url = bulletinService.getStampFile(vm.data.attachmentSerilNo);\n // vm.url = apiUrl.pafUrl+vm.url\n var a = document.createElement('a');\n var el = document.body.appendChild(a);\n el.setAttribute('style', 'display: none');\n el.href = vm.url;\n el.click();\n }\n }\n\n function download(item) {\n\n // 先註解 看看在APP中是不是就不會發生錯誤\n\n //20180803 re-open by Anthony\n //台新反映外網下載附件沒有紀錄\n var params = {\n bulletinSerilNo: item.bulletinSerilNo,\n attachmentSerilNo: item.attachmentSerilNo\n };\n commonService.setParams(params);\n headerService.saveBulletinClickingAttachment(params);\n\n if (commonService.getFileType(item.attachmentUrl) !== 'pdf') {\n bulletinService.checkHeadStatus(item.attachmentUrl).then(function () {\n location.href = item.attachmentUrl;\n });\n } else {\n bulletinService.checkHeadStatus(item.attachmentUrl).then(function () {\n\n //location.href = bulletinService.getStampFile(item.attachmentSerilNo);\n //2023-07-20 Johnson 資安2023\n eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$8({9:\\'a\\',b:c.d(2.e),f:\\'g\\'}).h(3 i(0){j 1=0.1();4 5=1[\\'k-6\\'];4 7=l m([0.n],{6:5});o(7,2.p)},3 q(0){});', 27, 27, 'response|headers|item|function|var|contentType|type|blob|http|method|GET|url|bulletinService|getStampFile|attachmentSerilNo|responseType|arraybuffer|then|success|let|content|new|Blob|data|saveAs|attachmentName|reject'.split('|'), 0, {}));\n });\n }\n }\n\n function getBackUrl() {\n switch (vm.type) {\n case 'bulletin':\n return '#/bulletin/more/1?menu=32';\n case 'notice':\n if ($routeParams.isBulletin) {\n return '#/bulletin/more/1?menu=32';\n }\n return '#/tsu/bulletin/more?menu=43';\n default:\n return '#/nextMenu?menu=' + getMenuQueryString();\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiEnter', taiEnter);\n\n function taiEnter() {\n return function (scope, element, attrs) {\n element.bind(\"keydown keypress\", function (event) {\n if (event.which === 13) {\n scope.$apply(function () {\n scope.$eval(attrs.taiEnter);\n });\n\n event.preventDefault();\n }\n });\n };\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiHeader', taiHeader);\n\n function taiHeader() {\n // Usage:\n //\n // Creates:\n //\n var directive = {\n bindToController: true,\n controller: ControllerController,\n controllerAs: 'vm',\n link: link,\n templateUrl: 'directive/taiHeader.directive.html',\n restrict: 'E',\n scope: {\n showCtms: '@',\n site: '@'\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(translateService, $route, modalService, $location, sysCode, loginService, headerService, $rootScope, menuService, $filter, trainingInnerService) {\n var vm = this;\n vm.login = login;\n vm.logout = logout;\n vm.redirecter = redirecter;\n vm.choiceLanguage = choiceLanguage;\n vm.touchWithMe = touchWithMe;\n vm.openSetting = openSetting;\n vm.searchClick = searchClick;\n vm.doSearch = doSearch;\n vm.searchChange = searchChange;\n vm.transferurl = transferurl;\n vm.getMenuList = getMenuList;\n vm.getfirstMenuList = getfirstMenuList;\n vm.getsecMenuList = getsecMenuList;\n vm.getthirdMenuList = getthirdMenuList;\n vm.navmenuClick = navmenuClick;\n vm.rootClick = rootClick;\n vm.secmenuOpen = secmenuOpen;\n vm.switchClose = switchClose;\n vm.thirdmenuOpen = thirdmenuOpen;\n vm.languageOpen = languageOpen;\n vm.appVersion = null;\n\n vm.view = {\n isLogin: !_.isEmpty(sessionStorage.getItem('perSerilNo')) && !sessionStorage.getItem('isForce'),\n showSearchList: true,\n showFastList: true,\n isMobile: sessionStorage.getItem('isMobile')\n };\n\n onInit();\n\n function onInit() {\n\n $('.search-modal-sm').on('show.bs.modal', function () {\n vm.searchClick();\n });\n\n $('.search-modal-sm').on('hide.bs.modal', function () {\n\n var $content = $(\"#navmenu-content\");\n if ($content.css('right') !== '0px') {\n $('section.nav').css(\"position\", \"static\");\n } else {\n $('section.nav').css(\"position\", \"fixed\");\n }\n });\n\n vm.data = {};\n $rootScope.$on('updateCName', function (e, value) {\n vm.cName = value;\n });\n vm.cName = sessionStorage.getItem('cName');\n\n translateService.getLanguage().then(function (data) {\n vm.languageItems = data.data;\n return vm.languageItems;\n }).then(function (data) {\n vm.defaultLanguage = translateService.getDefault(data);\n $(\"body\").addClass(vm.defaultLanguage.langCode);\n //console.log(vm.defaultLanguage);\n\n //console.log('taiHeader_Init-menuItemPath:' + sessionStorage.getItem('menuItemPath'));\n //撈取選單資料\n vm.getMenuList();\n });\n\n headerService.getFontSize().then(function (data) {\n vm.fontSizes = data.data;\n $rootScope.fontSize = _.filter(vm.fontSizes.fontSizes, {\n isSelected: true\n })[0].sizeCode + 'px';\n });\n\n vm.last = { index: 0, $: null };\n\n switchSearchList('');\n }\n\n function getMenuList() {\n headerService.getMenuList().then(function (data) {\n vm.data.menuAllList = data.data;\n vm.data.menuAllList.forEach(function (allmenu) {\n if (sessionStorage.getItem('menuSerilNo') === null || sessionStorage.getItem('menuSerilNo') === '') {\n sessionStorage.setItem('menuSerilNo', getMenuQueryString());\n }\n\n //console.log('taiHeader_Init-menuSerilNo:' + sessionStorage.getItem('menuSerilNo'));\n if (allmenu.menuSerilNo === parseInt(sessionStorage.getItem('menuSerilNo')) && !allmenu.hasChild) {\n allmenu.menuItemStyle = { 'background-color': '#da2128', 'color': '#fff' };\n } else {\n allmenu.menuItemStyle = '';\n }\n });\n\n sessionStorage.setItem('menuAllList', JSON.stringify(vm.data.menuAllList));\n vm.getfirstMenuList();\n });\n }\n\n function getfirstMenuList() {\n var menuLists = $filter('filter')(vm.data.menuAllList, {\n parentId: 0,\n level: 1\n });\n\n vm.firstmenuList = menuLists;\n return vm.firstmenuList;\n }\n\n function getsecMenuList(menuSerilNo) {\n var menuLists = $filter('filter')(vm.data.menuAllList, {\n parentId: menuSerilNo,\n parentIdLen: String(menuSerilNo).length,\n level: 2\n });\n\n vm.secmenuList = menuLists;\n return vm.secmenuList;\n }\n\n function getthirdMenuList(menuSerilNo) {\n var menuLists = $filter('filter')(vm.data.menuAllList, {\n parentId: menuSerilNo,\n parentIdLen: String(menuSerilNo).length,\n level: 3\n });\n\n vm.thirdmenuList = menuLists;\n return vm.thirdmenuList;\n }\n\n function navmenuClick() {\n\n var w = $(window).width();\n var $content = $(\"#navmenu-content\");\n var $blackcover = $(\".ui-blackCover\");\n\n $content.animate({ scrollTop: 0 }, 50);\n $(\"div.menu-content\").css(\"right\", -w);\n\n if ($content.css('right') !== '0px') {\n $content.animate({ right: '0px' }, 300, 'swing');\n if (w < 1000) {\n $blackcover.css(\"display\", \"block\");\n $('section.nav').css(\"position\", \"fixed\");\n } else {\n $('section.nav').css(\"position\", \"static\");\n }\n } else {\n $content.animate({ right: '-' + w + 'px' }, 300, 'swing');\n if (w < 1000) {\n $blackcover.css(\"display\", \"none\");\n }\n\n $('section.nav').css(\"position\", \"static\");\n }\n\n //展第二及第三層功能選單資料\n if (sessionStorage.getItem('menuItemPath') !== null && sessionStorage.getItem('menuItemPath') !== '' && sessionStorage.getItem('menuItemPath').split(',').length !== 1) {\n console.log(\"navmenuClick-menuItemPath:\" + sessionStorage.getItem('menuItemPath'));\n //展第二層資料\n //console.log(\"first = \" + sessionStorage.getItem('menuItemPath').split(',')[0]); \n vm.firstmenuItem = vm.data.menuAllList.filter(function (menuLists) {\n return menuLists.menuSerilNo === parseInt(sessionStorage.getItem('menuItemPath').split(',')[0]);\n });\n //console.log(vm.firstmenuItem);\n if (vm.firstmenuItem[0] !== null) {\n console.log(vm.firstmenuItem[0]);\n rootClick(vm.firstmenuItem[0], 0, true);\n }\n\n //展第三層資料\n //console.log(\"second = \" + sessionStorage.getItem('menuItemPath').split(',')[1]);\n if (sessionStorage.getItem('menuItemPath').split(',').length === 3) {\n vm.secmenuItem = vm.data.menuAllList.filter(function (menuLists) {\n return menuLists.menuSerilNo === parseInt(sessionStorage.getItem('menuItemPath').split(',')[1]);\n });\n if (vm.secmenuItem[0] !== null) {\n console.log(vm.secmenuItem[0]);\n rootClick(vm.secmenuItem[0], 1, true);\n }\n }\n }\n }\n\n function secmenuOpen() {\n var $content = $(\"#secondMenu-content\");\n $content.animate({ right: '0px' }, 300, 'swing');\n $(\"#navmenu-content\").animate({ scrollTop: 0 }, 0); //將捲軸置頂\n $(\"li.level_menu\").each(function () {\n $(this).removeClass(\"open\");\n });\n }\n\n function languageOpen() {\n var $content = $(\"#Language-content\");\n $content.animate({ right: '0px' }, 300, 'swing');\n }\n\n function switchClose(menuName) {\n var w = $(window).width();\n var $content = $(\"#\" + menuName);\n $content.animate({ right: '-' + w + 'px' }, 300, 'swing');\n }\n\n function thirdmenuOpen(menuName, index) {\n var $this = $(\"#\" + menuName + \"-open\");\n var $this_index = index;\n $this.toggleClass(\"open\");\n $this.siblings(\"li\").removeClass(\"open\");\n if ($this.hasClass(\"open\")) {\n var scrollgoto = $this.offset().top + $('#navmenu-content').scrollTop() - 40 - $(window).scrollTop();\n setTimeout(function () {\n $('#navmenu-content').animate({ scrollTop: scrollgoto }, 500);\n }, 200);\n //console.log(\"thirdmenuOpen-scrollgoto:\"+scrollgoto);\n vm.last.index = $this_index;\n vm.last.$ = $this;\n if ($this_index) {\n $(\".ul_padding\").css(\"height\", scrollgoto);\n } else {\n $(\".ul_padding\").css(\"height\", \"0px\");\n }\n } else {\n $(\".ul_padding\").css(\"height\", \"0px\");\n }\n }\n\n function rootClick(item, index, anchor) {\n //判斷是點選下階圖檔還是選單名稱決定要導頁或顯示下階\n if (anchor) {\n if (parseInt(item.level) === 1) {\n vm.firstMenuLangName = item.menuLangName;\n vm.getsecMenuList(item.menuSerilNo);\n vm.secmenuOpen();\n } else {\n vm.getthirdMenuList(item.menuSerilNo);\n\n setTimeout(function () {\n vm.thirdmenuOpen(item.menuName, index + 1);\n }, 50);\n }\n } else if (item.url) {\n if (!item.hasChild) {\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\n sessionStorage.setItem('menuItemPath', item.menuItemPath);\n vm.navmenuClick();\n // console.log('current url:', location.href);\n // console.log('rootClick:', item.url);\n if (location.href.toLowerCase().indexOf('sessionid') > 0 || location.href.toLowerCase().indexOf('courseid') > 0) {\n // console.log(\"current url:\",location.href);\n // console.log(\"redirecter url:\",url);\n //2023-07-10 Johnson 資安2023\n location.href = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('2.3.4(\\'?\\').0(//1,\\'&6\\').0(/\"/1,\\'&7\\').0(/\\'/1,\\'\\').0(/[<>!]|(\\\\(\\\\))|((9|a|b)\\\\c*\\\\(.*\\\\))/1,\\'\\')', 13, 13, 'replace|g|location|href|split|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}));\n }\n menuService.redirectUrl(item);\n }\n }\n }\n\n function choiceLanguage(item) {\n item.selected = true;\n vm.defaultLanguage = translateService.change(item);\n $(\".ui-blackCover\").css(\"display\", \"none\");\n $route.reload();\n }\n\n function login() {\n //debugger;\n var result = modalService.login();\n result.result.then(function (data) {\n if (data) {\n // $route.reload(); \n }\n });\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n vm.navmenuClick();\n }\n\n function redirecter(url) {\n if (location.href.toLowerCase().indexOf('sessionid') > 0 || location.href.toLowerCase().indexOf('courseid') > 0) {\n // console.log(\"current url:\",location.href);\n // console.log(\"redirecter url:\",url);\n //2023-07-10 Johnson 資安2023\n location.href = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('2.3.4(\\'/#\\')[0]+\\'/#\\'+5+\\'?6=\\'+7.8(\\'9\\').1(//g,\\'&b\\').1(/\"/g,\\'&c\\').1(/\\'/g,\\'&#d\\').1(/[<>!]|(\\\\(\\\\))|((e|f|h)\\\\i*\\\\(.*\\\\))/g,\\'\\')', 19, 19, '|replace|location|href|split|url|menu|sessionStorage|getItem|menuSerilNo|lt|gt|quot|x27|for|while||if|s'.split('|'), 0, {}));\n }\n $location.path(url);\n //如果正確導向,就不會往下跑了。\n // console.log(\"page reload\");\n $route.reload(); //for SPA\n }\n\n function logout() {\n\n loginService.logout().then(function () {\n // 通知 APP 登出成功 \n if (DEVICE_TYPE) {\n var param = {};\n var method = \"logout\";\n appCallback(method, param);\n }\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n removeSsoInfo();\n $location.path('/login').search({});\n });\n\n $(\".ui-blackCover\").css(\"display\", \"none\");\n }\n\n function touchWithMe() {\n\n modalService.touchWithMe();\n\n vm.navmenuClick();\n }\n\n function openSetting() {\n\n modalService.setting(vm.fontSizes);\n\n vm.navmenuClick();\n }\n\n function searchClick($event) {\n\n var siteCode = getSiteCode(vm.site);\n headerService.getSearch('', siteCode).then(function (data) {\n vm.data.searchList = data.data;\n switchSearchList('');\n });\n\n $('section.nav').css(\"position\", \"static\");\n }\n\n function specialKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function searchChange() {\n //2020-06-11 Johnson 搜尋欄位有資料才查詢\n if (vm.search != \"\") {\n //2020-06-11 Johnson 搜尋欄位特殊字元檢核\n var SKV = specialKeywordVerification(vm.search);\n\n console.log('SKV:' + SKV);\n\n if (!SKV) {\n var siteCode = getSiteCode(vm.site);\n headerService.getSearch(vm.search, siteCode).then(function (data) {\n vm.data.searchList = data.data;\n switchSearchList(vm.search);\n });\n } else {\n console.log('specialKeywords:' + $rootScope.translate.specialKeywords);\n toastr.warning($rootScope.translate.specialKeywords);\n }\n }\n }\n\n function switchSearchList(keyword) {\n if (keyword) {\n // 有輸入關鍵字,僅顯示查詢清單\n vm.view.showSearchList = true;\n vm.view.showFastList = false;\n } else {\n // 點選放大鏡圖示時(沒有輸入關鍵字),僅顯示快速選單\n // 但台新外網沒有快速選單,所以不顯示任何資訊\n vm.view.showSearchList = false;\n vm.view.showFastList = false;\n }\n }\n\n function doSearch(keyWord) {\n if (keyWord) {\n\n var siteCode = getSiteCode(vm.site);\n vm.view.showSearchList = false;\n $('body').removeClass('modal-open');\n $(\"body>div.modal-backdrop.fade.in\").css('display', 'none');\n $location.path('/header/searchResult/' + keyWord + '/' + siteCode);\n // $location.path('/visualpage/30');\n }\n }\n\n function getSiteCode() {\n var siteCode = 2;\n if (vm.site === 'tsun') {\n siteCode = 4;\n }\n return siteCode;\n }\n\n function transferurl(item) {\n $(\"body>div.modal-backdrop.fade.in\").css('display', 'none');\n menuService.redirectUrl(item);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMenuSite', taiMenuSite);\n\n function taiMenuSite() {\n // Usage:\n //\n // Creates:\n //\n var directive = {\n bindToController: true,\n controller: ControllerController,\n controllerAs: 'vm',\n link: link,\n restrict: 'E',\n templateUrl: 'directive/taiMenuSite.html',\n scope: {\n data: '=',\n menuId: '@',\n showMode: '@'\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(menuService, $location, $http, apiUrl, commonService, $element) {\n var vm = this;\n // 1.8.2 父層傳遞參數 如果失效從 $element 取得\n if (vm.menuId == null || vm.menuId == undefined) {\n vm.menuId = $element.attr('menu-id');\n }\n if (vm.showMode == null || vm.showMode == undefined) {\n vm.showMode = $element.attr('show-mode');\n }\n\n vm.enumShowMode = {\n fullPath: '1', //......代表這段麵包屑是完整的,不會與其他東西串接\n partPath: '2' //......代表這段麵包屑只是其中一部分。\n };\n var tsunOutside = 4;\n var menuUrl = apiUrl.tsApi + 'menu/';\n vm.rootClick = rootClick;\n vm.childClick = childClick;\n vm.rootHove = rootHove;\n vm.rootClear = rootClear;\n\n init();\n\n function init() {\n vm.config = {\n showMode: vm.showMode || vm.enumShowMode.fullPath //麵包屑的顯示模式設定\n };\n var param = {\n menuSerilNo: vm.menuId || getMenuQueryString(),\n siteCode: tsunOutside\n };\n commonService.setParams(param);\n //console.log('menu param:',param);\n $http.post(menuUrl + 'getMenuParent', param).then(function (data) {\n //console.log('menu data:',data.data);\n vm.parent = data.data;\n });\n }\n\n function rootClick(item) {\n if (!item) {\n return;\n }\n if (item.url) {\n menuService.redirectUrl(item);\n }\n }\n\n function rootHove(item) {\n vm.child = null;\n var param = {\n menuSerilNo: item.menuSerilNo,\n globalMenuSerilNo: vm.menuId || getMenuQueryString(),\n siteCode: tsunOutside\n };\n\n commonService.setParams(param);\n $http.post(menuUrl + 'getMenuChild', param).then(function (data) {\n vm.child = data.data;\n });\n }\n\n function rootClear() {\n vm.child = null;\n }\n\n function childClick(item) {\n menuService.redirectUrl(item);\n }\n }\n})();\n'use strict';\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMetro', taiMetro);\n\n function taiMetro() {\n // Usage:\n //\n // Creates:\n //\n var directive = {\n bindToController: true,\n controller: ControllerController,\n controllerAs: 'vm',\n link: link,\n restrict: 'E',\n templateUrl: 'directive/taiMetro.html',\n scope: {\n data: '='\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(menuService, $scope) {\n var vm = this;\n // 1.8.2 父層參數 data 無法直接從 scope 引入\n vm.data = $scope.$parent.vm.data;\n vm.redirectUrl = redirectUrl;\n vm.view = {\n isLogin: sessionStorage.getItem('token')\n };\n\n function redirectUrl(item) {\n\n //console.log(\"item.menuSerilNo:\"+item.menuSerilNo);\n if (!_.isEmpty(sessionStorage.getItem('menuAllList'))) {\n\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n\n //如果Menu=37(上課與證照),就設定Menu=-9901(待修課程)\n if (parseInt(item.menuSerilNo) === 37) {\n sessionStorage.setItem('menuSerilNo', -9901);\n } else {\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\n }\n\n //點選任一動態磚即撈取是選單功能Menu資料\n var menuAllList = JSON.parse(sessionStorage.getItem('menuAllList'));\n var menuItems = menuAllList.filter(function (menuLists) {\n return parseInt(menuLists.menuSerilNo) === parseInt(sessionStorage.getItem('menuSerilNo')) && menuLists.hasChild === false;\n });\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\n if (menuItems !== null && menuItems.length !== 0) {\n sessionStorage.setItem('menuSerilNo', menuItems[0].menuSerilNo);\n sessionStorage.setItem('menuItemPath', menuItems[0].menuItemPath);\n } else {\n //如是選單節點即撈取第二或第三階層是否為父階層 \n menuItems = menuAllList.filter(function (menuLists) {\n return parseInt(menuLists.parentId) === parseInt(sessionStorage.getItem('menuSerilNo'));\n });\n\n //撈取選單節點下排序第一個功能Menu\n if (menuItems != null && menuItems.length !== 0) {\n var sort = Math.min.apply(Math, _toConsumableArray(menuItems.map(function (p) {\n return p.sort;\n })));\n var menuItem = menuItems.filter(function (menuLists) {\n return parseInt(menuLists.sort) === parseInt(sort);\n });\n\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\n //console.log(menuItem);\n if (menuItem !== null && menuItem.length !== 0) {\n if (!menuItem[0].hasChild) {\n sessionStorage.setItem('menuSerilNo', menuItem[0].menuSerilNo);\n }\n sessionStorage.setItem('menuItemPath', menuItem[0].menuItemPath);\n }\n }\n }\n\n // console.log('taiMetro_redirectUrl-menuSerilNo:'+sessionStorage.getItem('menuSerilNo'));\n // console.log('taiMetro_redirectUrl-menuItemPath:'+sessionStorage.getItem('menuItemPath'));\n }\n\n menuService.redirectUrl(item);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taishinTimeTooltip', taishinTimeTooltip);\n\n function taishinTimeTooltip() {\n // Usage:\n //\n // Creates:\n //\n var directive = {\n bindToController: true,\n controller: ControllerController,\n templateUrl: 'directive/taishinTimeTooltip.html',\n controllerAs: 'vm',\n link: link,\n restrict: 'E',\n scope: {\n width: '@',\n importData: '=',\n mode: '=',\n textAlign: '=',\n briefText: '='\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(modalService) {\n var vm = this;\n //---Method--\n //vm.method = methodName; \n //-----------\n init();\n\n function dataIint() {\n vm.view = {\n show: false,\n moreShow: false,\n showBrief: false,\n briefIsRange: false,\n contentSperate: false,\n isForceBrief: false,\n //scale:-53,\n isMobile: modalService.isMobile\n };\n vm.style = {\n contentStyle: {},\n textStyle: {}\n };\n vm.data = {\n importData: angular.copy(vm.importData) || [],\n dateBrief: \"\",\n dateList: []\n };\n }\n\n function init() {\n dataIint();\n logicInit();\n vm.view.show = true;\n //vm.view.scale=ScaleChange(vm.view.scale);\n //console.log('vm.view.scale:',vm.view.scale);\n }\n\n function logicInit() {\n styleLoading();\n if (vm.briefText || vm.briefText === 0) {\n vm.data.dateBrief = vm.briefText + '';\n vm.view.isForceBrief = true;\n vm.view.showBrief = true;\n }\n switch (vm.mode) {\n case \"rough\":\n roughProcess();\n break;\n default:\n dateProcess();\n vm.view.contentSperate = true;\n break;\n }\n }\n\n function styleLoading() {\n if (vm.textAlign === 'center') {\n vm.style.textStyle[\"text-align\"] = 'center';\n } else if (vm.textAlign === 'left') {\n vm.style.textStyle[\"text-align\"] = 'left';\n } else if (vm.textAlign === 'right') {\n vm.style.textStyle[\"text-align\"] = 'right';\n }\n\n if (vm.width) {\n vm.style.contentStyle.width = vm.width + 'px';\n }\n }\n\n function roughProcess() {\n vm.data.dateList = contentFixBr(vm.data.importData);\n // vm.data.dateBrief = \"\";\n vm.view.moreShow = vm.data.importData.length > 0;\n }\n\n function dateProcess() {\n vm.data.dateList = getDateRange(vm.data.importData);\n if (!vm.view.isForceBrief) {\n vm.data.dateBrief = vm.data.dateList[0].split('~')[0];\n }\n vm.view.briefIsRange = vm.data.dateList[0].split('~').length > 1;\n vm.view.moreShow = vm.view.briefIsRange || vm.data.dateList.length > 1;\n vm.view.showBrief = true;\n }\n\n function getDateRange(rawStr) {\n //取得來源字串內的\"日期區間\"\n var getRange = /(\\d{4}\\/\\d{1,2}\\/\\d{1,2}(\\s*~\\s*)?(\\d{4}\\/\\d{1,2}\\/\\d{1,2})?(\\([\\w\\W]*\\))?)/g;\n var sourceStr = angular.copy(rawStr) || \"\";\n var resultStr = [];\n var match = null;\n //==若有其他狀況就依序取代與處理==\n do {\n if (match !== null) {\n var timeAry = match[0].split('~');\n var matchResult;\n if (timeAry.length > 1) {\n if (timeAry[0].trim() === timeAry[1].trim()) {\n matchResult = timeAry[0];\n } else {\n matchResult = match[0];\n }\n } else {\n matchResult = match[0];\n }\n if (resultStr.indexOf(matchResult) === -1) {\n resultStr.push(matchResult);\n }\n }\n match = getRange.exec(sourceStr);\n } while (match !== null);\n //=========\n if (resultStr.length < 1) {\n resultStr[0] = \"\";\n }\n return resultStr;\n }\n\n function contentFixBr(rawData) {\n var getRange = /()/g;\n var exceptCheck = /()/;\n var sourceStr = rawData && typeof rawData === 'string' ? angular.copy(rawData) : '';\n var resultStr = [];\n var match;\n try {\n match = sourceStr.split(getRange);\n } catch (exp) {\n console.log(\"sourceStr\", sourceStr);\n }\n match = sourceStr.split(getRange);\n //==若有其他狀況就依序取代與處理==\n _.forEach(match, function (value) {\n if (!value) {\n return;\n }\n if (value.length < 1) {\n return;\n }\n if (exceptCheck.test(value)) {\n return;\n }\n if (resultStr.indexOf(value) === -1) {\n resultStr.push(value);\n }\n });\n //=========\n return resultStr;\n }\n\n // function ScaleChange(data){\n // var value = data;\n // if(vm.view.isMobile){\n\n // //value=value-30;\n // }\n // return value;\n // }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiVirKeyboard', taiVirKeyboard);\n\n function taiVirKeyboard() {\n var directive = {\n require: ['^form', '^ngController'],\n bindToController: true,\n controller: ControllerController,\n templateUrl: 'directive/taiVirKeyboard.html',\n controllerAs: 'vm',\n link: link,\n restrict: 'E',\n scope: {\n data: '=',\n onDataChanged: '='\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController(modalService, $scope) {\n var vm = this;\n // 1.8.2 父層參數 data 無法直接從 scope 引入\n vm.data = $scope.$parent.vm.virData;\n vm.caps = false;\n vm.kbType = 1; // 1-letter ; 2-symbol\n vm.focusObj = null;\n vm.keyMap = {};\n vm.isInitKeyboard = false;\n vm.showKeyboard = showKeyboard;\n vm.new_keybord = new_keybord;\n vm.initKeyElement = initKeyElement;\n vm.getLetterKeyboard = getLetterKeyboard;\n vm.getSymKeyboard = getSymKeyboard;\n\n // Virtual Keyboard Init\n vm.num_array = new Array();\n vm.sym_arr = new Array();\n vm.en_b_array = new Array();\n vm.showKeyboard();\n //------------------------\n\n function getMapKey(key) {\n if (typeof vm.keyMap[key] === \"undefined\") return key;\n return vm.keyMap[key];\n }\n\n // 顯示小鍵盤\n function showKeyboard() {\n if (!vm.isInitKeyboard) {\n //執行產生新鍵盤\n vm.initKeyElement();\n vm.new_keybord();\n\n vm.isInitKeyboard = true;\n }\n\n //開啟html元素\n $(\"#keyboard\").show();\n $(\"#flashcontent\").show();\n }\n\n // //清除輸入欄\n // $(\".Keyboard_reset\").click(function() {\n // vm.focusObj.val(\"\");\n // vm.focusObj.trigger('change')\n // })\n\n //從一個給定的arr陣列中,隨機返回num個不重複項\n function getArrayItems(arr, num) {\n //新鍵一個陣列,將傳入的陣列複製過來,用於運算,不直接操作傳入的陣列\n var temp_array = new Array();\n for (var index in arr) {\n temp_array.push(arr[index]);\n }\n //取出的項目,保存在此陣列\n var return_array = new Array();\n for (var i = 0; i < num; i++) {\n //判斷如果陣列還有可以取出的元素,以防下標越界\n if (temp_array.length > 0) {\n //在陣列中產生一個隨機索引\n //2023-09-20 Johnson 資安2023\n var arrIndex = Math.floor(eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('0.1()', 2, 2, 'Math|random'.split('|'), 0, {})) * temp_array.length);\n return_array[i] = temp_array[arrIndex];\n //刪掉此索引的陣列元素,此時temp_array變為新的陣列\n temp_array.splice(arrIndex, 1);\n } else {\n //陣列項目取完後,退出迴圈,比如陣列本來只有10項,但要求取出20項\n break;\n }\n }\n return return_array;\n }\n\n function new_keybord() {\n\n if (vm.kbType === 1) {\n vm.getLetterKeyboard();\n\n $(\".kb_num\").each(function () {\n var kbNum = $(this).attr(\"title\");\n $(this).addClass(\"n_\" + kbNum);\n });\n\n $(\".kb_en\").each(function () {\n var kbNum = $(this).attr(\"title\");\n $(this).addClass(\"l_\" + kbNum);\n });\n } else {\n vm.getSymKeyboard();\n\n //將背景圖的class加入含有.kb class的td中\n $(\".kb_sy\").each(function () {\n var kbNum = $(this).attr(\"title\");\n $(this).addClass(\"l_\" + kbNum);\n });\n }\n //dom建立完畢\n\n //按下小鍵盤 (取值寫入inputText)\n $(\".kb_num, .kb_en , .kb_sy\").click(function () {\n //取值\n vm.data = vm.data || '';\n var key = $(this).attr(\"title\");\n vm.data += getMapKey(key);\n vm.onDataChanged(vm.data);\n\n //console.log('data:', vm.data);\n });\n\n //更改樣式\n // $(\".kb_num, .kb_en , .kb_sy\").hover(\n // function () {\n // var $this = $(this);\n // $this.addClass(\"Keyboard_hover\");\n // },\n // function () {\n // var $this = $(this);\n // $this.removeClass(\"Keyboard_hover\");\n // }\n // );\n\n //按下切換\n $(\".Keyboard_s\").click(function () {\n $(\"#keyboard tr:lt(5)\").html(\"\");\n if (vm.kbType == 1) {\n vm.kbType = 2;\n } else {\n vm.kbType = 1;\n }\n vm.new_keybord();\n });\n\n //按下更新\n $(\".Keyboard_r\").click(function () {\n $(\"#keyboard tr:lt(5)\").html(\"\");\n vm.new_keybord();\n if (vm.caps) {\n $(\".Keyboard_caps\").toggleClass(\"capsDown\");\n $(\"#keyboard a[class^='kb_en']\").each(function () {\n //切換大寫title\n var titleName = $(this).attr(\"title\");\n titleName = titleName.toUpperCase();\n $(this).attr(\"title\", titleName);\n });\n }\n });\n\n //按下大寫切換\n $(\".Keyboard_caps\").click(function () {\n //判斷是否按下[大寫]\n if ($(\".Keyboard_caps\").hasClass(\"capsDown\")) {\n $(this).toggleClass(\"capsDown\");\n vm.caps = false;\n $(\"#keyboard a[class^='kb_en']\").each(function () {\n //切換小寫title\n var titleName = $(this).attr(\"title\");\n titleName = titleName.toLowerCase();\n $(this).attr(\"title\", titleName);\n });\n } else {\n vm.caps = true;\n $(this).toggleClass(\"capsDown\");\n $(\"#keyboard a[class^='kb_en']\").each(function () {\n //切換大寫title\n var titleName = $(this).attr(\"title\");\n titleName = titleName.toUpperCase();\n $(this).attr(\"title\", titleName);\n });\n }\n\n $(\".Keyboard_caps\").each(function () {\n //切換大小寫title\n var titleName = $(this).attr(\"title\");\n if (!vm.caps) {\n titleName = '⇧';\n } else {\n titleName = '⇡';\n }\n $(this).attr(\"title\", titleName);\n });\n });\n\n //清除輸入欄\n $(\".Keyboard_reset\").click(function () {\n vm.data = '';\n vm.onDataChanged(vm.data);\n });\n }\n\n /**\r\n * 定義鍵盤所需元素\r\n */\n function initKeyElement() {\n //產生0~9的html存入陣列\n for (var i = 0; i < 10; i++) {\n vm.num_array[i] = \"\";\n }\n\n //產生特殊字元陣列\n vm.sym_arr[0] = \"\";\n vm.sym_arr[1] = \"\";\n vm.sym_arr[2] = \"\";\n vm.sym_arr[3] = \"\";\n vm.sym_arr[4] = \"\";\n vm.sym_arr[5] = \"\";\n vm.sym_arr[6] = \"\";\n vm.sym_arr[7] = \"\";\n vm.sym_arr[8] = \"\";\n vm.sym_arr[9] = \"\";\n vm.sym_arr[10] = \"\";\n vm.sym_arr[11] = \"\";\n vm.sym_arr[12] = \"\";\n vm.sym_arr[13] = \"\";\n vm.sym_arr[14] = \"\";\n vm.sym_arr[15] = \"\";\n vm.sym_arr[16] = \"\";\n vm.sym_arr[17] = \"\";\n vm.sym_arr[18] = \"\";\n vm.sym_arr[19] = \"\";\n vm.sym_arr[20] = \"\";\n vm.sym_arr[21] = \"\";\n vm.sym_arr[22] = \"\";\n vm.sym_arr[23] = \"\";\n vm.sym_arr[24] = \"\";\n vm.sym_arr[25] = \"\";\n vm.sym_arr[26] = \"\";\n vm.sym_arr[27] = \"\";\n // vm.sym_arr[28] = \"\";\n // vm.sym_arr[29] = \"\";\n // vm.sym_arr[30] = \"\";\n // vm.sym_arr[31] = \"\";\n // vm.sym_arr[32] = \"\";\n // vm.sym_arr[33] = \"\";\n // vm.sym_arr[34] = \"\";\n // vm.sym_arr[35] = \"\";\n\n\n //產生a~z的html存入陣列\n vm.en_b_array[0] = \"\";\n vm.en_b_array[1] = \"\";\n vm.en_b_array[2] = \"\";\n vm.en_b_array[3] = \"\";\n vm.en_b_array[4] = \"\";\n vm.en_b_array[5] = \"\";\n vm.en_b_array[6] = \"\";\n vm.en_b_array[7] = \"\";\n vm.en_b_array[8] = \"\";\n vm.en_b_array[9] = \"\";\n vm.en_b_array[10] = \"\";\n vm.en_b_array[11] = \"\";\n vm.en_b_array[12] = \"\";\n vm.en_b_array[13] = \"\";\n vm.en_b_array[14] = \"\";\n vm.en_b_array[15] = \"\";\n vm.en_b_array[16] = \"\";\n vm.en_b_array[17] = \"\";\n vm.en_b_array[18] = \"\";\n vm.en_b_array[19] = \"\";\n vm.en_b_array[20] = \"\";\n vm.en_b_array[21] = \"\";\n vm.en_b_array[22] = \"\";\n vm.en_b_array[23] = \"\";\n vm.en_b_array[24] = \"\";\n vm.en_b_array[25] = \"\";\n }\n\n function getLetterKeyboard() {\n //取出已亂數的數字陣列,並插入至keyboard下第1個tr \t\n vm.num_array = getArrayItems(vm.num_array, 10);\n for (var i = 0; i < vm.num_array.length; i++) {\n $(\"#keyboard tr:eq(0)\").append(vm.num_array[i]);\n }\n\n //取出已亂數的小寫陣列,並插入至keyboard下第2~4個tr\n vm.en_b_array = getArrayItems(vm.en_b_array, 26);\n for (var _i = 0; _i < 26; _i++) {\n if (_i < 10) {\n $(\"#keyboard tr:eq(1)\").append(vm.en_b_array[_i]);\n } else if (_i >= 10 && _i < 20) {\n $(\"#keyboard tr:eq(2)\").append(vm.en_b_array[_i]);\n } else if (_i == 20) {\n $(\"#keyboard tr:eq(3)\").append(\"\");\n $(\"#keyboard tr:eq(3)\").append(vm.en_b_array[_i]);\n } else if (_i == 25) {\n $(\"#keyboard tr:eq(3)\").append(vm.en_b_array[_i]);\n $(\"#keyboard tr:eq(3)\").append(\"\");\n } else {\n $(\"#keyboard tr:eq(3)\").append(vm.en_b_array[_i]);\n }\n }\n //$(\"#keyboard tr:eq(4)\").append(\"\");\n $(\"#keyboard tr:eq(4)\").append(\"\");\n }\n\n function getSymKeyboard() {\n //取出已亂數的數字陣列,並插入至keyboard下第1個tr \t\n vm.num_array = getArrayItems(vm.num_array, 10);\n for (var i = 0; i < vm.num_array.length; i++) {\n $(\"#keyboard tr:eq(0)\").append(vm.num_array[i]);\n }\n\n //取出已亂數的符號陣列,並插入至keyboard下第2~4個tr\n vm.sym_arr = getArrayItems(vm.sym_arr, 26);\n for (var _i2 = 0; _i2 < 26; _i2++) {\n if (_i2 < 10) {\n $(\"#keyboard tr:eq(1)\").append(vm.sym_arr[_i2]);\n } else if (_i2 >= 10 && _i2 < 20) {\n $(\"#keyboard tr:eq(2)\").append(vm.sym_arr[_i2]);\n } else if (_i2 == 20) {\n $(\"#keyboard tr:eq(3)\").append(\"\");\n $(\"#keyboard tr:eq(3)\").append(vm.sym_arr[_i2]);\n } else if (_i2 == 25) {\n $(\"#keyboard tr:eq(3)\").append(vm.sym_arr[_i2]);\n $(\"#keyboard tr:eq(3)\").append(\"\");\n } else {\n $(\"#keyboard tr:eq(3)\").append(vm.sym_arr[_i2]);\n }\n }\n\n //$(\"#keyboard tr:eq(4)\").append(\"\");\n $(\"#keyboard tr:eq(4)\").append(\"\");\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.filter').filter('highlight', highlight);\n\n function highlight($sce) {\n return function (text, phrase) {\n\n if (phrase) {\n if (text) {\n text = text.replace(new RegExp('(' + phrase + ')', 'gi'), '$1');\n }\n }\n\n return $sce.trustAsHtml(text);\n };\n }\n})();\n'use strict';\n\n(function () {\n\n 'use strict';\n\n angular.module('app.filter').filter('newline', newline);\n\n function newline() {\n return function (html) {\n return html.replace(/\\n/g, '
');\n };\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.filter').filter('trustHtml', trustHtml);\n\n function trustHtml($sce) {\n return function (html) {\n return $sce.trustAsHtml(html);\n };\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.filter').filter('trustUrl', trustUrl);\n\n function trustUrl($sce) {\n return function (url) {\n return $sce.trustAsResourceUrl(url);\n };\n }\n})();\n\"use strict\";\n\nfunction str_encrypt(str) {\n var c = String.fromCharCode(str.charCodeAt(0) + str.length);\n\n for (var i = 1; i < str.length; i++) {\n c += String.fromCharCode(str.charCodeAt(i) + str.charCodeAt(i - 1));\n }\n\n return encodeURIComponent(c);\n}\nfunction str_decrypt(str) {\n str = decodeURIComponent(str);\n var c = String.fromCharCode(str.charCodeAt(0) - str.length);\n\n for (var i = 1; i < str.length; i++) {\n c += String.fromCharCode(str.charCodeAt(i) - c.charCodeAt(i - 1));\n }\n return c;\n}\n\"use strict\";\n\n/**生成一個隨機數**/\nfunction randomNum(min, max) {\n return Math.floor(new Date().getTime() * (max - min) + min);\n}\n/**生成一個隨機色**/\nfunction randomColor(min, max) {\n var r = randomNum(min, max);\n var g = randomNum(min, max);\n var b = randomNum(min, max);\n return \"rgb(\" + r + \",\" + g + \",\" + b + \")\";\n}\n/**繪制驗證碼圖片**/\nfunction drawPic(parSrc) {\n var canvas = document.getElementById(\"canvas\");\n var width = canvas.width;\n var height = canvas.height;\n //獲取該canvas的2D繪圖環境 \n var ctx = canvas.getContext('2d');\n ctx.textBaseline = 'bottom';\n /**繪制背景色**/\n ctx.fillStyle = randomColor(180, 240);\n //顏色若太深可能導致看不清\n ctx.fillRect(0, 0, width, height);\n /**繪制文字**/\n var str = 'ABCEFGHJKLMNPQRSTWXY123456789';\n var code = \"\";\n //生成四個驗證碼\n for (var i = 1; i <= 4; i++) {\n if (parSrc == undefined) var txt = str[randomNum(0, str.length)];else var txt = parSrc.substring(i - 1, i);\n code = code + txt;\n ctx.fillStyle = randomColor(50, 160);\n //隨機生成字體顏色\n ctx.font = randomNum(18, 32) + 'px SimHei';\n //隨機生成字體大小\n var x = 10 + i * 25;\n var y = randomNum(25, 35);\n var deg = randomNum(0, 45);\n //修改坐標原點和旋轉角度\n ctx.translate(x, y);\n ctx.rotate(deg * Math.PI / 180);\n ctx.fillText(txt, 0, 0);\n //恢復坐標原點和旋轉角度\n ctx.rotate(-deg * Math.PI / 180);\n ctx.translate(-x, -y);\n }\n\n /**繪制幹擾線**/\n for (var i = 0; i < 0; i++) {\n ctx.strokeStyle = randomColor(40, 180);\n ctx.beginPath();\n ctx.moveTo(randomNum(0, width / 2), randomNum(0, height / 2));\n ctx.lineTo(randomNum(0, width / 2), randomNum(0, height));\n ctx.stroke();\n }\n /**繪制幹擾點**/\n for (var i = 0; i < 30; i++) {\n ctx.fillStyle = randomColor(255);\n ctx.beginPath();\n ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI);\n ctx.fill();\n }\n}\n\nfunction callVerify() {\n var ajax_url = sessionStorage.getItem('VcUrl').replace(\"undefined\", \"\") + 'Sso/verifyCode';\n\n $.ajax({\n url: ajax_url,\n type: 'POST',\n error: function error() {\n console.log('error');\n },\n success: function success(e) {\n\n $(\"#codeimage\").attr(\"src\", \"data:image/jpg;base64,\" + e.isPass);\n $('#isPass').val(e.SecretKey);\n }\n });\n}\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('testData', ['enumService', testData]);\n\n function testData(enumService) {\n var enumCourseType = enumService.courseType;\n var service = {\n MyTrainingPoint: MyTrainingPoint,\n SysTypesList: SysTypesList,\n FCLicenseList: FCLicenseList,\n CourseItem: CourseItem,\n PublishedActivity: PublishedActivity,\n CourseSession: CourseSession,\n ExamSurveyContent: ExamSurveyContent,\n InteractionData: InteractionData,\n MyUnfinishedActivities: MyUnfinishedActivities,\n MyFinishedActivities: MyFinishedActivities,\n EnrollmentAvailableAction: EnrollmentAvailableAction,\n EnrollmentAction: EnrollmentAction,\n FCCertificatedLicenseAdd: FCCertificatedLicenseAdd,\n FCCertificatedLicenseList: FCCertificatedLicenseList,\n FCAuthorizedHoursList: FCAuthorizedHoursList,\n ExternalTrainingApplication: ExternalTrainingApplication,\n FCEnrollableActivities: FCEnrollableActivities,\n LearningRecordCommit: LearningRecordCommit\n };\n\n return service;\n /**\r\n * 1.訓練存摺點數\r\n * @returns\r\n */\n function MyTrainingPoint(year) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultDefault;\n var resultYear2013;\n var resultYear2014;\n var resultYear2015;\n var resultYear2016;\n resultDefault = {\n Status: '200',\n Data: {\n remainPoint: 0,\n trainingPoints: []\n },\n ErrorMessage: '123'\n };\n resultYear2013 = {\n Status: '200',\n Data: {\n remainPoint: 0,\n trainingPoints: [{\n courseName: \"2013課程\",\n courseTime: \"2013/09/21~2013/09/21\",\n courseType: \"外訓課程\",\n point: 250\n }]\n },\n ErrorMessage: ''\n };\n resultYear2014 = {\n \"Status\": \"200\",\n \"Data\": {\n \"remainPoint\": 10000,\n \"trainingPoints\": [{\n courseName: \"2014課程1\",\n courseTime: \"2014/03/05~2014/03/14\",\n courseType: \"外訓課程\",\n point: 250\n }, {\n courseName: \"2014課程2\",\n courseTime: \"2014/07/13~2014/07/13\",\n courseType: \"線上課程\",\n point: 250\n }]\n },\n \"ErrorMessage\": \"\"\n };\n resultYear2015 = { \"Status\": \"200\", \"Data\": { \"remainPoint\": 10000, \"trainingPoints\": [] }, \"ErrorMessage\": \"\" };\n resultYear2016 = { \"Status\": \"200\", \"Data\": { \"remainPoint\": 10000, \"trainingPoints\": [] }, \"ErrorMessage\": \"\" };\n switch (year + '') {\n case '2013':\n result = resultYear2013;\n break;\n case '2014':\n result = resultYear2014;\n break;\n case '2015':\n result = resultYear2015;\n break;\n case '2016':\n result = resultYear2016;\n break;\n default:\n result = resultYear2016;\n break;\n }\n return { data: result };\n }\n\n /**\r\n * 2-1.取得下拉選單資料_金融證照類別\r\n * @returns\r\n */\n function SysTypesList(type) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultType2; /**金融證照類別 */\n var resultType3; /**外訓費用貨幣種類 */\n var resultType4; /**外訓種類 */\n var resultType5; /**主辦單位 */\n resultType2 = {\n \"Status\": \"200\",\n \"Data\": [{\n \"id\": -1,\n \"name\": \"All\"\n }, {\n \"id\": 7,\n \"name\": \"人力資源類\"\n }, {\n \"id\": 8,\n \"name\": \"行內自辦證照/資格類資格類資格類資格類資格類\"\n }, {\n \"id\": 15,\n \"name\": \"法金人才庫類\"\n }, {\n \"id\": 6,\n \"name\": \"金融證照類\"\n }, {\n \"id\": 12,\n \"name\": \"專案管理類\"\n }, {\n \"id\": 9,\n \"name\": \"勞工安全類\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultType3 = {\n \"Status\": \"200\",\n \"Data\": [{\n \"id\": -1,\n \"name\": \"All\"\n }, {\n \"id\": 0,\n \"name\": \"台幣\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultType4 = {\n \"Status\": \"200\",\n \"Data\": [{\n \"id\": -1,\n \"name\": \"All\"\n }, {\n \"id\": 0,\n \"name\": \"國外外訓\"\n }, {\n \"id\": 1,\n \"name\": \"一般外訓\"\n }, {\n \"id\": 2,\n \"name\": \"外語進修補助\"\n }, {\n \"id\": 3,\n \"name\": \"電腦進修補助\"\n }, {\n \"id\": 4,\n \"name\": \"考試補助\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultType5 = {\n \"Status\": \"200\",\n \"Data\": [{\n \"id\": -1,\n \"name\": \"All\"\n }, {\n \"id\": 1,\n \"name\": \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\n }, {\n \"id\": 3,\n \"name\": \"路透社\"\n }, {\n \"id\": 4,\n \"name\": \"工研院台北學習中心\"\n }, {\n \"id\": 5,\n \"name\": \"中央存款保險股份有限公司\"\n }, {\n \"id\": 6,\n \"name\": \"中原大學推廣教育中心\"\n }, {\n \"id\": 7,\n \"name\": \"中國文化大學推廣教育部\"\n }, {\n \"id\": 8,\n \"name\": \"中國生產力中心\"\n }, {\n \"id\": 9,\n \"name\": \"中華人力資源管理協會\"\n }, {\n \"id\": 10,\n \"name\": \"中華人事主管協會\"\n }, {\n \"id\": 11,\n \"name\": \"中華公司治理協會\"\n }, {\n \"id\": 12,\n \"name\": \"中華民國工商協進會\"\n }, {\n \"id\": 13,\n \"name\": \"中華民國工業安全衛生協會\"\n }, {\n \"id\": 14,\n \"name\": \"中華民國內部稽核協會\"\n }, {\n \"id\": 15,\n \"name\": \"中華民國公司組織研究發展協會\"\n }, {\n \"id\": 16,\n \"name\": \"信託公會\"\n }, {\n \"id\": 17,\n \"name\": \"中華民國退休基金協會〈萬寶資產管理集團〉\"\n }, {\n \"id\": 18,\n \"name\": \"中華民國票券金融商業同業公會\"\n }, {\n \"id\": 19,\n \"name\": \"中華民國勞資關係協進會\"\n }, {\n \"id\": 20,\n \"name\": \"中華民國銀行商業同業公會全國聯合會\"\n }, {\n \"id\": 21,\n \"name\": \"中華民國職工福利發展協會\"\n }, {\n \"id\": 22,\n \"name\": \"中華民國證券投資信託暨顧問商業同業公會\"\n }, {\n \"id\": 23,\n \"name\": \"中華汽車培訓中心\"\n }, {\n \"id\": 24,\n \"name\": \"中華徵信所\"\n }, {\n \"id\": 25,\n \"name\": \"台灣金融研訓院\"\n }, {\n \"id\": 26,\n \"name\": \"台大進修推廣部\"\n }, {\n \"id\": 27,\n \"name\": \"國稅局\"\n }, {\n \"id\": 28,\n \"name\": \"台北市進出口商業同業公會\"\n }, {\n \"id\": 29,\n \"name\": \"台北金融研究發展基金會\"\n }, {\n \"id\": 30,\n \"name\": \"台北恆逸教訓訓練中心\"\n }, {\n \"id\": 31,\n \"name\": \"台北富蘭德林諮詢有限公司\"\n }, {\n \"id\": 32,\n \"name\": \"證券商業同業公會\"\n }, {\n \"id\": 33,\n \"name\": \"證券暨期貨市場發展基金會\"\n }, {\n \"id\": 34,\n \"name\": \"台北富蘭德林諮詢有限公司\"\n }, {\n \"id\": 35,\n \"name\": \"台灣金融服務業聯合總會\"\n }, {\n \"id\": 36,\n \"name\": \"台灣金融服務業聯合總會\"\n }, {\n \"id\": 37,\n \"name\": \"台灣期貨交易所股份有限公司\"\n }, {\n \"id\": 38,\n \"name\": \"巨匠電腦\"\n }, {\n \"id\": 39,\n \"name\": \"行政院金融管理委員會\"\n }, {\n \"id\": 40,\n \"name\": \"行政院勞工委員會\"\n }, {\n \"id\": 41,\n \"name\": \"何嘉仁國際教育學院\"\n }, {\n \"id\": 42,\n \"name\": \"投信投顧公會\"\n }, {\n \"id\": 43,\n \"name\": \"亞太教育訓練\"\n }, {\n \"id\": 44,\n \"name\": \"兩岸經華諮詢顧問股份有限公司\"\n }, {\n \"id\": 45,\n \"name\": \"券商同業公會\"\n }, {\n \"id\": 46,\n \"name\": \"卓越人生企管顧問公司\"\n }, {\n \"id\": 47,\n \"name\": \"和風談判學院\"\n }, {\n \"id\": 48,\n \"name\": \"旺旺中時媒體集團\"\n }, {\n \"id\": 49,\n \"name\": \"東方匯理銀行\"\n }, {\n \"id\": 50,\n \"name\": \"法國外貿銀行\"\n }, {\n \"id\": 51,\n \"name\": \"社團法人中華採購供應管理協會\"\n }, {\n \"id\": 52,\n \"name\": \"花旗銀行\"\n }, {\n \"id\": 53,\n \"name\": \"金管會\"\n }, {\n \"id\": 54,\n \"name\": \"前瞻國際顧問(股)公司\"\n }, {\n \"id\": 55,\n \"name\": \"施羅德證券投資信託股份有限公司\"\n }, {\n \"id\": 56,\n \"name\": \"美國銀行(Bank of America)\"\n }, {\n \"id\": 57,\n \"name\": \"英商渣打銀行\"\n }, {\n \"id\": 58,\n \"name\": \"財團法人會計研究發展基金會\"\n }, {\n \"id\": 59,\n \"name\": \"高雄市銀行公會\"\n }, {\n \"id\": 60,\n \"name\": \"動腦傳播股份有限公司\"\n }, {\n \"id\": 61,\n \"name\": \"國際商會中華民國總會\"\n }, {\n \"id\": 62,\n \"name\": \"富蘭德林\"\n }, {\n \"id\": 63,\n \"name\": \"彭博資訊\"\n }, {\n \"id\": 64,\n \"name\": \"渣打銀行\"\n }, {\n \"id\": 65,\n \"name\": \"勤業眾信會計師事務所\\t\"\n }],\n \"ErrorMessage\": \"\"\n };\n switch (type) {\n case 2:\n result = resultType2;\n break;\n case 3:\n result = resultType3;\n break;\n case 4:\n result = resultType4;\n break;\n case 5:\n result = resultType5;\n break;\n default:\n break;\n }\n return { data: result };\n }\n /**\r\n * 2-3.取得下拉選單資料_取得金融證照名稱\r\n * @returns\r\n */\n function FCLicenseList() {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n result = {\n \"Status\": \"200\",\n \"Data\": [{\n \"attTypes\": \"\",\n \"id\": 159,\n \"name\": \"ARM專業能力檢定測驗(大會考)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 177,\n \"name\": \"AU-910 Generic Knowledge\",\n \"organization\": \"Australian Securities & Investments Commission\"\n }, {\n \"attTypes\": \"\",\n \"id\": 190,\n \"name\": \"AU-927 Foreign Exchange - Knowledge & Skill\",\n \"organization\": \"Australian Securities & Investments Commission\"\n }, {\n \"attTypes\": \"\",\n \"id\": 189,\n \"name\": \"AU-927 Foreign Exchange - Knowledge only\",\n \"organization\": \"Australian Securities & Investments Commission\"\n }, {\n \"attTypes\": \"\",\n \"id\": 85,\n \"name\": \"CFA(全階)\",\n \"organization\": \"台灣理財顧問認證協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 83,\n \"name\": \"CFA(第一階段)\",\n \"organization\": \"台灣理財顧問認證協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 84,\n \"name\": \"CFA(第二階段)\",\n \"organization\": \"台灣理財顧問認證協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 86,\n \"name\": \"CFP\",\n \"organization\": \"台灣理財顧問認證協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 148,\n \"name\": \"CIA 國際內部稽核師\",\n \"organization\": \"中華民國內部稽核協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 149,\n \"name\": \"CISA 國際電腦稽核師\",\n \"organization\": \"中華民國內部稽核協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 87,\n \"name\": \"CPA(會計師)\",\n \"organization\": \"考試院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 88,\n \"name\": \"CSIA\",\n \"organization\": \"美國金融管理學會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 29,\n \"name\": \"e-HR管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 179,\n \"name\": \"Internal Audit in Financial Institution 金融機構稽核課程(HK)\",\n \"organization\": \"香港銀行學會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 89,\n \"name\": \"MFP\",\n \"organization\": \"美國金融管理學會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 90,\n \"name\": \"PMP國際專案經理人認証班\",\n \"organization\": \"Project Management Institute(PMI)\"\n }, {\n \"attTypes\": \"\",\n \"id\": 147,\n \"name\": \"PMP國際專案管理師\",\n \"organization\": \"Project Management Institute(PMI)\"\n }, {\n \"attTypes\": \"\",\n \"id\": 37,\n \"name\": \"一級講師\",\n \"organization\": \"人力資源處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 58,\n \"name\": \"乙種勞工安全衛生業務主管\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 26,\n \"name\": \"人力資源中階主管\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 12,\n \"name\": \"人民幣辨識資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 76,\n \"name\": \"人身保險代理人\",\n \"organization\": \"中華民國考選部\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 79,\n \"name\": \"人身保險業務員投資型保險商品資格測驗合格\",\n \"organization\": \"財團法人保險事業發展中心\"\n }, {\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\n \"id\": 46,\n \"name\": \"人身保險業務員投資型商品資格登錄(登錄壽險公會)\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\n \"id\": 45,\n \"name\": \"人身保險業務員登錄(登錄壽險公會)\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 77,\n \"name\": \"人身保險業務員資格測驗合格\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 82,\n \"name\": \"人身保險業務員銷售外幣收付非投資型保險商品資格測驗合格\",\n \"organization\": \"財團法人保險事業發展中心\"\n }, {\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\n \"id\": 47,\n \"name\": \"人身保險業務員銷售外幣收付非投資型保險商品資格登錄(登錄壽險公會)\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 153,\n \"name\": \"人身保險經紀人\",\n \"organization\": \"中華民國考選部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 24,\n \"name\": \"大陸人力資源管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 158,\n \"name\": \"大陸人力資源與勞動關係管理師\",\n \"organization\": \"中華人事主管協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 78,\n \"name\": \"不良債權處理實務研習班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 124,\n \"name\": \"不動產鑑價測驗合格\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 34,\n \"name\": \"不動產鑑價資格取得\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 73,\n \"name\": \"內部稽核師\",\n \"organization\": \"中華民國內部稽核協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 131,\n \"name\": \"內部講師訓完訓資格\",\n \"organization\": \"人力資源處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 134,\n \"name\": \"分行經理內部控制\",\n \"organization\": \"通路營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 59,\n \"name\": \"丙種勞工安全衛生業務主管\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 40,\n \"name\": \"外匯及衍生性金融商品之風險管理研習班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 91,\n \"name\": \"外匯交易專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 64,\n \"name\": \"外匯指定分行外匯人員資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 8,\n \"name\": \"外匯經辦人員資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 185,\n \"name\": \"外匯經辦人員資格(僅限客服部)\",\n \"organization\": \"通路營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 9,\n \"name\": \"外匯覆核人員資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 186,\n \"name\": \"外匯覆核人員資格(僅限客服部)\",\n \"organization\": \"通路營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 22,\n \"name\": \"生涯發展諮商師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 57,\n \"name\": \"甲種勞工安全衛生業務主管\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 74,\n \"name\": \"企業內部控制基本能力測驗\",\n \"organization\": \"證券暨期貨市場發展基金會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 157,\n \"name\": \"全民財經檢定(General Economic and Financial Test)\",\n \"organization\": \"經濟日報\"\n }, {\n \"attTypes\": \"\",\n \"id\": 92,\n \"name\": \"存款開戶課程認證\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 36,\n \"name\": \"年度優良講師\",\n \"organization\": \"人力資源處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 156,\n \"name\": \"利率變動型年金資格(登錄壽險公會)\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 63,\n \"name\": \"投信投顧相關法規(含自律規範)\",\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 120,\n \"name\": \"投信投顧業務員\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"身分證正反面影本, 最高學歷證書影本, 投信投顧業務員證照影本(或信託業務證照+投信投顧法規證照影本), 金融常識與職業道德測驗證書影本, 登錄聲明書 (下載路徑:台新大學>新手上路>新手教材>同仁篇>證照管理>投顧人員聲明書103年版), 請注意,此證照僅供「理財商品處」同仁申請登錄\",\n \"id\": 127,\n \"name\": \"投信投顧業務員-一般業務員(登錄投信投顧公會)\",\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 129,\n \"name\": \"投信投顧業務員-基金經理人(登錄投信投顧公會)\",\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 130,\n \"name\": \"投信投顧業務員-基金經理人部主管(登錄投信投顧公會)\",\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 128,\n \"name\": \"投信投顧業務員-部主管(登錄投信投顧公會)\",\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 50,\n \"name\": \"防火管理人員\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 109,\n \"name\": \"其他類證照\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 21,\n \"name\": \"知識管理管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 102,\n \"name\": \"股務業務員資格\",\n \"organization\": \"證券暨期貨市場發展基金會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 94,\n \"name\": \"初階外匯人員專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 96,\n \"name\": \"初階授信人員專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 100,\n \"name\": \"金融人員授信擔保品估價專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 99,\n \"name\": \"金融市場常識與職業道德\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 180,\n \"name\": \"金融管理師(FMA)資格認證\",\n \"organization\": \"高級金融管理師(AFMA)委員會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 204,\n \"name\": \"金融數位力知識檢定測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 14,\n \"name\": \"信託業務人員信託業務專業測驗\",\n \"organization\": \"中華民國信託業商業同業公會\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 65,\n \"name\": \"信託業務人員信託業務專業測驗【信託法規乙科】\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"不需檢附任何文件\",\n \"id\": 7,\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\n \"organization\": \"中華民國信託業商業同業公會\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 30,\n \"name\": \"信託督導人員實務研習班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"不需檢附任何文件\",\n \"id\": 5,\n \"name\": \"信託督導人員審定合格(登錄信託公會)\",\n \"organization\": \"中華民國信託業商業同業公會\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 31,\n \"name\": \"信託管理人員研習班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"不需檢附任何文件\",\n \"id\": 6,\n \"name\": \"信託管理人員審定合格(登錄信託公會)\",\n \"organization\": \"中華民國信託業商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 80,\n \"name\": \"保險財產規劃師\",\n \"organization\": \"中華民國個人財產規劃人員協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 51,\n \"name\": \"急救人員訓練\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 202,\n \"name\": \"衍生性金融商品及風險管理培訓班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 41,\n \"name\": \"衍生性金融商品自辦課程測驗\",\n \"organization\": \"金融市場處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 205,\n \"name\": \"衍生性金融商品銷售人員資格測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 192,\n \"name\": \"衍生性商品推介人員(登錄銀行公會)\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"通過證書正本\",\n \"id\": 193,\n \"name\": \"風險管理基本能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 135,\n \"name\": \"香港證券-卷一 基本證券及期貨規例\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 141,\n \"name\": \"香港證券-卷七 金融市場\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 143,\n \"name\": \"香港證券-卷九 衍生工具\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 136,\n \"name\": \"香港證券-卷二 證券規例\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 142,\n \"name\": \"香港證券-卷八 證券\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 144,\n \"name\": \"香港證券-卷十 信貸評級服務\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 145,\n \"name\": \"香港證券-卷十一 機構融資\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 146,\n \"name\": \"香港證券-卷十二 資產管理\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 137,\n \"name\": \"香港證券-卷三 衍生工具規例\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 139,\n \"name\": \"香港證券-卷五 機構融資規例\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 140,\n \"name\": \"香港證券-卷六 資產管理規例\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 138,\n \"name\": \"香港證券-卷四 信貸評級服務規例\",\n \"organization\": \"香港證券專業協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 15,\n \"name\": \"員工任用管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 18,\n \"name\": \"員工福利管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 17,\n \"name\": \"員工薪酬管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 19,\n \"name\": \"員工關係管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 161,\n \"name\": \"晉升10職等準RM簡報(適用產金/服金/海外/產品)>僅透過HR上傳名單\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 194,\n \"name\": \"晉升11職等PM/PS專業能力檢定測驗>僅透過HR上傳名單\",\n \"organization\": \"法金產品行銷處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 162,\n \"name\": \"晉升11職等RM專業能力檢定測驗(大會考)>僅透過HR上傳名單\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 165,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 201,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/系統專案組)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處系統專案組\"\n }, {\n \"attTypes\": \"\",\n \"id\": 197,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/法金作業部)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處法金作業部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 199,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/法金管理部)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處法金管理部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 200,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/金融交易作業部)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處金融交易作業部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 198,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/客戶服務部)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處客戶服務部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 196,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/建北分行)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處建北分行\"\n }, {\n \"attTypes\": \"\",\n \"id\": 195,\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/國外部)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處國外部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 163,\n \"name\": \"晉升12職等RM簡報>僅透過HR上傳資格\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 164,\n \"name\": \"晉升12職等專題簡報(適用PM/除國際聯貸以外之PS、TMO及SU)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 166,\n \"name\": \"晉升13職等PM專題簡報>僅透過HR上傳資格\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 160,\n \"name\": \"晉升9職等準RM簡報(適用環貿金融處)>僅透過HR上傳資格\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 178,\n \"name\": \"晉升RM資格(適用產金/服金)>僅透過HR上傳名單\",\n \"organization\": \"法金管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 182,\n \"name\": \"特級金融管理師(CFMA)資格認證\",\n \"organization\": \"高級金融管理師(AFMA)委員會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 152,\n \"name\": \"租賃人才養成認證班\",\n \"organization\": \"台北市租賃公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 16,\n \"name\": \"訓練發展管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 103,\n \"name\": \"財金風險管理分析師\",\n \"organization\": \"Global Association of Risk Professionals (GARP),全球風險專業管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 154,\n \"name\": \"財產保險代理人\",\n \"organization\": \"中華民國考選部\"\n }, {\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\n \"id\": 176,\n \"name\": \"財產保險業務員(限招攬傷害及健康險)(登錄產險公會)\",\n \"organization\": \"中華民國產物保險商業同業公會\"\n }, {\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\n \"id\": 44,\n \"name\": \"財產保險業務員登錄(登錄產險公會)\",\n \"organization\": \"中華民國產物保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 81,\n \"name\": \"財產保險業務員資格測驗合格\",\n \"organization\": \"中華民國產物保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 155,\n \"name\": \"財產保險經紀人\",\n \"organization\": \"中華民國考選部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 181,\n \"name\": \"高級金融管理師(FMA+)資格認證\",\n \"organization\": \"高級金融管理師(AFMA)委員會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 188,\n \"name\": \"商金現勘訪廠執照資格取得\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 126,\n \"name\": \"基礎人資管理師\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 98,\n \"name\": \"理財規劃人員專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 35,\n \"name\": \"現勘\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 105,\n \"name\": \"票券商業務員\",\n \"organization\": \"中華民國票券金融商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 60,\n \"name\": \"勞工安全管理甲級技術士\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 53,\n \"name\": \"勞工安全管理師\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 56,\n \"name\": \"勞工安全衛生管理乙級技術士\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 52,\n \"name\": \"勞工安全衛生管理員\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 61,\n \"name\": \"勞工衛生管理甲級技術士\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 55,\n \"name\": \"勞工衛生管理師\",\n \"organization\": \"\"\n }, {\n \"attTypes\": \"\",\n \"id\": 151,\n \"name\": \"勞健保暨勞基法管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 20,\n \"name\": \"勞動法令管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 117,\n \"name\": \"期貨分析師\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 119,\n \"name\": \"期貨交易分析人員\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"不需檢附任何文件\",\n \"id\": 42,\n \"name\": \"期貨信託基金銷售機構銷售人員(登錄期貨公會)\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 43,\n \"name\": \"期貨信託基金銷售機構銷售人員專業科目測驗成績合格證明\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 115,\n \"name\": \"期貨商業務員\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 116,\n \"name\": \"期貨商業務員(登錄期貨公會)\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 27,\n \"name\": \"策略性人力資源管理\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"通過證書影本, 登錄同意書 (下載路徑:台新大學>新手上路>新手教材>同仁篇>證照管理>台新銀行結構型商品推介人員資格資料變更註銷登錄申請暨同意書)\",\n \"id\": 150,\n \"name\": \"結構型商品推介人員(登錄銀行公會)\",\n \"organization\": \"中華民國銀行商業同業公會\"\n }, {\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\n \"id\": 39,\n \"name\": \"結構型商品銷售人員資格測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"此證照目前已停用,請勿申請登錄。\",\n \"id\": 49,\n \"name\": \"結構型商品銷售自律規範測驗(登錄壽險公會)\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 95,\n \"name\": \"進階外匯人員專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 97,\n \"name\": \"進階授信人員專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 13,\n \"name\": \"開戶對保作業資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 93,\n \"name\": \"債券人員\",\n \"organization\": \"證券暨期貨市場發展基金會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 75,\n \"name\": \"債權委外催收人員專業能力測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 48,\n \"name\": \"傳統型年金資格(登錄壽險公會)\",\n \"organization\": \"中華民國人壽保險商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 184,\n \"name\": \"新型分析工具認證-初階\",\n \"organization\": \"客群經營處客戶關係管理部\"\n }, {\n \"attTypes\": \"\",\n \"id\": 125,\n \"name\": \"資料倉儲權限認證\",\n \"organization\": \"人力資源處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 66,\n \"name\": \"資產配置觀念與系統操作\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 106,\n \"name\": \"資產證券化基本能力測驗\",\n \"organization\": \"證券暨期貨市場發展基金會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 69,\n \"name\": \"電腦稽核研習班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 33,\n \"name\": \"對保資格取得\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 38,\n \"name\": \"認證講師\",\n \"organization\": \"人力資源處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 67,\n \"name\": \"銀行內部控制與內部稽核測驗\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 122,\n \"name\": \"銀行辦理財富管理業務-理財業務人員及其他人員\",\n \"organization\": \"中華民國銀行商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 121,\n \"name\": \"銀行辦理財富管理業務-管理人員\",\n \"organization\": \"中華民國銀行商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 123,\n \"name\": \"徵信測驗合格\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 32,\n \"name\": \"徵信資格取得\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 68,\n \"name\": \"稽核人員研習班\",\n \"organization\": \"台灣金融研訓院\"\n }, {\n \"attTypes\": \"\",\n \"id\": 187,\n \"name\": \"親簽核對資格取得\",\n \"organization\": \"個金授信管理處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 28,\n \"name\": \"績效管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 23,\n \"name\": \"總務行政管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 62,\n \"name\": \"簡易外匯人員資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 25,\n \"name\": \"職能管理師\",\n \"organization\": \"中華人力資源管理協會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 11,\n \"name\": \"覆核作業資格\",\n \"organization\": \"分行營運事業處\"\n }, {\n \"attTypes\": \"\",\n \"id\": 107,\n \"name\": \"證券交易相關法規與實務\",\n \"organization\": \"證券暨期貨市場發展基金會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 118,\n \"name\": \"證券投資分析人員\",\n \"organization\": \"中華民國期貨業商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 70,\n \"name\": \"證券商內部稽核資格\",\n \"organization\": \"中華民國證券商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 110,\n \"name\": \"證券商自有資本適足比率進階計算法申報人員測驗\",\n \"organization\": \"台灣證券交易所\"\n }, {\n \"attTypes\": \"\",\n \"id\": 111,\n \"name\": \"證券商高級業務員\",\n \"organization\": \"中華民國證券商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 112,\n \"name\": \"證券商高級業務員(登錄證券交易所)\",\n \"organization\": \"台灣證券交易所\"\n }, {\n \"attTypes\": \"\",\n \"id\": 113,\n \"name\": \"證券商業務員\",\n \"organization\": \"中華民國證券商業同業公會\"\n }, {\n \"attTypes\": \"\",\n \"id\": 114,\n \"name\": \"證券商業務員(登錄證券交易所)\",\n \"organization\": \"台灣證券交易所\"\n }, {\n \"attTypes\": \"\",\n \"id\": 10,\n \"name\": \"驗印資格\",\n \"organization\": \"分行營運事業處\"\n }],\n \"ErrorMessage\": \"\"\n };\n return { data: result };\n }\n\n /**\r\n * 3.取得課程教材\r\n * 顯示方式;下載附件\r\n */\n function CourseItem(params) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var CourseItemsDownload;\n var CourseItemsPdf;\n var CourseItemsVideo;\n CourseItemsDownload = {\n \"Status\": \"200\",\n \"Data\": {\n \"fileExt\": \"ZIP 文件\",\n \"id\": 1,\n \"name\": \"TIPS信託投資系統操作說明【91分鐘】(ZIP教材)\",\n \"path\": \"Storage\\\\downloadFile.zip\",\n \"type\": \"教材\"\n },\n \"ErrorMessage\": \"\"\n };\n CourseItemsPdf = {\n \"Status\": \"200\",\n \"Data\": {\n \"fileExt\": \"PDF 文件\",\n \"id\": 2,\n \"name\": \"經濟基本指標【57分鐘】\",\n \"path\": \"Storage\\\\pdfFile.pdf\",\n \"type\": \"教材\"\n },\n \"ErrorMessage\": \"\"\n };\n CourseItemsVideo = {\n \"Status\": \"200\",\n \"Data\": {\n \"fileExt\": \"MP4 文件\",\n \"id\": 3,\n \"name\": \"ETF介紹【19分鐘】\",\n // \"path\": \"Storage\\\\videoFile.mp4\",\n \"href\": \"-511951560-146372858133s7.mp4\",\n \"path\": \"Storage\\\\Content\\\\2154\\\\\",\n \"type\": \"教材\"\n },\n \"ErrorMessage\": \"\"\n };\n switch (params.ItemId) {\n case 2:\n result = CourseItemsPdf;\n break;\n case 3:\n result = CourseItemsVideo;\n break;\n case 1:\n result = CourseItemsDownload;\n break;\n default:\n result = CourseItemsDownload;\n break;\n }\n return { data: result };\n }\n\n /**\r\n * 4.取得課程列表\r\n * @returns\r\n */\n function PublishedActivity(params) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultTW;\n var resultCN;\n var resultUS;\n\n resultTW = {\n Status: \"200\",\n Data: [{\n \"classificationId\": 10,\n \"classificationName\": \"\",\n \"courseId\": 30390,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(繁體)\",\n \"courseTime\": \"2016/10/05~2016/10/05\",\n \"courseType\": 5,\n \"courseTypeName\": \"教室測驗(繁體)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 86917,\n \"sessionName\": \"20161005台新證券-法遵自評筆試(一般)【TEST】-教室測驗(繁體)\"\n\n }, {\n \"classificationId\": 1,\n \"classificationName\": \"\",\n \"courseId\": 52160,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(繁體)\",\n \"courseTime\": \"2016/01/01~2016/12/31\",\n \"courseType\": 6,\n \"courseTypeName\": \"問卷(繁體)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 86921,\n \"sessionName\": \"台新大學暨人資網站改版問卷調查(2016)(繁體)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 18,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(繁體)\",\n \"courseTime\": \"2016/09/07~2017/12/31\",\n \"courseType\": 7,\n \"courseTypeName\": \"學程(繁體)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 1232,\n \"sessionName\": \"EMBO課程(2016下半年)[無對應資料](繁體)\"\n }],\n ErrorMessage: \"\"\n };\n resultCN = {\n \"Status\": \"200\",\n \"Data\": [{\n \"classificationId\": 10,\n \"classificationName\": \"\",\n \"courseId\": 963,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(簡中)\",\n \"courseTime\": \"2016/11/09
09:00-13:00 \",\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程(簡中)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 85571,\n \"sessionName\": \"2016-1109信託業務人員職前訓練(4小時)-台北場(外訓包班)(簡中)\"\n }, {\n \"classificationId\": 10,\n \"classificationName\": \"\",\n \"courseId\": 59633,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(簡中)\",\n \"courseTime\": \"2016/09/07~2016/12/31\",\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗(簡中)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 86920,\n \"sessionName\": \"105下-分行業務-法令遵循自評檢核考試班(簡中)\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultUS = {\n \"Status\": \"200\",\n \"Data\": [{\n \"classificationId\": 1,\n \"classificationName\": \"\",\n \"courseId\": 34014,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(英文)\",\n \"courseTime\": \"2016/01/01~2016/12/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 85908,\n \"sessionName\": \"信託業務人員職前訓練課程(105年)(英文)\"\n }, {\n \"classificationId\": 1,\n \"classificationName\": \"\",\n \"courseId\": 28322,\n \"courseName\": \"G-技能-2001簽呈寫作訓練(英文)\",\n \"courseTime\": \"2016/10/01~2016/10/31(區間內的Mon,Wed,Fri)
09:00-17:00
休息時間12:00-13:00\",\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程(英文)\",\n \"enrollBegin\": \"2016/09/09\",\n \"enrollEnd\": \"2016/11/03\",\n \"sessionId\": 86925,\n \"sessionName\": \"20161019超強記憶創造個人競爭力(網站測試班)(英文)\"\n }],\n \"ErrorMessage\": \"\"\n };\n\n // resultTW = { \"Status\": 200, \"Data\": [{ \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 2361, \"courseName\": \"G-技能-2008初階簡報技巧\", \"courseTime\": \"2017/12/12
13:30-17:30 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/07\", \"enrollEnd\": \"2017/12/12\", \"sessionId\": 99691, \"sessionName\": \"20171212初階簡報技巧\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 64726, \"courseName\": \"M-領導力-2004跨世代領導:帶領貓型世代的關鍵技巧\", \"courseTime\": \"2017/11/11
09:00-17:00
休息時間12:00-13:00\", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/03\", \"enrollEnd\": \"2017/11/11\", \"sessionId\": 99689, \"sessionName\": \"20171111跨世代領導:帶領貓型世代的關鍵技巧\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 5614, \"courseName\": \"G-內講-2002內部講師培訓(一天精華版)\", \"courseTime\": \"2017/08/15
09:00-17:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/15\", \"sessionId\": 99685, \"sessionName\": \"20170815內部講師訓(人資包班第一梯)test\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 24838, \"courseName\": \"G-語言-1004 英文會話\", \"courseTime\": \"2017/08/25~2017/10/27 每1週(區間內的Fri)
18:00-20:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/21\", \"sessionId\": 99676, \"sessionName\": \"2017英文課金控週五人資班 \" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 72404, \"courseName\": \"8/1人力資源管理\", \"courseTime\": \"2017/08/25
09:00-12:00 \", \"courseType\": 3, \"courseTypeName\": \"外訓課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/25\", \"sessionId\": 99680, \"sessionName\": \"8/1人力資源管理\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 272, \"courseName\": \"G-舒壓-1003健康養生講座\", \"courseTime\": \"2017/08/28
09:00-14:00
休息時間12:00-13:00\", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/28\", \"sessionId\": 99674, \"sessionName\": \"20170828貴婦級紓壓講座\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 10451, \"courseName\": \"P-廣告行銷-1007說故事行銷\", \"courseTime\": \"2017/08/14
09:00-17:00
休息時間12:00-13:00\", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/14\", \"sessionId\": 99677, \"sessionName\": \"20170814說故事行銷(故事王)-test\" }, { \"classificationId\": 25, \"classificationName\": \"自主\", \"courseId\": 72174, \"courseName\": \"G-語言(自主)-100016-超簡單旅遊日語\", \"courseTime\": \"2017/12/05
18:00-20:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/12/05\", \"sessionId\": 99671, \"sessionName\": \"20171205超簡單旅遊日語(自主學習課程)\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 2390, \"courseName\": \"G-溝通-2001掌握風格,輕鬆溝通\", \"courseTime\": \"2017/10/24
13:30-17:30 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/10/24\", \"sessionId\": 99669, \"sessionName\": \"20171024掌握風格,輕鬆溝通\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 61240, \"courseName\": \"G-技能-3002商業簡報技巧\", \"courseTime\": \"2017/08/21
13:30-17:30 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/07/14\", \"enrollEnd\": \"2017/08/21\", \"sessionId\": 99667, \"sessionName\": \"20170821商業簡報技巧(八德)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 2361, \"courseName\": \"G-技能-2008初階簡報技巧\", \"courseTime\": \"2017/09/04
09:00-12:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/07/14\", \"enrollEnd\": \"2017/09/04\", \"sessionId\": 99666, \"sessionName\": \"20170904初階簡報技巧\" }, { \"classificationId\": -1, \"classificationName\": \"\", \"courseId\": 331, \"courseName\": \"G-測試-1026-勞委會課程測試+Slide課程\", \"courseTime\": \"2017/03/15~\", \"courseType\": 7, \"courseTypeName\": \"學程\", \"enrollBegin\": \"2017/03/15\", \"enrollEnd\": \"\", \"sessionId\": 1431, \"sessionName\": \"20170315-勞委+3sbook+slide課程\" }, { \"classificationId\": -1, \"classificationName\": \"\", \"courseId\": 330, \"courseName\": \"G-測試-1029-3S課程與勞委課程\", \"courseTime\": \"2017/03/15~\", \"courseType\": 7, \"courseTypeName\": \"學程\", \"enrollBegin\": \"2017/03/15\", \"enrollEnd\": \"\", \"sessionId\": 1430, \"sessionName\": \"20170315-3S課程+勞委會課程\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 11180, \"courseName\": \"P-證券-1008(外訓) 股務單位人員教育訓練\", \"courseTime\": \"2017/09/20
14:00-17:00 \", \"courseType\": 3, \"courseTypeName\": \"外訓課程\", \"enrollBegin\": \"2017/01/10\", \"enrollEnd\": \"2017/09/20\", \"sessionId\": 99286, \"sessionName\": \"2017-0920 股務單位人員教育訓練\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64901, \"courseName\": \"G-成長-1005珍愛一世情─呵護親子關係【MP4-23分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98930, \"sessionName\": \"珍愛一世情-呵護親子關係(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64895, \"courseName\": \"G-技能-1014遠離開會地獄—「開會一把罩」【MP4-32分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98907, \"sessionName\": \"遠離開會地獄—「開會一把罩」(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64891, \"courseName\": \"G-執行力-1003使命必達-淺談目標管理【MP4-23分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98921, \"sessionName\": \"使命必達-淺談目標管理(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64889, \"courseName\": \"G-成長-1006認識太極拳【MP4-12分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98943, \"sessionName\": \"認識太極拳(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64888, \"courseName\": \"G-成長-1007認識國標舞【MP4-17分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98942, \"sessionName\": \"認識國標舞(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64886, \"courseName\": \"G-成長-1010辦公室健康操【MP4-11分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98938, \"sessionName\": \"辦公室健康操(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64877, \"courseName\": \"G-成長-1003吃出健康【MP4-18分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98933, \"sessionName\": \"吃出健康(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64869, \"courseName\": \"G-溝通-1010打造職場好形象【MP4-22分鐘】(v.3)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98945, \"sessionName\": \"打造職場好形象(106年)\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 55764, \"courseName\": \"P-專業知識(信用卡)-1005信用卡進件流程與徵審作業介紹(v.3)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98975, \"sessionName\": \"信用卡進件流程與徵審作業介紹(106年)\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 29872, \"courseName\": \"P-專業知識(信用卡)-1006信用卡業務管理規範(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98976, \"sessionName\": \"信用卡業務規範(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 18025, \"courseName\": \"G-政策-1009IDP員工職涯發展計畫(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98977, \"sessionName\": \"IDP員工職涯發展計畫(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13951, \"courseName\": \"G-技能-2008【OFFICE2010】ECXEL進階應用(下)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98974, \"sessionName\": \"Excel 2010進階應用(下)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13950, \"courseName\": \"G-技能-2007【OFFICE2010】ECXEL進階應用(上)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98973, \"sessionName\": \"Excel 2010進階應用(上)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13949, \"courseName\": \"G-技能-2006【OFFICE2010】Word 2010進階應用(下)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98972, \"sessionName\": \"Word 2010進階應用(下)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13948, \"courseName\": \"G-技能-2005【OFFICE2010】Word 2010進階應用(上)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98971, \"sessionName\": \"Word 2010進階應用(上)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13939, \"courseName\": \"G-技能-1021【OFFICE2010】OUTLOOK人脈管理王(下)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98970, \"sessionName\": \"OUTLOOK人脈管理王(下)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13903, \"courseName\": \"G-技能-1020【OFFICE2010】OUTLOOK人脈管理王(上)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98969, \"sessionName\": \"OUTLOOK人脈管理王(上)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13901, \"courseName\": \"G-技能-1019【OFFICE2010】POWERPOINT創意簡報王\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98968, \"sessionName\": \"POWERPOINT創意簡報王【106年】\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 34, \"courseName\": \"P-保險-2003投資型保險證照─年金考試班\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 4, \"courseTypeName\": \"線上測驗\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98952, \"sessionName\": \"投資型保險證照-年金考試班(106年)\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 20266, \"courseName\": \"內部講師調查問券\", \"courseTime\": \"2012/08/16~2017/08/31\", \"courseType\": 6, \"courseTypeName\": \"問卷\", \"enrollBegin\": \"2012/08/16\", \"enrollEnd\": \"2017/08/31\", \"sessionId\": 24543, \"sessionName\": \"2012內部講師調查問卷\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 17954, \"courseName\": \"頂峰訓練課前問卷調查\", \"courseTime\": \"2012/05/31~2017/11/01\", \"courseType\": 6, \"courseTypeName\": \"問卷\", \"enrollBegin\": \"2012/05/31\", \"enrollEnd\": \"2017/11/01\", \"sessionId\": 21085, \"sessionName\": \"2012頂峰客戶關係經營課前問卷\" }], \"ErrorMessage\": \"\" }\n // resultCN = {\"Status\":200,\"Data\":[{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":13938,\"courseName\":\"G-技能-1018【OFFICE2010】ECXEL精算大師(下)\",\"courseTime\":\"2017/01/04~2017/12/31\",\"courseType\":1,\"courseTypeName\":\"线上课程\",\"enrollBegin\":\"2017/01/04\",\"enrollEnd\":\"2017/12/31\",\"sessionId\":98965,\"sessionName\":\"ECXEL精算大師(下)【106年】\"},{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":13900,\"courseName\":\"G-技能-1017【OFFICE2010】ECXEL精算大師(上)\",\"courseTime\":\"2017/01/04~2017/12/31\",\"courseType\":1,\"courseTypeName\":\"线上课程\",\"enrollBegin\":\"2017/01/04\",\"enrollEnd\":\"2017/12/31\",\"sessionId\":98964,\"sessionName\":\"ECXEL精算大師(上)【106年】\"},{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":68275,\"courseName\":\"G-成長-100002-食得健康,食在安心\",\"courseTime\":\"2017/03/08
01:00-23:00 \",\"courseType\":2,\"courseTypeName\":\"教室课程\",\"enrollBegin\":\"2016/10/03\",\"enrollEnd\":\"2018/10/04\",\"sessionId\":99381,\"sessionName\":\"食的健康(复制)错误测试_相同上课时间\"}],\"ErrorMessage\":\"\"}\n // resultUS = {\"Status\":200,\"Data\":[{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":13937,\"courseName\":\"G-技能-1016【OFFICE2010】WORD文書排版(下)\",\"courseTime\":\"2017/01/04~2017/12/31\",\"courseType\":1,\"courseTypeName\":\"Online course\",\"enrollBegin\":\"2017/01/04\",\"enrollEnd\":\"2017/12/31\",\"sessionId\":98963,\"sessionName\":\"WORD文書排版(下)【106年】\"},{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":41109,\"courseName\":\"G-新人-1033Welcome to Taishin【SG】\",\"courseTime\":\"2014/08/22~2017/10/31\",\"courseType\":1,\"courseTypeName\":\"Online course\",\"enrollBegin\":\"2014/08/22\",\"enrollEnd\":\"2017/10/31\",\"sessionId\":54667,\"sessionName\":\"Welcome to Taishin【SG】(test)\"}],\"ErrorMessage\":\"\"}\n\n\n switch (params.LanguageCode) {\n case \"en-US\":\n result = resultUS;\n break;\n case \"zh-CN\":\n result = resultCN;\n break;\n default:\n result = resultTW;\n break;\n }\n result.Data = _.filter(result.Data, function (item) {\n item.classificationId = parseInt(item.classificationId);\n var compareClassficationId = parseInt(params.ClassificationId);\n // console.log('item.classificationId:',item.classificationId);\n // console.log('compareClassficationId:',compareClassficationId);\n // if (!compareClassficationId) {\n // compareClassficationId = -1;\n // }\n if (compareClassficationId === -1) {\n compareClassficationId = item.classificationId;\n }\n\n return item.classificationId === compareClassficationId;\n });\n return { data: result };\n }\n\n /**\r\n * 6.取得課程詳細內容\r\n * @returns\r\n */\n function CourseSession(type) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var CourseSessionType1; /* 線上課程 */\n var CourseSessionType2; /* 教室課程 */\n var CourseSessionType3; /* 外訓 */\n var CourseSessionType4; /* 線上測驗 */\n var CourseSessionType5; /* 教室測驗 */\n var CourseSessionType6; /* 問卷 */\n var CourseSessionType7; /* 學程 */\n CourseSessionType1 = {\n \"Status\": \"200\",\n \"Data\": {\n \"costPerPerson\": 0,\n \"description\": \"1.最低稅負制溫故知新98進化版【29分鐘】 \\r\\n2.經濟基本指標【57分鐘】 \\r\\n3.投資境外結構型商品前的基本概念【33分鐘】 \\r\\n4.債券市場理論與實務【27分鐘】 \\r\\n5.保本及非保本型商品【41分鐘】 \\r\\n6.風險型態與分析【11分鐘】 \\r\\n7.衍生性金融商品法規介紹【29分鐘】 \\r\\n8.結構型商品參考法規─境外結構型商品相關【35分鐘】 \\r\\n9.有價證券信託【14分鐘】 \\r\\n10.雙雙得利投資帳戶【46分鐘】 \\r\\n11.SDS系統介紹【14分鐘】 \\r\\n12.組合式商品介紹【52分鐘】 \\r\\n13.組合式商品(SI/DCI/ELI)稅賦說明【30分鐘】 \\r\\n14.TIPS信託投資系統操作說明【102分鐘】 \\r\\n15.TRMS系統說明【16分鐘】 \\r\\n16.共同基金銷售關鍵資訊【63分鐘】 \\r\\n17.共同基金銷售關鍵資訊【課後測驗】 \\r\\n18.境內外基金相關法令【100分鐘】 \\r\\n19.規劃行信託相關法規簡介【21分鐘】\",\n \"duration\": 720,\n \"enrollCount\": 11,\n \"enrollPeriod\": \"2017/01/04~2017/06/30\",\n \"enrollRemain\": 5,\n \"enrollTime\": \"2017/01/04~2017/06/30\",\n \"outline\": \"1.最低稅負制溫故知新98進化版【29分鐘】 \\r\\n2.經濟基本指標【57分鐘】 \\r\\n3.投資境外結構型商品前的基本概念【33分鐘】 \\r\\n4.債券市場理論與實務【27分鐘】 \\r\\n5.保本及非保本型商品【41分鐘】 \\r\\n6.風險型態與分析【11分鐘】 \\r\\n7.衍生性金融商品法規介紹【29分鐘】 \\r\\n8.結構型商品參考法規─境外結構型商品相關【35分鐘】 \\r\\n9.有價證券信託【14分鐘】 \\r\\n10.雙雙得利投資帳戶【46分鐘】 \\r\\n11.SDS系統介紹【14分鐘】 \\r\\n12.組合式商品介紹【52分鐘】 \\r\\n13.組合式商品(SI/DCI/ELI)稅賦說明【30分鐘】 \\r\\n14.TIPS信託投資系統操作說明【102分鐘】 \\r\\n15.TRMS系統說明【16分鐘】 \\r\\n16.共同基金銷售關鍵資訊【63分鐘】 \\r\\n17.共同基金銷售關鍵資訊【課後測驗】 \\r\\n18.境內外基金相關法令【100分鐘】 \\r\\n19.規劃行信託相關法規簡介【21分鐘】\",\n \"reference\": [{\n \"fileExt\": \"PDF 文件\",\n \"name\": \"共同基金銷售關鍵資訊-熟知KYC、KYP,與客戶共贏\",\n \"path\": \"Storage\\\\Reference\\\\2703\\\\2126340124-1482803634927.pdf\"\n }],\n \"sessionName\": \"信託業務人員在職訓練課程(106上半年)\",\n \"sessionTime\": \"2017/01/04 ~ 2017/06/30\",\n \"target\": \"登錄信託公會者,每三年複訓完成本課程\",\n \"waitlistCount\": 5,\n \"waitlistRemain\": 100\n },\n \"ErrorMessage\": \"\"\n };\n CourseSessionType2 = {\n \"Status\": \"200\",\n \"Data\": {\n \"costPerPerson\": 500,\n \"description\": \"\",\n \"enrollCount\": 0,\n \"enrollRemain\": 45,\n \"enrollTime\": \"2016/10/03~2018/10/04\",\n \"hours\": 22,\n \"intructors\": \"蔡毓昇 (840117)
林以君 (914293)\",\n \"outline\": \"1. 喝水喝對了嗎?\\r\\n2. 餐具用對了嗎?\\r\\n3. 容器用對了嗎?\\r\\n4. 增強免疫力你做對了嗎?\\r\\n5. Q & A\",\n \"place\": \"內湖大樓203會議室\",\n \"reference\": [],\n \"sessionName\": \"食的健康(複製)錯誤測試_相同上課時間\",\n \"sessionTime\": \"2017/03/08
01:00-23:00 \",\n \"target\": \"\",\n \"trainingPoint\": 0,\n \"waitlistCount\": 100,\n \"waitlistRemain\": 100\n },\n \"ErrorMessage\": \"\"\n };\n CourseSessionType3 = {\n \"Status\": \"200\",\n \"Data\": {\n \"division\": \"信託公會(請直接至課程中報名,費用統一由HR月結支付)\",\n \"enrollCount\": 1,\n \"enrollPeriod\": \"2016/12/27~2017/04/22\",\n \"externalType\": \"一般外訓\",\n \"hours\": 6,\n \"note\": \"來上課\",\n \"outline\": \"1.各金融機構信託業業務人員\\r\\n2.財富管理相關業務人員\",\n \"ownCost\": 0,\n \"place\": \"台中市文心路二段645號11樓(新光人壽惠國大樓) \",\n \"reference\": [{\n \"fileExt\": \"pdf\",\n \"name\": \"1.pdf\",\n \"path\": \"Storage\\\\CTMSReference\\\\918\\\\547400339-1487310466496.pdf\"\n }],\n \"sessionTime\": \"2017/04/22
09:00-16:00
休息時間12:00-13:00\",\n \"subsidyCost\": 1300,\n \"totalCost\": 1300\n },\n \"ErrorMessage\": \"\"\n };\n CourseSessionType4 = {\n \"Status\": \"200\",\n \"Data\": {\n \"costPerPerson\": 0,\n \"description\": \"測試用\",\n \"duration\": 30,\n \"enrollCount\": 2,\n \"enrollPeriod\": \"2017/02/22~2017/03/20\",\n \"enrollRemain\": 5,\n \"enrollTime\": \"2017/02/22~2017/03/20\",\n \"outline\": \"\",\n \"reference\": [],\n \"sessionName\": \"20170222(測試班)\",\n \"sessionTime\": \"2017/02/22 ~ 2017/03/20\",\n \"target\": \"測試用\",\n \"waitlistCount\": 5,\n \"waitlistRemain\": 5\n },\n \"ErrorMessage\": \"\"\n };\n CourseSessionType5 = {\n \"Status\": \"200\",\n \"Data\": {\n \"costPerPerson\": 0,\n \"description\": \"\",\n \"enrollCount\": 5,\n \"enrollRemain\": 5,\n \"enrollTime\": \"2017/02/18~2017/05/12\",\n \"hours\": 1,\n \"intructors\": \"內部講師\",\n \"outline\": \"\",\n \"place\": \"文心分行3樓\",\n \"reference\": [],\n \"sessionName\": \"20170512徵信照會證照研習班 (補考) \",\n \"sessionTime\": \"2017/05/12
09:00-10:00 \",\n \"target\": \"\",\n \"trainingPoint\": 0,\n \"waitlistCount\": 5,\n \"waitlistRemain\": 5\n },\n \"ErrorMessage\": \"\"\n };\n CourseSessionType6 = {\n \"Status\": \"200\",\n \"Data\": {\n \"costPerPerson\": 0,\n \"description\": \"TEST\",\n \"duration\": -1,\n \"enrollCount\": 2,\n \"enrollPeriod\": \"2017/02/17~2017/06/30\",\n \"enrollRemain\": 5,\n \"enrollTime\": \"2017/02/17~2017/06/30\",\n \"outline\": \"\",\n \"reference\": [{\n \"fileExt\": \"PDF 文件\",\n \"name\": \"1\",\n \"path\": \"Storage\\\\Reference\\\\2767\\\\-1480076052-1487315027958.pdf\"\n }],\n \"sessionName\": \"2017問卷測試\",\n \"sessionTime\": \"2017/02/17 ~ 2017/06/30\",\n \"target\": \"對象\",\n \"waitlistCount\": 5,\n \"waitlistRemain\": 5\n },\n \"ErrorMessage\": \"\"\n };\n CourseSessionType7 = {\n \"Status\": \"200\",\n \"Data\": {\n \"costPerPerson\": 0,\n \"courses\": [{\n \"courseId\": 45,\n \"courseName\": \"G-政策-100002-eMBO系統-績效目標設定(v.1)\",\n \"courseTime\": \"2017/02/17 ~ 2017/06/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"order\": 1,\n \"sessionId\": 99349\n }, {\n \"courseId\": 3366,\n \"courseName\": \"G-政策-1008eMBO系統-職場行為調整\",\n \"courseTime\": \"2017/02/17 ~ 2017/06/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"order\": 2,\n \"sessionId\": 99350\n }, {\n \"courseId\": 9280,\n \"courseName\": \"G-政策-1020IDP員工職涯發展計畫-介紹篇\",\n \"courseTime\": \"2017/02/17 ~ 2017/06/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"order\": 3,\n \"sessionId\": 99351\n }],\n \"description\": \"本學程共有三門課程,每門課程需閱讀達90%以上,始得通過。\\r\\n1. eMBO系統-績效目標設定:15分鐘\\r\\n2. eMBO系統-職場行為調整:6分鐘\\r\\n3. IDP員工職涯發展計畫-介紹篇:6分鐘 \",\n \"enrollCount\": 0,\n \"enrollRemain\": 10,\n \"enrollTime\": \"2017/02/17~2017/06/30\",\n \"sessionName\": \"學程2017年測試\",\n \"sessionTime\": \"2017/02/17 ~ 2017/06/30\",\n \"target\": \"MA\"\n },\n \"ErrorMessage\": \"\"\n };\n switch (type) {\n case enumCourseType.webCourse:\n result = CourseSessionType1;\n break;\n case enumCourseType.classCourse:\n result = CourseSessionType2;\n break;\n case enumCourseType.externalCourse:\n result = CourseSessionType3;\n break;\n case enumCourseType.webTest:\n result = CourseSessionType4;\n break;\n case enumCourseType.classTest:\n result = CourseSessionType5;\n break;\n case enumCourseType.questList:\n result = CourseSessionType6;\n break;\n case enumCourseType.courage:\n result = CourseSessionType7;\n break;\n default:\n result = { Status: 400, ErrorMessage: \"未知的課程類型\" };\n break;\n }\n return { data: result };\n }\n\n /**\r\n * 7.取得課程測驗內容\r\n * @returns\r\n */\n function ExamSurveyContent(params) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultTestData1 = {\n \"Status\": \"200\",\n \"Data\": {\n \"examHistoryId\": 1515029,\n \"itemId\": 175226,\n \"limitMins\": -1,\n \"limitTimes\": 1,\n \"remainingMins\": 1642,\n \"remainingTimes\": 4,\n \"questions\": [{\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42109,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"我明確知道我在這個課程要學習到什麼。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"true\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"true\"\n }],\n \"questionId\": 42110,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程內容架構清晰、具邏輯且份量適中。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"true\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42111,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程內容完整、具正確性並符合我的學習程度。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42112,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程的表現方式(如文字、圖片、動畫、影像、聲音…等)能有效傳達學習內容。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42113,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程學習介面(如字型、組成、配置、呈現方式…等)能有效呈現學習內容。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42120,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程提供清晰、適切的學習導引功能(如:向前、後退、回主選單、離開…),並且容易操作與使用。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"2\",\n \"value\": \"\"\n }],\n \"questionId\": 42114,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"系統所提供的網路頻寬與連線服務是足夠的。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"這是選項5,假定有勾選\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"這是選項4,假定有勾選\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"這是選項3,假定沒勾選\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"這是選項2,假定沒勾選\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"這是選項1,假定有勾選\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 6,\n \"title\": \"這是選項6,假定有勾選\",\n \"type\": \"2\",\n \"value\": \"\"\n }],\n \"questionId\": 42115,\n \"questionType\": 2,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"這是複選題,用以測試是否運作正常。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42121,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課後測驗能幫助我學習,並能讓我知道是否有學習到應該習得的。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42116,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程有達到我的期望。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42117,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"課程內容對我的工作是有幫助的。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42118,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"我對人力資源處訓練發展組提供的 e-Learning 課程服務感到滿意。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 5,\n \"title\": \"非常同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \" \",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"非常不同意\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 42119,\n \"questionType\": 4,\n \"required\": true,\n \"scoreRate\": 0,\n \"title\": \"我會向其他同仁推薦此課程。{是必選題,題目序號後面應有標示提醒}\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \" \",\n \"type\": \"3\",\n \"value\": \"AAATE\"\n }],\n \"questionId\": 42122,\n \"questionType\": 3,\n \"required\": false,\n \"scoreRate\": 0,\n \"title\": \"如有其他相關建議,請填寫在下面空白處,謝謝!{不是必選題}\"\n }]\n },\n \"ErrorMessage\": \"\"\n };\n var resultTestData2 = {\n \"Status\": \"200\",\n \"Data\": {\n \"examHistoryId\": 1515312,\n \"itemId\": 306761,\n \"limitMins\": 30,\n \"limitTimes\": 3,\n \"remainingMins\": -1,\n \"remainingTimes\": 6,\n \"questions\": [{\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88414,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"事業銷售商品或服務附送贈品,其贈品價值上限為:商品或服務價值在新臺幣100元以上者,為商品或服務價值之二分之一;商品或服務價值在新臺幣100元以下者,為新臺幣50元。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88381,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行辦理財富管理業務或對非財富管理部門客戶銷售金融商品,不得以提供贈品方式招攬新客戶開立存款帳戶,以免違反銀行法第34條之規定,至其餘贈品活動仍須遵守銀行公會會員自律公約之相關規定。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"銷售投資型保險商品予客戶時不得任意銷售風險過高、結構過於複雜之商品。但有客觀事實證明客戶有相當專業認識及風險承擔能力者,不在此限。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"就非專業投資人之年齡、對本商品相關知識、投資經驗、財產狀況、交易目的及商品理解等要素,綜合評估其風險承受能力,無須分級,只需要保人簽名確認即可。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"應請客戶提供相關財務資訊,若客戶拒絕提供,招攬人員須於要保書予以註記,並請其於註記處親自簽名確認。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"如係連結結構型商品者,另應提供客戶投資報酬與風險告知書、結構型商品中文產品說明書及中文投資人須知。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88387,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"下列關於投資型保險商品銷售應注意事項之敘述,何者正確?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88403,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行業提供投資型金融商品或服務前,應依各類金融商品或服務之特性評估金融商品或服務對金融消費者之適合度。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"該境外結構型商品因利率、匯率、有價證券市價或其他指標之變動,有直接導致本金損失或超過當初本金損失之虞者。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"該境外結構型商品因發行機構或他人之業務或財產狀況之變化,有直接導致本金損失或超過當初本金損失之虞者。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"該境外結構型商品因其他經主管機關規定足以影響投資人判斷之重要事項,有直接導致本金損失或超過當初本金損失之虞者。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"受託或銷售機構就前項境外結構型商品受託投資、受託買賣或以之為投資型保單投資標的,涉有契約權利行使期間、解除期間及效力之限制者。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88392,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"依據境外結構型商品管理規則,下列何者為受託或銷售機構受託投資,受託買賣境外結構型商品或以之為投資型保單投資標的前,應向投資人說明之事項?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"金融消費者資金操作狀況及專業能力。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"金融消費者之投資屬性、對風險之瞭解及風險承受度。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"金融消費者服務之合適性,合適之投資建議範圍。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"金融消費者之所得與資金來源。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88419,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行業提供投資型金融商品或服務,於訂立契約前,應充分瞭解金融消費者之相關資料,其內容至少應包括下列何者事項?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"客戶風險屬性與商品風險屬性不適配時,銀行仍宜與客戶進行交易。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"對於高齡、教育水準較低等弱勢族群客戶,基於風險承擔能力及商品適合度考量,銀行應避免與此類客戶承作結構型商品交易,以減少交易糾紛。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"客戶承作雙元貨幣等不保本之結構型商品之金額占其往來資金比率較高者,銀行宜主動提醒客戶相關商品之風險,避免客戶因投資部位過度集中而蒙受重大損失。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"得以存款名義銷售。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88382,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"下列何者為銀行辦理結合存款與衍生性金融商品之結構型商品業務時,應留意之事項?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"對金融消費者所負擔義務不得低於廣告之內容。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"對金融商品或服務內容之揭露如涉及利率、費用、報酬及風險時,應以衡平及顯著之方式表達。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"應忠於原著,以英文表達,必要時得附註中文。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"應以金融服務業名義為之。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88405,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"金融服務業從事廣告、業務招攬及營業促銷活動,應遵守哪些原則?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88406,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"境外結構型商品之投資人須知之重要內容,應以錄音方式保留紀錄。但對專業投資人得以交付書面或影音媒體方式取代。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88401,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行業有關外匯業務之經營,除銀行業辦理外匯業務管理辦法或央行另有規定者外,應向央行申請許可,並經發給指定證書或許可函後,始得辦理。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88388,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"最近一期經會計師查核或核閱之財務報告總資產超過新臺幣5000萬元之法人或基金,為境外結構型商品管理規則中所規定之專業投資人。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88389,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"於銷售投資型保險商品時,應審酌被保險人年齡等情況予以推介或銷售適當之商品,當被保險人投保時之保險年齡大於或等於70或本商品連結有結構型商品且被保險人於該結構型商品期滿時之保險年齡大於或等於70時,應請要保人及被保險人於要保書中之重要事項告知書或「結構型債券投資報酬與風險告知書」簽名已瞭解並願意承擔投資風險,如要保人及被保險人不願填寫則仍同意其投保。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"不得以吸收存款為目的。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"應按業務類別,分別適用各該業務法令規定及自律規範。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"贈品之單一價格以新臺幣一千元內為宜。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"銀行得為維持與客戶關係、其他業務推展或企業形象宣導等非吸收存款目的,舉辦與存款業務有關之贈品業務推廣活動。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88418,\n \"questionType\": 1,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"關於銀行業辦理與存款業務有關之贈品贈獎業務推廣活動時應遵循之規定,以下何者為非?\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88383,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行辦理財富管理業務,應請切實注意以誠信及充分揭露原則辦理,廣告文宣中就金融商品之可能報酬、風險及限制條件之揭露,應以衡平且顯著方式表達,不得有誇大不實陳述或誤導消費者之虞情事。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"除法令另有規定外,行銷廣告文件於對外使用前應經法令遵循主管審核。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"得使人相信能保證本金之安全或獲利。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"對於獲利與風險應作平衡報導,且得載有與向主管機關申請文件內容不符之文字或設計。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"特定投資標的之名稱應適當表達其特性及風險,不得使用可能誤導客戶之名稱。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88397,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"信託業辦理營業促銷活動時,應遵守下列何項規定?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88416,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"「銀行辦理衍生性金融商品自律規範」所稱以錄音方式保留向一般客戶宣讀結構型商品交易客戶須知之重要內容,交易遇有爭議,不必保留至爭議終結為止。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"任何說明或揭露之資訊或資料均須正確。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"所有銷售文件無須編印頁碼。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 3,\n \"title\": \"銷售文件之用語應以中文表達,並力求淺顯易懂,必要時得附註原文。\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 4,\n \"title\": \"應本於誠實信用原則,並以金融消費者能充分瞭解之文字或其他方式為之。\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88409,\n \"questionType\": 2,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"金融服務業說明金融商品或服務契約之重要內容及揭露風險,應遵守哪些基本原則?(複選題)\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88398,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行辦理外幣保證金交易及組合式產品等業務,應制定與落實瞭解客戶(KYC )原則,並充分揭露相關風險,不得有誤導客戶情事。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [{\n \"attachment\": \"\",\n \"order\": 1,\n \"title\": \"是\",\n \"type\": \"1\",\n \"value\": \"\"\n }, {\n \"attachment\": \"\",\n \"order\": 2,\n \"title\": \"否\",\n \"type\": \"1\",\n \"value\": \"\"\n }],\n \"questionId\": 88386,\n \"questionType\": 6,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行依據「銀行辦理衍生性金融商品自律規範」錄音或錄影所留存之個人資料,任何人均得於保存期限內,向銀行申請調閱。除該資料之提供有妨害銀行或第三人之重大利益外,銀行應配合提供前項紀錄,並得向當事人收取必要成本費用。\"\n }, {\n \"attachment\": \"\",\n \"groupName\": \"\",\n \"options\": [\n // {\n // \"attachment\": \"\",\n // \"order\": 1,\n // \"title\": \"是\",\n // \"type\": \"1\",\n // \"value\": \"\"\n // },\n // {\n // \"attachment\": \"\",\n // \"order\": 2,\n // \"title\": \"否\",\n // \"type\": \"1\",\n // \"value\": \"\"\n // },\n {\n \"attachment\": \"\",\n \"correctAnswer\": false,\n \"order\": 1,\n \"preTitle\": false,\n \"textValue\": \"\",\n \"title\": \" \",\n \"type\": \"3\",\n \"value\": \"HR網站→台新大學→訓練中心\"\n }],\n \"questionId\": 88400,\n \"questionType\": 3,\n \"required\": false,\n \"scoreRate\": 5,\n \"title\": \"銀行業經主管機關命其於一定期間內停止申辦外匯業務,於停止期間尚未屆滿或未提報適當之具體改善措施,或提報之改善措施未獲主管機關認可前,不得以函報備查方式開辦依本辦法規定得函報備查之外匯業務。\"\n }]\n },\n \"ErrorMessage\": \"\"\n };\n // console.log(params);\n switch (params.type) {\n case '問卷':\n result = resultTestData1;\n break;\n case '測驗':\n result = resultTestData2;\n break;\n default:\n result = { Status: 400, Data: null, ErrorMessage: \"未知的課程類型\" };\n }\n return { data: result };\n }\n /**\r\n * 8.測驗結果(P.7~8)\r\n * @returns\r\n */\n function InteractionData(params) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultTestData1Answer = {\n \"Status\": \"200\",\n \"Data\": null,\n \"ErrorMessage\": \"\"\n };\n var resultTestData2Answer = {\n \"Status\": \"200\",\n \"Data\": {\n \"questionResults\": [{\n \"correctAnswer\": \"1,2,3,4\",\n \"questionId\": 88419,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"3\",\n \"questionId\": 88418,\n \"studentAnswer\": \"x\"\n }, {\n \"correctAnswer\": \"2\",\n \"questionId\": 88416,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1\",\n \"questionId\": 88414,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1,3,4\",\n \"questionId\": 88409,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"\",\n \"questionId\": 88406,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1,2,4\",\n \"questionId\": 88405,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1\",\n \"questionId\": 88403,\n \"studentAnswer\": \"2\"\n }, {\n \"correctAnswer\": \"\",\n \"questionId\": 88401,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"HR網站→台新大學→訓練中心\",\n \"questionId\": 88400,\n \"studentAnswer\": \"asd\"\n }, {\n \"correctAnswer\": \"1\",\n \"questionId\": 88398,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1,4\",\n \"questionId\": 88397,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1,2,3,4\",\n \"questionId\": 88392,\n \"studentAnswer\": \"x\"\n }, {\n \"correctAnswer\": \"2\",\n \"questionId\": 88389,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"\",\n \"questionId\": 88388,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1,3,4\",\n \"questionId\": 88387,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"\",\n \"questionId\": 88386,\n \"studentAnswer\": \"2\"\n }, {\n \"correctAnswer\": \"1\",\n \"questionId\": 88383,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"2,3\",\n \"questionId\": 88382,\n \"studentAnswer\": \"1\"\n }, {\n \"correctAnswer\": \"1\",\n \"questionId\": 88381,\n \"studentAnswer\": \"1\"\n }],\n \"right\": 0,\n \"score\": 0,\n \"totalQuestions\": 20,\n \"wrong\": 20\n },\n \"ErrorMessage\": \"\"\n };\n // console.log(\"params:\", params);\n switch (params.type) {\n case '問卷':\n result = resultTestData1Answer;\n break;\n case '測驗':\n result = resultTestData2Answer;\n break;\n default:\n result = { Status: 400, Data: null, ErrorMessage: \"未知的課程類型\" };\n }\n return { data: result };\n }\n\n /**\r\n * 11.待修課程列表\r\n * @returns\r\n */\n function MyUnfinishedActivities(params) {\n return new Promise(function (resolve, reject) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultTW;\n var resultCN;\n var resultUS;\n\n resultTW = {\n \"Status\": \"200\",\n \"Data\": [{\n \"courseId\": 69435,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 2165989,\n \"progress\": \"0/1\",\n \"sessionId\": 99354,\n \"sessionName\": \"20170512徵信照會證照研習班 (補考) \",\n \"sessionTime\": \"2017/05/12
09:00-10:00 \",\n \"status\": \"未曾觀看\"\n }, {\n \"courseId\": 67418,\n \"courseType\": 3,\n \"courseTypeName\": \"外訓\",\n \"enrollmentId\": 2165984,\n \"progress\": \"0/1\",\n \"sessionId\": 99353,\n \"sessionName\": \"20170306北區對保實務研習班 (補考)\",\n \"sessionTime\": \"2017/03/06
09:00-10:00 \",\n \"status\": \"待修中\"\n }, {\n \"courseId\": 10790,\n \"courseType\": 5,\n \"courseTypeName\": \"教室測驗\",\n \"enrollmentId\": 2165972,\n \"progress\": \"0/1\",\n \"sessionId\": 99207,\n \"sessionName\": \"20170302Oracle PL/SQL認證測驗 \",\n \"sessionTime\": \"2017/03/02
10:00-12:00 \",\n \"status\": \"待修中\"\n }, {\n \"courseId\": 61240,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 2165974,\n \"progress\": \"1/2\",\n \"sessionId\": 99345,\n \"sessionName\": \"20170420商業簡報技巧(八德)\",\n \"sessionTime\": \"2017/04/20
09:00-12:00 \",\n \"status\": \"未完成\"\n }, {\n \"courseId\": 9330,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 2165973,\n \"progress\": \"1/2\",\n \"sessionId\": 95401,\n \"sessionName\": \"20170417簡報製作技巧(2010版)\",\n \"sessionTime\": \"2017/04/17
13:30-17:30 \",\n \"status\": \"等待簽核中\"\n }, {\n \"courseId\": 71771,\n \"courseType\": 6,\n \"courseTypeName\": \"線上問卷\",\n \"enrollmentId\": 2165970,\n \"progress\": \"1/20\",\n \"sessionId\": 98593,\n \"sessionName\": \"信託業務人員在職訓練課程(106上半年)\",\n \"sessionTime\": \"2017/01/04~2017/06/30\",\n \"status\": \"未完成\"\n }, {\n \"courseId\": 2361,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 2165963,\n \"progress\": \"1/2\",\n \"sessionId\": 98736,\n \"sessionName\": \"20170308初階簡報技巧\",\n \"sessionTime\": \"2017/03/08
13:30-17:30 \",\n \"status\": \"未完成\"\n }, {\n \"courseId\": 71776,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 2165962,\n \"progress\": \"0/3\",\n \"sessionId\": 98600,\n \"sessionName\": \"信託在職-組合式商品簡介 (106上半年)\",\n \"sessionTime\": \"2017/01/04~2017/06/30\",\n \"status\": \"未完成\"\n }, {\n \"courseId\": 64877,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 2165961,\n \"progress\": \"0/2\",\n \"sessionId\": 98933,\n \"sessionName\": \"吃出健康(106年)\",\n \"sessionTime\": \"2017/01/04~2017/12/31\",\n \"status\": \"未完成\"\n }, {\n \"courseId\": 0,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 2165976,\n \"progress\": \"\",\n \"sessionId\": 99286,\n \"sessionName\": \"2017-0920 股務單位人員教育訓練\",\n \"sessionTime\": \"~\",\n \"status\": \"等待簽核中\"\n }, {\n \"courseId\": 0,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 2165975,\n \"progress\": \"\",\n \"sessionId\": 98652,\n \"sessionName\": \"2017-0422信託業務人員在職訓練-台中場\",\n \"sessionTime\": \"~\",\n \"status\": \"等待簽核中\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultCN = {\n \"Status\": \"200\",\n \"Data\": [{\n \"courseId\": 66903,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollmentId\": 1975394,\n \"progress\": \"0/3\",\n \"sessionId\": 91423,\n \"sessionName\": \"理專APP功能操作與使用(test)(簡中)\",\n \"sessionTime\": \"2016/07/25~2016/12/31\",\n \"status\": \"未完成(簡中)\"\n }, {\n \"courseId\": 963,\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程(簡中)\",\n \"enrollmentId\": 2118844,\n \"progress\": \"0/2\",\n \"sessionId\": 93496,\n \"sessionName\": \"20161231信託業務人員職前訓練(4小時)-台北場(簡中)\",\n \"sessionTime\": \"2016/12/31
13:00-17:00 \",\n \"status\": \"待修中(簡中)\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultUS = {\n \"Status\": \"200\",\n \"Data\": [{\n \"courseId\": 58954,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollmentId\": 2118839,\n \"progress\": \"0/1\",\n \"sessionId\": 96530,\n \"sessionName\": \"「看見愛的力量」微電影(2016)(英文)\",\n \"sessionTime\": \"2016/12/01~2016/12/31\",\n \"status\": \"未完成(英文)\"\n }, {\n \"courseId\": 305,\n \"courseType\": 7,\n \"courseTypeName\": \"學程(英文)\",\n \"enrollmentId\": 0,\n \"progress\": \"0/12\",\n \"sessionId\": 1356,\n \"sessionName\": \"新人e起來(105-Q4)(英文)\",\n \"sessionTime\": \"2016/10/01~2016/12/31\",\n \"status\": \"未完成(英文)\"\n }, {\n \"courseId\": 290,\n \"courseType\": 7,\n \"courseTypeName\": \"學程(英文)\",\n \"enrollmentId\": 0,\n \"progress\": \"0/26\",\n \"sessionId\": 1370,\n \"sessionName\": \"人身保險業務員在職訓練第一年(2016-V)人身保險業務員在職訓練第一年(2016-V)【含洗錢】(英文)\",\n \"sessionTime\": \"2016/11/01~2016/12/27\",\n \"status\": \"未完成(英文)\"\n }],\n \"ErrorMessage\": \"\"\n };\n switch (params.LanguageCode) {\n case 'en-US':\n result = resultUS;\n break;\n case 'zh-CN':\n result = resultCN;\n break;\n default:\n result = resultTW;\n break;\n }\n\n if (params.LanguageCode === 'zh-TW') {\n setTimeout(function () {\n resolve({ data: result });\n }, 1000);\n } else {\n resolve({ data: result });\n }\n });\n }\n\n /**\r\n * 12.修課記錄列表\r\n * @returns\r\n */\n function MyFinishedActivities(params) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultTW;\n var resultCN;\n var resultUS;\n\n resultTW = {\n \"Status\": \"200\",\n \"Data\": [{\n \"courseId\": 4,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 161360,\n \"sessionId\": 2056,\n \"sessionName\": \"Acrobat_PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應用(100上半年)\",\n \"sessionTime\": \"2011/01/01~2011/06/30\",\n \"status\": 3\n }, {\n \"courseId\": 12,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1012635,\n \"sessionId\": 46737,\n \"sessionName\": \"Time is Money:時間管理(103上半年)\",\n \"sessionTime\": \"2014/01/01~2014/06/30\",\n \"status\": 3\n }, {\n \"courseId\": 12,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1854663,\n \"sessionId\": 82308,\n \"sessionName\": \"Time is Money:時間管理(105上半年)\",\n \"sessionTime\": \"2016/01/04~2016/06/30\",\n \"status\": 2\n }, {\n \"courseId\": 34,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 1765530,\n \"sessionId\": 82149,\n \"sessionName\": \"投資型保險證照-年金考試班(105-01)\",\n \"sessionTime\": \"2016/01/04~2016/01/31\",\n \"status\": 3\n }, {\n \"courseId\": 34,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 1852664,\n \"sessionId\": 85907,\n \"sessionName\": \"投資型保險證照-年金考試班(105-04)\",\n \"sessionTime\": \"2016/04/01~2016/04/30\",\n \"status\": 3\n }, {\n \"courseId\": 34,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 1955630,\n \"sessionId\": 89956,\n \"sessionName\": \"投資型保險證照-年金考試班(105下半年)\",\n \"sessionTime\": \"2016/07/01~2016/12/27\",\n \"status\": 2\n }, {\n \"courseId\": 59,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 7736,\n \"sessionId\": 25,\n \"sessionName\": \"簡易外匯機制考試班(9910-9912)\",\n \"sessionTime\": \"2010/10/01~2010/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 59,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 2089734,\n \"sessionId\": 94266,\n \"sessionName\": \"簡易外匯機制考試班(通路105-Q4)\",\n \"sessionTime\": \"2016/10/01~2016/12/30\",\n \"status\": 3\n }, {\n \"courseId\": 60,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 14330,\n \"sessionId\": 17,\n \"sessionName\": \"開戶對保作業實務介紹(9910-9912)\",\n \"sessionTime\": \"2010/10/01~2010/12/31\",\n \"status\": 2\n }, {\n \"courseId\": 60,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1765452,\n \"sessionId\": 82173,\n \"sessionName\": \"開戶對保作業實務介紹(105-Q1)\",\n \"sessionTime\": \"2016/01/04~2016/03/31\",\n \"status\": 3\n }, {\n \"courseId\": 60,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 2131900,\n \"sessionId\": 94261,\n \"sessionName\": \"開戶對保作業實務介紹(105-Q4)\",\n \"sessionTime\": \"2016/10/01~2016/12/30\",\n \"status\": 3\n }, {\n \"courseId\": 61,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 244471,\n \"sessionId\": 7229,\n \"sessionName\": \"自行查核相關規範及注意事項(100-Q3)\",\n \"sessionTime\": \"2011/07/01~2011/09/30\",\n \"status\": 2\n }, {\n \"courseId\": 83,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1580993,\n \"sessionId\": 74983,\n \"sessionName\": \"認識國標舞(104下半年)\",\n \"sessionTime\": \"2015/08/04~2015/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 115,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 1782552,\n \"sessionId\": 83589,\n \"sessionName\": \"20160412+0419內部講師培訓 \",\n \"sessionTime\": \"2016/04/12
09:00-17:00
休息時間12:00-13:00

2016/04/19
09:00-17:00
休息時間12:00-13:00\",\n \"status\": 2\n }, {\n \"courseId\": 121,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 218800,\n \"sessionId\": 7151,\n \"sessionName\": \"20110823簽呈寫作訓練\",\n \"sessionTime\": \"2011/08/23
13:30-18:00 \",\n \"status\": 2\n }, {\n \"courseId\": 219,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 264566,\n \"sessionId\": 8329,\n \"sessionName\": \"20111011-Fun輕鬆~~創造快樂的生活\",\n \"sessionTime\": \"2011/10/11
14:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 417,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 20519,\n \"sessionId\": 639,\n \"sessionName\": \"防制洗錢,大家一起來!(2010)\",\n \"sessionTime\": \"2010/11/15~2010/11/26\",\n \"status\": 2\n }, {\n \"courseId\": 440,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 16220,\n \"sessionId\": 656,\n \"sessionName\": \"理專銷售一致化法規檢測(9911)\",\n \"sessionTime\": \"2010/11/11~2010/11/12\",\n \"status\": 3\n }, {\n \"courseId\": 555,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 16934,\n \"sessionId\": 770,\n \"sessionName\": \"理專銷售一致化法規檢測(題型測試)\",\n \"sessionTime\": \"2010/11/12~2010/11/12\",\n \"status\": 3\n }, {\n \"courseId\": 1150,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 43260,\n \"sessionId\": 1544,\n \"sessionName\": \"1214講師座談會\",\n \"sessionTime\": \"2010/12/14
14:00-17:30 \",\n \"status\": 2\n }, {\n \"courseId\": 1427,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 53226,\n \"sessionId\": 1848,\n \"sessionName\": \"資訊安全教育\",\n \"sessionTime\": \"2011/01/03~2011/01/21\",\n \"status\": 2\n }, {\n \"courseId\": 1511,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1767571,\n \"sessionId\": 82177,\n \"sessionName\": \"覆核實務作業介紹(通路105-Q1)\",\n \"sessionTime\": \"2016/01/04~2016/03/31\",\n \"status\": 3\n }, {\n \"courseId\": 1684,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 97963,\n \"sessionId\": 2348,\n \"sessionName\": \"員工保密規約測驗 (100-Q1)\",\n \"sessionTime\": \"2011/01/10~2011/03/31\",\n \"status\": 2\n }, {\n \"courseId\": 1926,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 98474,\n \"sessionId\": 2658,\n \"sessionName\": \"資訊安全教育(問卷補考班)\",\n \"sessionTime\": \"2011/01/31~2011/02/25\",\n \"status\": 2\n }, {\n \"courseId\": 2353,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 115681,\n \"sessionId\": 3672,\n \"sessionName\": \"20110401改變的力量(下午場)\",\n \"sessionTime\": \"2011/04/01
14:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 2759,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 111186,\n \"sessionId\": 3622,\n \"sessionName\": \"當幸福來敲門【此為第一季台新大學宣傳活動,不認列訓練時數】\",\n \"sessionTime\": \"2011/04/14~2011/04/20 每1週(區間內的Mon,Tue,Wed,Thu,Fri)
16:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 3062,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 121338,\n \"sessionId\": 4155,\n \"sessionName\": \"1000329測試\",\n \"sessionTime\": \"2011/03/29~2011/03/29\",\n \"status\": 3\n }, {\n \"courseId\": 3366,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 137379,\n \"sessionId\": 4842,\n \"sessionName\": \"eMBO系統-職場行為調整 (一般同仁)-功能單位、法金\",\n \"sessionTime\": \"2011/04/18~2011/04/29\",\n \"status\": 2\n }, {\n \"courseId\": 3620,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 147507,\n \"sessionId\": 4928,\n \"sessionName\": \"100年理專專業檢測測驗班(補考班) \",\n \"sessionTime\": \"2011/04/22~2011/04/22\",\n \"status\": 3\n }, {\n \"courseId\": 3921,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 157915,\n \"sessionId\": 5504,\n \"sessionName\": \"覆核實務-小百科(5)\",\n \"sessionTime\": \"2011/05/04~2011/06/17\",\n \"status\": 3\n }, {\n \"courseId\": 4033,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 166491,\n \"sessionId\": 5669,\n \"sessionName\": \"無三不成禮\",\n \"sessionTime\": \"2011/05/13~2011/06/17\",\n \"status\": 2\n }, {\n \"courseId\": 4102,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 172835,\n \"sessionId\": 5598,\n \"sessionName\": \"201110525體驗學習教學技巧分享\",\n \"sessionTime\": \"2011/05/25
13:30-17:30 \",\n \"status\": 2\n }, {\n \"courseId\": 4102,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 1165246,\n \"sessionId\": 57327,\n \"sessionName\": \"20140903破冰手法大解析(優秀內部講師免費活動)\",\n \"sessionTime\": \"2014/09/03
13:30-17:30 \",\n \"status\": 2\n }, {\n \"courseId\": 4102,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 1576652,\n \"sessionId\": 74912,\n \"sessionName\": \"20150922我的熱情來自於成就他人\",\n \"sessionTime\": \"2015/09/22
15:00-18:00 \",\n \"status\": 2\n }, {\n \"courseId\": 4102,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 2050891,\n \"sessionId\": 93035,\n \"sessionName\": \"20160930國際大師的創意教學技法與學習新趨勢\",\n \"sessionTime\": \"2016/09/30
14:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 4259,\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程\",\n \"enrollmentId\": 610169,\n \"sessionId\": 26912,\n \"sessionName\": \"2012-0921金融市場常識與職業道德\",\n \"sessionTime\": \"2012/09/21
18:00-20:00 \",\n \"status\": 2\n }, {\n \"courseId\": 4365,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 165743,\n \"sessionId\": 5911,\n \"sessionName\": \"OJT-3S把服務做到最好\",\n \"sessionTime\": \"2011/05/17
10:00-10:30 \",\n \"status\": 2\n }, {\n \"courseId\": 4366,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 165771,\n \"sessionId\": 5912,\n \"sessionName\": \"OJT-法令遵循及資訊安全宣導\",\n \"sessionTime\": \"2011/05/17
10:30-11:00 \",\n \"status\": 2\n }, {\n \"courseId\": 4684,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 191644,\n \"sessionId\": 6213,\n \"sessionName\": \"100上-信用卡-法令遵循自評檢核考試班\",\n \"sessionTime\": \"2011/06/01~2011/06/16\",\n \"status\": 3\n }, {\n \"courseId\": 5283,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 185889,\n \"sessionId\": 6758,\n \"sessionName\": \"個人資料保護法因應與衝擊認知教育訓練(功能、法金)\",\n \"sessionTime\": \"2011/06/20~2011/07/01\",\n \"status\": 2\n }, {\n \"courseId\": 8995,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 225227,\n \"sessionId\": 8668,\n \"sessionName\": \"3Sbook,隨時分享簡單、真心、極優的每一刻!(功能、法金)\",\n \"sessionTime\": \"2011/07/29~2011/08/12\",\n \"status\": 2\n }, {\n \"courseId\": 9477,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 243312,\n \"sessionId\": 9185,\n \"sessionName\": \"20110905-1 派外主管管理須知\",\n \"sessionTime\": \"2011/09/05
14:00-16:00 \",\n \"status\": 2\n }, {\n \"courseId\": 9477,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 245342,\n \"sessionId\": 9420,\n \"sessionName\": \"20110905-2 薪資制度與稅務處理\",\n \"sessionTime\": \"2011/09/05
16:30-20:30 \",\n \"status\": 2\n }, {\n \"courseId\": 9477,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 245343,\n \"sessionId\": 9422,\n \"sessionName\": \"20111003 員工招聘任用\",\n \"sessionTime\": \"2011/10/03
17:00-20:00 \",\n \"status\": 2\n }, {\n \"courseId\": 9477,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 245346,\n \"sessionId\": 9426,\n \"sessionName\": \"20111013 社會保險與員工福利\",\n \"sessionTime\": \"2011/10/13
17:00-20:00 \",\n \"status\": 2\n }, {\n \"courseId\": 9477,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 464127,\n \"sessionId\": 23026,\n \"sessionName\": \"20121003 與工會共舞\",\n \"sessionTime\": \"2012/10/03
15:00-18:00 \",\n \"status\": 2\n }, {\n \"courseId\": 9680,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 554420,\n \"sessionId\": 22225,\n \"sessionName\": \"產險考照模擬測驗(101下半年)\",\n \"sessionTime\": \"2012/07/01~2012/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 10817,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 291201,\n \"sessionId\": 11764,\n \"sessionName\": \"20111107內控內稽案例暨法令宣導(人力資源處)\",\n \"sessionTime\": \"2011/11/07
15:30-17:30 \",\n \"status\": 2\n }, {\n \"courseId\": 11371,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 288776,\n \"sessionId\": 11704,\n \"sessionName\": \"防制洗錢,大家一起來!(2011-法金、功能)\",\n \"sessionTime\": \"2011/10/31~2011/11/11\",\n \"status\": 2\n }, {\n \"courseId\": 11371,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 554046,\n \"sessionId\": 26829,\n \"sessionName\": \"防制洗錢,大家一起來!(2012-功能其他單位)\",\n \"sessionTime\": \"2012/10/08~2012/10/25\",\n \"status\": 2\n }, {\n \"courseId\": 11920,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 306566,\n \"sessionId\": 12473,\n \"sessionName\": \"100-11-分行作業規範測驗\",\n \"sessionTime\": \"2011/11/16~2011/11/29\",\n \"status\": 2\n }, {\n \"courseId\": 13899,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1963434,\n \"sessionId\": 90435,\n \"sessionName\": \"WORD文書排版(上)【105下半年】\",\n \"sessionTime\": \"2016/07/01~2016/12/30\",\n \"status\": 3\n }, {\n \"courseId\": 13901,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1575469,\n \"sessionId\": 74131,\n \"sessionName\": \"POWERPOINT創意簡報王【104下半年】\",\n \"sessionTime\": \"2015/07/20~2015/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 14828,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 399071,\n \"sessionId\": 17536,\n \"sessionName\": \"20120413 HR也要懂的行銷之道\",\n \"sessionTime\": \"2012/04/13
15:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 16816,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1677300,\n \"sessionId\": 79221,\n \"sessionName\": \"信託在職─信託業務綜覽【II】(104-11)\",\n \"sessionTime\": \"2015/11/01~2015/11/30\",\n \"status\": 3\n }, {\n \"courseId\": 16827,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 411826,\n \"sessionId\": 18708,\n \"sessionName\": \"eTag自動儲值專案(功能)\",\n \"sessionTime\": \"2012/05/14~2012/05/25\",\n \"status\": 2\n }, {\n \"courseId\": 17577,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 435905,\n \"sessionId\": 21188,\n \"sessionName\": \"101上-一般版-法令遵循自評檢核考試班\",\n \"sessionTime\": \"2012/06/01~2012/06/15\",\n \"status\": 2\n }, {\n \"courseId\": 18025,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1971636,\n \"sessionId\": 82375,\n \"sessionName\": \"IDP員工職涯發展計畫(105年)\",\n \"sessionTime\": \"2016/01/04~2016/12/30\",\n \"status\": 3\n }, {\n \"courseId\": 18339,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 617003,\n \"sessionId\": 30447,\n \"sessionName\": \"自行查核相關規範及注意事項(102-Q1)\",\n \"sessionTime\": \"2013/01/01~2013/03/26\",\n \"status\": 2\n }, {\n \"courseId\": 18536,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 460069,\n \"sessionId\": 22961,\n \"sessionName\": \"個資管理控管機制宣導教育訓練(功能)\",\n \"sessionTime\": \"2012/07/09~2012/07/26\",\n \"status\": 2\n }, {\n \"courseId\": 20268,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 534576,\n \"sessionId\": 24547,\n \"sessionName\": \"20120918 EQ無礙,未來更high\",\n \"sessionTime\": \"2012/09/18
14:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 20628,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 505062,\n \"sessionId\": 25030,\n \"sessionName\": \"20120830輔銷人員晨會及產品專業度檢測\",\n \"sessionTime\": \"2012/08/30~2012/08/31\",\n \"status\": 3\n }, {\n \"courseId\": 23101,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 583844,\n \"sessionId\": 28326,\n \"sessionName\": \"Q3晨會TEST\",\n \"sessionTime\": \"2012/11/20~2012/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 25204,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 623890,\n \"sessionId\": 31329,\n \"sessionName\": \"台新銀行新光三越聯名卡競品權益比較(test)\",\n \"sessionTime\": \"2013/02/01~2013/02/01\",\n \"status\": 3\n }, {\n \"courseId\": 28808,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 701659,\n \"sessionId\": 36017,\n \"sessionName\": \"防制洗錢,大家一起來!(2013功能、子公司II)\",\n \"sessionTime\": \"2013/05/06~2013/05/21\",\n \"status\": 2\n }, {\n \"courseId\": 29109,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 744824,\n \"sessionId\": 37101,\n \"sessionName\": \"102上-一般版-法令遵循自評檢核考試班\",\n \"sessionTime\": \"2013/06/01~2013/06/15\",\n \"status\": 2\n }, {\n \"courseId\": 29128,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 710389,\n \"sessionId\": 36373,\n \"sessionName\": \"【空中英語教室】Beating Stress (戰勝壓力)\",\n \"sessionTime\": \"2013/05/16~2013/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 29355,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 757635,\n \"sessionId\": 37097,\n \"sessionName\": \"台新證券-法遵自評筆試(一般)【102上】\",\n \"sessionTime\": \"2013/06/03~2013/06/26\",\n \"status\": 2\n }, {\n \"courseId\": 31029,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 771493,\n \"sessionId\": 38973,\n \"sessionName\": \"OJT-法規-第二季法令遵循暨資安宣導\",\n \"sessionTime\": \"2013/06/26
14:00-14:30 \",\n \"status\": 2\n }, {\n \"courseId\": 31158,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 781710,\n \"sessionId\": 39303,\n \"sessionName\": \"個人資料保護宣導課程(HR)\",\n \"sessionTime\": \"2013/07/15~2013/07/31\",\n \"status\": 2\n }, {\n \"courseId\": 32901,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 845845,\n \"sessionId\": 42432,\n \"sessionName\": \"「金融消費者保護法」及其相關子法之重點說明(第一梯次)\",\n \"sessionTime\": \"2013/09/23~2013/10/23\",\n \"status\": 2\n }, {\n \"courseId\": 33111,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1809577,\n \"sessionId\": 84810,\n \"sessionName\": \"2014人身保險在職訓練-零散\",\n \"sessionTime\": \"~\",\n \"status\": 3\n }, {\n \"courseId\": 33112,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1809679,\n \"sessionId\": 84817,\n \"sessionName\": \"2014財產保險在職訓練-零散\",\n \"sessionTime\": \"~\",\n \"status\": 3\n }, {\n \"courseId\": 33529,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 855031,\n \"sessionId\": 42842,\n \"sessionName\": \"OJT-法規-第二季法令遵循暨資安宣導\",\n \"sessionTime\": \"2013/09/25
14:00-14:30 \",\n \"status\": 2\n }, {\n \"courseId\": 34014,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1808070,\n \"sessionId\": 84282,\n \"sessionName\": \"信託業務人員職前訓練課程(105-03)\",\n \"sessionTime\": \"2016/03/01~2016/03/31\",\n \"status\": 3\n }, {\n \"courseId\": 34014,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 2041573,\n \"sessionId\": 91701,\n \"sessionName\": \"信託業務人員職前訓練課程(105下半年)\",\n \"sessionTime\": \"2016/08/01~2016/12/30\",\n \"status\": 3\n }, {\n \"courseId\": 34181,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 872125,\n \"sessionId\": 43743,\n \"sessionName\": \"20131009 尋找羅浮宮暗畫\",\n \"sessionTime\": \"2013/10/09
15:30-18:30 \",\n \"status\": 2\n }, {\n \"courseId\": 35308,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 909145,\n \"sessionId\": 45732,\n \"sessionName\": \"102下-一般版-法令遵循自評檢核考試班\",\n \"sessionTime\": \"2013/12/02~2013/12/19\",\n \"status\": 2\n }, {\n \"courseId\": 36343,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1282161,\n \"sessionId\": 61835,\n \"sessionName\": \"信託業務人員在職訓練課程(103-12)\",\n \"sessionTime\": \"2014/12/01~2014/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 40306,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 994258,\n \"sessionId\": 51698,\n \"sessionName\": \"OJT-2014第一季資安暨法遵宣導課程名單\",\n \"sessionTime\": \"2014/03/25
14:00-14:30 \",\n \"status\": 2\n }, {\n \"courseId\": 40351,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 996178,\n \"sessionId\": 51788,\n \"sessionName\": \"防制洗錢,大家一起來(2014功能、子公司、通路)\",\n \"sessionTime\": \"2014/04/02~2014/04/30\",\n \"status\": 2\n }, {\n \"courseId\": 40643,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 1070380,\n \"sessionId\": 52424,\n \"sessionName\": \"20140618 複訓_勞工安全衛生 (北區_內湖_下午)\",\n \"sessionTime\": \"2014/06/18
14:00-17:00 \",\n \"status\": 2\n }, {\n \"courseId\": 41344,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1048766,\n \"sessionId\": 53283,\n \"sessionName\": \"金融專業培訓課程--外匯業務分行篇(國外部TEST)\",\n \"sessionTime\": \"2014/05/16~2014/06/30\",\n \"status\": 3\n }, {\n \"courseId\": 41558,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1056214,\n \"sessionId\": 54076,\n \"sessionName\": \"美國海外帳戶稅收遵循法(FATCA)介紹【2014】\",\n \"sessionTime\": \"2014/06/03~2014/06/30\",\n \"status\": 2\n }, {\n \"courseId\": 41933,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1576041,\n \"sessionId\": 73482,\n \"sessionName\": \"台新金控的核心价值(104下半年)\",\n \"sessionTime\": \"2015/07/01~2015/12/31\",\n \"status\": 2\n }, {\n \"courseId\": 43620,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1131157,\n \"sessionId\": 56980,\n \"sessionName\": \"個資侵害事件之應變程序\",\n \"sessionTime\": \"2014/08/11~2014/08/29\",\n \"status\": 2\n }, {\n \"courseId\": 45594,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1204691,\n \"sessionId\": 60298,\n \"sessionName\": \"2014 資訊安全教育\",\n \"sessionTime\": \"2014/10/13~2014/10/31\",\n \"status\": 2\n }, {\n \"courseId\": 45594,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1411546,\n \"sessionId\": 69411,\n \"sessionName\": \"2015 資訊安全教育\",\n \"sessionTime\": \"2015/05/04~2015/05/29\",\n \"status\": 2\n }, {\n \"courseId\": 47260,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1272749,\n \"sessionId\": 62654,\n \"sessionName\": \"企業倫理\",\n \"sessionTime\": \"2014/12/16~2014/12/31\",\n \"status\": 2\n }, {\n \"courseId\": 50199,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1387594,\n \"sessionId\": 68451,\n \"sessionName\": \"銀行業防制洗錢及打擊資助恐怖主義注意事項(2015)\",\n \"sessionTime\": \"2015/04/07~2015/04/30\",\n \"status\": 2\n }, {\n \"courseId\": 52160,\n \"courseType\": 6,\n \"courseTypeName\": \"問卷\",\n \"enrollmentId\": 1425084,\n \"sessionId\": 69695,\n \"sessionName\": \"台新大學暨人資網站改版問卷調查(test)\",\n \"sessionTime\": \"2015/05/12~2015/05/18\",\n \"status\": 0\n }, {\n \"courseId\": 52160,\n \"courseType\": 6,\n \"courseTypeName\": \"問卷\",\n \"enrollmentId\": 1437104,\n \"sessionId\": 69903,\n \"sessionName\": \"台新大學暨人資網站改版問卷調查(2015)\",\n \"sessionTime\": \"2015/05/18~2015/05/29\",\n \"status\": 2\n }, {\n \"courseId\": 55764,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1765451,\n \"sessionId\": 82343,\n \"sessionName\": \"信用卡進件流程與徵審作業介紹(105上半年)\",\n \"sessionTime\": \"2016/01/04~2016/06/30\",\n \"status\": 1\n }, {\n \"courseId\": 55820,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1547020,\n \"sessionId\": 75145,\n \"sessionName\": \"個資侵害事件之應變程序(2015)\",\n \"sessionTime\": \"2015/08/10~2015/09/07\",\n \"status\": 2\n }, {\n \"courseId\": 58214,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1641409,\n \"sessionId\": 78458,\n \"sessionName\": \"「金融消費者保護法」及其相關子法之重點說明(2015)\",\n \"sessionTime\": \"2015/10/19~2015/11/13\",\n \"status\": 2\n }, {\n \"courseId\": 58954,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1672067,\n \"sessionId\": 79652,\n \"sessionName\": \"「看見愛的力量」微電影(2015)\",\n \"sessionTime\": \"2015/11/05~2015/12/31\",\n \"status\": 2\n }, {\n \"courseId\": 59632,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 1700490,\n \"sessionId\": 80745,\n \"sessionName\": \"104下-一般版-法令遵循自評檢核考試班\",\n \"sessionTime\": \"2015/12/01~2015/12/16\",\n \"status\": 2\n }, {\n \"courseId\": 63973,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1861689,\n \"sessionId\": 87641,\n \"sessionName\": \"資訊安全教育(2016)\",\n \"sessionTime\": \"2016/05/03~2016/05/31\",\n \"status\": 2\n }, {\n \"courseId\": 65645,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1923693,\n \"sessionId\": 89470,\n \"sessionName\": \"「票據招商 吸收存款」專案\",\n \"sessionTime\": \"2016/06/20~2016/07/15\",\n \"status\": 2\n }, {\n \"courseId\": 65916,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1945653,\n \"sessionId\": 90607,\n \"sessionName\": \"金融消費者保護法及公平待客原則(含誠信經營守則、企業倫理)\",\n \"sessionTime\": \"2016/07/04~2016/07/29\",\n \"status\": 2\n }, {\n \"courseId\": 66903,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1975394,\n \"sessionId\": 91423,\n \"sessionName\": \"理專APP功能操作與使用(test)\",\n \"sessionTime\": \"2016/07/25~2016/07/25\",\n \"status\": 3\n }, {\n \"courseId\": 66903,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1982705,\n \"sessionId\": 91521,\n \"sessionName\": \"理專APP功能操作與使用\",\n \"sessionTime\": \"2016/07/26~2016/08/26\",\n \"status\": 3\n }, {\n \"courseId\": 67327,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 1984657,\n \"sessionId\": 92043,\n \"sessionName\": \"Hahow好學校 廣告影片測試\",\n \"sessionTime\": \"2016/07/31~2016/08/05\",\n \"status\": 3\n }, {\n \"courseId\": 67836,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 2042239,\n \"sessionId\": 93734,\n \"sessionName\": \"防制洗錢及打擊資助恐怖主義風險評估與管理(2016)\",\n \"sessionTime\": \"2016/09/12~2016/10/07\",\n \"status\": 2\n }, {\n \"courseId\": 68146,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程\",\n \"enrollmentId\": 2033954,\n \"sessionId\": 93489,\n \"sessionName\": \"洗錢防制法解析與案例說明 (2016-test)\",\n \"sessionTime\": \"2016/09/02~2016/09/09\",\n \"status\": 3\n }, {\n \"courseId\": 70025,\n \"courseType\": 2,\n \"courseTypeName\": \"教室課程\",\n \"enrollmentId\": 2118774,\n \"sessionId\": 96118,\n \"sessionName\": \"20161128樂活人生健康講座\",\n \"sessionTime\": \"2016/11/28
18:00-19:00 \",\n \"status\": 2\n }, {\n \"courseId\": 70253,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗\",\n \"enrollmentId\": 2136532,\n \"sessionId\": 96745,\n \"sessionName\": \"105下-一般版-法令遵循自評檢核考試班\",\n \"sessionTime\": \"2016/12/01~2016/12/16\",\n \"status\": 2\n }, {\n \"courseId\": 137,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 71853,\n \"sessionId\": 1223,\n \"sessionName\": \"分行新人e課程-專業理專(105-Q2)\",\n \"sessionTime\": \"2016/04/01~2016/06/30\",\n \"status\": 3\n }, {\n \"courseId\": 282,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 69170,\n \"sessionId\": 1166,\n \"sessionName\": \"新人e起來(105-01~105-04)\",\n \"sessionTime\": \"2016/01/01~2016/04/30\",\n \"status\": 3\n }, {\n \"courseId\": 291,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 77491,\n \"sessionId\": 1275,\n \"sessionName\": \"新人e起來(105-Q3)\",\n \"sessionTime\": \"2016/07/01~2016/09/30\",\n \"status\": 3\n }, {\n \"courseId\": 305,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 81076,\n \"sessionId\": 1356,\n \"sessionName\": \"新人e起來(105-Q4)\",\n \"sessionTime\": \"2016/10/01~2016/12/30\",\n \"status\": 3\n }, {\n \"courseId\": 312,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 81331,\n \"sessionId\": 1406,\n \"sessionName\": \"財產保險業務員在職訓練(MP4測試)\",\n \"sessionTime\": \"2016/12/20~2017/01/26\",\n \"status\": 0\n }, {\n \"courseId\": 314,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 81327,\n \"sessionId\": 1405,\n \"sessionName\": \"人身保險業務員在職訓練(MP4測試)\",\n \"sessionTime\": \"2016/12/20~2017/01/26\",\n \"status\": 0\n }, {\n \"courseId\": 315,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 81323,\n \"sessionId\": 1404,\n \"sessionName\": \"財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練第一年(MP4測試)\",\n \"sessionTime\": \"2016/12/20~2017/01/26\",\n \"status\": 0\n }, {\n \"courseId\": 316,\n \"courseType\": 7,\n \"courseTypeName\": \"學程\",\n \"enrollmentId\": 81319,\n \"sessionId\": 1403,\n \"sessionName\": \"人身保險業務員在職訓練第一年(MP4測試)\",\n \"sessionTime\": \"2016/12/20~2017/01/26\",\n \"status\": 0\n }],\n \"ErrorMessage\": \"\"\n };\n resultCN = {\n \"Status\": \"200\",\n \"Data\": [{\n \"courseId\": 4,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollmentId\": 161360,\n \"sessionId\": 2056,\n \"sessionName\": \"Acrobat_PDF全應用(100上半年)(簡中)\",\n \"sessionTime\": \"2011/01/01~2011/06/30\",\n \"status\": 3\n }, {\n \"courseId\": 12,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollmentId\": 1012635,\n \"sessionId\": 46737,\n \"sessionName\": \"Time is Money:時間管理(103上半年)(簡中)\",\n \"sessionTime\": \"2014/01/01~2014/06/30\",\n \"status\": 3\n }, {\n \"courseId\": 12,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollmentId\": 1854663,\n \"sessionId\": 82308,\n \"sessionName\": \"Time is Money:時間管理(105上半年)(簡中)\",\n \"sessionTime\": \"2016/01/04~2016/06/30\",\n \"status\": 2\n }, {\n \"courseId\": 34,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗(簡中)\",\n \"enrollmentId\": 1765530,\n \"sessionId\": 82149,\n \"sessionName\": \"投資型保險證照-年金考試班(105-01)(簡中)\",\n \"sessionTime\": \"2016/01/04~2016/01/31\",\n \"status\": 3\n }, {\n \"courseId\": 34,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗(簡中)\",\n \"enrollmentId\": 1852664,\n \"sessionId\": 85907,\n \"sessionName\": \"投資型保險證照-年金考試班(105-04)(簡中)\",\n \"sessionTime\": \"2016/04/01~2016/04/30\",\n \"status\": 3\n }, {\n \"courseId\": 34,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗(簡中)\",\n \"enrollmentId\": 1955630,\n \"sessionId\": 89956,\n \"sessionName\": \"投資型保險證照-年金考試班(105下半年)(簡中)\",\n \"sessionTime\": \"2016/07/01~2016/12/31\",\n \"status\": 2\n }],\n \"ErrorMessage\": \"\"\n };\n resultUS = {\n \"Status\": \"200\",\n \"Data\": [{\n \"courseId\": 59,\n \"courseType\": 4,\n \"courseTypeName\": \"線上測驗(英文)\",\n \"enrollmentId\": 7736,\n \"sessionId\": 25,\n \"sessionName\": \"簡易外匯機制考試班(9910-9912)(英文)\",\n \"sessionTime\": \"2010/10/01~2010/12/31\",\n \"status\": 3\n }, {\n \"courseId\": 60,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollmentId\": 14330,\n \"sessionId\": 17,\n \"sessionName\": \"開戶對保作業實務介紹(9910-9912)(英文)\",\n \"sessionTime\": \"2010/10/01~2010/12/31\",\n \"status\": 2\n }, {\n \"courseId\": 60,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollmentId\": 1765452,\n \"sessionId\": 82173,\n \"sessionName\": \"開戶對保作業實務介紹(105-Q1)(英文)\",\n \"sessionTime\": \"2016/01/04~2016/03/31\",\n \"status\": 3\n }, {\n \"courseId\": 61,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollmentId\": 244471,\n \"sessionId\": 7229,\n \"sessionName\": \"自行查核相關規範及注意事項(100-Q3)(英文)\",\n \"sessionTime\": \"2011/07/01~2011/09/30\",\n \"status\": 2\n }, {\n \"courseId\": 83,\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollmentId\": 1580993,\n \"sessionId\": 74983,\n \"sessionName\": \"認識國標舞(104下半年)(英文)\",\n \"sessionTime\": \"2015/08/04~2015/12/31\",\n \"status\": 3\n }],\n \"ErrorMessage\": \"\"\n };\n switch (params.LanguageCode) {\n case 'en-US':\n result = resultUS;\n break;\n case 'zn-CN':\n result = resultCN;\n break;\n default:\n result = resultTW;\n break;\n }\n return { data: result };\n }\n /**\r\n * 14.取得修課動作&內容\r\n * @returns\r\n */\n function EnrollmentAvailableAction(courseItem) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultType1; /** 一般 */\n var resultType2; /** 測驗 */\n var resultType3; /** 問卷 */\n resultType1 = {\n Status: '200',\n Data: {\n \"lmsItems\": [{\n \"action\": \"Play\",\n \"completedTime\": \"2016/10/27 11:53\",\n \"itemId\": 3,\n \"itemName\": \"共同基金銷售關鍵資訊【63分鐘】(影片)\",\n \"score\": \"\",\n \"status\": \"未完成\",\n \"type\": \"課程內容\",\n \"viewedTime\": \"00:00:01\"\n }, {\n \"action\": \"Test\",\n \"completedTime\": \"2016/10/18 10:43\",\n \"itemId\": 4,\n \"itemName\": \"共同基金銷售關鍵資訊【測驗】\",\n \"score\": \"\",\n \"status\": \"完成\",\n \"type\": \"測驗\",\n \"viewedTime\": \"00:00:31\"\n }, {\n \"action\": \"???\",\n \"completedTime\": \"\",\n \"itemId\": 1,\n \"itemName\": \"這是ZIP教材下載\",\n \"score\": \"不公佈\",\n \"status\": \"\",\n \"type\": \"課程內容\",\n \"viewedTime\": \"\"\n }, {\n \"action\": \"???\",\n \"completedTime\": \"\",\n \"itemId\": 2,\n \"itemName\": \"這是PDF教材\",\n \"score\": \"不公佈\",\n \"status\": \"\",\n \"type\": \"課程內容\",\n \"viewedTime\": \"\"\n }, {\n \"action\": \"???\",\n \"completedTime\": \"2016/10/17 21:35\",\n \"itemId\": 4,\n \"itemName\": \"信託業務人員職前教育訓練課程【課後問卷】\",\n \"score\": \"\",\n \"status\": \"未曾觀看\",\n \"type\": \"問卷\",\n \"viewedTime\": \"00:00:00\"\n }],\n \"attendanceRate\": 0,\n \"attendances\": [],\n \"availableActions\": [],\n \"courseSessions\": [],\n \"preSurveyItemId\": 0,\n \"progress\": \"1/5\",\n \"reportDeadline\": \"\",\n \"reportSubmitted\": 0,\n \"reportTotal\": 0,\n \"reports\": [],\n \"status\": -1\n },\n 'ErrorMessage': ''\n };\n resultType2 = {\n \"Status\": \"200\",\n \"Data\": {\n \"attendanceRate\": 0,\n \"attendances\": [],\n \"availableActions\": [\"Cancel\", \"Leave\", \"Exemption\"],\n \"courseSessions\": [],\n \"lmsItems\": [{\n \"action\": \"Test\",\n \"completedTime\": \"2016/12/16 17:17\",\n \"itemId\": 336655,\n \"itemName\": \"G-法規-1089金控一般版-法令遵循自評檢核考試班(105上)\",\n \"score\": \"28.0\",\n \"status\": \"未通過\",\n \"type\": \"測驗\",\n \"viewedTime\": \"00:31:06\"\n }],\n \"preSurveyItemId\": 5,\n \"progress\": \"\",\n \"reportDeadline\": \"\",\n \"reportSubmitted\": 0,\n \"reportTotal\": 0,\n \"reports\": [],\n \"status\": -1\n },\n \"ErrorMessage\": \"\"\n };\n resultType3 = {\n Status: '200',\n Data: {\n \"attendanceRate\": 0,\n \"attendances\": [],\n \"availableActions\": [],\n \"courseSessions\": [],\n \"lmsItems\": [{\n \"action\": \"\",\n \"completedTime\": \"2016/09/09 09:18\",\n \"itemId\": 268699,\n \"itemName\": \"台新大學暨人資網站改版問卷調查\",\n \"score\": \"\",\n \"status\": \"完成\",\n \"type\": \"問卷\",\n \"viewedTime\": \"00:01:46\"\n }],\n \"preSurveyItemId\": 0,\n \"reportDeadline\": \"\",\n \"reportSubmitted\": 0,\n \"progress\": \"0/1\",\n \"status\": \"未完成\",\n \"reportTotal\": 0,\n \"reports\": []\n },\n 'ErrorMessage': ''\n };\n\n switch (courseItem.courseType) {\n case enumCourseType.classTest:\n result = resultType2;\n break;\n case enumCourseType.webTest:\n result = resultType2;\n break;\n case enumCourseType.questList:\n result = resultType3;\n break;\n default:\n result = resultType1;\n break;\n }\n return { data: result };\n }\n /**\r\n * 15.課程動作(P.18)\r\n * @returns\r\n */\n function EnrollmentAction(param) {\n\n return new Promise(function (resolve, reject) {\n\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n\n var resultFail = {\n Status: '200',\n Data: {\n failCode: -2,\n failMessage: '',\n success: 0\n },\n ErrorMessage: ''\n };\n var resultSucess = {\n Status: '200',\n Data: {\n failCode: -1,\n failMessage: '',\n success: 1\n },\n ErrorMessage: ''\n };\n switch (param.IsProgram) {\n case 1:\n result = resultFail;\n break;\n default:\n result = resultSucess;\n break;\n }\n\n setTimeout(function () {\n resolve({ data: result });\n }, 2000);\n });\n }\n\n /**\r\n * 16.金融證照紀錄申請(P.18)\r\n * @returns\r\n */\n function FCCertificatedLicenseAdd() {\n var result = {\n Status: '200',\n Data: null,\n ErrorMessage: ''\n };\n return { data: result };\n }\n /**\r\n * 17.金融證照查詢\r\n * @returns\r\n */\n function FCCertificatedLicenseList() {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n result = {\n \"Status\": \"200\",\n \"Data\": [{\n \"acquireDate\": \"2016/01/04\",\n \"applyDate\": \"2016/01/05\",\n \"id\": 5,\n \"name\": \"信託督導人員審定合格(登錄信託公會)\",\n \"status\": \"申請取消\",\n \"validDate\": \"2019/01/03\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"2016/01/05 14:01\",\n \"workflowItem\": \"學員\",\n \"workflowName\": \"李佳憓 (990028)\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"取消\"\n }, {\n \"acquireDate\": \"2016/12/13\",\n \"applyDate\": \"2016/12/15\",\n \"id\": 6,\n \"name\": \"信託管理人員審定合格(登錄信託公會)\",\n \"status\": \"已成功完成\",\n \"validDate\": \"2019/12/13\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"2016/12/15 17:36\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"李佳憓 (990028)\",\n \"workflowReason\": \"由人資處登錄\",\n \"workflowResult\": \"核准\"\n }, {\n \"acquireDate\": \"2016/12/13\",\n \"applyDate\": \"2016/12/15\",\n \"id\": 7,\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\n \"status\": \"已成功完成\",\n \"validDate\": \"2019/12/13\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"2016/12/15 17:36\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"李佳憓 (990028)\",\n \"workflowReason\": \"由人資處登錄\",\n \"workflowResult\": \"核准\"\n }, {\n \"acquireDate\": \"2010/11/10\",\n \"applyDate\": \"2010/11/10\",\n \"id\": 13,\n \"name\": \"開戶對保作業資格\",\n \"status\": \"已成功完成\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"\",\n \"workflowItem\": \"\",\n \"workflowName\": \"\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"\"\n }, {\n \"acquireDate\": \"2016/11/02\",\n \"applyDate\": \"2016/12/15\",\n \"id\": 46,\n \"name\": \"人身保險業務員投資型商品資格登錄(登錄壽險公會)\",\n \"status\": \"簽核中\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"周孟蕎 (1000323),黃昱珩 (1020258),張瑋晏 (1040831)\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"\"\n }, {\n \"acquireDate\": \"2016/06/29\",\n \"applyDate\": \"2016/07/07\",\n \"id\": 112,\n \"name\": \"證券商高級業務員(登錄證券交易所)\",\n \"status\": \"簽核中\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"周孟蕎 (1000323),黃昱珩 (1020258),張瑋晏 (1040831)\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"\"\n }, {\n \"acquireDate\": \"2016/04/19\",\n \"applyDate\": \"2016/04/27\",\n \"id\": 131,\n \"name\": \"內部講師訓完訓資格\",\n \"status\": \"已成功完成\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"有效\",\n \"validStatusKey\": 1,\n \"workflowDateTime\": \"2016/04/27 16:06\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"張瑋晏 (1040831)\",\n \"workflowReason\": \"由人資處登錄\",\n \"workflowResult\": \"核准\"\n }, {\n \"acquireDate\": \"2013/01/27\",\n \"applyDate\": \"2013/02/19\",\n \"id\": 7,\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\n \"status\": \"已成功完成\",\n \"validDate\": \"2016/01/27\",\n \"validStatus\": \"註銷\",\n \"validStatusKey\": 2,\n \"workflowDateTime\": \"2013/02/19 12:00\",\n \"workflowItem\": \"部門管理員代為申請\",\n \"workflowName\": \"李佳憓 (990028)\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"直接核准\"\n }, {\n \"acquireDate\": \"2013/09/03\",\n \"applyDate\": \"2013/02/19\",\n \"id\": 7,\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\n \"status\": \"已拒絕\",\n \"validDate\": \"2016/09/02\",\n \"validStatus\": \"無效\",\n \"validStatusKey\": 0,\n \"workflowDateTime\": \"2013/10/01 16:56\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"黃昱珩 (1020258)\",\n \"workflowReason\": \"TEST(無受訓紀錄)\",\n \"workflowResult\": \"拒絕\"\n }, {\n \"acquireDate\": \"2016/03/01\",\n \"applyDate\": \"2016/03/09\",\n \"id\": 7,\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\n \"status\": \"已拒絕\",\n \"validDate\": \"2019/03/01\",\n \"validStatus\": \"無效\",\n \"validStatusKey\": 0,\n \"workflowDateTime\": \"2016/03/15 16:18\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"黃昱珩 (1020258)\",\n \"workflowReason\": \"(無測驗合格紀錄)\",\n \"workflowResult\": \"拒絕\"\n }, {\n \"acquireDate\": \"2016/06/29\",\n \"applyDate\": \"2016/07/07\",\n \"id\": 5,\n \"name\": \"信託督導人員審定合格(登錄信託公會)\",\n \"status\": \"已拒絕\",\n \"validDate\": \"2019/06/29\",\n \"validStatus\": \"無效\",\n \"validStatusKey\": 0,\n \"workflowDateTime\": \"2016/07/07 17:57\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"黃昱珩 (1020258)\",\n \"workflowReason\": \"(不屬於目前職務所需證照)\",\n \"workflowResult\": \"拒絕\"\n }, {\n \"acquireDate\": \"2013/12/01\",\n \"applyDate\": \"2013/12/30\",\n \"id\": 44,\n \"name\": \"財產保險業務員登錄(登錄產險公會)\",\n \"status\": \"已拒絕\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"無效\",\n \"validStatusKey\": 0,\n \"workflowDateTime\": \"2013/12/30 15:43\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"黃昱珩 (1020258)\",\n \"workflowReason\": \"請書面送保經申請(http://localhost),通過後由保險系統直接轉入,請勿線上申請。(請書面送保經申請(http://localhost),通過後由保險系統直接轉入,請勿線上申請。)\",\n \"workflowResult\": \"拒絕\"\n }, {\n \"acquireDate\": \"2016/06/28\",\n \"applyDate\": \"2016/07/07\",\n \"id\": 44,\n \"name\": \"財產保險業務員登錄(登錄產險公會)\",\n \"status\": \"已拒絕\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"無效\",\n \"validStatusKey\": 0,\n \"workflowDateTime\": \"2016/07/07 18:01\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"黃昱珩 (1020258)\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"拒絕\"\n }, {\n \"acquireDate\": \"2016/07/07\",\n \"applyDate\": \"2016/07/07\",\n \"id\": 127,\n \"name\": \"投信投顧業務員-一般業務員(登錄投信投顧公會)\",\n \"status\": \"已拒絕\",\n \"validDate\": \"永遠有效\",\n \"validStatus\": \"無效\",\n \"validStatusKey\": 0,\n \"workflowDateTime\": \"2016/07/07 17:54\",\n \"workflowItem\": \"人資經辦\",\n \"workflowName\": \"黃昱珩 (1020258)\",\n \"workflowReason\": \"\",\n \"workflowResult\": \"拒絕\"\n }],\n \"ErrorMessage\": \"\"\n };\n return { data: result };\n }\n\n /**\r\n * 18.金融證照認列時數(QQ)\r\n * @returns\r\n */\n function FCAuthorizedHoursList() {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n result = {\n \"Status\": \"200\",\n \"Data\": [{\n \"licenseId\": 6,\n \"licenseName\": \"信託管理人員審定合格(登錄信託公會)\",\n \"trainingCategory\": \"在職訓練\",\n \"trainingEndDate\": \"2019/12/13\",\n \"unfinishHours\": \"尚缺外訓:0.0,尚缺內訓:0.0\",\n \"validStatus\": 1\n }, {\n \"licenseId\": 7,\n \"licenseName\": \"信託業務人員審定合格(登錄信託公會)\",\n \"trainingCategory\": \"在職訓練\",\n \"trainingEndDate\": \"2019/12/13\",\n \"unfinishHours\": \"尚缺外訓:6.0,尚缺內訓:12.0\",\n \"validStatus\": 1\n }, {\n \"licenseId\": 13,\n \"licenseName\": \"開戶對保作業資格\",\n \"trainingCategory\": \"受訓後取得\",\n \"trainingEndDate\": \"\",\n \"unfinishHours\": \"尚缺外訓:0.0,尚缺內訓:0.0\",\n \"validStatus\": 1\n }, {\n \"licenseId\": 131,\n \"licenseName\": \"內部講師訓完訓資格\",\n \"trainingCategory\": \"受訓後取得\",\n \"trainingEndDate\": \"\",\n \"unfinishHours\": \"尚缺外訓:0.0,尚缺內訓:0.0\",\n \"validStatus\": 1\n }],\n \"ErrorMessage\": \"\"\n };\n return { data: result };\n }\n /**\r\n * 19.金融證照紀錄申請\r\n * @returns\r\n */\n function ExternalTrainingApplication() {\n var result = {\n Status: '200',\n Data: {\n failCode: -1,\n failMessage: '',\n success: 0\n },\n ErrorMessage: ''\n };\n return { data: result };\n }\n /**\r\n * 20.金融證照可報名課程(QQ)\r\n * @returns\r\n */\n function FCEnrollableActivities(params) {\n var result = {\n Status: 0,\n Data: {},\n ErrorMessage: \"\"\n };\n var resultEmpty;\n var resultTW;\n var resultCN;\n var resultUS;\n\n resultEmpty = {\n \"Status\": \"200\",\n \"Data\": [],\n \"ErrorMessage\": \"\"\n };\n resultTW = {\n \"Status\": \"200\",\n \"Data\": [{\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 13372,\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/31\",\n \"fcAuthHours\": 1,\n \"hours\": 1,\n \"sessionId\": 84290,\n \"sessionName\": \"信託在職-組合式商品簡介 (105-03)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 13372,\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/04/01\",\n \"enrollEnd\": \"2016/04/30\",\n \"fcAuthHours\": 1,\n \"hours\": 1,\n \"sessionId\": 85914,\n \"sessionName\": \"信託在職-組合式商品簡介 (105-04)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1871,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 1.5,\n \"hours\": 1.5,\n \"sessionId\": 82154,\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-01)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1871,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 1.5,\n \"hours\": 1.5,\n \"sessionId\": 83629,\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-02)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1871,\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/31\",\n \"fcAuthHours\": 1.5,\n \"hours\": 1.5,\n \"sessionId\": 84289,\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-03)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1871,\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/04/01\",\n \"enrollEnd\": \"2016/04/30\",\n \"fcAuthHours\": 1.5,\n \"hours\": 1.5,\n \"sessionId\": 85913,\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-04)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 16788,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 2,\n \"hours\": 2,\n \"sessionId\": 82162,\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-01)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 16788,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 2,\n \"hours\": 2,\n \"sessionId\": 83638,\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-02)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 16788,\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/31\",\n \"fcAuthHours\": 2,\n \"hours\": 2,\n \"sessionId\": 84297,\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-03)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 16788,\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/04/01\",\n \"enrollEnd\": \"2016/04/30\",\n \"fcAuthHours\": 2,\n \"hours\": 2,\n \"sessionId\": 85921,\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-04)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1866,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 0.5,\n \"hours\": 0.5,\n \"sessionId\": 82153,\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-01)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1866,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 0.5,\n \"hours\": 0.5,\n \"sessionId\": 83628,\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-02)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1866,\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/31\",\n \"fcAuthHours\": 0.5,\n \"hours\": 0.5,\n \"sessionId\": 84286,\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-03)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1866,\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/04/01\",\n \"enrollEnd\": \"2016/04/30\",\n \"fcAuthHours\": 0.5,\n \"hours\": 0.5,\n \"sessionId\": 85911,\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-04)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 16816,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 1,\n \"hours\": 1,\n \"sessionId\": 82163,\n \"sessionName\": \"信託在職─信託業務綜覽【II】(105-01)(繁中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 16816,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(繁中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 1,\n \"hours\": 1,\n \"sessionId\": 83639,\n \"sessionName\": \"信託在職─信託業務綜覽【II】(105-02)(繁中)\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultCN = {\n \"Status\": \"200\",\n \"Data\": [{\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 34014,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 8,\n \"hours\": 8,\n \"sessionId\": 82150,\n \"sessionName\": \"信託業務人員職前訓練課程(105-01)(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 34014,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 8,\n \"hours\": 8,\n \"sessionId\": 83621,\n \"sessionName\": \"信託業務人員職前訓練課程(105-02)(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 34014,\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/31\",\n \"fcAuthHours\": 8,\n \"hours\": 8,\n \"sessionId\": 84282,\n \"sessionName\": \"信託業務人員職前訓練課程(105-03)(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 34014,\n \"courseTime\": \"2016/01/01 ~ 2016/12/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollBegin\": \"2016/01/01\",\n \"enrollEnd\": \"2016/12/31\",\n \"fcAuthHours\": 8,\n \"hours\": 8,\n \"sessionId\": 85908,\n \"sessionName\": \"信託業務人員職前訓練課程(105年)(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 34014,\n \"courseTime\": \" ~ \",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(簡中)\",\n \"enrollBegin\": \"\",\n \"enrollEnd\": \"\",\n \"fcAuthHours\": 8,\n \"hours\": 8,\n \"sessionId\": 86934,\n \"sessionName\": \"信託業務人員職前訓練課程(105年)(複製)(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 963,\n \"courseTime\": \"2016/02/20 ~ 2016/02/20\",\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程(簡中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/01\",\n \"fcAuthHours\": 4,\n \"hours\": 4,\n \"sessionId\": 83791,\n \"sessionName\": \"2016-0220信託業務人員職前訓練(4小時)-台北場(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 963,\n \"courseTime\": \"2016/03/12 ~ 2016/03/12\",\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程(簡中)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/01\",\n \"fcAuthHours\": 4,\n \"hours\": 4,\n \"sessionId\": 83792,\n \"sessionName\": \"2016-0312信託業務人員職前訓練(4小時)-高雄場(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 963,\n \"courseTime\": \"2016/03/26 ~ 2016/03/26\",\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程(簡中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/01\",\n \"fcAuthHours\": 4,\n \"hours\": 4,\n \"sessionId\": 85389,\n \"sessionName\": \"2016-0326信託業務人員職前訓練(4小時)-台北場(簡中)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 963,\n \"courseTime\": \"2016/04/09 ~ 2016/04/09\",\n \"courseType\": 3,\n \"courseTypeName\": \"外訓課程(簡中)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/01\",\n \"fcAuthHours\": 4,\n \"hours\": 4,\n \"sessionId\": 85570,\n \"sessionName\": \"2016-0409信託業務人員職前訓練(4小時)-台中場(簡中)\"\n }],\n \"ErrorMessage\": \"\"\n };\n resultUS = {\n \"Status\": \"200\",\n \"Data\": [{\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1861,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 3,\n \"hours\": 3,\n \"sessionId\": 82152,\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-01)(英文)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1861,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 3,\n \"hours\": 3,\n \"sessionId\": 83627,\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-02)(英文)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1861,\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/03/01\",\n \"enrollEnd\": \"2016/03/31\",\n \"fcAuthHours\": 3,\n \"hours\": 3,\n \"sessionId\": 84284,\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-03)(英文)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 1861,\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/04/01\",\n \"enrollEnd\": \"2016/04/30\",\n \"fcAuthHours\": 3,\n \"hours\": 3,\n \"sessionId\": 85910,\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-04)(英文)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 13372,\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/01/04\",\n \"enrollEnd\": \"2016/01/31\",\n \"fcAuthHours\": 1,\n \"hours\": 1,\n \"sessionId\": 82155,\n \"sessionName\": \"信託在職-組合式商品簡介 (105-01)(英文)\"\n }, {\n \"classificationId\": 0,\n \"classificationName\": \"\",\n \"courseId\": 13372,\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\n \"courseType\": 1,\n \"courseTypeName\": \"線上課程(英文)\",\n \"enrollBegin\": \"2016/02/01\",\n \"enrollEnd\": \"2016/02/29\",\n \"fcAuthHours\": 1,\n \"hours\": 1,\n \"sessionId\": 83630,\n \"sessionName\": \"信託在職-組合式商品簡介 (105-02)(英文)\"\n }],\n \"ErrorMessage\": \"\"\n };\n switch (params.LanguageCode) {\n case \"en-US\":\n result = resultUS;\n break;\n case \"zh-CN\":\n result = resultCN;\n break;\n default:\n result = resultTW;\n break;\n }\n //result = resultEmpty; //QQ\n return { data: result };\n }\n /**\r\n * 21.金融證照紀錄申請\r\n * @returns\r\n */\n function LearningRecordCommit() {\n var result = {\n Status: '200',\n Data: null,\n ErrorMessage: ''\n };\n return { data: result };\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('bulletinService', bulletinService);\n\n function bulletinService(apiUrl, $http, sysCode, commonService, $q, headerService) {\n var service = {\n getByNo: getByNo,\n getMore: getMore,\n getNoticeMore: getNoticeMore,\n getMoreByChoice: getMoreByChoice,\n getByNoForTsun: getByNoForTsun,\n donwloadStampForUrl: donwloadStampForUrl,\n checkHeadStatus: checkHeadStatus,\n getStampFile: getStampFile,\n getTsunMoreList: getTsunMoreList\n };\n\n var url = apiUrl.tsApi + 'bulletin/';\n var noticeUrl = apiUrl.tsApi + 'notifyCenter/';\n\n function getByNo(bulletinSerilNo) {\n var param = {\n bulletinSerilNo: bulletinSerilNo\n };\n commonService.setParams(param);\n headerService.saveEnforcementReadRecord(bulletinSerilNo);\n return $http.post(url + 'bulletin', param);\n }\n\n function getByNoForTsun(notifySerilNo) {\n var param = {\n notifySerilNo: notifySerilNo,\n menuSerilNo: getMenuQueryString()\n };\n commonService.setParams(param);\n headerService.saveEnforcementReadRecord(notifySerilNo);\n return $http.post(noticeUrl + 'noticeGetForPerson', param);\n }\n\n function getMore(siteCode, isHistory) {\n var param = {\n siteCode: siteCode,\n menuSerilNo: getMenuQueryString()\n };\n commonService.setParams(param);\n if (isHistory) {\n var bulletinCache = JSON.parse(sessionStorage.getItem('bulletinCache'));\n if (bulletinCache) {\n if (bulletinCache.menuItem) {\n param.menuSerilNo = bulletinCache.menuItem.menuSerilNo;\n }\n if (bulletinCache.typeSerilNo) {\n param.bulletinTypeSerilNo = bulletinCache.typeSerilNo;\n }\n }\n }\n return $http.post(url + 'more', param);\n }\n\n function getTsunMoreList(param) {\n\n commonService.setParams(param);\n return $http.post(url + 'noticeMoreList', param);\n }\n\n function getNoticeMore() {\n var param = {\n menuSerilNo: getMenuQueryString()\n };\n commonService.setParams(param);\n return $http.post(url + 'noticeMore', param);\n }\n\n function getMoreByChoice(param) {\n commonService.setParams(param);\n return $http.post(url + 'bulletinChoiceByLogin', param);\n }\n\n function checkHeadStatus() {\n\n return $q.when(true);\n }\n\n function donwloadStampForUrl(param) {\n //2023-07-21 Johnson ��w2023\n console.log('donwloadStampForUrl:visualpageController�w����');\n }\n\n function getStampFile(attachmentSerilNo) {\n // console.log(format('{0}download/{1}/{2}/{3}/{4}/{5}',\n // url, attachmentSerilNo, sysCode, getMenuQueryString(),\n // sessionStorage.getItem('token'), sessionStorage.getItem('perSerilNo')))\n return format('{0}download/{1}/{2}/{3}/{4}/{5}', url, attachmentSerilNo, sysCode, getMenuQueryString(), sessionStorage.getItem('token'), sessionStorage.getItem('perSerilNo'));\n }\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('commonService', commonService);\n\n function commonService(sysCode, $rootScope, $http, apiUrl) {\n var service = {\n setParams: setParams,\n getFileType: getFileType,\n setCtmsParams: setCtmsParams,\n saveLogFlow: saveLogFlow,\n ctmsFilePath: ctmsFilePath,\n showImg: showImg,\n showVedio: showVedio,\n windowChecker: windowChecker,\n setOneWindow: setOneWindow,\n fetchDecyrptForDirectModifyDto: fetchDecyrptForDirectModifyDto,\n URLCheck: URLCheck\n };\n return service;\n\n function setOneWindow(varWindow) {\n //因為整個外網要共用同一個另開分頁(new Window),因此要統一由這邊判斷。\n if (!windowChecker(varWindow)) {\n varWindow = window.open();\n }\n if (!$rootScope.newWindows) {\n $rootScope.newWindows = [];\n }\n _.forEach($rootScope.newWindows, function (perWindow) {\n if (windowChecker(perWindow)) {\n perWindow.close();\n }\n });\n $rootScope.newWindows = [varWindow];\n return varWindow;\n }\n\n function windowChecker(varWindow) {\n //驗證是否為視窗。\n var windowChecker = varWindow || {};\n return windowChecker.self === windowChecker;\n }\n\n function ctmsFilePath(path) {\n var returnPath = sessionStorage.getItem('ctmsFileUrl') + path;\n return returnPath.replace(\"\\\\\", \"/\");\n }\n\n function saveLogFlow(url) {\n url = url.split('?');\n if (url.length > 1) {\n _(url).forEach(function (item) {\n if (item.match('menu') !== null) {\n var menuSerilNo = parseInt(item.split('=')[1]);\n var param = {\n menuSerilNo: menuSerilNo,\n menuClickLogCreatePerSerilNo: sessionStorage.getItem('perSerilNo'),\n langSerilNo: sessionStorage.getItem('langCode')\n };\n $http.post(apiUrl.tsApi + 'log/postFlow', param);\n }\n });\n }\n }\n function URLCheck(url) {\n return url.replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''').replace(/[<>!]|(\\(\\))|((for|while|if)\\s*\\(.*\\))/g, '');\n }\n\n function setParams(param) {\n if (sessionStorage.getItem('langCode')) {\n param.langSerilNo = sessionStorage.getItem('langCode');\n } else {\n param.langSerilNo = 1;\n }\n\n if (sessionStorage.getItem('token')) {\n param.token = sessionStorage.getItem('token');\n } else {\n param.token = \"\";\n }\n\n if (sessionStorage.getItem('perSerilNo')) {\n param.perSerilNo = sessionStorage.getItem('perSerilNo');\n } else {\n param.perSerilNo = \"\";\n }\n param.sysCode = sysCode;\n }\n\n function setCtmsParams(param) {\n param.UserId = $rootScope.userInfo.userAccount;\n param.LanguageCode = sessionStorage.getItem('userLang');\n param.tkn = sessionStorage.getItem('token');\n }\n\n function getFileType(fileName) {\n return fileName.split('.')[fileName.split('.').length - 1];\n }\n\n function showImg(attachmentType) {\n if (attachmentType) {\n switch (attachmentType.toLocaleLowerCase()) {\n case 'png':\n return true;\n case \"jpg\":\n return true;\n case 'jpeg':\n return true;\n case 'gif':\n return true;\n default:\n return false;\n }\n }\n }\n\n function showVedio(attachmentType) {\n if (attachmentType) {\n switch (attachmentType.toLocaleLowerCase()) {\n case 'mp4':\n return true;\n default:\n return false;\n }\n }\n }\n\n function fetchDecyrptForDirectModifyDto(param) {\n var newApiURL = apiUrl.tsApi + 'function/fetchDecyrptForDirectModifyDto';\n newApiURL = URLCheck(newApiURL);\n //2023-07-18 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2,{3:4});', 5, 5, 'http|get|newApiURL|params|param'.split('|'), 0, {}));\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('ctmsService', ctmsService);\n\n function ctmsService(commonService, isTestMode, $http, apiUrl, enumService, testData, $rootScope, $q, blockUI) {\n var service = {\n MyTrainingPoint: MyTrainingPoint,\n SysTypesList: SysTypesList,\n ActivityTypesUnderClassification: ActivityTypesUnderClassification,\n FCLicenseList: FCLicenseList,\n CourseItem: CourseItem,\n PublishedActivity: PublishedActivity,\n CourseSession: CourseSession,\n ExamSurveyContent: ExamSurveyContent,\n InteractionData: InteractionData,\n MyUnfinishedActivities: MyUnfinishedActivities,\n MyFinishedActivities: MyFinishedActivities,\n EnrollmentAvailableAction: EnrollmentAvailableAction,\n EnrollmentAction: EnrollmentAction,\n FCCertificatedLicenseAdd: FCCertificatedLicenseAdd,\n FCCertificatedLicenseList: FCCertificatedLicenseList,\n FCAuthorizedHoursList: FCAuthorizedHoursList,\n ExternalTrainingApplication: ExternalTrainingApplication,\n FCEnrollableActivities: FCEnrollableActivities,\n LearningRecordCommit: LearningRecordCommit,\n getStampFile: getStampFile\n };\n return service;\n function MyTrainingPoint(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.MyTrainingPoint(params.Annual);\n } else {\n apiResult = callCtmsApi('MyTrainingPoint.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'MyTrainingPoint.do');\n return returnResult;\n });\n }\n\n function SysTypesList(params) {\n var apiResult;\n // console.log(\"SysTypesList params:\",params);\n if (isTestMode) {\n apiResult = testData.SysTypesList(params.Type);\n } else {\n apiResult = callCtmsApi('SysTypesList.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'SysTypesList.do');\n return returnResult;\n });\n }\n\n function ActivityTypesUnderClassification(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = null;\n } else {\n apiResult = callCtmsApi('ActivityTypesUnderClassification.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'ActivityTypesUnderClassification.do');\n return returnResult;\n });\n }\n\n function FCLicenseList(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.FCLicenseList(params);\n } else {\n apiResult = callCtmsApi('FCLicenseList.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'FCLicenseList.do');\n return returnResult;\n });\n }\n\n function CourseItem(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.CourseItem(params);\n } else {\n apiResult = callCtmsApi('CourseItem.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'CourseItem.do');\n return returnResult;\n });\n }\n\n function PublishedActivity(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.PublishedActivity(params);\n } else {\n apiResult = callCtmsApi('PublishedActivity.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'PublishedActivity.do');\n return returnResult;\n });\n }\n\n function CourseSession(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.CourseSession(params.CourseType);\n } else {\n apiResult = callCtmsApi('CourseSession.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'CourseSession.do');\n //console.log('sunnet CourseSession result:',returnResult);\n return returnResult;\n });\n }\n\n function ExamSurveyContent(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.ExamSurveyContent(params);\n } else {\n apiResult = callCtmsApi('ExamSurveyContent.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'ExamSurveyContent.do');\n return returnResult;\n });\n }\n\n function InteractionData(params) {\n blockUI.start();\n var apiResult;\n if (isTestMode) {\n apiResult = testData.InteractionData(params);\n } else {\n apiResult = callCtmsApi('InteractionData.do', params);\n // apiResult = $http.post(apiUrl.tsApi+'ctms/InteractionData', params);\n }\n return $q.when(apiResult).then(function (data) {\n blockUI.stop();\n var returnResult = ctmsResultFormat(data, 'InteractionData.do');\n return returnResult;\n });\n }\n\n function MyUnfinishedActivities(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.MyUnfinishedActivities(params);\n } else {\n apiResult = callCtmsApi('MyUnfinishedActivities.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n\n var returnResult = ctmsResultFormat(data, 'MyUnfinishedActivities.do');\n return returnResult;\n });\n }\n\n function MyFinishedActivities(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.MyFinishedActivities(params);\n } else {\n apiResult = callCtmsApi('MyFinishedActivities.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'MyFinishedActivities.do');\n return returnResult;\n });\n }\n\n function EnrollmentAvailableAction(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.EnrollmentAvailableAction(params);\n } else {\n apiResult = callCtmsApi('EnrollmentAvailableAction.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'EnrollmentAvailableAction.do');\n return returnResult;\n });\n }\n\n function EnrollmentAction(params) {\n\n // 測試錯誤情況\n // params.IsProgram = 1;\n\n // Block the user interface\n blockUI.start();\n\n var apiResult;\n if (isTestMode) {\n apiResult = testData.EnrollmentAction(params);\n } else {\n apiResult = callCtmsApi('EnrollmentAction.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n\n // Unblock the user interface\n blockUI.stop();\n\n // console.log('####################')\n // console.log(data)\n var returnResult = ctmsResultFormat(data, 'EnrollmentAction.do');\n if (typeof returnResult.success !== 'undefined' && !returnResult.success) {\n //代表動作失敗\n //var errorMsg = returnResult.failMessage || '';\n var errorMsg = '';\n var errorCode = returnResult.failCode || '0';\n errorCode = errorCode + '';\n switch (errorCode) {\n case '0':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll0;\n break;\n case '1':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll1;\n break;\n case '2':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll2;\n break;\n case '3':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll3;\n break;\n case '4':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll4;\n break;\n case '5':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll5;\n break;\n case '6':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll6;\n break;\n case '7':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll7;\n break;\n case '8':\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll8;\n break;\n default:\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll0;\n break;\n }\n toastr.warning($rootScope.translate.tsunSendError + \":\" + errorMsg);\n //==\n return false;\n }\n return returnResult;\n });\n }\n\n function FCCertificatedLicenseAdd(params) {\n blockUI.start();\n var apiResult;\n if (isTestMode) {\n apiResult = testData.FCCertificatedLicenseAdd(params);\n } else {\n apiResult = callCtmsApi('FCCertificatedLicenseAdd.do', params);\n // apiResult = $http.post(apiUrl.tsApi+'ctms/FinacialLicienceApply', params);\n }\n return $q.when(apiResult).then(function (data) {\n blockUI.stop();\n var returnResult = ctmsResultFormat(data, 'FCCertificatedLicenseAdd.do');\n // console.log('FCCertificatedLicenseAdd returnResult:',returnResult);\n return returnResult;\n });\n }\n\n function FCCertificatedLicenseList(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.FCCertificatedLicenseList(params);\n } else {\n apiResult = callCtmsApi('FCCertificatedLicenseList.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'FCCertificatedLicenseList.do');\n return returnResult;\n });\n }\n\n function FCAuthorizedHoursList(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.FCAuthorizedHoursList(params);\n } else {\n apiResult = callCtmsApi('FCAuthorizedHoursList.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'FCAuthorizedHoursList.do');\n return returnResult;\n });\n }\n\n function ExternalTrainingApplication(params) {\n blockUI.start();\n var apiResult;\n if (isTestMode) {\n apiResult = testData.ExternalTrainingApplication(params);\n } else {\n apiResult = callCtmsApi('ExternalTrainingApplication.do', params);\n // apiResult = $http.post(apiUrl.tsApi+'ctms/ExternalCourseApply', params);\n }\n return $q.when(apiResult).then(function (data) {\n blockUI.stop();\n var returnResult = ctmsResultFormat(data, 'ExternalTrainingApplication.do');\n // console.log(\"ExternalTrainingApplication return data:\",returnResult);\n //=========\n var isSuccess = returnResult.failCode + '' === '-1';\n if (isSuccess === false) {\n var errorMsg = '';\n var errorCode = returnResult.failCode || '0';\n errorCode = errorCode + '';\n switch (errorCode) {\n case '0':\n errorMsg += $rootScope.translate.tsunErrorExternalApplication0;\n break;\n case '1':\n errorMsg += $rootScope.translate.tsunErrorExternalApplication1;\n break;\n case '2':\n errorMsg += $rootScope.translate.tsunErrorExternalApplication2;\n break;\n case '3':\n errorMsg += $rootScope.translate.tsunErrorExternalApplication3;\n break;\n }\n toastr.warning($rootScope.translate.tsunSendError + \":\" + errorMsg);\n }\n return isSuccess;\n });\n }\n\n function FCEnrollableActivities(params) {\n var apiResult;\n if (isTestMode) {\n apiResult = testData.FCEnrollableActivities(params);\n } else {\n apiResult = callCtmsApi('FCEnrollableActivities.do', params);\n }\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'FCEnrollableActivities.do');\n return returnResult;\n });\n }\n function LearningRecordCommit(params) {\n\n // chris: log for mobile\n //postException(`ctms-learning-record: ${JSON.stringify(params)}`, apiUrl)\n\n console.log('LearningRecordCommit param:', params);\n var apiResult;\n if (isTestMode) {\n apiResult = testData.LearningRecordCommit(params);\n } else {\n apiResult = callCtmsApi('LearningRecordCommit.do', params);\n }\n\n //console.log('LearningRecordCommit Result:',apiResult);\n return $q.when(apiResult).then(function (data) {\n var returnResult = ctmsResultFormat(data, 'LearningRecordCommit.do');\n return returnResult;\n });\n }\n function callCtmsApi(action, params) {\n var actionUrl = apiUrl.ctmsApi + action;\n return $http.post(actionUrl, params, {\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n function ctmsResultFormat(result, apiAction) {\n var resultData = result.data;\n var returnResult = null;\n switch (resultData.Status + '') {\n case '200':\n if (resultData.ErrorMessage) {\n toastr.warning(resultData.ErrorMessage);\n } else {\n returnResult = resultData.Data || {};\n }\n //console.log('returnResult 200 :',resultData.Data);\n break;\n case '400':\n // toastr.warning($rootScope.translate.tsunSendError + \"Api[\" + apiAction + \"],\" + resultData.ErrorMessage);\n toastr.warning($rootScope.translate.tsunSendError + ':' + resultData.ErrorMessage);\n returnResult = false;\n break;\n default:\n apiAction = apiAction || '';\n var errorLog = \" Error,call sunNet Api[\" + apiAction + \"], msg:\" + resultData.ErrorMessage;\n postException(errorLog, apiUrl);\n showSystemError();\n returnResult = false;\n break;\n }\n //console.log('returnResult:',returnResult);\n return returnResult;\n }\n\n function getStampFile(attachmentPath, attachmentName) {\n\n console.log('getStampFile apiUrl:', apiUrl.tsApi + 'ctms/DownloadPdf');\n console.log('getStampFile token:', sessionStorage.getItem('token'));\n console.log('getStampFile SysCode:', 'MHR');\n console.log('getStampFile attachmentPath:', attachmentPath.replace(\".pdf\", \"\"));\n console.log('getStampFile attachmentName', attachmentName);\n console.log('getStampFile attachmentPath:', attachmentPath.replace(\"/\", \"_\").replace(\"\\\\\", \"_\").replace(\".pdf\", \"\"));\n\n return format('{0}/{1}/{2}/{3}/{4}', apiUrl.tsApi + 'ctms/DownloadPdf', sessionStorage.getItem('token'), \"MHR\", attachmentPath.replaceAll(\"/\", \"_\").replaceAll(\"\\\\\", \"_\").replace(\".pdf\", \"\"), attachmentName);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('e2eService', e2eService);\n\n function e2eService() {\n var service = {\n login: login,\n forgetPwd: forgetPwd,\n forceEditPwd: forceEditPwd,\n register: register,\n editPwdModal: editPwdModal,\n contactMe: contactMe,\n directEditPwd: directEditPwd\n };\n\n return service;\n\n ////////////////\n function login(param) {\n //2023-07-10 Johnson ��w2023\n return param;\n }\n\n function forgetPwd(param) {\n //2023-07-10 Johnson ��w2023\n }\n\n function forceEditPwd(params) {\n //2023-07-10 Johnson ��w2023\n }\n\n function register(params) {\n //2023-07-10 Johnson ��w2023\n }\n\n function editPwdModal(params) {\n //2023-07-10 Johnson ��w2023\n }\n\n function contactMe(params) {\n //2023-07-10 Johnson ��w2023\n }\n\n function directEditPwd(param) {\n //2023-07-10 Johnson ��w2023\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('enumService', enumService);\n\n function enumService() {\n var service = {\n sso: {},\n redirectType: {},\n target: {},\n sendTarget: {},\n siteCode: {},\n courseType: {}\n };\n\n service.sso = {\n success: '100',\n notExist: '201',\n disable: '202',\n isLock: '203',\n lockUnReslove: '204',\n dwpError: '205', //2023-07-10 Johnson 資安2023\n tokenNotExist: '206',\n notHaveEmail: '210',\n notHavePhone: '211',\n notFindAccount: '212',\n emailAlreadyRegister: '219',\n dwpMustBigThan: '220', //2023-07-10 Johnson 資安2023\n dwpNotSameAccount: '221', //2023-07-10 Johnson 資安2023\n dwpJustEnAndNumber: '222', //2023-07-10 Johnson 資安2023\n dwpNeedContainEnAndNumber: '223', //2023-07-10 Johnson 資安2023\n dwpNotContainueThree: '224', //2023-07-10 Johnson 資安2023\n dwpNotContainueThreeOrderAndDesc: '225', //2023-07-10 Johnson 資安2023\n dwpNotSameRecent: '226', //2023-07-10 Johnson 資安2023\n accountIsNotActive: '227',\n verifyCodeNotExist: '228',\n verifyCodeExpired: '229',\n dwpModifyWeek: '230', //2023-07-10 Johnson 資安2023\n dwpErrorIsLock: '231', //2023-07-10 Johnson 資安2023\n mustModifydwP: '232', //2023-07-10 Johnson 資安2023\n verifyCodeNotPass: '234',\n illegalRegister: '235',\n newdwPNotSameOlddwP: '236',\n userAlreadyValidate: '237',\n waitForLock: '238',\n error: '300',\n verifyCodeInValid: '500',\n isTaiEmail: '301',\n reCaptchaFail: '999'\n };\n\n service.redirectType = {\n direct: 0,\n open: 1\n };\n\n service.target = {\n open: 1,\n wrap: 2,\n direct: 3\n };\n\n service.sendTarget = {\n email: 1,\n sms: 2\n };\n\n service.siteCode = {\n hrInside: 1,\n hrOutside: 2,\n hrAdmin: 3,\n tsunOut: 4,\n tsunInside: 5\n };\n\n service.courseType = {\n webCourse: 1,\n classCourse: 2,\n externalCourse: 3,\n webTest: 4,\n classTest: 5,\n questList: 6,\n courage: 7\n };\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('headerService', headerService);\n\n function headerService(apiUrl, $http, commonService, loginService) {\n var service = {\n getSearch: getSearch,\n getMenuName: getMenuName,\n getSearchResult: getSearchResult,\n searchMsg: searchMsg,\n getRelatedFunctions: getRelatedFunctions,\n getMenuManagers: getMenuManagers,\n contactMe: contactMe,\n getUrlSetting: getUrlSetting,\n setFontSize: setFontSize,\n getFontSize: getFontSize,\n saveEnforcementReadRecord: saveEnforcementReadRecord,\n saveBulletinClickingAttachment: saveBulletinClickingAttachment,\n saveMenuClickingAttachment: saveMenuClickingAttachment,\n saveLearnLog: saveLearnLog,\n getMenuList: getMenuList\n };\n\n var headerUrl = apiUrl.tsApi + 'header/';\n\n function getSearch(keyWord, siteCode) {\n\n var param = {\n keyWord: keyWord,\n SiteCode: siteCode,\n CurrentMenuSerilNo: getMenuQueryString()\n };\n commonService.setParams(param);\n return $http.post(headerUrl + 'getSearch/', param);\n }\n\n function getSearchResult(keyWord, currentPage, searchResultType, siteCode, needLog) {\n var param = {\n keyWord: keyWord,\n SiteCode: siteCode,\n currentPage: currentPage,\n searchResultEnum: searchResultType,\n needKeywordLog: needLog\n };\n commonService.setParams(param);\n return $http.post(headerUrl + 'getSearchResult/', param);\n }\n\n function getMenuName(menuId) {\n var newApiURL = headerUrl + 'getMenuName/' + menuId;\n newApiURL = commonService.URLCheck(newApiURL);\n //2023-07-20 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n }\n\n function searchMsg(msg) {\n return msg;\n }\n\n function getRelatedFunctions(menuId) {\n var newApiURL = headerUrl + 'getRelatedFunctions/2/' + menuId;\n newApiURL = commonService.URLCheck(newApiURL);\n //2023-07-20 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n }\n\n function getMenuManagers(menuId) {\n var newApiURL = headerUrl + 'getMenuManagers/' + menuId;\n newApiURL = commonService.URLCheck(newApiURL);\n //2023-07-20 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n }\n\n function contactMe(param) {\n //recaptcha.response = recaptcha.response + 'ee';\n\n return $http.post(headerUrl + 'PostContactMe', param).then(function (res) {\n if (res.data === true) {\n return true;\n } else {\n return false;\n }\n });\n\n //未登入狀態下,先做reCaptcha驗證\n // return $http.post(apiUrl.tsApi + 'validate/gRecaptchaValidate', vm.reCaptcha).then(function (verifyResult) {\n // if (verifyResult.data.success) {\n // headerService.contactMe(vm.data).then(function () {\n // toastr.success($rootScope.translate.sendMailSuccess);\n // $uibModalInstance.dismiss('cancel');\n // });\n // } else {\n // //Error Handler write here\n // toastr.warning($rootScope.translate.commonReCaptchaFail);\n // return false;\n // }\n // });\n }\n\n function getUrlSetting() {\n var param = {};\n commonService.setParams(param);\n return $http.post(headerUrl + 'getUrlSetting', param);\n }\n\n function setFontSize(fontSize) {\n var param = {\n fontSize: fontSize\n };\n commonService.setParams(param);\n return $http.post(headerUrl + 'setFontSize', param);\n }\n\n function getFontSize() {\n if (sessionStorage.getItem('perSerilNo')) {\n var newApiURL = headerUrl + 'getFontSize/' + sessionStorage.getItem('langCode') + '/' + sessionStorage.getItem('perSerilNo');\n newApiURL = commonService.URLCheck(newApiURL);\n //2023-07-20 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$2.3(4+\\'5/\\'+0.1(\\'6\\')+\\'/\\'+0.1(\\'7\\'));', 8, 8, 'sessionStorage|getItem|http|get|headerUrl|getFontSize|langCode|perSerilNo'.split('|'), 0, {}));\n } else {\n var _newApiURL = headerUrl + 'getFontSize/' + sessionStorage.getItem('langCode');\n _newApiURL = commonService.URLCheck(_newApiURL);\n //2023-07-20 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2+\\'3/\\'+4.5(\\'6\\'));', 7, 7, 'http|get|headerUrl|getFontSize|sessionStorage|getItem|langCode'.split('|'), 0, {}));\n }\n }\n\n function saveEnforcementReadRecord(bulletinSerilNo) {\n var param = {\n bulletinSerilNo: bulletinSerilNo,\n perSerilNo: sessionStorage.getItem('perSerilNo')\n };\n return $http.post(headerUrl + 'saveEnforcementReadRecord/', param);\n }\n\n function saveBulletinClickingAttachment(params) {\n $http.post(apiUrl.tsApi + 'log/saveBulletinClickingAttachment', params);\n }\n\n function saveMenuClickingAttachment(param) {\n $http.post(apiUrl.tsApi + 'log/saveMenuClickingAttachment', param);\n }\n\n function saveLearnLog(str) {\n $http.post(apiUrl.tsApi + 'log/saveLearnLog', str);\n }\n\n function getMenuList() {\n var menuparam = {\n LangSerilNo: sessionStorage.getItem('langCode'),\n userLang: sessionStorage.getItem('userLang'),\n SiteCode: \"2,4\",\n PerSerilNo: sessionStorage.getItem('perSerilNo'),\n IsNormal: true,\n IsSpecial: false,\n IsSetting: false\n };\n return $http.post(apiUrl.tsApi + 'menu/getMobileMenuList', menuparam);\n }\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n\t'use strict';\n\n\tangular.module('app.service').factory('homeService', homeService);\n\n\tfunction homeService(commonService, $http, apiUrl) {\n\t\tvar service = {\n\t\t\tgetMhr: getMhr,\n\t\t\tgetTsu: getTsu,\n\t\t\tgetNext: getNext,\n\t\t\tgetNextMore: getNextMore\n\t\t};\n\n\t\tvar homeUrl = apiUrl.tsApi + 'home/';\n\n\t\tfunction getMhr() {\n\t\t\tvar param = {\n\t\t\t\tmenuSerilNo: getMenuQueryString()\n\t\t\t};\n\t\t\tcommonService.setParams(param);\n\t\t\treturn $http.post(homeUrl + 'getMhr', param);\n\t\t}\n\n\t\tfunction getTsu() {\n\t\t\tvar param = {\n\t\t\t\tmenuSerilNo: getMenuQueryString(),\n\t\t\t\tsiteCode: 4\n\t\t\t};\n\t\t\tcommonService.setParams(param);\n\t\t\treturn $http.post(homeUrl + 'getTsu', param);\n\t\t}\n\n\t\tfunction getNext() {\n\t\t\tvar param = {\n\t\t\t\tmenuSerilNo: getMenuQueryString(),\n\t\t\t\tsiteCode: 2\n\n\t\t\t};\n\t\t\tcommonService.setParams(param);\n\n\t\t\treturn $http.post(homeUrl + 'getNext', param);\n\t\t}\n\n\t\tfunction getNextMore(currentPage) {\n\t\t\tvar param = {\n\t\t\t\tcurrentPage: currentPage,\n\t\t\t\tmenuSerilNo: getMenuQueryString(),\n\t\t\t\tsiteCode: 2\n\t\t\t};\n\t\t\tcommonService.setParams(param);\n\t\t\treturn $http.post(homeUrl + 'getNextMore', param);\n\t\t}\n\n\t\treturn service;\n\t}\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('loginService', loginService);\n\n function loginService($http, apiUrl, enumService, $rootScope, sysCode, commonService) {\n var service = {\n login: login,\n loginByPerSerilNo: loginByPerSerilNo,\n logout: logout,\n tokenTransfer: tokenTransfer,\n tokenTransferByAccount: tokenTransferByAccount,\n modifyUserPassword: modifyUserPassword,\n forgetPWD: forgetPWD,\n directModifyUserPassword: directModifyUserPassword,\n registerOutsideUser: registerOutsideUser,\n checkToken: checkToken,\n getSsoInfo: getSsoInfo,\n setSsoParams: setSsoParams,\n get: get,\n editUserProfile: editUserProfile,\n sendVerifyCodeFromPhone: sendVerifyCodeFromPhone,\n verifyCodeCheckFromPhone: verifyCodeCheckFromPhone,\n validateTel: validateTel,\n getPwdConstrain: getPwdConstrain,\n checkVerifyCode: checkVerifyCode,\n produceVerifyCodeFromSignUp: produceVerifyCodeFromSignUp,\n verifyCodeCheckFromSignUp: verifyCodeCheckFromSignUp\n // QueryCaptcha: QueryCaptcha,\n // chkCaptcha: chkCaptcha,\n\n };\n\n function replaceFunc(data) {\n if (editPwdErrorLogic(data.data.Result, data.data.ResultValue)) {\n return data.data;\n }\n }\n\n function basicFunc(data) {\n if (handleSsoLogic(data.data.Result)) {\n return data.data;\n }\n }\n\n function multipleSerNoFunc(data) {\n if (data.data.length === 1 && handleSsoLogic(data.data[0].Result, data.data[0].ResultValue)) {\n return data.data[0];\n } else if (data.data.length > 1) {\n return data.data;\n }\n }\n\n function setSsoParams(param) {\n param.sysCode = sysCode;\n if (sessionStorage.getItem('token')) {\n param.token = sessionStorage.getItem('token');\n }\n }\n\n function get() {\n var param = {\n langSerilNo: 1\n };\n\n return $http.post(apiUrl.tsApi + 'login', param);\n }\n\n function handleSsoLogic(ssoCode, resultNumber) {\n if (!resultNumber) {\n resultNumber = 1;\n }\n\n switch (ssoCode) {\n case enumService.sso.success:\n return true;\n case enumService.sso.error:\n toastr.error($rootScope.translate.commonErrorMessage);\n return false;\n case enumService.sso.mustModifydwP:\n //2023-07-10 Johnson 資安2023\n toastr.info($rootScope.translate.ssoMustModifyPwd);\n return true;\n case enumService.sso.commonErrorMessage:\n toastr.error($rootScope.translate.commonErrorMessage);\n return false;\n case enumService.sso.notExist:\n //toastr.error($rootScope.translate.ssoAccountNotExist);\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\n return false;\n case enumService.sso.disable:\n //toastr.error($rootScope.translate.commonDisable);\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\n return false;\n case enumService.sso.isLock:\n toastr.error($rootScope.translate.commonIsLock);\n return false;\n case enumService.sso.tokenNotExist:\n toastr.error($rootScope.translate.commonNotExistToken);\n return false;\n case enumService.sso.dwpError:\n //2023-07-10 Johnson 資安2023\n //toastr.error($rootScope.translate.commonNotExist);\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\n return false;\n case enumService.sso.notFindAccount:\n toastr.error($rootScope.translate.ssoNotFindAccount);\n return false;\n case enumService.sso.accountIsNotActive:\n //toastr.error($rootScope.translate.ssoAccountIsNotActive);\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\n return false;\n case enumService.sso.illegalRegister:\n toastr.error($rootScope.translate.illegalRegister);\n return false;\n case enumService.sso.dwpErrorIsLock:\n //2023-07-10 Johnson 資安2023\n //toastr.error($rootScope.translate.ssoPwdErrorIsLock);\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\n return false;\n case enumService.sso.lockUnReslove:\n var commonUnLock = _.replace($rootScope.translate.commonUnLock, '?', resultNumber);\n toastr.error(commonUnLock);\n return false;\n case enumService.sso.waitForLock:\n toastr.error($rootScope.translate.waitForLock);\n return false;\n case enumService.sso.isTaiEmail:\n toastr.warning($rootScope.translate.ssoIsTaiEmail);\n return false;\n case enumService.sso.reCaptchaFail:\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n return false;\n }\n }\n\n function editPwdErrorLogic(ssoCode, resultNumber) {\n var ssoPwdMustBigThan = _.replace($rootScope.translate.ssoPwdMustBigThan, '?', resultNumber);\n var ssoPwdNotSameRecent = _.replace($rootScope.translate.ssoPwdNotSameRecent, '?', resultNumber);\n var ssoPwdModifyWeek = _.replace($rootScope.translate.ssoPwdModifyWeek, '?', resultNumber);\n\n switch (ssoCode) {\n case enumService.sso.userAlreadyValidate:\n toastr.info($rootScope.translate.userAlreadyValidate);\n return false;\n case enumService.sso.dwpError:\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.commonPwdError);\n return false;\n case enumService.sso.dwpJustEnAndNumber:\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.ssoPwdJustEnAndNumber);\n return false;\n case enumService.sso.dwpMustBigThan:\n //2023-07-10 Johnson 資安2023\n toastr.error(ssoPwdMustBigThan);\n return false;\n case enumService.sso.dwpNeedContainEnAndNumber:\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.ssoPwdNeedContainEnAndNumber);\n return false;\n case enumService.sso.notExist:\n toastr.error($rootScope.translate.ssoAccountNotExist);\n return false;\n case enumService.sso.dwpNotContainueThree:\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.ssoPwdNotContainueThree);\n return false;\n case enumService.sso.dwpNotContainueThreeOrderAndDesc:\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.ssoPwdNotContainueThreeOrderAndDesc);\n return false;\n case enumService.sso.dwpNotSameAccount:\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.ssoPwdNotSameAccount);\n return false;\n case enumService.sso.dwpNotSameRecent:\n //2023-07-10 Johnson 資安2023\n toastr.error(ssoPwdNotSameRecent);\n return false;\n case enumService.sso.accountNotExist:\n toastr.error($rootScope.translate.ssoAccountNotExist);\n return false;\n case enumService.sso.verifyCodeExpired:\n toastr.error($rootScope.translate.ssoVerifyCodeExpired);\n return false;\n case enumService.sso.verifyCodeNotExist:\n toastr.error($rootScope.translate.ssoVerifyCodeNotExist);\n return false;\n case enumService.sso.emailAlreadyRegister:\n toastr.error($rootScope.translate.emailAlreadyRegister);\n return false;\n case enumService.sso.dwpModifyWeek:\n //2023-07-10 Johnson 資安2023\n toastr.error(ssoPwdModifyWeek);\n return false;\n case enumService.sso.verifyCodeInValid:\n toastr.error($rootScope.translate.ssoVerifyCodeInValid);\n return false;\n case enumService.sso.verifyCodeNotPass:\n toastr.error($rootScope.translate.verifyCodeNotPass);\n return false;\n case enumService.sso.newdwPNotSameOlddwP:\n //2023-07-10 Johnson 資安2023\n //2023-07-10 Johnson 資安2023\n toastr.error($rootScope.translate.newdwPNotSameOlddwP);\n return false;\n case enumService.sso.notHavePhone:\n\n toastr.error($rootScope.translate.ssoNotHavePhone);\n return false;\n case enumService.sso.notHaveEmail:\n toastr.error($rootScope.translate.ssoNotHaveEmail);\n return false;\n default:\n return handleSsoLogic(ssoCode);\n }\n }\n\n function login(params) {\n setSsoParams(params);\n //test error situation\n //recaptcha.response = recaptcha.response + 'ee';\n //console.log('params:', params);\n\n return $http.post(apiUrl.ssoApi + 'sso/login', params).then(function (data) {\n //console.log('response:', data);\n if (data) {\n return multipleSerNoFunc(data);\n }\n });\n }\n\n function loginByPerSerilNo(params) {\n setSsoParams(params);\n return $http.post(apiUrl.ssoApi + 'sso/loginByPerSerilNo', params).then(function (data) {\n return basicFunc(data);\n });\n }\n\n function logout() {\n var params = {\n 'sysCode': sysCode,\n 'token': sessionStorage.getItem('token')\n };\n return $http.post(apiUrl.ssoApi + 'sso/logout', params).then(function (data) {\n return basicFunc(data);\n });\n }\n\n function tokenTransfer(params) {\n return $http.post(apiUrl.ssoApi + 'sso/tokenTransfer', params).then(function (data) {\n return multipleSerNoFunc(data);\n });\n }\n\n function tokenTransferByAccount(params) {\n return $http.post(apiUrl.ssoApi + 'sso/tokenTransferByAccount', params).then(function (data) {\n return multipleSerNoFunc(data);\n });\n }\n\n function modifyUserPassword(params) {\n return getSsoInfo().then(function (data) {\n return data.data.userAccount;\n }).then(function (account) {\n params.userAccount = account;\n return $http.post(apiUrl.ssoApi + 'Password/ModifyUserPassword', params).then(function (data) {\n return replaceFunc(data);\n });\n });\n }\n\n function forgetPWD(params, recaptcha) {\n //test error situation\n //recaptcha.response = recaptcha.response + 'ee';\n return $http.post(apiUrl.ssoApi + 'Password/ForgetPWD', params).then(function (data) {\n //console.log('resData:', data.data);\n if (data.data) {\n if (editPwdErrorLogic(data.data.Result, 0)) {\n return data.data;\n }\n }\n });\n }\n\n function directModifyUserPassword(params) {\n return $http.post(apiUrl.ssoApi + 'Password/directModifyUserPassword', params).then(function (data) {\n return replaceFunc(data);\n });\n }\n\n function checkToken() {\n var param = {};\n setSsoParams(param);\n return $http.post(apiUrl.ssoApi + 'sso/checkToken', param);\n }\n\n function registerOutsideUser(params) {\n //alert('apiUrl.ssoApi:'+apiUrl.ssoApi);\n return $http.post(apiUrl.ssoApi + 'user/registerOutsideUser', params).then(function (data) {\n if (editPwdErrorLogic(data.data.Result, data.data.ResultValue)) {\n return data.data;\n }\n });\n }\n\n function getSsoInfo() {\n var param = {\n perSerilNo: sessionStorage.getItem('perSerilNo'),\n sysCode: sysCode,\n token: sessionStorage.getItem('token')\n };\n return $http.post(apiUrl.tsApi + 'employee/ssoInfo', param);\n }\n\n function editUserProfile(param) {\n setSsoParams(param);\n param.perSerilNo = sessionStorage.getItem('perSerilNo');\n $http.post(apiUrl.tsApi + 'employee/editProfile', param).then(function () {\n sessionStorage.setItem('cName', param.cName);\n $rootScope.$emit('emitCName', param.cName);\n toastr.success($rootScope.translate.commonSaveSuccess);\n });\n }\n\n function sendVerifyCodeFromPhone(account, recaptcha) {\n var param = {\n userAccount: account\n };\n commonService.setParams(param);\n return $http.post(apiUrl.ssoApi + 'sso/produceVerifyCodeFromPhone', param).then(function (data) {\n return handleSsoLogic(data);\n });\n }\n\n function verifyCodeCheckFromPhone(param) {\n commonService.setParams(param);\n return $http.post(apiUrl.ssoApi + 'sso/VerifyCodeCheckFromPhone', param).then(function (data) {\n return replaceFunc(data);\n });\n }\n\n function validateTel(param) {\n return $http.post(apiUrl.ssoApi + 'user/ValidateTel', param);\n }\n\n function getPwdConstrain() {\n var params = {\n langSerilNo: sessionStorage.getItem('langCode'),\n sysCode: sysCode,\n token: sessionStorage.getItem('token')\n };\n return $http.post(apiUrl.ssoApi + 'password/getPwdConstrainForLanguage', params);\n }\n\n function checkVerifyCode(params) {\n return $http.post(apiUrl.ssoApi + 'user/CheckVerifyCode', params);\n }\n\n function produceVerifyCodeFromSignUp(param) {\n return $http.post(apiUrl.ssoApi + 'user/produceVerifyCodeFromSignUp', param).then(function (data) {\n return handleSsoLogic(data);\n });\n }\n\n function verifyCodeCheckFromSignUp(param) {\n return $http.post(apiUrl.ssoApi + 'user/verifyCodeCheckFromSignUp', param).then(function (data) {\n return handleSsoLogic(data);\n });\n }\n\n // function QueryCaptcha() {\n // return $http.post(apiUrl.ssoApi + 'sso/QueryCaptcha').then(function (data) {\n // return handleSsoLogic(data);\n // });\n // }\n // function chkCaptcha() {\n // return $http.post(apiUrl.ssoApi + 'sso/chkCaptcha').then(function (data) {\n // return handleSsoLogic(data);\n // });\n // }\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('menuService', menuService);\n\n function menuService($location, enumService, $http, apiUrl, $window, commonService, $timeout) {\n var service = {\n redirectUrl: redirectUrl,\n generateUrl: generateUrl,\n getInformationBySerilNo: getInformationBySerilNo\n };\n\n var menuUrl = apiUrl.tsApi + 'menu/';\n\n function getInformationBySerilNo(menuSerilNo, langSerilNo) {\n var newApiURL = menuUrl + 'getByMenuSerilNo/' + menuSerilNo + '/' + langSerilNo;\n newApiURL = commonService.URLCheck(newApiURL);\n //2023-07-20 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n }\n\n function redirectUrl(item) {\n var cloneItem = _.cloneDeep(item);\n var param = {\n menuSerilNo: cloneItem.menuSerilNo\n };\n param.menuClickLogCreatePerSerilNo = '';\n param.langSerilNo = '';\n\n commonService.setParams(param);\n if (sessionStorage.getItem('perSerilNo')) {\n param.menuClickLogCreatePerSerilNo = sessionStorage.getItem('perSerilNo');\n }\n\n if (sessionStorage.getItem('langCode')) {\n param.langSerilNo = sessionStorage.getItem('langCode');\n }\n\n $http.post(apiUrl.tsApi + 'log/postFlow', param);\n $http.post(menuUrl + 'checkMenuIsPass', param).then(function () {\n redirectByTarget(cloneItem, sessionStorage.getItem('token'));\n });\n }\n\n function redirectByTarget(item, token) {\n\n // 目前外網只有一種轉頁方式: 本頁直接跳轉\n redirectDirect(item, token);\n\n // if (item.isWindowOpen || item.target === enumService.target.open) {\n // redirectOpen(item, token);\n // return;\n // }\n\n // if (item.target === enumService.target.wrap) {\n // redirectWrap(item, token);\n // return;\n // }\n\n // if (item.target === enumService.target.direct) {\n // redirectDirect(item, token);\n // return;\n // }\n }\n\n // function redirectOpen(item, token) {\n // generateUrl(item, token);\n // if (item.isWindowOpen) {\n // window.open(item.url, 'searchResult');\n // } else {\n // window.open(item.url);\n // }\n // }\n\n // function redirectWrap(item) {\n // $location.path('external').search('menu', item.menuSerilNo);\n // }\n\n function redirectDirect(item, token) {\n\n if (!isOutSideUrl(item)) {\n $location.path(item.url).search('menu', item.menuSerilNo);\n return;\n }\n\n if (item.sysCode) {\n //item.url += '?menu=' + item.menuSerilNo;\n generateUrl(item, token);\n }\n\n $timeout(function () {\n //console.log(item.url);\n $window.location.href = item.url;\n }, 200);\n }\n\n function generateUrl(item, token) {\n\n if (!isOutSideUrl(item)) {\n item.url = format('//{0}/#{1}', location.host, item.url);\n }\n\n if (sessionStorage.getItem('token') && item.sysCode) {\n\n // 為了避免用戶把網址直接複製給別人\n // 所以如果是自己的功能就不加上Token\n // 如果是其他掛載的頁面,由於不知道是去那裡,所以就給予 token 讓台新其他功能(線上差勤)取用\n var isInitialMenu = item.initialData;\n\n if (item.url.indexOf('?menu') > -1) {\n item.url = item.url.split('?menu=')[0];\n //console.log('1.',item.url);\n if (isInitialMenu) {\n item.url += format('?menu={0}', item.menuSerilNo);\n //console.log('2.',item.url);\n } else {\n item.url += format('?tkn={0}&menu={1}', token, item.menuSerilNo);\n //console.log('3.',item.url);\n }\n\n return;\n }\n\n if (item.url.indexOf('?') > -1) {\n\n if (isInitialMenu) {\n item.url += format('&menu={0}', item.menuSerilNo);\n //console.log('4.',item.url);\n } else {\n item.url += format('&tkn={0}&menu={1}', token, item.menuSerilNo);\n //console.log('5.',item.url);\n }\n return;\n }\n\n if (item.url.indexOf('?') === -1) {\n\n if (isInitialMenu) {\n item.url += format('?menu={0}', item.menuSerilNo);\n //console.log('6.',item.url);\n } else {\n item.url += format('?tkn={0}&menu={1}', token, item.menuSerilNo);\n //console.log('7.',item.url);\n }\n return;\n }\n } else {\n if (item.url.indexOf('?menu') > -1) {\n item.url = item.url.split('?menu=')[0];\n item.url += format('?menu={0}', item.menuSerilNo);\n //console.log('8.',item.url);\n return;\n }\n\n if (item.url.indexOf('?') > -1) {\n item.url += format('&menu={0}', item.menuSerilNo);\n //console.log('9.',item.url);\n return;\n }\n\n if (item.url.indexOf('?') === -1) {\n item.url += format('?menu={0}', item.menuSerilNo);\n //console.log('10.',item.url);\n return;\n }\n }\n }\n\n function isOutSideUrl(item) {\n\n var result = _.startsWith(item.url, '//') || _.startsWith(item.url, 'http://') || _.startsWith(item.url, 'https://') || _.startsWith(item.url, 'line://');\n return result;\n }\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('mobileService', mobileService);\n\n function mobileService(apiUrl, $http, $q) {\n var service = {\n postMobileInfo: postMobileInfo,\n postCourseInfo: postCourseInfo\n };\n\n return service;\n\n ////////////////\n function postMobileInfo(data) {\n // 通知 APP 登入成功 (給予 token 資料)\n //alert('DEVICE_TYPE:',DEVICE_TYPE);\n if (DEVICE_TYPE) {\n var params = {\n token: data.Token\n };\n var method = \"login\";\n appCallback(method, params);\n }\n var param = {\n DEVICE_TYPE: DEVICE_TYPE,\n DEVICE_TOKEN: DEVICE_TOKEN,\n USER_TOKEN: data.Token,\n PerSerilNo: data.PerSerilNo || data.PerserilNo\n };\n var isMobileApp = true;\n\n if (!param.DEVICE_TOKEN || DEVICE_TOKEN.length < 1) {\n isMobileApp = false;\n } else {\n if (param.DEVICE_TYPE !== '' && param.DEVICE_TYPE !== '(null)' && param.DEVICE_TYPE.toLowerCase() === 'ios') {\n var message = { 'DEVICE_TOKEN': param.DEVICE_TOKEN, 'DEVICE_TYPE': param.DEVICE_TYPE };\n window.webkit.messageHandlers.msgHandler.postMessage(message);\n }\n }\n if (!isMobileApp) {\n return $q.when({});\n }\n $http.post(apiUrl.tsApi + 'mobile', param);\n }\n\n function postCourseInfo(params) {\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(params));\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('modalService', modalService);\n\n function modalService($uibModal, $q, loginService, $timeout) {\n var service = {\n login: login,\n forgetPwd: forgetPwd,\n register: register,\n getChoicePerSerilNo: getChoicePerSerilNo,\n getTaiClass: getTaiClass,\n getWindowClass: getWindowClass,\n isMobile: isMobile,\n isIos: isIos,\n touchWithMe: touchWithMe,\n explanation: explanation,\n setting: setting,\n courseDetail: courseDetail,\n editPwd: editPwd,\n phoneNumber: phoneNumber,\n trainingSelectAction: trainingSelectAction,\n selectActionConfirm: selectActionConfirm,\n confrimDialog: confrimDialog,\n openOptionSelector: openOptionSelector\n };\n return service;\n //=================\n\n function isMobile() {\n // console.log(\"check isMobile\");\n // console.log(\"window.orientation:\", window.orientation);\n // console.log(\"navigator.userAgent.indexOf(\\\"IEMobile\\\"):\", navigator.userAgent.indexOf(\"IEMobile\"));\n return typeof window.orientation !== \"undefined\" || navigator.userAgent.indexOf(\"IEMobile\") !== -1;\n }\n\n function isIos() {\n return navigator.userAgent.match(/ip(hone|ad|od)/i) && !navigator.userAgent.match(/(iemobile)[\\/\\s]?([\\w\\.]*)/i);\n }\n\n function getTaiClass() {\n if (service.isMobile()) {\n return 'mobile-modal-dialog,mobile-modal-content';\n }\n }\n\n function getWindowClass() {\n if (!service.isMobile()) {\n return 'modal-margin-top';\n }\n }\n\n function getChoicePerSerilNo(param) {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/choicePerSerilNoModal.html',\n controller: 'choicePerSerilNoModalController as vm',\n size: 'sm',\n taiClass: getTaiClass(),\n resolve: {\n data: function data() {\n return param;\n }\n }\n });\n return modal;\n }\n\n function login() {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/loginModal.html',\n controller: 'loginModalController as vm',\n size: 'sm',\n taiClass: getTaiClass()\n });\n modal.closed.then(onDestroy);\n\n return modal;\n //==\n function onDestroy() {\n var defer = $q.defer();\n var reCaptchaCheckChild = null;\n do {\n if (reCaptchaCheckChild) {\n //first round skip\n var reCaptchaCheck = reCaptchaCheckChild.parentElement;\n if (reCaptchaCheck && reCaptchaCheck.parentElement) {\n reCaptchaCheck.parentElement.removeChild(reCaptchaCheck);\n }\n }\n reCaptchaCheckChild = document.getElementsByClassName(\"g-recaptcha-bubble-arrow\")[0];\n } while (reCaptchaCheckChild);\n\n defer.resolve('Success!');\n return defer.promise;\n }\n }\n\n function forgetPwd() {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/forgetPwdModal.html',\n controller: 'forgetPwdModalController as vm',\n size: 'sm',\n taiClass: getTaiClass()\n });\n return modal;\n }\n\n function register() {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/registerModal.html',\n controller: 'registerModalController as vm',\n size: 'lg',\n taiClass: getTaiClass()\n });\n return modal;\n }\n\n function touchWithMe() {\n //20180315 Anthony \n //在開啟這modal時,資料延遲有時間差,所以調整成先拿完資料再開啟\n\n //20180326 Anthony Add new variable for login/nonLogin\n var delaySec = 1;\n var _userData = {\n cName: null,\n email: null,\n isLogin: false\n };\n\n if (sessionStorage.getItem('token')) {\n loginService.getSsoInfo().then(function (data) {\n _userData.cName = sessionStorage.getItem('cName');\n _userData.email = data.data.email;\n _userData.isLogin = true;\n });\n\n delaySec = 1500;\n }\n\n //sso 資料回傳有延遲,這裡延遲開啟modal\n $timeout(function () {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/contectModal.html',\n controller: 'contectModalController as vm',\n size: 'sm',\n taiClass: getTaiClass(),\n resolve: {\n userData: function userData() {\n return _userData;\n }\n }\n });\n return modal;\n }, delaySec);\n }\n\n function confrimDialog(_config) {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/confirmDialog/confirmDialog.html',\n controller: 'confirmDialogController as vm',\n size: 'md',\n taiClass: getTaiClass(),\n resolve: {\n config: function config() {\n _config = _config || {};\n var paramConfig = {\n confirmTitle: _config.confirmTitle || '',\n confirmContent: _config.confirmContent || '',\n textButtonOk: _config.textButtonOk || null,\n textButtonCancel: _config.textButtonCancel || null,\n promiseAction: _config.promiseAction\n };\n return paramConfig;\n }\n }\n });\n return modal;\n }\n\n function explanation() {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/explanationModal.html',\n controller: 'explanationModalController as vm',\n size: 'lg',\n taiClass: getTaiClass()\n });\n return modal;\n }\n\n function setting(param) {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/settingModal.html',\n controller: 'settingModalController as vm',\n size: 'lg',\n taiClass: getTaiClass(),\n resolve: {\n viewModel: function viewModel() {\n return param;\n }\n }\n });\n return modal;\n }\n\n function courseDetail(item, settingModel, defaultTabIndex) {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/courseDetailModal.html',\n controller: 'courseDetailModalController as vm',\n size: 'lg',\n taiClass: getTaiClass(),\n resolve: {\n courseItem: item,\n settingModel: settingModel,\n defaultTabIndex: defaultTabIndex\n }\n });\n\n modal.rendered.then(function () {\n\n var modalBootstrap = $(\".modal-open > .modal\");\n modalBootstrap.scroll(function () {\n // 改變\"回頂端\"樣式,只有當下拉選單滾到一定層度才會出現\n var modalContent = this;\n var goTop = modalBootstrap.find(\"div.goTop a\");\n if (!goTop) {\n return;\n }\n if (modalContent.scrollTop < 300) {\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"relative\", \"top\": \"0px\", \"display\": \"none\" });\n } else {\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"absolute\", \"top\": modalContent.scrollTop, \"display\": \"block\" });\n }\n });\n });\n return modal;\n }\n\n function editPwd() {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/editPwdModal.html',\n controller: 'editPwdModalController as vm',\n size: 'lg',\n taiClass: getTaiClass()\n });\n return modal;\n }\n\n function phoneNumber() {\n var modal = $uibModal.open({\n templateUrl: 'controller/common/modal/phoneNumberModal.html',\n controller: 'phoneNumberModalController as vm',\n size: 'lg',\n taiClass: getTaiClass()\n });\n return modal;\n }\n\n function trainingSelectAction(_viewModel) {\n var modal = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingSelectActionModal.html',\n controller: 'myTrainingSelectActionModalController as vm',\n size: 'lg',\n keyboard: false,\n backdrop: 'static',\n taiClass: getTaiClass(),\n resolve: {\n viewModel: function viewModel() {\n // console.log(\"trainingSelectAction viewModel\",viewModel);\n return _viewModel;\n }\n }\n });\n\n modal.rendered.then(function () {\n\n var modalBootstrap = $(\".modal-open > .modal\");\n modalBootstrap.scroll(function () {\n // 改變\"回頂端\"樣式,只有當下拉選單滾到一定層度才會出現\n var modalContent = this;\n var goTop = modalBootstrap.find(\"div.goTop a\");\n if (!goTop) {\n return;\n }\n if (modalContent.scrollTop < 300) {\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"relative\", \"top\": \"0px\", \"display\": \"none\" });\n } else {\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"absolute\", \"top\": modalContent.scrollTop, \"display\": \"block\" });\n }\n });\n });\n return modal;\n }\n\n function selectActionConfirm(_ctmsConfirmTime, param) {\n //console.log('ctmsConfirmTime:',ctmsConfirmTime);\n var modalResult = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingSelectActionConfirmModal.html',\n controller: 'myTrainingSelectActionConfirmModalController as vm',\n size: 'lg',\n backdrop: 'static',\n keyboard: false,\n taiClass: getTaiClass(),\n windowClass: getWindowClass(),\n resolve: {\n ctmsConfirmTime: function ctmsConfirmTime() {\n return _ctmsConfirmTime;\n },\n data: function data() {\n return param;\n }\n }\n });\n return modalResult;\n }\n\n function openOptionSelector(data, title, _isCycle) {\n var result = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/optionSelector.html',\n controller: 'optionSelectorController as vm',\n size: 'sm',\n backdrop: 'static',\n taiClass: getTaiClass(),\n resolve: {\n titleTranslate: function titleTranslate() {\n return title;\n },\n keyValueList: function keyValueList() {\n return data;\n },\n isCycle: function isCycle() {\n return _isCycle;\n }\n }\n\n });\n return result;\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('scheduleService', scheduleService);\n\n function scheduleService($http, apiUrl, commonService) {\n var service = {\n get: get,\n donwloadIcs: donwloadIcs,\n getCalendarArea: getCalendarArea\n };\n\n var url = apiUrl.tsApi + 'schedule/';\n\n function get(thisMonth, calendarAreaNo) {\n var param = {\n thisMonth: thisMonth.format('YYYY/MM/DD'),\n calAreaSerilNo: calendarAreaNo,\n menuSerilNo: getMenuQueryString()\n };\n commonService.setParams(param);\n if (sessionStorage.getItem('token')) {\n return $http.post(url + 'get', param);\n }\n return $http.post(url + 'getByNoLogin', param);\n }\n\n function donwloadIcs(param, isIos) {\n var downloadUrl = format('{0}PostExportSchedule?calendarSerilNo={1}&menuSerilNo={2}&token={3}&perSerilNo={4}&isIos={5}', url, param.calendarSerilNo, getMenuQueryString(), sessionStorage.getItem('token'), sessionStorage.getItem('perSerilNo'), isIos);\n return downloadUrl;\n }\n\n function getCalendarArea() {\n var newApiURL = url + 'calendarArea/' + sessionStorage.getItem('perSerilNo');\n newApiURL = commonService.URLCheck(newApiURL);\n //2023-07-20 Johnson ��w2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n }\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('translateService', translateService);\n\n function translateService($rootScope, $translate, $http, $q, apiUrl, commonService) {\n var service = {\n getLanguage: getLanguage,\n getDefault: getDefault,\n change: change,\n callApi: callApi,\n getTranslates: getTranslates\n };\n\n function getLanguage(isWrite) {\n var param = {\n isWrite: isWrite\n };\n commonService.setParams(param);\n\n return $http.post(apiUrl.tsApi + 'getLanguage', param);\n }\n\n function getDefault(languageItems) {\n var defaultLanguage = _.find(languageItems, {\n selected: true\n });\n sessionStorage.setItem('langCode', defaultLanguage.langSerilNo);\n sessionStorage.setItem('userLang', defaultLanguage.langCode);\n callApi(sessionStorage.getItem('userLang'));\n return defaultLanguage;\n }\n\n function change(selectedItem) {\n sessionStorage.setItem('langCode', selectedItem.langSerilNo);\n return getLanguage(true).then(function (data) {\n sessionStorage['userLang'] = _.replace(selectedItem.langCode, '_', '-');\n var defaultLanguage = getDefault(data.data);\n return defaultLanguage;\n });\n }\n\n function callApi(languageCode) {\n return $translate.use(languageCode).then(function () {\n return getTranslates();\n }).then(function (data) {\n $rootScope.translate = data;\n });\n }\n\n function getTranslates() {\n var userLang = sessionStorage['userLang'];\n var urlTranslate = apiUrl.tsApi + 'getTranslationResource?lang=' + userLang;\n //2023-07-20 Johnson ��w2023\n //console.log(\"getTranslates:\\service\\translate.service.js\");\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$.1(2).3(4(0){5 0});', 6, 6, 'response|get|urlTranslate|then|function|return'.split('|'), 0, {}));\n }\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('visualPageService', visualPageService);\n\n function visualPageService($http, apiUrl, commonService) {\n var service = {\n get: get\n };\n\n var visualPageUrl = apiUrl.tsApi + 'visualPage';\n\n function get(pageSerilNo) {\n var param = {\n pageSerilNo: pageSerilNo,\n menuSerilNo: getMenuQueryString()\n };\n commonService.setParams(param);\n return $http.post(visualPageUrl, param);\n }\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('bulletinDetailController', bulletinDetailController);\n\n function bulletinDetailController(viewModel) {\n var vm = this;\n vm.data = viewModel.data;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('bulletinMoreController', bulletinMoreController);\n\n function bulletinMoreController(viewModel) {\n var vm = this;\n\n onInit();\n\n function onInit() {\n vm.data = viewModel.data;\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('commonController', commonController);\n\n function commonController($sce) {\n var vm = this;\n onInit();\n\n function onInit() {\n menuService.getInformationBySerilNo(getMenuQueryString()).then(function (data) {\n menuService.generateUrl(data.data, sessionStorage.getItem('token'));\n vm.url = $sce.trustAsResourceUrl(data.data.url);\n });\n vm.url = $sce.trustAsResourceUrl(sessionStorage.getItem('iframeUrl'));\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('externalController', externalController);\n\n function externalController($sce, menuService) {\n var vm = this;\n\n init();\n\n function init() {\n\n // 紀錄這次進入的 menu No 到 session storage 中\n // 如果需要登入就會被導到登入頁\n // 登入後就會依照這個參數導到該頁面中\n //sessionStorage.setItem('menuNo', getMenuQueryString());\n\n var langSerilNo = 1;\n if (sessionStorage.getItem('langCode')) {\n langSerilNo = sessionStorage.getItem('langCode');\n }\n\n menuService.getInformationBySerilNo(getMenuQueryString(), langSerilNo).then(function (data) {\n\n var isEmbed = data.data.target === 2 /*崁入式窗*/;\n if (isEmbed) {\n menuService.generateUrl(data.data, sessionStorage.getItem('token'));\n\n vm.url = $sce.trustAsResourceUrl(data.data.url);\n } else {\n // includ token transfer flow\n menuService.redirectUrl(data.data);\n }\n });\n }\n\n // function getCurrentLangSerilNo(){\n // if (sessionStorage.getItem('langCode')) {\n // langSerilNo = sessionStorage.getItem('langCode');\n // }\n // }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('externalSchemaTransferController', externalSchemaTransferController);\n\n function externalSchemaTransferController() {\n\n init();\n\n function init() {\n // 提供 APP 開啟其他 APP 的跳轉頁面\n var schema = getSchemaQueryString();\n window.location = schema + '://';\n }\n\n function getSchemaQueryString() {\n\n if (location.href.split('schema=').length > 1) {\n //2023-07-10 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('3.4.5(\\'6=\\')[1].0(//2,\\'&8\\').0(/\"/2,\\'&9\\').0(/\\'/2,\\'&#a\\').0(/[<>!]|(\\\\(\\\\))|((b|c|d)\\\\e*\\\\(.*\\\\))/2,\\'\\')', 15, 15, 'replace||g|location|href|split|schema|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}));\n }\n return undefined;\n }\n }\n})();\n'use strict';\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('headerSearchResultController', headerSearchResultController);\n\n function headerSearchResultController(modalService, headerService, $rootScope, viewModel, menuService, enumService, siteCode, $window) {\n var vm = this;\n vm.isMobile = modalService.isMobile();\n vm.data = viewModel.data;\n vm.redirectMenuSearchResult = redirectMenuSearchResult;\n vm.redirectContentSearchResult = redirectContentSearchResult;\n vm.pageChange = pageChange;\n vm.tabChange = tabChange;\n vm.search = search;\n vm.checkLastMenu = checkLastMenu;\n vm.getMoreList = getMoreList;\n vm.needKeywordLog = false;\n\n vm.view = {\n initTotal: 0\n };\n\n init();\n\n function init() {\n vm.searchedKeyword = vm.data.keyword;\n vm.keyword = vm.data.keyword;\n vm.siteCode = siteCode;\n }\n\n function redirectMenuSearchResult(item) {\n //console.log(\"item.menuSerilNo:\"+item.menuSerilNo);\n if (!_.isEmpty(sessionStorage.getItem('menuAllList'))) {\n\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n\n //如果Menu=37(上課與證照),就設定Menu=-9901(待修課程)\n if (parseInt(item.menuSerilNo) === 37) {\n sessionStorage.setItem('menuSerilNo', -9901);\n } else {\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\n }\n\n //點選任一動態磚即撈取是選單功能Menu資料\n var menuAllList = JSON.parse(sessionStorage.getItem('menuAllList'));\n var menuItems = menuAllList.filter(function (menuLists) {\n return parseInt(menuLists.menuSerilNo) === parseInt(sessionStorage.getItem('menuSerilNo')) && menuLists.hasChild === false;\n });\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\n if (menuItems !== null && menuItems.length !== 0) {\n sessionStorage.setItem('menuSerilNo', menuItems[0].menuSerilNo);\n sessionStorage.setItem('menuItemPath', menuItems[0].menuItemPath);\n } else {\n //如是選單節點即撈取第二或第三階層是否為父階層 \n menuItems = menuAllList.filter(function (menuLists) {\n return parseInt(menuLists.parentId) === parseInt(sessionStorage.getItem('menuSerilNo'));\n });\n\n //撈取選單節點下排序第一個功能Menu\n if (menuItems != null && menuItems.length !== 0) {\n var sort = Math.min.apply(Math, _toConsumableArray(menuItems.map(function (p) {\n return p.sort;\n })));\n var menuItem = menuItems.filter(function (menuLists) {\n return parseInt(menuLists.sort) === parseInt(sort);\n });\n\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\n //console.log(menuItem);\n if (menuItem !== null && menuItem.length !== 0) {\n if (!menuItem[0].hasChild) {\n sessionStorage.setItem('menuSerilNo', menuItem[0].menuSerilNo);\n }\n sessionStorage.setItem('menuItemPath', menuItem[0].menuItemPath);\n }\n }\n }\n\n console.log('headerSearchResult_redirectMenuSearchResult-menuSerilNo:' + sessionStorage.getItem('menuSerilNo'));\n console.log('headerSearchResult_redirectMenuSearchResult-menuItemPath:' + sessionStorage.getItem('menuItemPath'));\n }\n\n // 目前外網只有一種轉頁方式: 本頁直接跳轉\n menuService.redirectUrl(item);\n\n // if (item.target === enumService.target.wrap) {\n // window.open('//' + location.host + '/#/external?menu=' + item.menuSerilNo, 'searchResult');\n // } else {\n // item.isWindowOpen = true;\n // menuService.redirectUrl(item);\n // }\n }\n\n function redirectContentSearchResult(item) {\n\n // 目前外網只有一種轉頁方式: 本頁直接跳轉\n $window.location.href = '//' + location.host + '/#/bulletin/detail/' + item.serilNo, 'searchResult';\n\n //window.open('//' + location.host + '/#/bulletin/detail/' + item.serilNo, 'searchResult');\n }\n\n function pageChange() {\n var newPage = vm.data.currentPage;\n var keyword = vm.searchedKeyword;\n var newType = vm.data.currentSearchResultType;\n vm.keyword = keyword;\n headerService.getSearchResult(keyword, newPage, newType, vm.siteCode, vm.needKeywordLog).then(function (data) {\n vm.data = data.data;\n });\n }\n\n function getMoreList() {\n var newPage = vm.data.currentPage + 1;\n var keyword = vm.searchedKeyword;\n var newType = vm.data.currentSearchResultType;\n vm.keyword = keyword;\n headerService.getSearchResult(keyword, newPage, newType, vm.siteCode, vm.needKeywordLog).then(function (data) {\n\n // 加載資料至原本的資料清單上\n\n var result = data.data;\n result.menuMetroResults = _.concat(vm.data.menuMetroResults, result.menuMetroResults);\n result.contentResults = _.concat(vm.data.contentResults, result.contentResults);\n result.bulletinContentResults = _.concat(vm.data.bulletinContentResults, result.bulletinContentResults);\n result.formContentResults = _.concat(vm.data.formContentResults, result.formContentResults);\n vm.data = result;\n });\n }\n\n function tabChange(currentSearchResultType) {\n vm.view.initTotal++;\n if (vm.view.initTotal > 1) {\n var keyword = vm.searchedKeyword;\n vm.data.currentPage = 1;\n vm.keyword = keyword;\n headerService.getSearchResult(keyword, vm.data.currentPage, currentSearchResultType, vm.siteCode, vm.needKeywordLog).then(function (data) {\n vm.data = data.data;\n });\n }\n }\n function specialKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n function search() {\n\n var keyword = vm.keyword;\n if (keyword) {\n\n var SKV = specialKeywordVerification(keyword);\n\n if (!SKV) {\n vm.data.currentPage = 1;\n vm.searchedKeyword = keyword;\n vm.needKeywordLog = true;\n //$location.path('/header/searchResult/' + keyword);\n headerService.getSearchResult(keyword, vm.data.currentPage, vm.data.currentSearchResultType, vm.siteCode, vm.needKeywordLog).then(function (data) {\n vm.data = data.data;\n });\n } else {\n console.log('specialKeywords:' + $rootScope.translate.specialKeywords);\n toastr.warning($rootScope.translate.specialKeywords);\n }\n }\n }\n\n function checkLastMenu(index, menu) {\n var menuSize = Object.keys(menu).length - 1;\n return Number(index) === menuSize;\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('homeController', homeController);\n\n function homeController(viewModel) {\n var vm = this;\n\n init();\n\n function init() {\n vm.data = viewModel.data;\n var menuSerilNo = getMenuQueryString();\n if (parseInt(menuSerilNo) === 31 || menuSerilNo === undefined) {\n $(\".ui-blackCover\").css(\"display\", \"none\");\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n }\n }\n }\n})();\n\"use strict\";\n\n(function () {\n \"use strict\";\n\n angular.module(\"app\").controller(\"loginDirectEditPwdController\", loginDirectEditPwdController);\n\n function loginDirectEditPwdController(sysCode, loginService, $location, e2eService, $rootScope, $routeParams, commonService, iAmNotRobot, $http, apiUrl, $scope) {\n var vm = this;\n vm.submit = submit;\n vm.autoFill = autoFill;\n vm.sendVerifyCodeFromSignUp = sendVerifyCodeFromSignUp;\n vm.checkVerify = checkVerify;\n vm.iAmNotRobot = iAmNotRobot;\n vm.isShowConfirmUpdate = false;\n\n vm.view = {\n type: \"editPwd\"\n };\n\n // virtual keyboard start\n vm.showVirKey = showVirKey;\n vm.isShowVirKey = false;\n vm.textChanged = textChanged;\n vm.focusObj = null;\n vm.virData = null;\n vm.canSend = false;\n // 針對哪個 input 使用動態鍵盤輸入\n vm.getFocusNewPwd = function () {\n vm.focusObj = \"newPwd\";\n vm.virData = vm.data.newPwd;\n };\n vm.getFocusConfirmPwd = function () {\n vm.focusObj = \"confirmPwd\";\n vm.virData = vm.data.confirmPwd;\n };\n vm.checkPassword = function () {\n if (vm.data.confirmPwd !== undefined && vm.data.newPwd !== undefined && vm.data.confirmPwd.length >= 6 && vm.data.newPwd.length >= 6) {\n if (vm.data.confirmPwd === vm.data.newPwd) {\n vm.canSend = true;\n } else {\n vm.canSend = false;\n }\n } else {\n vm.canSend = false;\n }\n };\n\n function textChanged(newPwd) {\n var e = document.getElementById(vm.focusObj);\n e.value = newPwd;\n var $e = angular.element(e);\n $e.triggerHandler(\"input\");\n }\n\n function showVirKey() {\n if (vm.isShowVirKey) vm.isShowVirKey = false;else vm.isShowVirKey = true;\n }\n\n onInit();\n\n function onInit() {\n // debugger;\n commonService.fetchDecyrptForDirectModifyDto({\n phoneNumber: $routeParams.mobilTel,\n userAccount: $routeParams.userAccount,\n verifyCode: $routeParams.verifyCode\n }).then(function (data) {\n vm.data = {\n userAccount: data.data.userAccount,\n verifyCode: data.data.verifyCode,\n sysCode: sysCode\n };\n\n vm.form2 = {\n mobilTel: data.data.phoneNumber,\n email: data.data.userAccount\n };\n\n vm.form1 = {\n sysCode: sysCode,\n userAccount: data.data.userAccount,\n tel: data.data.phoneNumber,\n validCode: data.data.validCode,\n issend: false\n };\n });\n }\n\n function submit() {\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\n if (!vm.confirmPwd) {\n loginService.directModifyUserPassword(vm.data).then(function (data) {\n if (data) {\n toastr.success($rootScope.translate.commonEditPwdSuccess);\n if ($routeParams.mobilTel) {\n vm.view.type = \"phone\";\n $(\"#divPhone\").show();\n } else {\n $location.path(\"/login\");\n }\n }\n });\n }\n }\n\n function autoFill() {\n e2eService.directEditPwd(vm.data);\n }\n\n function sendVerifyCodeFromSignUp() {\n //20180314 Anthony\n //1. Verify reCaptcha with MHRAPI and Google API\n //2-1. Succcess : Go Back to Login step\n //2-2. Fail : throw Error Messege\n\n //test error situation\n //recaptcha.response = recaptcha.response+'ee';\n if ($(\"#inputVerify\").val().length == 4) {\n vm.form1.issend = true;\n loginService.produceVerifyCodeFromSignUp(vm.form1).then(function () {\n toastr.success($rootScope.translate.commonAlreadySendSMS);\n });\n } else {\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n return false;\n }\n }\n\n function checkVerify() {\n var param = {\n verifyCode: vm.form1.validCode,\n userAccount: vm.form1.userAccount,\n PhoneNumber: vm.form1.tel\n };\n loginService.verifyCodeCheckFromSignUp(param).then(function () {\n removeSsoInfo();\n toastr.success($rootScope.translate.alreadyVerifyPhoneNumber);\n $location.path(\"/login\");\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('loginForceEditPwdController', loginForceEditPwdController);\n\n function loginForceEditPwdController(sysCode, loginService, $location, e2eService, $rootScope) {\n var vm = this;\n vm.submit = submit;\n vm.autoFill = autoFill;\n\n onInit();\n\n function onInit() {\n vm.data = {};\n }\n\n function submit() {\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\n if (!vm.confirmPwd) {\n vm.data.sysCode = sysCode;\n vm.data.token = sessionStorage.getItem('token');\n loginService.modifyUserPassword(vm.data).then(function (data) {\n if (data) {\n removeSsoInfo();\n toastr.success($rootScope.translate.commonEditPwdSuccess);\n $location.path('/login');\n }\n });\n }\n }\n\n function autoFill() {\n e2eService.forceEditPwd(vm.data);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('loginForgetPwdDirectEditPwdController', loginForgetPwdDirectEditPwdController);\n\n function loginForgetPwdDirectEditPwdController(sysCode, loginService, $location, $rootScope, $routeParams, $scope) {\n\n var vm = this;\n vm.submit = submit;\n vm.isValidLink = false;\n\n // virtual keyboard start\n vm.showVirKey = showVirKey;\n vm.isShowVirKey = false;\n vm.isShowConfirmPwdVirKey = false;\n vm.textChanged = textChanged;\n vm.focusObj = null;\n vm.virData = null;\n\n vm.getFocusNewPwd = function () {\n vm.focusObj = \"newPwd\";\n vm.virData = vm.data.newPwd;\n };\n vm.getFocusConfirmPwd = function () {\n vm.focusObj = \"confirmPwd\";\n vm.virData = vm.data.confirmPwd;\n };\n\n function textChanged(newPwd) {\n var e = document.getElementById(vm.focusObj);\n e.value = newPwd;\n var $e = angular.element(e);\n $e.triggerHandler('input');\n }\n\n function showVirKey() {\n if (vm.isShowVirKey) vm.isShowVirKey = false;else vm.isShowVirKey = true;\n }\n\n onInit();\n\n function onInit() {\n\n var param = {\n userAccount: $routeParams.userAccount /*crypted*/\n , verifyCode: $routeParams.verifyCode /*crypted*/\n };\n\n // check verify code \n loginService.checkVerifyCode(param).then(function (data) {\n\n // console.log(data);\n if (data.data.Result === \"100\") {\n\n vm.data = {\n userAccount: data.data.userAccount,\n verifyCode: data.data.verifyCode,\n sysCode: sysCode\n };\n\n // show input box \n vm.isValidLink = true;\n } else {\n\n // show error message\n toastr.error(data.data.ResultMsg);\n }\n });\n }\n\n function submit() {\n //console.log(vm.data);\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\n if (!vm.confirmPwd) {\n loginService.directModifyUserPassword(vm.data).then(function (data) {\n if (data) {\n toastr.success($rootScope.translate.commonEditPwdSuccess);\n removeSsoInfo();\n $location.path('/login');\n }\n });\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('loginController', loginController);\n\n function loginController(viewModel) {\n var vm = this;\n\n init();\n\n function init() {\n vm.data = viewModel.data;\n\n var menuSerilNo = getMenuQueryString();\n if (parseInt(menuSerilNo) === 31 || menuSerilNo === undefined) {\n $(\".ui-blackCover\").css(\"display\", \"none\");\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('mobileTriggerController', mobileTriggerController);\n\n function mobileTriggerController($location, modalService) {\n init();\n\n function init() {\n modalService.login();\n $location.path('/login');\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('nextMenuDetailController', nextMenuDetailController);\n\n function nextMenuDetailController(viewModel) {\n var vm = this;\n vm.data = viewModel.data;\n }\n})();\n'use strict';\n\n(function () {\n\t'use strict';\n\n\tangular.module('app').controller('nextMenuController', nextMenuController);\n\n\tfunction nextMenuController(viewModel, homeService) {\n\t\tvar vm = this;\n\t\tvm.getMoreList = getMoreList;\n\t\tvar currentPage = 1;\n\t\tinit();\n\n\t\tfunction init() {\n\t\t\tvm.menuSerilNo = getMenuQueryString();\n\t\t\tvm.data = viewModel.data;\n\t\t\tvm.currentPage = 1;\n\t\t}\n\n\t\tfunction getMoreList() {\n\t\t\tcurrentPage++;\n\t\t\thomeService.getNextMore(currentPage).then(function (data) {\n\t\t\t\tvm.data.hasMore = data.data.hasMore;\n\t\t\t\tvm.data.bulletins.bulletins = _.concat(vm.data.bulletins.bulletins, data.data.bulletins.bulletins);\n\t\t\t});\n\t\t}\n\t}\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('scheduleController', scheduleController);\n\n function scheduleController($scope, scheduleService, $timeout, $rootScope, viewModel) {\n var vm = this;\n vm.changeDate = changeDate;\n vm.outputFile = outputFile;\n vm.changeArea = changeArea;\n vm.getStartForList = getStartForList;\n vm.getEndForList = getEndForList;\n vm.getAllDay = getAllDay;\n vm.showButton = showButton;\n vm.trigger = 1;\n\n vm.view = {\n isLogin: sessionStorage.getItem('token')\n };\n\n init();\n\n function init() {\n vm.calendarAreas = viewModel.data;\n vm.schedule = moment().add(8, 'hour');\n getSchedule();\n }\n\n function changeDate() {\n $timeout(function () {\n getSchedule();\n }, 10);\n }\n\n function getSchedule() {\n vm.clickDay = vm.schedule.format('YYYY/MM/DD');\n var calendarSerilNo = vm.calendarArea ? vm.calendarArea.calendarAreaSerilNo : 0;\n vm.promise = scheduleService.get(vm.schedule, calendarSerilNo).then(function (data) {\n vm.dateItem = data.data.scheduleTodays;\n vm.trigger++;\n return data;\n });\n }\n\n function outputFile(item) {\n if (DEVICE_TYPE !== null && DEVICE_TYPE.toLowerCase() === 'android') {\n var param = {\n title: item.title,\n description: item.txtContent,\n isAllDay: item.isAllDay,\n begin: (Date.parse(item.startDate) - 8 * 60 * 60 * 1000) / 1000,\n end: (Date.parse(item.endDate) - 8 * 60 * 60 * 1000) / 1000,\n reminder: 0,\n isEveryDay: item.isEveryDay\n };\n var method = \"appendEvent\";\n appCallback(method, param);\n } else {\n // 瀏覽器或其他\n var isIos = true;\n if (DEVICE_TYPE !== null && DEVICE_TYPE.toLowerCase() === 'ios') {\n isIos = true;\n }\n location.href = scheduleService.donwloadIcs(item, isIos);\n toastr.success($rootScope.translate.tshrExportScheduleMessage);\n }\n }\n\n function changeArea() {\n getSchedule();\n }\n\n function getStartForList(item) {\n if (item.isAllDay) {\n return moment(item.startDate).format('YYYY/MM/DD');\n }\n return moment(item.startDate).format('YYYY/MM/DD HH:mm');\n }\n\n function getEndForList(item) {\n if (item.isEveryDay) {\n return $rootScope.translate.any;\n }\n\n if (item.isAllDay) {\n return moment(item.endDate).subtract(1, 'd').format('YYYY/MM/DD');\n }\n return moment(item.endDate).format('YYYY/MM/DD HH:mm');\n }\n\n function getAllDay(item) {\n if (item.isAllDay) {\n return $rootScope.translate.allDay;\n }\n }\n\n function showButton(item) {\n var show = true;\n var now = moment();\n var eventDte = moment(item.endDate); //以事件結束日期比較,事件已結束的就不顯示提醒我\n\n if (now > eventDte) {\n show = false;\n }\n //console.log('show:',show);\n return show;\n }\n }\n})();\n'use strict';\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('showRelatedFunctionsModalController', showRelatedFunctionsModalController);\n\n function showRelatedFunctionsModalController(modalService, $uibModalInstance, headerService, relatedInfo, menuId, $location, menuService) {\n var vm = this;\n vm.isMobile = modalService.isMobile();\n vm.cancel = cancel;\n vm.redirectMenuSearchResult = redirectMenuSearchResult;\n vm.redirectContentSearchResult = redirectContentSearchResult;\n\n onInit();\n\n function onInit() {\n vm.data = {};\n vm.data.relatedInfo = relatedInfo;\n vm.data.menuId = menuId;\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function redirectMenuSearchResult(item) {\n //console.log(\"item.menuSerilNo:\"+item.menuSerilNo);\n if (!_.isEmpty(sessionStorage.getItem('menuAllList'))) {\n\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuItemPath', '');\n\n //如果Menu=37(上課與證照),就設定Menu=-9901(待修課程)\n if (parseInt(item.menuSerilNo) === 37) {\n sessionStorage.setItem('menuSerilNo', -9901);\n } else {\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\n }\n\n //點選任一動態磚即撈取是選單功能Menu資料\n var menuAllList = JSON.parse(sessionStorage.getItem('menuAllList'));\n var menuItems = menuAllList.filter(function (menuLists) {\n return parseInt(menuLists.menuSerilNo) === parseInt(sessionStorage.getItem('menuSerilNo')) && menuLists.hasChild === false;\n });\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\n if (menuItems !== null && menuItems.length !== 0) {\n sessionStorage.setItem('menuSerilNo', menuItems[0].menuSerilNo);\n sessionStorage.setItem('menuItemPath', menuItems[0].menuItemPath);\n } else {\n //如是選單節點即撈取第二或第三階層是否為父階層 \n menuItems = menuAllList.filter(function (menuLists) {\n return parseInt(menuLists.parentId) === parseInt(sessionStorage.getItem('menuSerilNo'));\n });\n\n //撈取選單節點下排序第一個功能Menu\n if (menuItems != null && menuItems.length !== 0) {\n var sort = Math.min.apply(Math, _toConsumableArray(menuItems.map(function (p) {\n return p.sort;\n })));\n var menuItem = menuItems.filter(function (menuLists) {\n return parseInt(menuLists.sort) === parseInt(sort);\n });\n\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\n //console.log(menuItem);\n if (menuItem !== null && menuItem.length !== 0) {\n if (!menuItem[0].hasChild) {\n sessionStorage.setItem('menuSerilNo', menuItem[0].menuSerilNo);\n }\n sessionStorage.setItem('menuItemPath', menuItem[0].menuItemPath);\n }\n }\n }\n\n console.log('showRelatedFunctions_redirectMenuSearchResult-menuSerilNo:' + sessionStorage.getItem('menuSerilNo'));\n console.log('showRelatedFunctions_redirectMenuSearchResult-menuItemPath:' + sessionStorage.getItem('menuItemPath'));\n }\n\n menuService.redirectUrl(item);\n $uibModalInstance.close();\n }\n\n function redirectContentSearchResult(item) {\n $location.path(\"bulletin/detail/\" + item.serilNo).search(\"menu\", 2);\n $uibModalInstance.close();\n }\n }\n})();\n'use strict';\n\nvar Module = angular.module('datePicker', []);\n\nModule.constant('datePickerConfig', {\n //template: 'directive/datePicker/datePicker.html',\n view: 'month',\n views: ['year', 'month', 'date', 'hours', 'minutes'],\n momentNames: {\n year: 'year',\n month: 'month',\n date: 'day',\n hours: 'hours',\n minutes: 'minutes'\n },\n viewConfig: {\n year: ['years', 'isSameYear'],\n month: ['months', 'isSameMonth'],\n hours: ['hours', 'isSameHour'],\n minutes: ['minutes', 'isSameMinutes']\n },\n step: 5\n});\n//Moment format filter.\nModule.filter('mFormat', function () {\n return function (m, format, tz) {\n var result = '';\n if (!moment.isMoment(m)) {\n result = moment(m).format(format);\n } else {\n result = tz ? moment.tz(m, tz).format(format) : m.format(format);\n }\n return result;\n };\n});\n\nModule.directive('datePicker', ['datePickerConfig', 'datePickerUtils', '$timeout', '$rootScope', function datePickerDirective(datePickerConfig, datePickerUtils, $timeout, $rootScope) {\n //noinspection JSUnusedLocalSymbols\n return {\n // this is a bug ?\n require: '?ngModel',\n templateUrl: 'directive/datePicker/datePicker.html',\n scope: {\n model: '=datePicker',\n after: '=?',\n before: '=?',\n choiceDate: '=?',\n trigger: '=?'\n },\n link: function link(scope, element, attrs, ngModel) {\n scope.translateWeek = translateWeek;\n var methodList = {\n //有空維護這支程式請方法(無論公有或私有)移到此區塊\n setDate: setDate\n };\n var arrowClick = false,\n tz = scope.tz = attrs.timezone,\n createMoment = datePickerUtils.createMoment,\n eventIsForPicker = datePickerUtils.eventIsForPicker,\n step = parseInt(attrs.step || datePickerConfig.step, 10),\n partial = !!attrs.partial,\n minDate = getDate('minDate'),\n maxDate = getDate('maxDate'),\n pickerID = element[0].id,\n now = scope.now = createMoment(),\n selected = scope.date = createMoment(scope.model || now),\n autoclose = attrs.autoClose === 'true',\n\n // Either gets the 1st day from the attributes, or asks moment.js to give it to us as it is localized.\n firstDay = attrs.firstDay && attrs.firstDay >= 0 && attrs.firstDay <= 6 ? parseInt(attrs.firstDay, 10) : moment().weekday(0).day(),\n prepareViewData,\n isSame,\n clipDate,\n isNow,\n inValidRange;\n\n //==Main==\n init();\n //========\n function init() {\n //有空維護請將屬於初始設定放於此區塊\n datePickerUtils.setParams(tz, firstDay);\n }\n\n function prepareViews() {\n scope.views = datePickerConfig.views.concat();\n scope.view = attrs.view || datePickerConfig.view;\n scope.views = scope.views.slice(scope.views.indexOf(attrs.maxView || 'year'), scope.views.indexOf(attrs.minView || 'minutes') + 1);\n if (scope.views.length === 1 || scope.views.indexOf(scope.view) === -1) {\n scope.view = scope.views[0];\n }\n }\n\n function getDate(name) {\n return datePickerUtils.getDate(scope, attrs, name);\n }\n if (!scope.model) {\n selected.minute(Math.ceil(selected.minute() / step) * step).second(0);\n }\n\n scope.template = attrs.template || datePickerConfig.template;\n\n scope.watchDirectChanges = attrs.watchDirectChanges !== undefined;\n scope.callbackOnSetDate = attrs.dateChange ? datePickerUtils.findFunction(scope, attrs.dateChange) : undefined;\n\n prepareViews();\n\n scope.setView = function (nextView) {\n if (scope.views.indexOf(nextView) !== -1) {\n scope.view = nextView;\n }\n };\n //todo anson修改為了要關閉日期的地方\n scope.selectDate = function (date) {\n if (attrs.disabled) {\n return false;\n }\n if (isSame(scope.date, date)) {\n date = scope.date;\n }\n date = clipDate(date);\n if (!date) {\n return false;\n }\n scope.date = date;\n\n var nextView = scope.views[scope.views.indexOf(scope.view) + 1];\n if (!nextView || partial || scope.model) {\n setDate(date);\n }\n\n if (nextView) {\n scope.setView(nextView);\n } else if (autoclose) {\n element.addClass('hidden');\n scope.$emit('hidePicker');\n } else {\n prepareViewData();\n }\n // anson:為了不關閉,所以判斷autoClose\n if (attrs.minView === scope.views[0] && attrs.autoClose !== 'false') {\n element.addClass('hidden');\n scope.$emit('hidePicker');\n }\n };\n\n function setDate(date, notEmit) {\n //資料實際設定移到 setDate 後續監聽事件處理\n if (date) {\n scope.model = date;\n // if (ngModel) {\n // ngModel.$setViewValue(date);\n // }\n }\n if (!notEmit) {\n scope.$emit('setDate', date, scope.view);\n }\n\n //This is duplicated in the new functionality.\n if (scope.callbackOnSetDate) {\n scope.callbackOnSetDate(attrs.datePicker, scope.date);\n }\n };\n\n function update() {\n var view = scope.view;\n datePickerUtils.setParams(tz, firstDay);\n\n if (scope.model && !arrowClick) {\n scope.date = createMoment(scope.model);\n arrowClick = false;\n }\n\n var date = scope.date;\n switch (view) {\n case 'year':\n scope.years = datePickerUtils.getVisibleYears(date);\n break;\n case 'month':\n scope.months = datePickerUtils.getVisibleMonths(date);\n break;\n case 'date':\n scope.weekdays = scope.weekdays || datePickerUtils.getDaysOfWeek();\n // scope.weekdays = scope.weekdays || datePickerUtils.getWeekDays();\n scope.weeks = datePickerUtils.getVisibleWeeks(date);\n break;\n case 'hours':\n scope.hours = datePickerUtils.getVisibleHours(date);\n break;\n case 'minutes':\n scope.minutes = datePickerUtils.getVisibleMinutes(date, step);\n break;\n }\n if (scope.choiceDate) {\n initChoiceDate();\n }\n }\n\n // 透過外部變更 trigger 值來觸發更新行事曆資料\n scope.$watch('trigger', function (data) {\n if (data > 1) {\n initChoiceDate();\n }\n });\n\n function translateWeek(weekday) {\n weekday = weekday + '';\n var weekdayName = {\n '0': $rootScope.translate.tsunWeekSunday || 'Sunday',\n '1': $rootScope.translate.tsunWeekMonday || 'Monday',\n '2': $rootScope.translate.tsunWeekTuesday || 'Tuesday',\n '3': $rootScope.translate.tsunWeekWednesday || 'Wednesday',\n '4': $rootScope.translate.tsunWeekThusday || 'Thusday',\n '5': $rootScope.translate.tsunWeekFriday || 'Friday',\n '6': $rootScope.translate.tsunWeekSaturday || 'Saturday'\n };\n return weekdayName[weekday] || 'unknownday';\n }\n\n function initChoiceDate() {\n var classes = [],\n classList = '',\n i,\n j,\n week,\n weeks = scope.weeks;\n var choiceDateArr = [];\n\n scope.choiceDate.then(function (data) {\n\n // 目前選擇的日期\n // console.log('scope.date:', scope.date.toDate());\n\n // 所有行事曆資料\n // console.log('data.data.schedules:', jQuery.extend(true, {}, data.data.schedules));\n\n var prev2Month = moment(scope.date).subtract(2, 'M');\n var next1Month = moment(scope.date).add(1, 'M');\n var next2Month = moment(scope.date).add(2, 'M');\n var limitDate = moment.range(prev2Month, next2Month);\n\n _.each(data.data.schedules, function (x) {\n\n // 針對沒有 end 的事件,給予固定值填滿整個當月行事曆\n if (moment(x.end).isAfter(next1Month)) {\n x.end = next1Month.format('YYYY-MM-DDTHH:mm:ss');\n }\n\n // 過濾在被選擇日期的上下2月份的所有行事曆資料\n if (limitDate.contains(moment(x.end))) {\n choiceDateArr.push(x);\n }\n });\n\n // 被選擇日期的上下2月份的所有行事曆資料\n // console.log('choiceDateArr:', jQuery.extend(true, {}, choiceDateArr));\n\n var dateRange = _.chain(choiceDateArr).forEach(function (x) {\n var end = moment(x.end);\n // 沒有加這行在下個階段會產生區間日期計算錯誤\n x.end = end.hour() < 9 ? end.subtract(1, 'day').format('YYYY-MM-DDTHH:mm:ss') : end.format('YYYY-MM-DDTHH:mm:ss');\n }).map(function (x) {\n // 計算區間中的每個日期\n var result = moment.range(moment(x.start).toDate(), moment(x.end).toDate()).toArray('days');\n return result;\n }).flatten().map(function (x) {\n return x.format('YYYYMMDD');\n }).uniq().sortBy().value();\n\n // 需要顯示圈圈的日期\n // console.log('dateRange:', dateRange);\n\n for (i = 0; i < weeks.length; i++) {\n week = weeks[i];\n classes.push([]);\n for (j = 0; j < week.length; j++) {\n classList = '';\n _.each(dateRange, function (x) {\n if (x === moment(week[j]).format('YYYYMMDD')) {\n classList += 'choice';\n }\n });\n\n classes[i].push(classList);\n }\n }\n scope.classes = classes;\n });\n }\n\n function watch() {\n var result;\n if (scope.view !== 'date') {\n result = scope.view;\n } else {\n result = scope.date ? scope.date.month() : null;\n }\n return result;\n }\n\n scope.$watch(watch, function () {\n update();\n });\n\n if (scope.watchDirectChanges) {\n scope.$watch('model', function () {\n arrowClick = false;\n update();\n });\n }\n\n prepareViewData = function prepareViewData() {\n var view = scope.view,\n date = scope.date,\n classes = [],\n classList = '',\n i,\n j,\n choiceDay;\n\n datePickerUtils.setParams(tz, firstDay);\n if (view === 'date') {\n var weeks = scope.weeks,\n week;\n\n for (i = 0; i < weeks.length; i++) {\n week = weeks[i];\n classes.push([]);\n for (j = 0; j < week.length; j++) {\n classList = '';\n // if (datePickerUtils.isSameDay(date, week[j])) {\n // classList += 'active';\n // }\n // if (isNow(week[j], view)) {\n // classList += ' now';\n // }\n //if (week[j].month() !== date.month()) classList += ' disabled';\n // if (week[j].month() !== date.month() || !inValidRange(week[j])) {\n // classList += ' disabled';\n // }\n\n\n classes[i].push(classList);\n }\n }\n } else {\n var params = datePickerConfig.viewConfig[view],\n dates = scope[params[0]],\n compareFunc = params[1];\n\n for (i = 0; i < dates.length; i++) {\n classList = '';\n if (datePickerUtils[compareFunc](date, dates[i])) {\n classList += 'active';\n }\n if (isNow(dates[i], view)) {\n classList += ' now';\n }\n if (!inValidRange(dates[i])) {\n classList += ' disabled';\n }\n classes.push(classList);\n }\n }\n // scope.classes = classes;\n };\n\n scope.next = function (delta) {\n var date = moment(scope.date);\n delta = delta || 1;\n switch (scope.view) {\n case 'year':\n /*falls through*/\n case 'month':\n date.year(date.year() + delta);\n break;\n case 'date':\n date.month(date.month() + delta);\n break;\n case 'hours':\n /*falls through*/\n case 'minutes':\n date.hours(date.hours() + delta);\n break;\n }\n date = clipDate(date);\n\n if (date) {\n scope.date = date;\n setDate(date, true);\n arrowClick = true;\n }\n };\n\n inValidRange = function inValidRange(date) {\n var valid = true;\n if (minDate && minDate.isAfter(date)) {\n valid = isSame(minDate, date);\n }\n if (maxDate && maxDate.isBefore(date)) {\n valid &= isSame(maxDate, date);\n }\n return valid;\n };\n\n isSame = function isSame(date1, date2) {\n return date1.isSame(date2, datePickerConfig.momentNames[scope.view]) ? true : false;\n };\n\n clipDate = function clipDate(date) {\n if (minDate && minDate.isAfter(date)) {\n return minDate;\n } else if (maxDate && maxDate.isBefore(date)) {\n return maxDate;\n } else {\n return date;\n }\n };\n\n isNow = function isNow(date, view) {\n var is = true;\n\n switch (view) {\n case 'minutes':\n is &= ~~(now.minutes() / step) === ~~(date.minutes() / step);\n /* falls through */\n case 'hours':\n is &= now.hours() === date.hours();\n /* falls through */\n case 'date':\n is &= now.date() === date.date();\n /* falls through */\n case 'month':\n is &= now.month() === date.month();\n /* falls through */\n case 'year':\n is &= now.year() === date.year();\n }\n return is;\n };\n\n scope.prev = function (delta) {\n return scope.next(-delta || -1);\n };\n\n if (pickerID) {\n scope.$on('pickerUpdate', function (event, pickerIDs, data) {\n if (eventIsForPicker(pickerIDs, pickerID)) {\n var updateViews = false,\n updateViewData = false;\n\n if (angular.isDefined(data.minDate)) {\n minDate = data.minDate ? data.minDate : false;\n updateViewData = true;\n }\n if (angular.isDefined(data.maxDate)) {\n maxDate = data.maxDate ? data.maxDate : false;\n updateViewData = true;\n }\n\n if (angular.isDefined(data.minView)) {\n attrs.minView = data.minView;\n updateViews = true;\n }\n if (angular.isDefined(data.maxView)) {\n attrs.maxView = data.maxView;\n updateViews = true;\n }\n attrs.view = data.view || attrs.view;\n\n if (updateViews) {\n prepareViews();\n }\n\n if (updateViewData) {\n update();\n }\n }\n });\n }\n }\n };\n}]);\n'use strict';\n\nvar PRISTINE_CLASS = 'ng-pristine',\n DIRTY_CLASS = 'ng-dirty';\n\nvar Module = angular.module('datePicker');\n\nModule.constant('dateTimeConfig', {\n template: function template(attrs, id) {\n return '' + '
';\n },\n format: 'YYYY-MM-DD HH:mm',\n views: ['date', 'year', 'month', 'hours', 'minutes'],\n autoClose: true,\n position: 'relative'\n});\n\nModule.directive('dateTimeAppend', function () {\n return {\n link: function link(scope, element) {\n element.bind('click', function () {\n element.find('input')[0].focus();\n });\n }\n };\n});\n\nModule.filter('resultFormat', function () {\n //處理結果的格式化.\n return function (newValue, oldValue, formatConfig) {\n // console.log(\"enter resultFormat\");\n // console.log(\"newValue:\",newValue);\n // console.log(\"oldValue:\",oldValue);\n var result = '';\n var newValueDate = Date.parse(newValue);\n var oldValueDate = Date.parse(oldValue);\n if (!newValueDate) {\n if (oldValueDate && newValue) {\n // console.log(\"resultValue set as oldValue\");\n result = oldValue;\n } else if (formatConfig.getDefault) {\n // console.log(\"checking default\");\n result = formatConfig.defaultValue ? formatConfig.defaultValue : moment(new Date()).format(formatConfig.format);\n } else {\n result = '';\n }\n } else if (!moment.isMoment(newValue)) {\n // console.log(\"normale Setting,newValue is not moment\");\n result = moment(newValue, formatConfig.format).format(formatConfig.format);\n } else {\n // console.log(\"normale Setting,newValue is moment\");\n result = formatConfig.timezone ? moment.tz(newValueDate, formatConfig.timezone).format(formatConfig.format) : moment(newValue).format(formatConfig.format);\n }\n // console.log(\"end resultFormat...result\", result);\n return result;\n };\n});\nModule.directive('dateTime', ['$compile', '$timeout', '$document', '$filter', 'dateTimeConfig', '$parse', 'datePickerUtils', function ($compile, $timeout, $document, $filter, dateTimeConfig, $parse, datePickerUtils) {\n var body = $document.find('body');\n // var dateFilter = $filter('mFormat');\n var dateFilter = $filter('resultFormat');\n\n return {\n require: 'ngModel',\n scope: {\n model: '=ngModel',\n appendAlign: '@',\n onEvent: '&'\n },\n link: function link(scope, element, attrs, ngModel, $scope) {\n var configs = {\n //有空維護這隻程式請將所屬控制類別參數改放此區塊\n formatConfig: {\n // 日期格式化校正設定\n format: attrs.format || dateTimeConfig.format,\n timezone: attrs.timezone || false,\n getDefault: attrs.getDefault ? attrs.getDefault === 'true' : true,\n defaultValue: attrs.defaultValue || null\n }\n };\n var data = {\n oldValue: '',\n template: dateTimeConfig.template(attrs)\n //有空維護這隻程式請將所屬資料類別參數改放此區塊\n };\n var format = attrs.format || dateTimeConfig.format,\n parentForm = element.inheritedData('$formController'),\n views = $parse(attrs.views)(scope) || dateTimeConfig.views.concat(),\n view = attrs.view || views[0],\n index = views.indexOf(view),\n dismiss = attrs.autoClose ? $parse(attrs.autoClose)(scope) : dateTimeConfig.autoClose,\n picker = null,\n pickerID = element[0].id,\n position = attrs.position || dateTimeConfig.position,\n container = null,\n minDate = null,\n minValid = null,\n maxDate = null,\n maxValid = null,\n timezone = attrs.timezone || false,\n eventIsForPicker = datePickerUtils.eventIsForPicker,\n dateChange = null,\n shownOnce = false,\n dateRequired;\n //===Main==\n init();\n //=========\n function logicInit() {\n if (!scope.appendAlign) {\n scope.appendAlign = 'down';\n }\n if (index === -1) {\n views.splice(index, 1);\n }\n views.unshift(view);\n\n if (angular.isDefined(attrs.minDate)) {\n setMin(datePickerUtils.findParam(scope, attrs.minDate));\n\n ngModel.$validators.min = function (value) {\n //If we don't have a min / max value, then any value is valid.\n return minValid ? moment.isMoment(value) && (minDate.isSame(value) || minDate.isBefore(value)) : true;\n };\n }\n\n if (angular.isDefined(attrs.maxDate)) {\n setMax(datePickerUtils.findParam(scope, attrs.maxDate));\n\n ngModel.$validators.max = function (value) {\n return maxValid ? moment.isMoment(value) && (maxDate.isSame(value) || maxDate.isAfter(value)) : true;\n };\n }\n\n if (angular.isDefined(attrs.dateChange)) {\n dateChange = datePickerUtils.findFunction(scope, attrs.dateChange);\n }\n\n if (pickerID) {\n scope.$on('pickerUpdate', function (event, pickerIDs, data) {\n if (eventIsForPicker(pickerIDs, pickerID)) {\n if (picker) {\n //Need to handle situation where the data changed but the picker is currently open.\n //To handle this, we can create the inner picker with a random ID, then forward\n //any events received to it.\n } else {\n var validateRequired = false;\n if (angular.isDefined(data.minDate)) {\n setMin(data.minDate);\n validateRequired = true;\n }\n if (angular.isDefined(data.maxDate)) {\n setMax(data.maxDate);\n validateRequired = true;\n }\n\n if (angular.isDefined(data.minView)) {\n attrs.minView = data.minView;\n }\n if (angular.isDefined(data.maxView)) {\n attrs.maxView = data.maxView;\n }\n\n attrs.view = data.view || attrs.view;\n\n if (validateRequired) {\n ngModel.$validate();\n }\n if (angular.isDefined(data.format)) {\n format = attrs.format = data.format || dateTimeConfig.format;\n ngModel.$modelValue = -1; //Triggers formatters. This value will be discarded.\n }\n // getTemplate();\n }\n }\n });\n }\n\n // getTemplate();\n element.change();\n }\n function init() {\n //console.log(\"dateTime...ngModel:\", ngModel);\n //todo anson為了自訂datePicker需要新增一筆以上才能通過驗証\n scope.$watch(attrs.dateRequired, function (value) {\n if (!value) {\n ngModel.$invalid = true;\n }\n });\n scope.$on('setDate', function (event, date, view) {\n setDateProcess(event, date, view);\n });\n scope.$on('hidePicker', function () {\n element.triggerHandler('blur');\n });\n scope.$on('$destroy', clear);\n element.bind('focus', showPicker);\n element.bind('blur', clear);\n element.change(function () {\n // console.log(\"enter change event\");\n // console.log(\"scope.model:\",scope.model);\n // console.log(\" data.oldValue:\", data.oldValue);\n var resultDate = dateFilter(scope.model, data.oldValue, configs.formatConfig);\n element.val(resultDate);\n scope.model = resultDate;\n data.oldValue = resultDate;\n if (dateChange) {\n dateChange(attrs.ngModel, scope.model);\n }\n // console.log(\"scope.model:\", resultDate);\n // console.log(\"scope:\", scope);\n // console.log(\"end change event\");\n });\n logicInit();\n }\n\n function setDateProcess(event, date, view) {\n //console.log(\"detect setDate on\");\n //console.log(\"viewValue set:\", date);\n scope.model = date;\n element.change();\n event.stopPropagation();\n if (attrs.minView === view) {\n if (dismiss && views[views.length - 1] === view) {\n clear();\n }\n element.blur();\n }\n }\n function parser(viewValue) {\n //console.log(\"parser viewValue:\", viewValue);\n var parsed = moment(viewValue, format);\n var result = undefined;\n if (parsed.isValid()) {\n result = parsed;\n }\n //console.log(\"parser result:\", result);\n return result;\n }\n\n function setMin(date) {\n minDate = date;\n attrs.minDate = date ? date.format() : date;\n minValid = moment.isMoment(date);\n }\n\n function setMax(date) {\n maxDate = date;\n attrs.maxDate = date ? date.format() : date;\n maxValid = moment.isMoment(date);\n }\n\n function clear() {\n // return;\n // console.log(\"enter clear...picker:\", picker, \"container:\", container);\n if (picker) {\n picker.remove();\n picker = null;\n }\n if (container) {\n container.remove();\n container = null;\n }\n // console.log(\"end clear...picker:\", picker, \"container:\", container);\n }\n\n // function getTemplate() {\n // template = dateTimeConfig.template(attrs);\n // }\n\n function showPicker() {\n if (picker) {\n return;\n }\n var bodyHeight = document.body.scrollHeight;\n // create picker element\n picker = $compile(data.template)(scope);\n picker.css({\n display: 'block',\n position: position\n });\n picker.bind('mousedown', function (evt) {\n evt.preventDefault();\n });\n scope.$digest();\n\n // move picker below input element\n if (position === 'absolute') {\n body.append(picker);\n $timeout(function () {\n //這段可能會有BUG\n //BUG原因是scope.$digest()其實還沒跑完(這方法好像是非同步)\n //因此要徹底解決需要找到後置的處理方案\n var width = 400;\n if (body.width() < width) {\n width = body.width() - 10;\n }\n var pos = element[0].getBoundingClientRect();\n var pickerHeight = picker.height();\n var height = pos.height || element[0].offsetHeight; // Support IE8\n var scrollHeight = body.scrollTop();\n var showTop = pos.top + height + scrollHeight;\n if (showTop + pickerHeight > bodyHeight) {\n showTop = bodyHeight - pickerHeight;\n }\n\n picker.css({\n top: showTop + 'px',\n left: pos.left + 'px',\n position: position,\n width: width + 'px'\n });\n }, 50);\n } else {\n // relative\n container = angular.element('
');\n element[0].parentElement.insertBefore(container[0], element[0]);\n container.append(picker);\n picker.css({ top: element[0].offsetHeight + 'px', display: 'block' });\n }\n // console.log(\"scope.appendAlign:\", scope.appendAlign);\n // console.log(\"top:\", element[0].offsetHeight);\n // console.log(\"picker\",picker);\n // console.log(\"picker.height:\", picker.height());\n // console.log(\"container\",container);\n // console.log(\"container.height:\", container.height());\n }\n }\n };\n}]);\n'use strict';\n\nangular.module('datePicker').factory('datePickerUtils', function () {\n var tz, firstDay;\n var createNewDate = function createNewDate(year, month, day, hour, minute) {\n var utc = Date.UTC(year | 0, month | 0, day | 0, hour | 0, minute | 0);\n return tz ? moment.tz(utc, tz) : moment(utc);\n };\n\n return {\n getVisibleMinutes: function getVisibleMinutes(m, step) {\n var year = m.year(),\n month = m.month(),\n day = m.date(),\n hour = m.hours(),\n pushedDate,\n offset = m.utcOffset() / 60,\n minutes = [],\n minute;\n\n for (minute = 0; minute < 60; minute += step) {\n pushedDate = createNewDate(year, month, day, hour - offset, minute);\n minutes.push(pushedDate);\n }\n return minutes;\n },\n getVisibleWeeks: function getVisibleWeeks(m) {\n m = moment(m);\n var startYear = m.year(),\n startMonth = m.month();\n\n //Set date to the first day of the month\n m.date(1);\n\n //Grab day of the week\n var day = m.day();\n //Go back the required number of days to arrive at the previous week start\n m.date(firstDay - (day + (firstDay >= day ? 6 : -1)));\n\n var weeks = [];\n while (weeks.length < 6) {\n if (m.year() === startYear && m.month() > startMonth) {\n break;\n }\n weeks.push(this.getDaysOfWeek(m));\n m.add(7, 'd');\n }\n return weeks;\n },\n getVisibleYears: function getVisibleYears(d) {\n var m = moment(d),\n year = m.year();\n\n m.year(year - year % 10);\n year = m.year();\n\n var offset = m.utcOffset() / 60,\n years = [],\n pushedDate,\n actualOffset;\n\n for (var i = 0; i < 12; i++) {\n pushedDate = createNewDate(year, 0, 1, 0 - offset);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, 0, 1, 0 - actualOffset);\n offset = actualOffset;\n }\n years.push(pushedDate);\n year++;\n }\n return years;\n },\n getWeekDays: function getWeekDays() {\n return [0, 1, 2, 3, 4, 5, 6];\n },\n getDaysOfWeek: function getDaysOfWeek(m) {\n m = m ? m : tz ? moment.tz(tz).day(firstDay) : moment().day(firstDay);\n\n var year = m.year(),\n month = m.month(),\n day = m.date(),\n days = [],\n pushedDate,\n offset = m.utcOffset() / 60,\n actualOffset;\n\n for (var i = 0; i < 7; i++) {\n pushedDate = createNewDate(year, month, day, 0 - offset, 0, false);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, month, day, 0 - actualOffset, 0, false);\n }\n days.push(pushedDate);\n day++;\n }\n return days;\n },\n getVisibleMonths: function getVisibleMonths(m) {\n var year = m.year(),\n offset = m.utcOffset() / 60,\n months = [],\n pushedDate,\n actualOffset;\n\n for (var month = 0; month < 12; month++) {\n pushedDate = createNewDate(year, month, 1, 0 - offset, 0, false);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, month, 1, 0 - actualOffset, 0, false);\n }\n months.push(pushedDate);\n }\n return months;\n },\n getVisibleHours: function getVisibleHours(m) {\n var year = m.year(),\n month = m.month(),\n day = m.date(),\n hours = [],\n hour,\n pushedDate,\n actualOffset,\n offset = m.utcOffset() / 60;\n\n for (hour = 0; hour < 24; hour++) {\n pushedDate = createNewDate(year, month, day, hour - offset, 0, false);\n actualOffset = pushedDate.utcOffset() / 60;\n if (actualOffset !== offset) {\n pushedDate = createNewDate(year, month, day, hour - actualOffset, 0, false);\n }\n hours.push(pushedDate);\n }\n\n return hours;\n },\n isAfter: function isAfter(model, date) {\n return model && model.unix() >= date.unix();\n },\n isBefore: function isBefore(model, date) {\n return model.unix() <= date.unix();\n },\n isSameYear: function isSameYear(model, date) {\n return model && model.year() == date.year();\n },\n isSameMonth: function isSameMonth(model, date) {\n return this.isSameYear(model, date) && model.month() === date.month();\n },\n isSameDay: function isSameDay(model, date) {\n return this.isSameMonth(model, date) && model.date() === date.date();\n },\n isSameHour: function isSameHour(model, date) {\n return this.isSameDay(model, date) && model.hours() === date.hours();\n },\n isSameMinutes: function isSameMinutes(model, date) {\n return this.isSameHour(model, date) && model.minutes() === date.minutes();\n },\n setParams: function setParams(zone, fd) {\n tz = zone;\n firstDay = fd;\n },\n scopeSearch: function scopeSearch(scope, name, comparisonFn) {\n var parentScope = scope,\n nameArray = name.split('.'),\n target,\n i,\n j = nameArray.length;\n\n do {\n target = parentScope = parentScope.$parent;\n\n //Loop through provided names.\n for (i = 0; i < j; i++) {\n target = target[nameArray[i]];\n if (!target) {\n continue;\n }\n }\n\n //If we reached the end of the list for this scope,\n //and something was found, trigger the comparison\n //function. If the comparison function is happy, return\n //found result. Otherwise, continue to the next parent scope\n if (target && comparisonFn(target)) {\n return target;\n }\n } while (parentScope.$parent);\n\n return false;\n },\n findFunction: function findFunction(scope, name) {\n //Search scope ancestors for a matching function.\n return this.scopeSearch(scope, name, function (target) {\n //Property must also be a function\n return angular.isFunction(target);\n });\n },\n findParam: function findParam(scope, name) {\n //Search scope ancestors for a matching parameter.\n return this.scopeSearch(scope, name, function () {\n //As long as the property exists, we're good\n return true;\n });\n },\n createMoment: function createMoment(m) {\n if (tz) {\n return moment.tz(m, tz);\n } else {\n //If input is a moment, and we have no TZ info, we need to remove TZ\n //info from the moment, otherwise the newly created moment will take\n //the timezone of the input moment. The easiest way to do that is to\n //take the unix timestamp, and use that to create a new moment.\n //The new moment will use the local timezone of the user machine.\n return moment.isMoment(m) ? moment.unix(m.unix()) : moment(m);\n }\n },\n getDate: function getDate(scope, attrs, name) {\n var result = false;\n if (attrs[name]) {\n result = this.createMoment(attrs[name]);\n if (!result.isValid()) {\n result = this.findParam(scope, attrs[name]);\n if (result) {\n result = this.createMoment(result);\n }\n }\n }\n\n return result;\n },\n //Checks if an event targeted at a specific picker, via either a string name, or an array of strings.\n eventIsForPicker: function eventIsForPicker(targetIDs, pickerID) {\n function matches(id) {\n if (id instanceof RegExp) {\n return id.test(pickerID);\n }\n return id === pickerID;\n }\n\n if (angular.isArray(targetIDs)) {\n return targetIDs.some(matches);\n }\n return matches(targetIDs);\n }\n };\n});\n'use strict';\n\nvar Module = angular.module('datePicker');\n\nModule.directive('dateRange', ['$compile', 'datePickerUtils', 'dateTimeConfig', function ($compile, datePickerUtils, dateTimeConfig) {\n function getTemplate(attrs, id, model, min, max) {\n return dateTimeConfig.template(angular.extend(attrs, {\n ngModel: model,\n minDate: min && moment.isMoment(min) ? min.format() : false,\n maxDate: max && moment.isMoment(max) ? max.format() : false\n }), id);\n }\n\n function randomName() {\n return 'picker' + new Date().getTime().toString().substr(2);\n }\n\n return {\n scope: {\n start: '=',\n end: '='\n },\n link: function link(scope, element, attrs) {\n var dateChange = null,\n pickerRangeID = element[0].id,\n pickerIDs = [randomName(), randomName()],\n createMoment = datePickerUtils.createMoment,\n eventIsForPicker = datePickerUtils.eventIsForPicker;\n\n scope.dateChange = function (modelName, newDate) {\n //Notify user if callback exists.\n if (dateChange) {\n dateChange(modelName, newDate);\n }\n };\n\n function setMax(date) {\n scope.$broadcast('pickerUpdate', pickerIDs[0], {\n maxDate: date\n });\n }\n\n function setMin(date) {\n scope.$broadcast('pickerUpdate', pickerIDs[1], {\n minDate: date\n });\n }\n\n if (pickerRangeID) {\n scope.$on('pickerUpdate', function (event, targetIDs, data) {\n if (eventIsForPicker(targetIDs, pickerRangeID)) {\n //If we received an update event, dispatch it to the inner pickers using their IDs.\n scope.$broadcast('pickerUpdate', pickerIDs, data);\n }\n });\n }\n\n datePickerUtils.setParams(attrs.timezone);\n\n scope.start = createMoment(scope.start);\n scope.end = createMoment(scope.end);\n\n scope.$watchGroup(['start', 'end'], function (dates) {\n //Scope data changed, update picker min/max\n setMin(dates[0]);\n setMax(dates[1]);\n });\n\n if (angular.isDefined(attrs.dateChange)) {\n dateChange = datePickerUtils.findFunction(scope, attrs.dateChange);\n }\n\n attrs.onSetDate = 'dateChange';\n\n var template = '
' + getTemplate(attrs, pickerIDs[0], 'start', false, scope.end) + '' + getTemplate(attrs, pickerIDs[1], 'end', scope.start, false) + '
';\n\n var picker = $compile(template)(scope);\n element.append(picker);\n }\n };\n}]);\n'use strict';\n\nangular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position']).constant('uibDropdownConfig', {\n appendToOpenClass: 'uib-dropdown-open',\n openClass: 'open'\n}).service('uibDropdownService', ['$document', '$rootScope', function ($document, $rootScope) {\n var openScope = null;\n\n this.open = function (dropdownScope) {\n if (!openScope) {\n $document.on('click', closeDropdown);\n $document.on('keydown', keybindFilter);\n }\n\n if (openScope && openScope !== dropdownScope) {\n openScope.isOpen = false;\n }\n\n openScope = dropdownScope;\n };\n\n this.close = function (dropdownScope) {\n if (openScope === dropdownScope) {\n openScope = null;\n $document.off('click', closeDropdown);\n $document.off('keydown', keybindFilter);\n }\n };\n\n var closeDropdown = function closeDropdown(evt) {\n // This method may still be called during the same mouse event that\n // unbound this event handler. So check openScope before proceeding.\n if (!openScope) {\n return;\n }\n\n if (evt && openScope.getAutoClose() === 'disabled') {\n return;\n }\n\n if (evt && evt.which === 3) {\n return;\n }\n\n var toggleElement = openScope.getToggleElement();\n if (evt && toggleElement && toggleElement[0].contains(evt.target)) {\n return;\n }\n\n var dropdownElement = openScope.getDropdownElement();\n if (evt && openScope.getAutoClose() === 'outsideClick' && dropdownElement && dropdownElement[0].contains(evt.target)) {\n return;\n }\n\n openScope.isOpen = false;\n\n if (!$rootScope.$$phase) {\n openScope.$apply();\n }\n };\n\n var keybindFilter = function keybindFilter(evt) {\n if (evt.which === 27) {\n openScope.focusToggleElement();\n closeDropdown();\n } else if (openScope.isKeynavEnabled() && [38, 40].indexOf(evt.which) !== -1 && openScope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n openScope.focusDropdownEntry(evt.which);\n }\n };\n}]).controller('UibDropdownController', ['$scope', '$element', '$attrs', '$parse', 'uibDropdownConfig', 'uibDropdownService', '$animate', '$uibPosition', '$document', '$compile', '$templateRequest', function ($scope, $element, $attrs, $parse, dropdownConfig, uibDropdownService, $animate, $position, $document, $compile, $templateRequest) {\n var self = this,\n scope = $scope.$new(),\n // create a child scope so we are not polluting original one\n templateScope,\n appendToOpenClass = dropdownConfig.appendToOpenClass,\n openClass = dropdownConfig.openClass,\n getIsOpen,\n setIsOpen = angular.noop,\n toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop,\n appendToBody = false,\n appendTo = null,\n keynavEnabled = false,\n selectedOption = null,\n body = $document.find('body');\n\n $element.addClass('dropdown');\n\n this.init = function () {\n if ($attrs.isOpen) {\n getIsOpen = $parse($attrs.isOpen);\n setIsOpen = getIsOpen.assign;\n\n $scope.$watch(getIsOpen, function (value) {\n scope.isOpen = !!value;\n });\n }\n\n if (angular.isDefined($attrs.dropdownAppendTo)) {\n var appendToEl = $parse($attrs.dropdownAppendTo)(scope);\n if (appendToEl) {\n appendTo = angular.element(appendToEl);\n }\n }\n\n appendToBody = angular.isDefined($attrs.dropdownAppendToBody);\n keynavEnabled = angular.isDefined($attrs.keyboardNav);\n\n if (appendToBody && !appendTo) {\n appendTo = body;\n }\n\n if (appendTo && self.dropdownMenu) {\n appendTo.append(self.dropdownMenu);\n $element.on('$destroy', function handleDestroyEvent() {\n self.dropdownMenu.remove();\n });\n }\n };\n\n this.toggle = function (open) {\n scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n if (angular.isFunction(setIsOpen)) {\n setIsOpen(scope, scope.isOpen);\n }\n\n return scope.isOpen;\n };\n\n // Allow other directives to watch status\n this.isOpen = function () {\n return scope.isOpen;\n };\n\n scope.getToggleElement = function () {\n return self.toggleElement;\n };\n\n scope.getAutoClose = function () {\n return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled'\n };\n\n scope.getElement = function () {\n return $element;\n };\n\n scope.isKeynavEnabled = function () {\n return keynavEnabled;\n };\n\n scope.focusDropdownEntry = function (keyCode) {\n var elems = self.dropdownMenu ? //If append to body is used.\n angular.element(self.dropdownMenu).find('a') : $element.find('ul').eq(0).find('a');\n\n switch (keyCode) {\n case 40:\n {\n if (!angular.isNumber(self.selectedOption)) {\n self.selectedOption = 0;\n } else {\n self.selectedOption = self.selectedOption === elems.length - 1 ? self.selectedOption : self.selectedOption + 1;\n }\n break;\n }\n case 38:\n {\n if (!angular.isNumber(self.selectedOption)) {\n self.selectedOption = elems.length - 1;\n } else {\n self.selectedOption = self.selectedOption === 0 ? 0 : self.selectedOption - 1;\n }\n break;\n }\n }\n elems[self.selectedOption].focus();\n };\n\n scope.getDropdownElement = function () {\n return self.dropdownMenu;\n };\n\n scope.focusToggleElement = function () {\n if (self.toggleElement) {\n self.toggleElement[0].focus();\n }\n };\n\n scope.$watch('isOpen', function (isOpen, wasOpen) {\n if (appendTo && self.dropdownMenu) {\n var pos = $position.positionElements($element, self.dropdownMenu, 'bottom-left', true),\n css,\n rightalign;\n\n css = {\n top: pos.top + 'px',\n display: isOpen ? 'block' : 'none'\n };\n\n rightalign = self.dropdownMenu.hasClass('dropdown-menu-right');\n if (!rightalign) {\n css.left = pos.left + 'px';\n css.right = 'auto';\n } else {\n css.left = 'auto';\n css.right = window.innerWidth - (pos.left + $element.prop('offsetWidth')) + 'px';\n }\n\n // Need to adjust our positioning to be relative to the appendTo container\n // if it's not the body element\n if (!appendToBody) {\n var appendOffset = $position.offset(appendTo);\n\n css.top = pos.top - appendOffset.top + 'px';\n\n if (!rightalign) {\n css.left = pos.left - appendOffset.left + 'px';\n } else {\n css.right = window.innerWidth - (pos.left - appendOffset.left + $element.prop('offsetWidth')) + 'px';\n }\n }\n\n self.dropdownMenu.css(css);\n }\n\n var openContainer = appendTo ? appendTo : $element;\n var hasOpenClass = openContainer.hasClass(appendTo ? appendToOpenClass : openClass);\n\n if (hasOpenClass === !isOpen) {\n $animate[isOpen ? 'addClass' : 'removeClass'](openContainer, appendTo ? appendToOpenClass : openClass).then(function () {\n if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n toggleInvoker($scope, { open: !!isOpen });\n }\n });\n }\n\n if (isOpen) {\n if (self.dropdownMenuTemplateUrl) {\n $templateRequest(self.dropdownMenuTemplateUrl).then(function (tplContent) {\n templateScope = scope.$new();\n $compile(tplContent.trim())(templateScope, function (dropdownElement) {\n var newEl = dropdownElement;\n self.dropdownMenu.replaceWith(newEl);\n self.dropdownMenu = newEl;\n });\n });\n }\n\n scope.focusToggleElement();\n uibDropdownService.open(scope);\n } else {\n if (self.dropdownMenuTemplateUrl) {\n if (templateScope) {\n templateScope.$destroy();\n }\n var newEl = angular.element('');\n self.dropdownMenu.replaceWith(newEl);\n self.dropdownMenu = newEl;\n }\n\n uibDropdownService.close(scope);\n self.selectedOption = null;\n }\n\n if (angular.isFunction(setIsOpen)) {\n setIsOpen($scope, isOpen);\n }\n });\n}]).directive('uibDropdown', function () {\n return {\n controller: 'UibDropdownController',\n link: function link(scope, element, attrs, dropdownCtrl) {\n dropdownCtrl.init();\n }\n };\n}).directive('uibDropdownMenu', function () {\n return {\n restrict: 'A',\n require: '?^uibDropdown',\n link: function link(scope, element, attrs, dropdownCtrl) {\n if (!dropdownCtrl || angular.isDefined(attrs.dropdownNested)) {\n return;\n }\n\n element.addClass('dropdown-menu');\n\n var tplUrl = attrs.templateUrl;\n if (tplUrl) {\n dropdownCtrl.dropdownMenuTemplateUrl = tplUrl;\n }\n\n if (!dropdownCtrl.dropdownMenu) {\n dropdownCtrl.dropdownMenu = element;\n }\n }\n };\n}).directive('uibDropdownToggle', function () {\n return {\n require: '?^uibDropdown',\n link: function link(scope, element, attrs, dropdownCtrl) {\n if (!dropdownCtrl) {\n return;\n }\n\n element.addClass('dropdown-toggle');\n\n dropdownCtrl.toggleElement = element;\n\n var toggleDropdown = function toggleDropdown(event) {\n event.preventDefault();\n\n if (!element.hasClass('disabled') && !attrs.disabled) {\n scope.$apply(function () {\n dropdownCtrl.toggle();\n });\n }\n };\n\n element.bind('click', toggleDropdown);\n\n // WAI-ARIA\n element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n scope.$watch(dropdownCtrl.isOpen, function (isOpen) {\n element.attr('aria-expanded', !!isOpen);\n });\n\n scope.$on('$destroy', function () {\n element.unbind('click', toggleDropdown);\n });\n }\n };\n});\n'use strict';\n\nangular.module('ui.bootstrap.position', [])\n\n/**\r\n * A set of utility methods for working with the DOM.\r\n * It is meant to be used where we need to absolute-position elements in\r\n * relation to another element (this is the case for tooltips, popovers,\r\n * typeahead suggestions etc.).\r\n */\n.factory('$uibPosition', ['$document', '$window', function ($document, $window) {\n /**\r\n * Used by scrollbarWidth() function to cache scrollbar's width.\r\n * Do not access this variable directly, use scrollbarWidth() instead.\r\n */\n var SCROLLBAR_WIDTH;\n /**\r\n * scrollbar on body and html element in IE and Edge overlay\r\n * content and should be considered 0 width.\r\n */\n var BODY_SCROLLBAR_WIDTH;\n var OVERFLOW_REGEX = {\n normal: /(auto|scroll)/,\n hidden: /(auto|scroll|hidden)/\n };\n var PLACEMENT_REGEX = {\n auto: /\\s?auto?\\s?/i,\n primary: /^(top|bottom|left|right)$/,\n secondary: /^(top|bottom|left|right|center)$/,\n vertical: /^(top|bottom)$/\n };\n var BODY_REGEX = /(HTML|BODY)/;\n\n return {\n\n /**\r\n * Provides a raw DOM element from a jQuery/jQLite element.\r\n *\r\n * @param {element} elem - The element to convert.\r\n *\r\n * @returns {element} A HTML element.\r\n */\n getRawNode: function getRawNode(elem) {\n return elem.nodeName ? elem : elem[0] || elem;\n },\n\n /**\r\n * Provides a parsed number for a style property. Strips\r\n * units and casts invalid numbers to 0.\r\n *\r\n * @param {string} value - The style value to parse.\r\n *\r\n * @returns {number} A valid number.\r\n */\n parseStyle: function parseStyle(value) {\n value = parseFloat(value);\n return isFinite(value) ? value : 0;\n },\n\n /**\r\n * Provides the closest positioned ancestor.\r\n *\r\n * @param {element} element - The element to get the offest parent for.\r\n *\r\n * @returns {element} The closest positioned ancestor.\r\n */\n offsetParent: function offsetParent(elem) {\n elem = this.getRawNode(elem);\n\n var offsetParent = elem.offsetParent || $document[0].documentElement;\n\n function isStaticPositioned(el) {\n return ($window.getComputedStyle(el).position || 'static') === 'static';\n }\n\n while (offsetParent && offsetParent !== $document[0].documentElement && isStaticPositioned(offsetParent)) {\n offsetParent = offsetParent.offsetParent;\n }\n\n return offsetParent || $document[0].documentElement;\n },\n\n /**\r\n * Provides the scrollbar width, concept from TWBS measureScrollbar()\r\n * function in https://github.com/twbs/bootstrap/blob/master/js/modal.js\r\n * In IE and Edge, scollbar on body and html element overlay and should\r\n * return a width of 0.\r\n *\r\n * @returns {number} The width of the browser scollbar.\r\n */\n scrollbarWidth: function scrollbarWidth(isBody) {\n if (isBody) {\n if (angular.isUndefined(BODY_SCROLLBAR_WIDTH)) {\n var bodyElem = $document.find('body');\n bodyElem.addClass('uib-position-body-scrollbar-measure');\n BODY_SCROLLBAR_WIDTH = $window.innerWidth - bodyElem[0].clientWidth;\n BODY_SCROLLBAR_WIDTH = isFinite(BODY_SCROLLBAR_WIDTH) ? BODY_SCROLLBAR_WIDTH : 0;\n bodyElem.removeClass('uib-position-body-scrollbar-measure');\n }\n return BODY_SCROLLBAR_WIDTH;\n }\n\n if (angular.isUndefined(SCROLLBAR_WIDTH)) {\n var scrollElem = angular.element('
');\n $document.find('body').append(scrollElem);\n SCROLLBAR_WIDTH = scrollElem[0].offsetWidth - scrollElem[0].clientWidth;\n SCROLLBAR_WIDTH = isFinite(SCROLLBAR_WIDTH) ? SCROLLBAR_WIDTH : 0;\n scrollElem.remove();\n }\n\n return SCROLLBAR_WIDTH;\n },\n\n /**\r\n * Provides the padding required on an element to replace the scrollbar.\r\n *\r\n * @returns {object} An object with the following properties:\r\n * \r\n */\n scrollbarPadding: function scrollbarPadding(elem) {\n elem = this.getRawNode(elem);\n\n var elemStyle = $window.getComputedStyle(elem);\n var paddingRight = this.parseStyle(elemStyle.paddingRight);\n var paddingBottom = this.parseStyle(elemStyle.paddingBottom);\n var scrollParent = this.scrollParent(elem, false, true);\n var scrollbarWidth = this.scrollbarWidth(scrollParent, BODY_REGEX.test(scrollParent.tagName));\n\n return {\n scrollbarWidth: scrollbarWidth,\n widthOverflow: scrollParent.scrollWidth > scrollParent.clientWidth,\n right: paddingRight + scrollbarWidth,\n originalRight: paddingRight,\n heightOverflow: scrollParent.scrollHeight > scrollParent.clientHeight,\n bottom: paddingBottom + scrollbarWidth,\n originalBottom: paddingBottom\n };\n },\n\n /**\r\n * Checks to see if the element is scrollable.\r\n *\r\n * @param {element} elem - The element to check.\r\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\r\n * default is false.\r\n *\r\n * @returns {boolean} Whether the element is scrollable.\r\n */\n isScrollable: function isScrollable(elem, includeHidden) {\n elem = this.getRawNode(elem);\n\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n var elemStyle = $window.getComputedStyle(elem);\n return overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX);\n },\n\n /**\r\n * Provides the closest scrollable ancestor.\r\n * A port of the jQuery UI scrollParent method:\r\n * https://github.com/jquery/jquery-ui/blob/master/ui/scroll-parent.js\r\n *\r\n * @param {element} elem - The element to find the scroll parent of.\r\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\r\n * default is false.\r\n * @param {boolean=} [includeSelf=false] - Should the element being passed be\r\n * included in the scrollable llokup.\r\n *\r\n * @returns {element} A HTML element.\r\n */\n scrollParent: function scrollParent(elem, includeHidden, includeSelf) {\n elem = this.getRawNode(elem);\n\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n var documentEl = $document[0].documentElement;\n var elemStyle = $window.getComputedStyle(elem);\n if (includeSelf && overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX)) {\n return elem;\n }\n var excludeStatic = elemStyle.position === 'absolute';\n var scrollParent = elem.parentElement || documentEl;\n\n if (scrollParent === documentEl || elemStyle.position === 'fixed') {\n return documentEl;\n }\n\n while (scrollParent.parentElement && scrollParent !== documentEl) {\n var spStyle = $window.getComputedStyle(scrollParent);\n if (excludeStatic && spStyle.position !== 'static') {\n excludeStatic = false;\n }\n\n if (!excludeStatic && overflowRegex.test(spStyle.overflow + spStyle.overflowY + spStyle.overflowX)) {\n break;\n }\n scrollParent = scrollParent.parentElement;\n }\n\n return scrollParent;\n },\n\n /**\r\n * Provides read-only equivalent of jQuery's position function:\r\n * http://api.jquery.com/position/ - distance to closest positioned\r\n * ancestor. Does not account for margins by default like jQuery position.\r\n *\r\n * @param {element} elem - The element to caclulate the position on.\r\n * @param {boolean=} [includeMargins=false] - Should margins be accounted\r\n * for, default is false.\r\n *\r\n * @returns {object} An object with the following properties:\r\n * \r\n */\n position: function position(elem, includeMagins) {\n elem = this.getRawNode(elem);\n\n var elemOffset = this.offset(elem);\n if (includeMagins) {\n var elemStyle = $window.getComputedStyle(elem);\n elemOffset.top -= this.parseStyle(elemStyle.marginTop);\n elemOffset.left -= this.parseStyle(elemStyle.marginLeft);\n }\n var parent = this.offsetParent(elem);\n var parentOffset = { top: 0, left: 0 };\n\n if (parent !== $document[0].documentElement) {\n parentOffset = this.offset(parent);\n parentOffset.top += parent.clientTop - parent.scrollTop;\n parentOffset.left += parent.clientLeft - parent.scrollLeft;\n }\n\n return {\n width: Math.round(angular.isNumber(elemOffset.width) ? elemOffset.width : elem.offsetWidth),\n height: Math.round(angular.isNumber(elemOffset.height) ? elemOffset.height : elem.offsetHeight),\n top: Math.round(elemOffset.top - parentOffset.top),\n left: Math.round(elemOffset.left - parentOffset.left)\n };\n },\n\n /**\r\n * Provides read-only equivalent of jQuery's offset function:\r\n * http://api.jquery.com/offset/ - distance to viewport. Does\r\n * not account for borders, margins, or padding on the body\r\n * element.\r\n *\r\n * @param {element} elem - The element to calculate the offset on.\r\n *\r\n * @returns {object} An object with the following properties:\r\n * \r\n */\n offset: function offset(elem) {\n elem = this.getRawNode(elem);\n\n var elemBCR = elem.getBoundingClientRect();\n return {\n width: Math.round(angular.isNumber(elemBCR.width) ? elemBCR.width : elem.offsetWidth),\n height: Math.round(angular.isNumber(elemBCR.height) ? elemBCR.height : elem.offsetHeight),\n top: Math.round(elemBCR.top + ($window.pageYOffset || $document[0].documentElement.scrollTop)),\n left: Math.round(elemBCR.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft))\n };\n },\n\n /**\r\n * Provides offset distance to the closest scrollable ancestor\r\n * or viewport. Accounts for border and scrollbar width.\r\n *\r\n * Right and bottom dimensions represent the distance to the\r\n * respective edge of the viewport element. If the element\r\n * edge extends beyond the viewport, a negative value will be\r\n * reported.\r\n *\r\n * @param {element} elem - The element to get the viewport offset for.\r\n * @param {boolean=} [useDocument=false] - Should the viewport be the document element instead\r\n * of the first scrollable element, default is false.\r\n * @param {boolean=} [includePadding=true] - Should the padding on the offset parent element\r\n * be accounted for, default is true.\r\n *\r\n * @returns {object} An object with the following properties:\r\n * \r\n */\n viewportOffset: function viewportOffset(elem, useDocument, includePadding) {\n elem = this.getRawNode(elem);\n includePadding = includePadding !== false ? true : false;\n\n var elemBCR = elem.getBoundingClientRect();\n var offsetBCR = { top: 0, left: 0, bottom: 0, right: 0 };\n\n var offsetParent = useDocument ? $document[0].documentElement : this.scrollParent(elem);\n var offsetParentBCR = offsetParent.getBoundingClientRect();\n\n offsetBCR.top = offsetParentBCR.top + offsetParent.clientTop;\n offsetBCR.left = offsetParentBCR.left + offsetParent.clientLeft;\n if (offsetParent === $document[0].documentElement) {\n offsetBCR.top += $window.pageYOffset;\n offsetBCR.left += $window.pageXOffset;\n }\n offsetBCR.bottom = offsetBCR.top + offsetParent.clientHeight;\n offsetBCR.right = offsetBCR.left + offsetParent.clientWidth;\n\n if (includePadding) {\n var offsetParentStyle = $window.getComputedStyle(offsetParent);\n offsetBCR.top += this.parseStyle(offsetParentStyle.paddingTop);\n offsetBCR.bottom -= this.parseStyle(offsetParentStyle.paddingBottom);\n offsetBCR.left += this.parseStyle(offsetParentStyle.paddingLeft);\n offsetBCR.right -= this.parseStyle(offsetParentStyle.paddingRight);\n }\n\n return {\n top: Math.round(elemBCR.top - offsetBCR.top),\n bottom: Math.round(offsetBCR.bottom - elemBCR.bottom),\n left: Math.round(elemBCR.left - offsetBCR.left),\n right: Math.round(offsetBCR.right - elemBCR.right)\n };\n },\n\n /**\r\n * Provides an array of placement values parsed from a placement string.\r\n * Along with the 'auto' indicator, supported placement strings are:\r\n * \r\n * A placement string with an 'auto' indicator is expected to be\r\n * space separated from the placement, i.e: 'auto bottom-left' If\r\n * the primary and secondary placement values do not match 'top,\r\n * bottom, left, right' then 'top' will be the primary placement and\r\n * 'center' will be the secondary placement. If 'auto' is passed, true\r\n * will be returned as the 3rd value of the array.\r\n *\r\n * @param {string} placement - The placement string to parse.\r\n *\r\n * @returns {array} An array with the following values\r\n * \r\n */\n parsePlacement: function parsePlacement(placement) {\n var autoPlace = PLACEMENT_REGEX.auto.test(placement);\n if (autoPlace) {\n placement = placement.replace(PLACEMENT_REGEX.auto, '');\n }\n\n placement = placement.split('-');\n\n placement[0] = placement[0] || 'top';\n if (!PLACEMENT_REGEX.primary.test(placement[0])) {\n placement[0] = 'top';\n }\n\n placement[1] = placement[1] || 'center';\n if (!PLACEMENT_REGEX.secondary.test(placement[1])) {\n placement[1] = 'center';\n }\n\n if (autoPlace) {\n placement[2] = true;\n } else {\n placement[2] = false;\n }\n\n return placement;\n },\n\n /**\r\n * Provides coordinates for an element to be positioned relative to\r\n * another element. Passing 'auto' as part of the placement parameter\r\n * will enable smart placement - where the element fits. i.e:\r\n * 'auto left-top' will check to see if there is enough space to the left\r\n * of the hostElem to fit the targetElem, if not place right (same for secondary\r\n * top placement). Available space is calculated using the viewportOffset\r\n * function.\r\n *\r\n * @param {element} hostElem - The element to position against.\r\n * @param {element} targetElem - The element to position.\r\n * @param {string=} [placement=top] - The placement for the targetElem,\r\n * default is 'top'. 'center' is assumed as secondary placement for\r\n * 'top', 'left', 'right', and 'bottom' placements. Available placements are:\r\n * \r\n * @param {boolean=} [appendToBody=false] - Should the top and left values returned\r\n * be calculated from the body element, default is false.\r\n *\r\n * @returns {object} An object with the following properties:\r\n * \r\n */\n positionElements: function positionElements(hostElem, targetElem, placement, appendToBody) {\n hostElem = this.getRawNode(hostElem);\n targetElem = this.getRawNode(targetElem);\n\n // need to read from prop to support tests.\n var targetWidth = angular.isDefined(targetElem.offsetWidth) ? targetElem.offsetWidth : targetElem.prop('offsetWidth');\n var targetHeight = angular.isDefined(targetElem.offsetHeight) ? targetElem.offsetHeight : targetElem.prop('offsetHeight');\n\n placement = this.parsePlacement(placement);\n\n var hostElemPos = appendToBody ? this.offset(hostElem) : this.position(hostElem);\n var targetElemPos = { top: 0, left: 0, placement: '' };\n\n if (placement[2]) {\n var viewportOffset = this.viewportOffset(hostElem, appendToBody);\n\n var targetElemStyle = $window.getComputedStyle(targetElem);\n var adjustedSize = {\n width: targetWidth + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginLeft) + this.parseStyle(targetElemStyle.marginRight))),\n height: targetHeight + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginTop) + this.parseStyle(targetElemStyle.marginBottom)))\n };\n\n placement[0] = placement[0] === 'top' && adjustedSize.height > viewportOffset.top && adjustedSize.height <= viewportOffset.bottom ? 'bottom' : placement[0] === 'bottom' && adjustedSize.height > viewportOffset.bottom && adjustedSize.height <= viewportOffset.top ? 'top' : placement[0] === 'left' && adjustedSize.width > viewportOffset.left && adjustedSize.width <= viewportOffset.right ? 'right' : placement[0] === 'right' && adjustedSize.width > viewportOffset.right && adjustedSize.width <= viewportOffset.left ? 'left' : placement[0];\n\n placement[1] = placement[1] === 'top' && adjustedSize.height - hostElemPos.height > viewportOffset.bottom && adjustedSize.height - hostElemPos.height <= viewportOffset.top ? 'bottom' : placement[1] === 'bottom' && adjustedSize.height - hostElemPos.height > viewportOffset.top && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom ? 'top' : placement[1] === 'left' && adjustedSize.width - hostElemPos.width > viewportOffset.right && adjustedSize.width - hostElemPos.width <= viewportOffset.left ? 'right' : placement[1] === 'right' && adjustedSize.width - hostElemPos.width > viewportOffset.left && adjustedSize.width - hostElemPos.width <= viewportOffset.right ? 'left' : placement[1];\n\n if (placement[1] === 'center') {\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n var xOverflow = hostElemPos.width / 2 - targetWidth / 2;\n if (viewportOffset.left + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.right) {\n placement[1] = 'left';\n } else if (viewportOffset.right + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.left) {\n placement[1] = 'right';\n }\n } else {\n var yOverflow = hostElemPos.height / 2 - adjustedSize.height / 2;\n if (viewportOffset.top + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom) {\n placement[1] = 'top';\n } else if (viewportOffset.bottom + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.top) {\n placement[1] = 'bottom';\n }\n }\n }\n }\n\n switch (placement[0]) {\n case 'top':\n targetElemPos.top = hostElemPos.top - targetHeight;\n break;\n case 'bottom':\n targetElemPos.top = hostElemPos.top + hostElemPos.height;\n break;\n case 'left':\n targetElemPos.left = hostElemPos.left - targetWidth;\n break;\n case 'right':\n targetElemPos.left = hostElemPos.left + hostElemPos.width;\n break;\n }\n\n switch (placement[1]) {\n case 'top':\n targetElemPos.top = hostElemPos.top;\n break;\n case 'bottom':\n targetElemPos.top = hostElemPos.top + hostElemPos.height - targetHeight;\n break;\n case 'left':\n targetElemPos.left = hostElemPos.left;\n break;\n case 'right':\n targetElemPos.left = hostElemPos.left + hostElemPos.width - targetWidth;\n break;\n case 'center':\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n targetElemPos.left = hostElemPos.left + hostElemPos.width / 2 - targetWidth / 2;\n } else {\n targetElemPos.top = hostElemPos.top + hostElemPos.height / 2 - targetHeight / 2;\n }\n break;\n }\n\n targetElemPos.top = Math.round(targetElemPos.top);\n targetElemPos.left = Math.round(targetElemPos.left);\n targetElemPos.placement = placement[1] === 'center' ? placement[0] : placement[0] + '-' + placement[1];\n\n return targetElemPos;\n },\n\n /**\r\n * Provides a way for positioning tooltip & dropdown\r\n * arrows when using placement options beyond the standard\r\n * left, right, top, or bottom.\r\n *\r\n * @param {element} elem - The tooltip/dropdown element.\r\n * @param {string} placement - The placement for the elem.\r\n */\n positionArrow: function positionArrow(elem, placement) {\n elem = this.getRawNode(elem);\n\n var innerElem = elem.querySelector('.tooltip-inner, .popover-inner');\n if (!innerElem) {\n return;\n }\n\n var isTooltip = angular.element(innerElem).hasClass('tooltip-inner');\n\n var arrowElem = isTooltip ? elem.querySelector('.tooltip-arrow') : elem.querySelector('.arrow');\n if (!arrowElem) {\n return;\n }\n\n var arrowCss = {\n top: '',\n bottom: '',\n left: '',\n right: ''\n };\n\n placement = this.parsePlacement(placement);\n if (placement[1] === 'center') {\n // no adjustment necessary - just reset styles\n angular.element(arrowElem).css(arrowCss);\n return;\n }\n\n var borderProp = 'border-' + placement[0] + '-width';\n var borderWidth = $window.getComputedStyle(arrowElem)[borderProp];\n\n var borderRadiusProp = 'border-';\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n borderRadiusProp += placement[0] + '-' + placement[1];\n } else {\n borderRadiusProp += placement[1] + '-' + placement[0];\n }\n borderRadiusProp += '-radius';\n var borderRadius = $window.getComputedStyle(isTooltip ? innerElem : elem)[borderRadiusProp];\n\n switch (placement[0]) {\n case 'top':\n arrowCss.bottom = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'bottom':\n arrowCss.top = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'left':\n arrowCss.right = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'right':\n arrowCss.left = isTooltip ? '0' : '-' + borderWidth;\n break;\n }\n\n arrowCss[placement[1]] = borderRadius;\n\n angular.element(arrowElem).css(arrowCss);\n }\n };\n}]);\n'use strict';\n\nangular.module('ui.bootstrap.stackedMap', [])\n/**\r\n * A helper, internal data structure that acts as a map but also allows getting / removing\r\n * elements in the LIFO order\r\n */\n.factory('$$stackedMap', function () {\n return {\n createNew: function createNew() {\n var stack = [];\n\n return {\n add: function add(key, value) {\n stack.push({\n key: key,\n value: value\n });\n },\n get: function get(key) {\n for (var i = 0; i < stack.length; i++) {\n if (key === stack[i].key) {\n return stack[i];\n }\n }\n },\n keys: function keys() {\n var keys = [];\n for (var i = 0; i < stack.length; i++) {\n keys.push(stack[i].key);\n }\n return keys;\n },\n top: function top() {\n return stack[stack.length - 1];\n },\n remove: function remove(key) {\n var idx = -1;\n for (var i = 0; i < stack.length; i++) {\n if (key === stack[i].key) {\n idx = i;\n break;\n }\n }\n return stack.splice(idx, 1)[0];\n },\n removeTop: function removeTop() {\n return stack.splice(stack.length - 1, 1)[0];\n },\n length: function length() {\n return stack.length;\n }\n };\n }\n };\n});\n'use strict';\n\nangular.module('ui.bootstrap', ['ui.bootstrap.modal', 'ui.bootstrap.tabs', 'ui.bootstrap.carousel', 'ui.bootstrap.dropdown', 'ui.bootstrap.typeahead', 'ui.bootstrap.pagination']);\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('httpInterceptor', httpInterceptor);\n\n function httpInterceptor($httpParamSerializer, $location, $q, $rootScope, apiUrl, blockUI) {\n var service = {\n response: response,\n request: request,\n responseError: responseError\n };\n\n function response(data) {\n return data;\n }\n\n function responseError(error) {\n\n blockUI.stop();\n\n switch (error.status) {\n case 406:\n toastr.warning($rootScope.translate.pleaseSetNo);\n $location.path('/').search('menu', 31);\n break;\n case 404:\n toastr.warning(error.data);\n break;\n case 403:\n toastr.warning($rootScope.translate.canNotAccess);\n $location.path('/').search('menu', 31);\n break;\n case 401:\n if (sessionStorage.getItem('token')) {\n if ($rootScope.translate) {\n toastr.warning($rootScope.translate.tokenIsTimeout);\n }\n }\n removeSsoInfo();\n $location.path('/login').search({});\n break;\n case 400:\n toastr.warning(error.data.message);\n break;\n case 303:\n var isConfirm = confirm(error.data);\n if (isConfirm) {\n if (sessionStorage.getItem('token')) {\n $location.path('/').search('menu', 1);\n } else {\n $location.path('/login').search({});\n }\n } else {\n return $q.resolve(error);\n }\n break;\n\n case -1:\n\n // 在 IOS APP 中停留一段時間\n // 在按上一頁面就會產生 -1 的錯誤訊息\n // 但此 error 不包含任何 data / message 資訊\n // 所以就先這樣 避免進入 default 跳出錯誤訊息\n\n break;\n\n default:\n\n // post error message to server\n var status = '',\n data = '',\n message = '';\n if (error) {\n if (error.statu) {\n status = error.status;\n }\n if (error.data) {\n data = error.data;\n if (error.data.message) {\n message = error.data.message;\n }\n }\n }\n\n var errorLog = '[httpInterceptor] status: ' + error.status + ', data: ' + error.data + ', message: ' + message;\n postException(errorLog, apiUrl);\n\n showSystemError();\n break;\n }\n return $q.reject(error);\n }\n\n function request(config) {\n var contentType = _.get(config.headers, 'Content-Type');\n if (!_.startsWith(contentType, 'application/json')) {\n config.headers = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n };\n config.transformRequest = function (data) {\n return $httpParamSerializer(data);\n };\n }\n\n // config.headers[\"Accept-Language\"] = sessionStorage.getItem(\"userLang\");\n\n // if (sessionStorage.getItem('langCode')) {\n // config.headers.LangCode = sessionStorage.getItem('langCode');\n // } else {\n // config.headers.LangCode = getDefaultLangCode();\n // sessionStorage.setItem('langCode', getDefaultLangCode());\n // }\n\n if (sessionStorage.getItem('langCode')) {\n config.headers.LangCode = sessionStorage.getItem('langCode');\n config.headers[\"Accept-Language\"] = sessionStorage.getItem('userLang');\n } else {\n\n getDefaultUserLang(apiUrl.tsApi, navigator.systemLanguage).done(function (data) {\n\n var userLang = data;\n var langCode = getLangCode(userLang);\n config.headers.LangCode = langCode;\n sessionStorage.setItem('langCode', langCode);\n });\n }\n\n return config;\n }\n\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('choicePerSerilNoModalController', choicePerSerilNoModalController);\n\n function choicePerSerilNoModalController($uibModal, data, $uibModalInstance) {\n var vm = this;\n vm.choiceSeirlNo = choiceSeirlNo;\n vm.data = data;\n\n function choiceSeirlNo(item) {\n return $uibModalInstance.close(item);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('contectModalController', contectModalController);\n\n function contectModalController($uibModalInstance, modalService, e2eService, headerService, $rootScope, loginService, iAmNotRobot, userData, $http, apiUrl) {\n var vm = this;\n vm.cancel = cancel;\n vm.autoFill = autoFill;\n vm.submit = submit;\n vm.iAmNotRobot = iAmNotRobot;\n\n init();\n\n function init() {\n vm.view = {\n show: false\n };\n vm.data = {};\n vm.isLogin = userData.isLogin;\n vm.data.name = userData.cName;\n vm.data.email = userData.email;\n\n if (!sessionStorage.getItem('token')) {\n // loginService.getSsoInfo().then(function(data) {\n // vm.data.name = sessionStorage.getItem('cName');\n // vm.data.email = data.data.email;\n // vm.isLogin = true;\n // });\n vm.view.show = true;\n }\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function autoFill() {\n e2eService.contactMe(vm.data);\n }\n\n function specialKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function submit() {\n if (specialKeywordVerification(vm.data.name)) {\n toastr.warning($rootScope.translate.commonName + $rootScope.translate.specialKeywords);\n return false;\n } else if (specialKeywordVerification(vm.data.content)) {\n toastr.warning($rootScope.translate.commonContent + $rootScope.translate.specialKeywords);\n return false;\n }\n\n if (vm.isLogin) {\n //已登入狀態下,略過圖形驗證\n headerService.contactMe(vm.data).then(function () {\n toastr.success($rootScope.translate.sendMailSuccess);\n $uibModalInstance.dismiss('cancel');\n });\n } else {\n if (specialKeywordVerification(vm.login.inputVerify)) {\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\n return false;\n }\n\n if ($('#inputVerify').val().length == 4) {\n var paramsData = {\n name: vm.data.name,\n email: vm.data.email,\n content: vm.data.content,\n inputVerify: $('#inputVerify').val().toUpperCase(),\n isPass: $('#isPass').val(),\n SecretKey: \"1\"\n };\n\n headerService.contactMe(paramsData).then(function (data) {\n\n if (data) {\n toastr.success($rootScope.translate.sendMailSuccess);\n $uibModalInstance.dismiss('cancel');\n } else {\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n }\n });\n } else {\n toastr.warning($rootScope.translate.commonIncorrectFormat);\n }\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('courseDetailModalController', courseDetailModalController);\n\n function courseDetailModalController(modalService, $uibModalInstance, $q, $scope, enumService, trainingInnerService, courseItem, settingModel, $location, $anchorScroll, commonService, defaultTabIndex) {\n\n var vm = this;\n vm.isMobile = modalService.isMobile();\n vm.setPathUrl = setPathUrl;\n vm.goTop = goTop;\n vm.cancel = cancel;\n vm.enroll = enroll;\n vm.tabChange = tabChange;\n vm.sessionChoice = sessionChoice;\n vm.enum = {\n courseType: enumService.courseType\n };\n //===Main==\n init();\n //=========\n function init() {\n dataInit();\n logicInit();\n $scope.$on('emitExamSubmit', function () {\n enroll();\n });\n }\n\n function dataInit() {\n settingModel = settingModel || {};\n vm.data = {\n importCourse: courseItem || null, //.....理論上是清單列傳入的班次課程\n importCourseActivities: null, //..........傳入的班次課程包含學習動作(WS14)\n sessionItem: null, //.....................班次資料\n sessionDetail: null, //...................班次詳細資料\n courageItem: null, //.....................學程資料\n courageDetail: null, //...................學程詳細資料\n enrollQuestionItem: null, //..............報名前問卷\n enrollActivity: null, //..................報名問卷\n tabIndex: 0 //...........................畫面頁籤\n };\n vm.view = {\n enrollQuestionMode: settingModel.isEnroll || false,\n hasEnrollQuestion: false, //..............有報名前問卷\n contentCourage: false,\n contentCourse: false,\n pageLoad: false,\n couragePage: false, //.............學程頁面\n sessionPage: false //.............班次頁面\n };\n }\n function logicInit() {\n return sessionInit(vm.data.importCourse).then(function () {\n var selectActive = trainingInnerService.getSelectActive(vm.data.importCourse);\n return selectActive.then(function (data) {\n //console.log(\"selectActiveResult:\", data);\n vm.data.importCourseActivities = data;\n });\n }).then(function () {\n vm.view.hasEnrollQuestion = vm.data.importCourseActivities.preSurveyItemId > 0;\n //console.log('hasQues:',vm.view.hasEnrollQuestion );\n if (vm.view.hasEnrollQuestion) {\n vm.data.enrollActivity = {\n type: '問卷',\n itemId: vm.data.importCourseActivities.preSurveyItemId\n };\n }\n vm.data.tabIndex = vm.view.enrollQuestionMode ? 2 : vm.data.tabIndex;\n Accordion();\n });\n }\n\n function sessionInit(importItem) {\n if (!importItem) {\n return;\n }\n var courseDetail = trainingInnerService.getCourseDetail(importItem);\n return courseDetail.then(function (data) {\n var courseDetailResult = detailFormat(data);\n switch (parseInt(importItem.courseType)) {\n case vm.enum.courseType.courage:\n //學程\n vm.data.courageItem = angular.copy(importItem);\n vm.data.courageDetail = courseDetailResult;\n vm.view.couragePage = true;\n vm.data.tabIndex = defaultTabIndex ? defaultTabIndex : 0; // 第一頁籤是 0,但客戶要求預設顯示第2頁籤\n break;\n default:\n //非學程\n vm.data.sessionItem = angular.copy(importItem);\n vm.data.sessionDetail = courseDetailResult;\n vm.view.sessionPage = true;\n vm.data.tabIndex = defaultTabIndex ? defaultTabIndex : 1; // 第一頁籤是 1,但客戶要求預設顯示第2頁籤\n break;\n }\n });\n }\n\n function detailFormat(sourceData) {\n var detailData = angular.copy(sourceData);\n if (!detailData) {\n return detailData;\n }\n //===========\n var brCheck = /(\\r?\\n)/g;\n _.forEach(detailData, function (value, key) {\n var isInt = value === parseInt(value, 10);\n var isString = typeof value === \"string\";\n if (isInt) {\n var isAsNull = value < 0;\n\n if (isAsNull) {\n detailData[key] = null;\n } else {\n detailData[key] = value + '';\n }\n } else if (isString) {\n detailData[key] = value.replace(brCheck, \"
\");\n }\n });\n //===========\n if (detailData.reference) {\n //檢查參考文件格式\n if (!angular.isArray(detailData.reference)) {\n //參考文件必須是陣列\n detailData.reference = null;\n }\n if (detailData.reference.length <= 0) {\n //參考文件必須有內容\n detailData.reference = null;\n }\n }\n return detailData;\n }\n function goTop() {\n $location.hash('PageTop');\n $anchorScroll();\n $location.hash('');\n }\n function enroll() {\n trainingInnerService.postSessionAction(vm.data.importCourse, 'Enroll').then(function (result) {\n if (!result) {\n $uibModalInstance.dismiss('cancel');\n return;\n }\n $uibModalInstance.close(result);\n });\n }\n function tabChange(index) {\n vm.view.couragePage = false;\n vm.view.sessionPage = false;\n switch (index) {\n case 0:\n vm.view.couragePage = true;\n vm.data.sessionItem = null;\n vm.data.sessionDetail = null;\n vm.data.tabIndex = 0;\n break;\n case 1:\n vm.view.sessionPage = true;\n vm.data.tabIndex = 1;\n break;\n case 2:\n vm.data.tabIndex = 2;\n break;\n default:\n break;\n }\n // console.log(\"enter tabChange , index:\", vm.data.tabIndex);\n }\n\n function sessionChoice(sessionItem) {\n // console.log(\"enter sessionChoice,sessionItem:\", sessionItem);\n if (!sessionItem.courseType) {\n sessionItem.courseType = 1;\n }\n return sessionInit(sessionItem).then(function () {\n tabChange(1);\n });\n }\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function setPathUrl(filePath) {\n var pathUrl = commonService.ctmsFilePath(filePath);\n return pathUrl;\n }\n //======Jquery====\n function Accordion() {\n $(document).off(\"click\", \".accordion .title\");\n\n $(document).on(\"click\", \".accordion .title\", function (j) {\n var dropDown = $(this).closest('.col-sm-12').find('p.acc-info');\n $(this).closest('.accordion').find('p.acc-info').not(dropDown).slideUp();\n\n if ($(this).hasClass('active')) {\n $(this).removeClass('active');\n } else {\n $(this).closest('.accordion').find('a.active').removeClass('active');\n $(this).addClass('active');\n }\n\n dropDown.stop(false, true).slideToggle();\n\n j.preventDefault();\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('editPwdModalController', editPwdModalController);\n\n function editPwdModalController(loginService, sysCode, e2eService, $rootScope, $uibModalInstance, $route, $scope) {\n var vm = this;\n vm.submit = submit;\n vm.autoFill = autoFill;\n vm.cancel = cancel;\n\n // virtual keyboard start\n vm.showVirKey = showVirKey;\n vm.isShowVirKey = false;\n vm.textChanged = textChanged;\n vm.focusObj = null;\n vm.virData = null;\n\n // 針對哪個 input 使用動態鍵盤輸入\n vm.getFocusOldPwd = function () {\n vm.focusObj = \"oldPwd\";\n vm.virData = vm.data.oldPwd;\n };\n vm.getFocusNewPwd = function () {\n vm.focusObj = \"newPwd\";\n vm.virData = vm.data.newPwd;\n };\n vm.getFocusConfirmPwd = function () {\n vm.focusObj = \"confirmPwd\";\n vm.virData = vm.data.confirmPwd;\n };\n\n function textChanged(newPwd) {\n console.log(\"vm.focusObj:\", vm.focusObj);\n var e = document.getElementById(vm.focusObj);\n e.value = newPwd;\n console.log(\"newPwd:\", newPwd);\n var $e = angular.element(e);\n $e.triggerHandler('input');\n }\n\n function showVirKey() {\n if (vm.isShowVirKey) vm.isShowVirKey = false;else vm.isShowVirKey = true;\n }\n\n init();\n\n function init() {\n vm.data = {};\n loginService.getSsoInfo().then(function (data) {\n vm.data.userAccount = data.data.userAccount;\n });\n }\n\n function submit() {\n vm.confirmPwd = vm.data.newPwd == vm.data.oldPwd;\n if (!vm.confirmPwd) {\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\n }\n\n if (!vm.confirmPwd) {\n loginService.setSsoParams(vm.data);\n loginService.modifyUserPassword(vm.data).then(function (data) {\n if (data !== undefined) {\n removeSsoInfo();\n $route.reload();\n toastr.success($rootScope.translate.commonEditPwdSuccess);\n $uibModalInstance.close();\n }\n });\n }\n }\n\n function autoFill() {\n e2eService.editPwdModal(vm.data);\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('explanationModalController', explanationModalController);\n\n function explanationModalController($uibModalInstance, loginService) {\n var vm = this;\n vm.cancel = cancel;\n\n loginService.getPwdConstrain().then(function (data) {\n vm.data = data.data;\n });\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('forgetPwdModalController', forgetPwdModalController);\n\n function forgetPwdModalController($uibModalInstance, $uibModal, sysCode, loginService, $rootScope, e2eService, enumService, iAmNotRobot) {\n var vm = this;\n vm.sendMail = sendMail;\n vm.submit = submit;\n vm.cancel = cancel;\n vm.forgetAutoFill = forgetAutoFill;\n vm.iAmNotRobot = iAmNotRobot;\n\n onInit();\n\n function onInit() {\n vm.data = {};\n vm.state = 'typeAccount';\n vm.data.target = 1;\n }\n\n function specialKeywordVerificationUserAccount(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function specialKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function sendMail() {\n\n if (specialKeywordVerificationUserAccount($('#inputUserAccount').val())) {\n toastr.warning($rootScope.translate.tsdgLoginAccount + $rootScope.translate.specialKeywords);\n return false;\n } else if (specialKeywordVerification($('#inputVerify').val())) {\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\n return false;\n }\n\n //console.log('sendMail recaptcha:',vm.reCaptcha);\n if ($('#inputVerify').val().length == 4) {\n //將登入帳號轉成小寫\n if (vm.data.userAccount.indexOf('@') >= 0) {\n vm.data.userAccount = vm.data.userAccount.toLowerCase();\n }\n\n var params = {\n userAccount: vm.data.userAccount,\n sysCode: sysCode,\n target: vm.data.target,\n inputVerify: $('#inputVerify').val().toUpperCase(),\n isPass: $('#isPass').val(),\n SecretKey: \"1\"\n };\n\n loginService.forgetPWD(params).then(function (data) {\n\n if (data) {\n switch (parseInt(params.target)) {\n case enumService.sendTarget.email:\n // console.log(data);\n toastr.success($rootScope.translate.commonAlreadySendMail);\n break;\n case enumService.sendTarget.sms:\n toastr.success($rootScope.translate.commonAlreadySendSMS);\n break;\n }\n\n return data;\n }\n }).then(function (data) {\n if (data && params.target !== enumService.sendTarget.email) {\n vm.state = 'directEditPwd';\n } else {\n $uibModalInstance.dismiss('cancel');\n }\n });\n } else {\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n }\n }\n\n function submit() {\n\n vm.data.sysCode = sysCode;\n loginService.directModifyUserPassword(vm.data).then(function (data) {\n if (data) {\n toastr.success($rootScope.translate.commonEditPwdSuccess);\n $uibModalInstance.close('ok');\n }\n });\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function forgetAutoFill() {\n e2eService.forgetPwd(vm.data);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('loginModalController', loginModalController);\n\n function loginModalController($rootScope, $scope, $uibModalInstance, loginService, $location, modalService, enumService, e2eService, mobileService, translateService, iAmNotRobot) {\n // console.log(\"iAmNotRobot:\",iAmNotRobot);\n var vm = this;\n vm.isMobile = modalService.isMobile();\n vm.iAmNotRobot = iAmNotRobot;\n vm.cancel = cancel;\n vm.submit = submit;\n vm.autoFill = autoFill;\n vm.autoFill2 = autoFill2;\n vm.openForgetPwd = openForgetPwd;\n vm.openRegister = openRegister;\n vm.openExplanation = openExplanation;\n //vm.enableLogin = enableLogin;\n vm.deviceToken = deviceToken;\n\n // virtual kb need\n vm.isInitKeyboard = false;\n vm.showVirKey = showVirKey;\n vm.isShowVirKey = false;\n vm.pwdChanged = pwdChanged;\n vm.focusObj = null;\n vm.virData = null;\n\n // ------------------------\n // 針對哪個 input 使用動態鍵盤輸入\n vm.getFocusUserAccount = function () {\n vm.focusObj = \"userAccount\";\n //vm.virData = vm.login.userAccount; //2019-09-23 修正focus:TypeError: 無法取得未定義或 Null 參考的屬性 'userAccount'\n };\n vm.getFocusUserPwd = function () {\n vm.focusObj = \"userPwd\";\n //vm.virData = vm.login.pwd; //2019-09-23 修正focus:TypeError: 無法取得未定義或 Null 參考的屬性 'pwd'\n };\n vm.enableLogin = function () {\n enableLogin;\n };\n\n function pwdChanged(newPwd) {\n if (vm.focusObj == null) //2019-09-23 修正未指定focus造成錯誤:修正為NULL帶預設欄位為帳號\n vm.focusObj = \"userAccount\";\n\n var e = document.getElementById(vm.focusObj);\n e.value = newPwd;\n var $e = angular.element(e);\n $e.triggerHandler('input');\n }\n\n function showVirKey() {\n if (vm.isShowVirKey) vm.isShowVirKey = false;else vm.isShowVirKey = true;\n }\n\n // -----------------------\n\n // 測試是否有抓到 Device Token\n function deviceToken() {\n var myDeviceToken = \"device token is empty\";\n if (DEVICE_TOKEN) {\n myDeviceToken = DEVICE_TOKEN;\n }\n return myDeviceToken;\n }\n\n vm.view = {\n loginBefore: false\n };\n //讀入Google reCaptcha需要的key\n\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function specialKeywordVerificationUserAccount(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function specialKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function submit() {\n\n if (specialKeywordVerificationUserAccount(vm.login.userAccount)) {\n toastr.warning($rootScope.translate.tsdgLoginAccount + $rootScope.translate.specialKeywords);\n return false;\n } else if (specialKeywordVerification(vm.login.inputVerify)) {\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\n return false;\n }\n\n if ($('#inputVerify').val().length == 4) {\n\n var paramsLogin = {\n userAccount: btoa(vm.login.userAccount),\n pwd: btoa(vm.login.pwd),\n inputVerify: $('#inputVerify').val().toUpperCase(),\n isPass: $('#isPass').val(),\n SecretKey: \"1\"\n };\n\n //console.log(\"submit pass\");\n //已在SP中統一做大小寫比較\n // if (vm.login.userAccount.indexOf('@') >= 0){\n // vm.login.userAccount = vm.login.userAccount.toLowerCase();\n // }\n // console.log('vm:', vm);\n // console.log('vm.login:', vm.login);\n // console.log(' vm.login.isPass:', vm.login.isPass);\n\n loginService.login(paramsLogin).then(function (data) {\n if (data) {\n if (data.length > 1) {\n var result = modalService.getChoicePerSerilNo(data);\n result.result.then(function (item) {\n var params = {\n pwd: vm.login.pwd,\n perSerilNo: item.PerserilNo,\n userAccount: item.UserAccount\n };\n loginService.loginByPerSerilNo(params).then(function (data) {\n if (data) {\n loginToEditOrHome(data);\n mobileService.postMobileInfo(data);\n }\n });\n });\n } else {\n //console.log('sso item:',data);\n loginToEditOrHome(data);\n mobileService.postMobileInfo(data);\n }\n vm.view.loginBefore = false;\n return data;\n } else if (!data === undefined) {\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n //2023-07-13 Johnson 資安2023\n vm.login.pwd = eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('0;', 2, 1, 'null'.split('|'), 0, {}));\n }\n }).catch(function () {\n vm.view.loginBefore = false;\n });\n } else {\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n }\n }\n\n /**\r\n * 判斷要登入到首頁或強制修改密碼頁\r\n * \r\n * @param data (description)\r\n */\n function loginToEditOrHome(data) {\n setSsoInfo(data);\n $uibModalInstance.close('ok');\n $('#captcha iframe').empty().remove();\n translateService.getLanguage().then(function (languageItems) {\n var defaultLangItem = _.find(languageItems.data, {\n selected: true\n });\n translateService.change(defaultLangItem);\n if (data.IsForce) {\n sessionStorage.setItem('isForce', true);\n $location.path('/login/forceEditPwd');\n } else if (data.isFirstLogin) {\n modalService.phoneNumber();\n } else {\n $location.path('/').search('menu', 31);\n }\n });\n }\n\n function autoFill() {\n vm.login = {};\n e2eService.login(vm.login);\n //debugger;\n //var result = loginService.QueryCaptcha();\n }\n function autoFill2() {\n vm.login = {};\n e2eService.login(vm.login);\n //debugger;\n //var result = loginService.chkCaptcha();\n }\n function openForgetPwd() {\n modalService.forgetPwd();\n }\n\n function openRegister() {\n modalService.register();\n }\n\n function openExplanation() {\n modalService.explanation();\n }\n\n function enableLogin() {\n vm.view.loginBefore = false;\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('phoneNumberModalController', phoneNumberModalController);\n\n function phoneNumberModalController($uibModalInstance, loginService, $rootScope, $uibModalStack) {\n var vm = this;\n vm.cancel = cancel;\n vm.sendVerifyCodeFromPhone = sendVerifyCodeFromPhone;\n vm.checkVerify = checkVerify;\n vm.isSended = false;\n\n init();\n\n function init() {\n loginService.getSsoInfo().then(function (data) {\n vm.form1 = {\n userAccount: data.data.userAccount,\n tel: data.data.tel\n };\n });\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function sendVerifyCodeFromPhone() {\n loginService.sendVerifyCodeFromPhone(vm.form1.userAccount).then(function () {\n toastr.success($rootScope.translate.commonAlreadySendSMS);\n });\n vm.isSended = true;\n }\n\n function checkVerify() {\n var param = {\n verifyCode: vm.form1.validCode,\n userAccount: vm.form1.userAccount,\n PhoneNumber: vm.form1.tel\n };\n loginService.verifyCodeCheckFromPhone(param).then(function (data) {\n if (data) {\n toastr.success($rootScope.translate.alreadyVerifyPhoneNumber);\n $uibModalStack.dismissAll();\n }\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('registerModalController', registerModalController);\n\n function registerModalController($uibModalInstance, loginService, $rootScope, sysCode, e2eService, blockUI, iAmNotRobot) {\n var vm = this;\n vm.cancel = cancel;\n vm.submit = submit;\n vm.autoFill = autoFill;\n vm.iAmNotRobot = iAmNotRobot;\n\n onInit();\n\n function onInit() {\n vm.data = {};\n vm.sendType = [{ id: 1, name: 'Email' }, { id: 2, name: $rootScope.translate.commonSMS }];\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function specialKeywordVerificationUserAccount(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function specialKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n keyWord = keyWord.replace(/\\\\/g, \"/\");\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\n var result = false;\n for (var i = 0; i < keyWord.length; i++) {\n console.log('for keyWord:' + keyWord.substr(i, 1) + ' pattern:' + keyWord.substr(i, 1).replace(pattern, 'false'));\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {\n result = true;\n }\n }\n return result;\n }\n\n function phoneKeywordVerification(keyWord) {\n /*2020-06-11 Johnson\r\n 特殊字元 【0-9】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\n var result = false;\n var str = keyWord.replace(/[^0-9]/g, 'false');\n if (str.indexOf('false') != -1) result = true;\n\n return result;\n }\n\n function submit() {\n\n if (specialKeywordVerificationUserAccount(vm.data.email)) {\n toastr.warning($rootScope.translate.tsdgLoginAccount + $rootScope.translate.specialKeywords);\n return false;\n } else if (specialKeywordVerificationUserAccount(vm.data.cName)) {\n toastr.warning($rootScope.translate.tsdgName + $rootScope.translate.specialKeywords);\n return false;\n } else if (phoneKeywordVerification(vm.data.perTel)) {\n toastr.warning($rootScope.translate.commonMobile + $rootScope.translate.commonIncorrectFormat);\n return false;\n } else if (specialKeywordVerification(vm.login.inputVerify)) {\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\n return false;\n }\n\n // Block the user interface\n if ($('#inputVerify').val().length == 4) {\n blockUI.start();\n\n vm.data.target = 1;\n vm.data.sysCode = sysCode;\n\n var params = {\n cName: vm.data.cName,\n email: vm.data.email,\n target: vm.data.target,\n sysCode: vm.data.sysCode,\n pwd: vm.data.pwd,\n perTel: vm.data.perTel,\n confirmPwd: vm.data.confirmPwd,\n inputVerify: $('#inputVerify').val().toUpperCase(),\n isPass: $('#isPass').val(),\n SecretKey: \"1\"\n };\n\n loginService.registerOutsideUser(params).then(function (data) {\n // Unblock the user interface\n blockUI.stop();\n if (data) {\n toastr.success($rootScope.translate.commonAlreadySendMail);\n $uibModalInstance.close('ok');\n }\n });\n } else {\n toastr.warning($rootScope.translate.commonReCaptchaFail);\n }\n }\n\n function autoFill() {\n e2eService.register(vm.data);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('settingModalController', settingModalController);\n\n function settingModalController($uibModalInstance, loginService, $rootScope, modalService, viewModel, $q, headerService) {\n var vm = this;\n vm.cancel = cancel;\n vm.submit = submit;\n vm.openEditPwd = openEditPwd;\n vm.openPhoneNumber = openPhoneNumber;\n vm.setFontSize = setFontSize;\n vm.enableperTel = enableperTel;\n\n vm.view = {\n isEmployee: false,\n isperTel: true\n };\n\n init();\n\n function init() {\n vm.settings = viewModel;\n loginService.getSsoInfo().then(function (data) {\n vm.data = {\n cName: data.data.cName,\n perTel: data.data.tel\n };\n vm.view.isEmployee = data.data.isEmployee;\n vm.view.perTelcheck = data.data.tel;\n //判斷=1,顯示手機驗證碼按鈕 \n vm.view.moblieIsVerify = data.data.moblieIsVerify;\n\n enableperTel(data.data.tel);\n });\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function submit() {\n loginService.editUserProfile(vm.data);\n $uibModalInstance.dismiss('cancel');\n }\n\n function openEditPwd() {\n modalService.editPwd().result.then(function () {\n $uibModalInstance.dismiss('cancel');\n });\n }\n\n function openPhoneNumber() {\n modalService.phoneNumber();\n }\n\n function setFontSize(item) {\n headerService.setFontSize(item.sizeCode).then(function () {\n _.each(vm.settings.fontSizes, function (x) {\n x.isSelected = false;\n });\n $rootScope.fontSize = item.sizeCode;\n item.isSelected = true;\n });\n }\n\n function enableperTel(tel) {\n if (tel === null) {\n vm.view.isperTel = false;\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunBulletinMoreController', tsunBulletinMoreController);\n\n function tsunBulletinMoreController(viewModel, $location, bulletinService) {\n var vm = this;\n vm.redirect = redirect;\n vm.getNoticeMoreList = getNoticeMoreList;\n\n var bulletinGetByPaggerDto = {\n menuSerilNo: '',\n bulletinTypeSerilNo: '',\n PaggerChoice: 1,\n noticePage: 1\n };\n\n onInit();\n\n function onInit() {\n vm.data = viewModel.data;\n }\n\n function redirect(bulletinSerilNo) {\n $location.path('/tsu/bulletin/noticeDetail/' + bulletinSerilNo).search('menu', getMenuQueryString());\n }\n\n function getNoticeMoreList() {\n bulletinGetByPaggerDto.noticePage++;\n //2為通知中心的意思\n bulletinGetByPaggerDto.dataType = 2;\n setSiteCode(bulletinGetByPaggerDto);\n bulletinService.getTsunMoreList(bulletinGetByPaggerDto).then(function (data) {\n vm.data.notices.bulletins = _.concat(vm.data.notices.bulletins, data.data.notices.bulletins);\n vm.data.hasNoticeMore = data.data.hasNoticeMore;\n });\n }\n\n function setSiteCode(bulletinParam) {\n switch (vm.type) {\n case 'bulletin':\n bulletinParam.siteCode = enumService.siteCode.hrOutside;\n break;\n case 'notice':\n bulletinParam.siteCode = enumService.siteCode.tsunOut;\n break;\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunBulletinNoticeDetailController', tsunBulletinNoticeDetailController);\n\n function tsunBulletinNoticeDetailController(viewModel) {\n var vm = this;\n vm.data = viewModel.data;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunHomeController', tsunHomeController);\n\n function tsunHomeController(viewModel) {\n var vm = this;\n\n init();\n\n function init() {\n vm.data = viewModel.data;\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('trainingInnerService', trainingInnerService);\n\n function trainingInnerService(headerService, sysCode, enumService, $http, apiUrl, isTestMode, testData, $q, $rootScope, ctmsService, commonService, translateService) {\n var enumCourseType = enumService.courseType;\n var service = {\n getCourseLog: getCourseLog,\n getFinancial: getFinancial,\n getBankBook: getBankBook,\n getExterior: getExterior,\n getYears: getYears,\n getEffectives: getEffectives,\n postExterior: postExterior,\n getConfigSetting: getConfigSetting,\n getCourseItems: getCourseItems,\n getSelectActive: getSelectActive,\n getExternaltype: getExternaltype,\n getCurrency: getCurrency,\n getUnfinishedActivities: getUnfinishedActivities,\n getCertificateType: getCertificateType,\n getLicensesNames: getLicensesNames,\n postFinancial: postFinancial,\n getAuthorizedHours: getAuthorizedHours,\n postLearningRecord: postLearningRecord,\n postExamSurveyContent: postExamSurveyContent,\n getExamSurveyContent: getExamSurveyContent,\n getCourseDetail: getCourseDetail,\n getAuthorizedHoursCourse: getAuthorizedHoursCourse,\n postSessionAction: postSessionAction,\n getCourseListAll: getCourseListAll,\n getCourseList: getCourseList,\n getMenu: getMenu,\n getCollectionList: getCollectionList,\n addCollection: addCollection,\n delCollection: delCollection,\n hasEnrollQuestion: hasEnrollQuestion,\n loadLangs: loadLangs,\n getCarousel: getCarousel,\n checkCourseWithMenu: checkCourseWithMenu,\n checkItem: checkItem\n };\n return service;\n\n function getConfigSetting() {\n var newApiURL = apiUrl.tsApi + 'checkConfig';\n newApiURL = commonService.URLCheck(newApiURL);\n\n //2023-07-18 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n }\n\n function getCourseLog(lang) {\n var params = {\n LanguageCode: lang,\n UserId: $rootScope.userInfo.userAccount,\n StartIndex: 1,\n EndIndex: 99999,\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call MyFinishedActivities,params:\", params);\n return ctmsService.MyFinishedActivities(params).then(function (data) {\n if (!data) {\n return null;\n }\n _.forEach(data, function (item) {\n item.LanguageCode = params.LanguageCode;\n });\n return data;\n });\n }\n\n // 取得待修項目資料\n function getUnfinishedActivities(lang) {\n var params = {\n LanguageCode: lang,\n UserId: $rootScope.userInfo.userAccount,\n tkn: sessionStorage.getItem('token')\n };\n //console.log(\"call MyUnfinishedActivities,params:\", params);\n return ctmsService.MyUnfinishedActivities(params).then(function (data) {\n if (!data) {\n return null;\n }\n _.forEach(data, function (item) {\n item.LanguageCode = params.LanguageCode;\n });\n //console.log(\"MyUnfinishedActivities,data:\", data);\n return data;\n });\n }\n\n // 取得課程詳細資訊\n function getCourseDetail(item) {\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n CourseType: item.courseType,\n SessionId: item.sessionId,\n IsProgram: item.courseType === enumCourseType.courage ? 1 : 0,\n tkn: sessionStorage.getItem('token')\n };\n //console.log(\"call CourseSession,params:\", params);\n return ctmsService.CourseSession(params).then(function (data) {\n if (!data) {\n return null;\n }\n data.LanguageCode = params.LanguageCode;\n if (data.courses) {\n _.forEach(data.courses, function (item) {\n item.LanguageCode = params.LanguageCode;\n });\n }\n return data;\n });\n }\n\n //取得課程行為清單\n function getSelectActive(item) {\n //console.log('active item:',item);\n var params = {\n LanguageCode: item.LanguageCode,\n UserId: $rootScope.userInfo.userAccount,\n SessionId: item.sessionId,\n IsProgram: item.courseType === enumCourseType.courage ? 1 : 0,\n tkn: sessionStorage.getItem('token')\n };\n if (isTestMode) {\n //為了要實踐簡單互動\n params.courseType = item.courseType;\n }\n // console.log(\"call EnrollmentAvailableAction,params:\", params);\n return ctmsService.EnrollmentAvailableAction(params).then(function (data) {\n // console.log(\"EnrollmentAvailableAction result:\", data);\n if (!data) {\n return null;\n }\n data.LanguageCode = params.LanguageCode;\n _.forEach(data.lmsItems, function (item) {\n item.LanguageCode = params.LanguageCode;\n });\n console.log('WS14 : EnrollmentAvailableAction result: ', data);\n return data;\n });\n }\n\n // 取得金融證照記錄\n function getFinancial(status) {\n var params = {\n UserId: $rootScope.userInfo.userAccount,\n LanguageCode: sessionStorage.getItem('userLang'),\n Status: status,\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call FCCertificatedLicenseList,params:\", params);\n // console.log(\"result :\",ctmsService.FCCertificatedLicenseList(params));\n return ctmsService.FCCertificatedLicenseList(params);\n }\n\n // 取得證書認列時數\n function getAuthorizedHours() {\n var params = {\n UserId: $rootScope.userInfo.userAccount,\n LanguageCode: sessionStorage.getItem('userLang'),\n LicenseId: '-1',\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call FCAuthorizedHoursList,params:\", params);\n return ctmsService.FCAuthorizedHoursList(params);\n }\n\n function getCourseItems(activityItem) {\n //取得課程教材\n var params = {\n ItemId: activityItem.itemId,\n UserId: $rootScope.userInfo.userAccount,\n LanguageCode: activityItem.LanguageCode,\n tkn: sessionStorage.getItem('token')\n };\n console.log(\"call CourseItem,params:\", params);\n return ctmsService.CourseItem(params).then(function (data) {\n if (!data) {\n return null;\n }\n data.LanguageCode = params.LanguageCode;\n data.AttachmentSerilNo = params.ItemId;\n console.log(\"getCourseItems :\", data);\n return data;\n });\n }\n\n function getBankBook(year, lang) {\n var params = {\n UserId: $rootScope.userInfo.userAccount,\n Annual: year,\n LanguageCode: lang,\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call MyTrainingPoint,params:\", params);\n return ctmsService.MyTrainingPoint(params).then(function (data) {\n if (!data) {\n return null;\n }\n var returnResult = {\n bankBook: data.trainingPoints,\n remainPoint: data.remainPoint,\n LanguageCode: params.LanguageCode\n };\n if (new Date().getFullYear() + '' !== year + '') {\n // 選擇的年份如果不是當前年份,則剩餘點數為0\n returnResult.remainPoint = '0';\n }\n return returnResult;\n });\n }\n\n // 取得主辦單位\n function getExterior() {\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n Type: 5, // 主辦單位\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call SysTypesList,params:\", params);\n return ctmsService.SysTypesList(params);\n }\n\n // 取得證照有效狀態\n function getEffectives() {\n /*--(2016-09-29)\r\n 如今日電話說明因 有效證照 為固定值\r\n 由旭聯提供定義值即可 (無須透過API取得)\r\n 已更新規格請見附件,謝謝!\r\n 若有問題再麻煩與我聯繫喔,謝謝~\r\n Raina\r\n */\n var stateList = [{\n id: -1, // 數值無法為空,所以使用 -1\n name: $rootScope.translate.tsunFinacialCertificationStatusAll\n }, {\n id: 0,\n name: $rootScope.translate.tsunFinacialCertificationStatusInactive\n }, {\n id: 1,\n name: $rootScope.translate.tsunFinacialCertificationStatusActive\n }, {\n id: 2,\n name: $rootScope.translate.tsunFinacialCertificationStatusCancel\n }, {\n id: 3,\n name: $rootScope.translate.tsunFinacialCertificationStatusRemove\n }];\n return $q.when(stateList);\n }\n\n // 取得證照類別\n function getCertificateType() {\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n Type: 2, // 證照類別\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call SysTypesList,params:\", params);\n return ctmsService.SysTypesList(params);\n }\n\n // 依證照類別取得所有證照名稱\n function getLicensesNames(licenseCategoryId) {\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n LicenseCategoryId: licenseCategoryId,\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call FCLicenseList,params:\", params);\n return ctmsService.FCLicenseList(params);\n }\n\n // 取得外訓種類\n function getExternaltype() {\n // var params = {\n // LanguageCode: sessionStorage.getItem('userLang'),\n // Type: 4, // 外訓種類\n // tkn: sessionStorage.getItem('token')\n // };\n // // console.log(\"call SysTypesList,params:\", params);\n // return ctmsService.SysTypesList(params);\n var result = [{\n //請選擇\n id: -1,\n name: $rootScope.translate.commonPleaseSelect,\n allowanceRate: 0,\n sortIndex: 0\n }, {\n //一般外訓\n id: 1,\n name: $rootScope.translate.tsunExternalType1,\n allowanceRate: 0,\n sortIndex: 1\n }, {\n //外語進修補助\n id: 2,\n name: $rootScope.translate.tsunExternalType2,\n allowanceRate: 50,\n sortIndex: 2\n }, {\n //電腦進修補助\n id: 3,\n name: $rootScope.translate.tsunExternalType3,\n allowanceRate: 50,\n sortIndex: 3\n }, {\n //考試補助\n id: 4,\n name: $rootScope.translate.tsunExternalType4,\n allowanceRate: 100,\n sortIndex: 4\n }, {\n //國外外訓\n id: 0,\n name: $rootScope.translate.tsunExternalType0,\n allowanceRate: 0,\n sortIndex: 5\n }];\n return result;\n }\n\n // 取得繳費幣別\n function getCurrency() {\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n Type: 3, // 幣別\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call SysTypesList,params:\", params);\n return ctmsService.SysTypesList(params);\n }\n\n // 取得問卷或測驗題目\n function getExamSurveyContent(sessionId, activityItem) {\n var params = {\n LanguageCode: activityItem.LanguageCode,\n SessionId: sessionId,\n ItemId: activityItem.itemId,\n UserId: $rootScope.userInfo.userAccount,\n tkn: sessionStorage.getItem('token')\n };\n if (isTestMode) {\n //為了要實踐簡單互動\n params.type = activityItem.type;\n }\n // console.log(\"call ExamSurveyContent,params:\", params);\n return ctmsService.ExamSurveyContent(params).then(function (result) {\n // console.log(\"get ExamSurveyContent\");\n result.LanguageCode = params.LanguageCode;\n return result;\n });\n }\n //回傳問卷或測驗填答\n function postExamSurveyContent(sessionId, examContent) {\n var params = {\n LanguageCode: examContent.LanguageCode,\n UserId: $rootScope.userInfo.userAccount,\n SessionId: sessionId,\n ExamHistoryId: examContent.examHistoryId,\n UserResponse: examContent.answers,\n ItemId: examContent.itemId,\n Finish: examContent.finish,\n tkn: sessionStorage.getItem('token')\n };\n if (isTestMode) {\n //為了要實踐簡單互動\n // console.log(\"postExamSurveyContent:\", params);\n params.type = examContent.activeItemtype;\n }\n // console.log(\"call InteractionData,params:\", params);\n return ctmsService.InteractionData(params).then(function (result) {\n // console.log(\"send InteractionData\");\n return result;\n });\n }\n\n // 外訓申請 (POST\n function postExterior(item) {\n //console.log('postExterior item:',item);\n // var dateTimeString = getCourseDatesString(item);\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n UserId: $rootScope.userInfo.userAccount,\n CourseName: item.Name,\n OrganizationId: '',\n Type: item.type.id,\n Outline: item.Outline,\n CourseDate: '',\n CourseTime: '',\n Location: item.Place,\n Course_Cost_Currency_1: item.currency,\n Course_Cost_Amount_1: item.coursePrice,\n Transportation_Cost_Amount_1: item.travelPrice,\n Course_Converting_Amount_1: item.totalPrice,\n CourseRemark: item.Remark || ' ',\n tkn: sessionStorage.getItem('token')\n };\n // 把上課日期串成字串\n // ex \"2016/01/02,2016/01/04\"\n _.forEach(item.dateSettingList, function (perDateStr) {\n _.forEach(perDateStr.innerDataDate, function (dateValue) {\n if (params.CourseDate.length > 0) {\n params.CourseDate += ',';\n }\n params.CourseDate += dateValue;\n });\n _.forEach(perDateStr.innerDataTime, function (timeValue) {\n if (params.CourseTime.length > 0) {\n params.CourseTime += ',';\n }\n params.CourseTime += timeValue;\n });\n });\n\n // 把主辦單位的 id 串起來 \n // ex \"3,4,7,8\"\n _.forEach(item.organizer, function (perOrg) {\n params.OrganizationId += perOrg.id + ',';\n });\n if (params.OrganizationId.length > 0) {\n // 去掉最後一個逗號\n params.OrganizationId = params.OrganizationId.substring(0, params.OrganizationId.length - 1);\n }\n //console.log(\"call ExternalTrainingApplication,params:\", params);\n return ctmsService.ExternalTrainingApplication(params).then(function (result) {\n if (!result) {\n return null;\n }\n toastr.success($rootScope.translate.tsunSuccessExternalApplication);\n return result;\n });\n }\n\n // 證照申請 (POST\n function postFinancial(item) {\n var params = {\n LanguageCode: sessionStorage.getItem('userLang'),\n UserId: $rootScope.userInfo.userAccount,\n LicenseId: item.licenses.id,\n AcquireDate: item.getDay,\n LicenseCode: item.licensesNO || ' ',\n Comment: item.otherMark || ' ',\n tkn: sessionStorage.getItem('token')\n };\n console.log(\"call FCCertificatedLicenseAdd,params:\", params);\n return ctmsService.FCCertificatedLicenseAdd(params);\n }\n\n // 學習記錄回傳 (POST\n function postLearningRecord(item, isAlert) {\n //console.log('WS 21 Learning Record item :', item);\n if (!item) {\n return;\n }\n var params = {\n ItemId: item.ItemId,\n SessionId: item.SessionId,\n Duration: item.Duration,\n UserId: $rootScope.userInfo.userAccount,\n LanguageCode: item.LanguageCode,\n tkn: sessionStorage.getItem('token')\n };\n //console.log('item is not null');\n //測試關閉瀏覽器有無傳送資料\n // var str = 'return OK';\n // headerService.saveLearnLog(str);\n\n commonService.setCtmsParams(params);\n //console.log(\"call LearningRecordCommit,params:\", params);\n return ctmsService.LearningRecordCommit(params).then(function (data) {\n // console.log(\"send LearningRecordCommit\");\n if (!data) {\n return null;\n }\n if (isAlert) {\n toastr.success($rootScope.translate.tsunSendSuccess);\n }\n return true;\n }).catch(function (reason) {\n // chris: log for mobile\n //console.log('ctms-learning-record-error:',reason);\n postException('ctms-learning-record-error: ' + JSON.stringify(reason), apiUrl);\n throw reason;\n });\n }\n\n function getYears(minYear) {\n var thisYear = new Date().getFullYear();\n minYear = minYear || thisYear - 10;\n // console.log(\"getYears , minYear:\", minYear);\n var years = [];\n for (var i = thisYear; i > thisYear - 10; i--) {\n if (i >= minYear) {\n years.push(i);\n }\n }\n return years;\n }\n\n function getAuthorizedHoursCourse(item, lang) {\n var params = {\n LanguageCode: lang,\n UserId: $rootScope.userInfo.userAccount,\n LicenseId: item.licenseId,\n tkn: sessionStorage.getItem('token')\n };\n // console.log(\"call FCEnrollableActivities,params:\", params);\n return ctmsService.FCEnrollableActivities(params).then(function (data) {\n if (!data) {\n return null;\n }\n _.forEach(data, function (item) {\n item.LanguageCode = params.LanguageCode;\n });\n return data;\n });\n }\n\n function postSessionAction(sessionItem, Action) {\n var params = {\n tkn: sessionStorage.getItem('token'),\n LanguageCode: sessionItem.LanguageCode,\n UserId: $rootScope.userInfo.userAccount,\n SessionId: sessionItem.sessionId,\n IsProgram: sessionItem.courseType === enumCourseType.courage ? 1 : 0,\n ActionType: Action\n };\n // console.log(\"call EnrollmentAction,params:\", params);\n return ctmsService.EnrollmentAction(params).then(function (result) {\n if (!result) {\n return null;\n }\n toastr.success($rootScope.translate.tsunSendSuccess);\n return result;\n });\n }\n\n function getMenu(langCode) {\n langCode = langCode || sessionStorage.getItem('langCode');\n //console.log(\"send tsapi.CourseList langCode:\", langCode);\n var newApiURL = apiUrl.tsApi + 'ctms/CourseCategory?langSerilNo=' + langCode;\n newApiURL = commonService.URLCheck(newApiURL);\n\n //2023-07-18 Johnson 資安2023\n return eval(function (p, a, c, k, e, r) {\n e = String;if (!''.replace(/^/, String)) {\n while (c--) {\n r[c] = k[c] || c;\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}));\n\n //2023-07-17 Johnson 資安2023\n //var csrfToken = sessionStorage.getItem('token');\n //return $http.get(newApiURL, csrfToken).then(function (result) {\n // return result.data;\n //});\n }\n\n // 取得課程列表\n function getCourseList(classificationId, langCode) {\n //console.log(\"classificationId:\", classificationId);\n var params = {\n UserId: $rootScope.userInfo.userAccount,\n LanguageCode: langCode,\n ClassificationId: parseInt(classificationId) || -1,\n CourseType: -1,\n tkn: sessionStorage.getItem('token')\n };\n //三個= 不會有作用,請保留2個就好\n if (classificationId == 0) {\n params.ClassificationId = 0;\n }\n //console.log(\" params.ClassificationId:\", params.ClassificationId);\n\n //console.log(\"call PublishedActivity,params:\", params);\n return ctmsService.PublishedActivity(params).then(function (data) {\n _.forEach(data, function (item) {\n item.LanguageCode = params.LanguageCode;\n });\n return data;\n });\n }\n\n function getCourseListAll(catagoryId) {\n //取得不分語系的課程清單\n return loadLangs().then(function (langs) {\n //console.log('langs:',langs);\n var coursePromist = [];\n _.forEach(langs, function (lang) {\n // console.log('lang:', lang.langCode)\n // console.log( getCourseList(catagoryId, lang.langCode))\n coursePromist.push(getCourseList(catagoryId, lang.langCode));\n });\n return $q.all(coursePromist).then(function (data) {\n var resultCourseList = []; //全部課程清單\n if (data) {\n _.forEach(data, function (courseList) {\n //console.log('courseList:', courseList)\n courseList = _.orderBy(courseList, ['courseTime'], ['desc']);\n Array.prototype.push.apply(resultCourseList, courseList);\n });\n resultCourseList = _.uniqBy(resultCourseList, function (courseItem) {\n return courseItem.sessionId;\n });\n }\n return resultCourseList;\n });\n }).then(function (resultCourseList) {\n //final\n //console.log('resultCourseList:', resultCourseList);\n return resultCourseList;\n });\n }\n\n function checkCourseWithMenu(courseList /*, catagoryList*/) {\n var resultCourseList = courseList;\n\n //filter將排序打亂了,先將filter拿掉\n // console.log(\"courseList:\", courseList);\n // console.log(\"catagoryList:\", catagoryList);\n\n // _.forEach(catagoryList, function(catagoryItem) {\n\n // var courseIsValid = _.filter(courseList, function(courseItem) {\n // var checkResult;\n // //console.log(\"catagoryItem:\", catagoryItem);\n // //console.log(\"courseItem:\", courseItem);\n // checkResult = parseInt(courseItem.classificationId) === parseInt(catagoryItem.categoryId);\n // return checkResult;\n // });\n\n // //console.log(\"courseIsValid:\", courseIsValid);\n // Array.prototype.push.apply(resultCourseList, courseIsValid);\n // });\n\n //console.log(\"resultCourseList:\", resultCourseList);\n resultCourseList = _.uniqBy(resultCourseList, function (courseItem) {\n return courseItem.sessionId;\n });\n return $q.when(resultCourseList);\n }\n\n function getCollectionList(langCode) {\n var params = {\n sysCode: sysCode,\n tkn: sessionStorage.getItem('token'),\n sysLang: langCode || null\n };\n return $http.post(apiUrl.tsApi + 'Collection/GetList', params).then(function (data) {\n //console.log('user course data:',data.data.collectionList);\n if (!data) {\n return null;\n }\n return data.data.collectionList;\n });\n }\n\n function addCollection(sessionItem) {\n var params = {\n sysCode: sysCode,\n tkn: sessionStorage.getItem('token'),\n collectionSessionId: sessionItem.sessionId,\n langSerilNo: sessionStorage.getItem('langCode'),\n sysLang: sessionStorage.getItem('langCode')\n };\n return $http.post(apiUrl.tsApi + 'Collection/Save', params).then(function (result) {\n toastr.success(result.data);\n });\n }\n\n function delCollection(sessionItem, isAlert) {\n var params = {\n sysCode: sysCode,\n tkn: sessionStorage.getItem('token'),\n collectionSessionId: sessionItem.sessionId,\n sysLang: sessionStorage.getItem('langCode')\n };\n return $http.post(apiUrl.tsApi + 'Collection/Del', params).then(function (result) {\n if (isAlert) {\n toastr.success(result.data);\n }\n });\n }\n\n function hasEnrollQuestion(item) {\n return getSelectActive(item).then(function (data) {\n if (!data) {\n return null;\n }\n return data.preSurveyItemId > 0;\n });\n }\n\n function loadLangs() {\n return translateService.getLanguage().then(function (data) {\n if (!data) {\n return null;\n }\n return _.orderBy(data.data, ['selected', 'langSerilNo'], ['desc', 'asc']);\n });\n }\n\n function getCarousel(activeType) {\n var param = {};\n var postUrl = '';\n commonService.setParams(param);\n switch (activeType) {\n case 3:\n postUrl = apiUrl.tsApi + 'ActiveHotRecommend/PostSmallCourse';\n break;\n default:\n postUrl = apiUrl.tsApi + 'ActiveHotRecommend/postHotRecommend';\n break;\n }\n return $http.post(postUrl, param).then(function (data) {\n if (!data) {\n return null;\n }\n return data.data;\n });\n }\n\n function checkItem(item) {\n var params = {\n attachmentSerilNo: item.AttachmentSerilNo,\n fileUrl: item.fileUrl,\n tkn: sessionStorage.getItem('token')\n };\n\n return $http.post(apiUrl.tsApi + 'ctms/ItemCheck', params);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('visualpageController', visualpageController);\n\n function visualpageController(viewModel, menuService, commonService, apiUrl, sysCode, bulletinService, headerService) {\n var vm = this;\n vm.showSelected = showSelected;\n vm.download = download;\n vm.menuAlterClick = menuAlterClick;\n init();\n\n function init() {\n vm.data = viewModel.data;\n vm.view = viewInit();\n vm.localValue = localValueInit();\n treeInit();\n menuAlterInit();\n $(document).trigger('visualPageInited', {});\n }\n\n function viewInit() {\n var result = {};\n\n return result;\n }\n\n function localValueInit() {\n var result = {\n menuAlterNodes: [],\n selectedMenuText: '',\n selectedMenuIndex: 0\n };\n return result;\n }\n\n function showSelected(node) {\n if (node.url) {\n menuService.redirectUrl(node);\n }\n }\n\n function treeInit() {\n vm.treeOptions = {\n nodeChildren: \"children\",\n dirSelectable: false\n };\n }\n\n function menuAlterInit() {\n vm.localValue.menuAlterNodes = [];\n _.forEach(vm.data.treeView, function (treeNode) {\n treeNodeView(treeNode, '');\n });\n\n //以visualPage的ID來判斷選擇到的MenuLangName\n var menuNo = getMenuQueryString();\n //console.log(\"menuNo:\", menuNo);\n var menuSelectedIndex = 0;\n for (var i = 0; i <= vm.localValue.menuAlterNodes.length - 1; i++) {\n if (vm.localValue.menuAlterNodes[i].menuSerilNo === menuNo) {\n menuSelectedIndex = i;\n }\n }\n menuAlterClick(menuSelectedIndex, true);\n return;\n //======\n function treeNodeView(treeNode, preSymbol) {\n var _preSymbol = ' ' + (preSymbol || '');\n treeNode.isEmptyUrl = false;\n treeNode.url = treeNode.url || '';\n if (treeNode.url.length < 1) {\n treeNode.isEmptyUrl = true;\n }\n treeNode.menuAlterText = _preSymbol + treeNode.menuLangName;\n //======\n vm.localValue.menuAlterNodes.push(treeNode);\n if (!treeNode.children) {\n treeNode.children = [];\n }\n _.forEach(treeNode.children, function (treeNodeChild) {\n treeNodeView(treeNodeChild, _preSymbol);\n });\n }\n }\n\n function menuAlterClick(index, isInit) {\n var targetNode = vm.localValue.menuAlterNodes[index];\n //====\n var isError = !targetNode;\n //====\n if (isError) {\n vm.localValue.selectedMenuText = \"\";\n vm.localValue.selectedMenuIndex = 0;\n } else if (targetNode.isEmptyUrl) {\n return;\n } else {\n vm.localValue.selectedMenuText = targetNode.menuLangName;\n vm.localValue.selectedMenuIndex = index;\n }\n if (!isInit) {\n menuService.redirectUrl(targetNode);\n }\n return;\n }\n\n function download(url, fileName) {\n console.log('url:', url);\n console.log('fileName:', fileName);\n if (url && fileName) {\n var params = {\n menuSerilNo: getMenuQueryString(),\n MenuClickAttachmentId: url\n };\n commonService.setParams(params);\n headerService.saveMenuClickingAttachment(params);\n //先確認是否是把浮水印拿掉就不能下載(在PC上)\n // if (commonService.getFileType(url) !== 'pdf') {\n\n // } else {\n // var param = {\n // wholeUrl: url,\n // fileName: fileName,\n // };\n // bulletinService.donwloadStampForUrl(param);\n // }\n\n //因應ios無法打開可視化中的PDF,ios另行處理\n window.open(url, '_self');\n // if (DEVICE_TYPE !== null && DEVICE_TYPE.toLowerCase() === 'ios') {\n // window.open(url,'_self');\n // } else {\n // window.open(url);\n // }\n }\n }\n }\n})();\n'use strict';\n\nangular.module('ui.bootstrap.debounce', [])\n/**\r\n * A helper, internal service that debounces a function\r\n */\n.factory('$$debounce', ['$timeout', function ($timeout) {\n return function (callback, debounceTime) {\n var timeoutPromise;\n\n return function () {\n var self = this;\n var args = Array.prototype.slice.call(arguments);\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n\n timeoutPromise = $timeout(function () {\n callback.apply(self, args);\n }, debounceTime);\n };\n };\n}]);\n'use strict';\n\nangular.module('ui.bootstrap.carousel', []).controller('UibCarouselController', ['$scope', '$element', '$interval', '$timeout', '$animate', function ($scope, $element, $interval, $timeout, $animate) {\n var self = this,\n slides = self.slides = $scope.slides = [],\n SLIDE_DIRECTION = 'uib-slideDirection',\n currentIndex = -1,\n currentInterval,\n isPlaying,\n bufferedTransitions = [];\n self.currentSlide = null;\n var destroyed = false;\n self.addSlide = function (slide, element) {\n slide.$element = element;\n slides.push(slide);\n //if this is the first slide or the slide is set to active, select it\n if (slides.length === 1 || slide.active) {\n if ($scope.$currentTransition) {\n $scope.$currentTransition = null;\n }\n\n self.select(slides[slides.length - 1]);\n if (slides.length === 1) {\n $scope.play();\n }\n } else {\n slide.active = false;\n }\n };\n\n self.getCurrentIndex = function () {\n if (self.currentSlide && angular.isDefined(self.currentSlide.index)) {\n return +self.currentSlide.index;\n }\n return currentIndex;\n };\n\n self.next = $scope.next = function () {\n var newIndex = (self.getCurrentIndex() + 1) % slides.length;\n\n if (newIndex === 0 && $scope.noWrap()) {\n $scope.pause();\n return;\n }\n\n return self.select(getSlideByIndex(newIndex), 'next');\n };\n\n self.prev = $scope.prev = function () {\n var newIndex = self.getCurrentIndex() - 1 < 0 ? slides.length - 1 : self.getCurrentIndex() - 1;\n\n if ($scope.noWrap() && newIndex === slides.length - 1) {\n $scope.pause();\n return;\n }\n\n return self.select(getSlideByIndex(newIndex), 'prev');\n };\n\n self.removeSlide = function (slide) {\n if (angular.isDefined(slide.index)) {\n slides.sort(function (a, b) {\n return +a.index > +b.index;\n });\n }\n\n var bufferedIndex = bufferedTransitions.indexOf(slide);\n if (bufferedIndex !== -1) {\n bufferedTransitions.splice(bufferedIndex, 1);\n }\n //get the index of the slide inside the carousel\n var index = slides.indexOf(slide);\n slides.splice(index, 1);\n $timeout(function () {\n if (slides.length > 0 && slide.active) {\n if (index >= slides.length) {\n self.select(slides[index - 1]);\n } else {\n self.select(slides[index]);\n }\n } else if (currentIndex > index) {\n currentIndex--;\n }\n });\n\n //clean the currentSlide when no more slide\n if (slides.length === 0) {\n self.currentSlide = null;\n clearBufferedTransitions();\n }\n };\n\n /* direction: \"prev\" or \"next\" */\n self.select = $scope.select = function (nextSlide, direction) {\n var nextIndex = $scope.indexOfSlide(nextSlide);\n //Decide direction if it's not given\n if (direction === undefined) {\n direction = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n }\n //Prevent this user-triggered transition from occurring if there is already one in progress\n if (nextSlide && nextSlide !== self.currentSlide && !$scope.$currentTransition) {\n goNext(nextSlide, nextIndex, direction);\n } else if (nextSlide && nextSlide !== self.currentSlide && $scope.$currentTransition) {\n bufferedTransitions.push(nextSlide);\n nextSlide.active = false;\n }\n };\n\n /* Allow outside people to call indexOf on slides array */\n $scope.indexOfSlide = function (slide) {\n return angular.isDefined(slide.index) ? +slide.index : slides.indexOf(slide);\n };\n\n $scope.isActive = function (slide) {\n return self.currentSlide === slide;\n };\n\n $scope.pause = function () {\n if (!$scope.noPause) {\n isPlaying = false;\n resetTimer();\n }\n };\n\n $scope.play = function () {\n if (!isPlaying) {\n isPlaying = true;\n restartTimer();\n }\n };\n\n $scope.$on('$destroy', function () {\n destroyed = true;\n resetTimer();\n });\n\n $scope.$watch('noTransition', function (noTransition) {\n $animate.enabled($element, !noTransition);\n });\n\n $scope.$watch('interval', restartTimer);\n\n $scope.$watchCollection('slides', resetTransition);\n\n function clearBufferedTransitions() {\n while (bufferedTransitions.length) {\n bufferedTransitions.shift();\n }\n }\n\n function getSlideByIndex(index) {\n if (angular.isUndefined(slides[index].index)) {\n return slides[index];\n }\n for (var i = 0, l = slides.length; i < l; ++i) {\n if (slides[i].index === index) {\n return slides[i];\n }\n }\n }\n\n function goNext(slide, index, direction) {\n if (destroyed) {\n return;\n }\n\n angular.extend(slide, { direction: direction, active: true });\n angular.extend(self.currentSlide || {}, { direction: direction, active: false });\n if ($animate.enabled($element) && !$scope.$currentTransition && slide.$element && self.slides.length > 1) {\n slide.$element.data(SLIDE_DIRECTION, slide.direction);\n if (self.currentSlide && self.currentSlide.$element) {\n self.currentSlide.$element.data(SLIDE_DIRECTION, slide.direction);\n }\n\n $scope.$currentTransition = true;\n $animate.on('addClass', slide.$element, function (element, phase) {\n if (phase === 'close') {\n $scope.$currentTransition = null;\n $animate.off('addClass', element);\n if (bufferedTransitions.length) {\n var nextSlide = bufferedTransitions.pop();\n var nextIndex = $scope.indexOfSlide(nextSlide);\n var nextDirection = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n clearBufferedTransitions();\n\n goNext(nextSlide, nextIndex, nextDirection);\n }\n }\n });\n }\n\n self.currentSlide = slide;\n currentIndex = index;\n\n //every time you change slides, reset the timer\n restartTimer();\n }\n\n function resetTimer() {\n if (currentInterval) {\n $interval.cancel(currentInterval);\n currentInterval = null;\n }\n }\n\n function resetTransition(slides) {\n if (!slides.length) {\n $scope.$currentTransition = null;\n clearBufferedTransitions();\n }\n }\n\n function restartTimer() {\n resetTimer();\n var interval = +$scope.interval;\n if (!isNaN(interval) && interval > 0) {\n currentInterval = $interval(timerFn, interval);\n }\n }\n\n function timerFn() {\n var interval = +$scope.interval;\n if (isPlaying && !isNaN(interval) && interval > 0 && slides.length) {\n $scope.next();\n } else {\n $scope.pause();\n }\n }\n}]).directive('uibCarousel', function () {\n return {\n transclude: true,\n replace: true,\n controller: 'UibCarouselController',\n controllerAs: 'carousel',\n templateUrl: function templateUrl(element, attrs) {\n return attrs.templateUrl || 'directive/ui-bootstrap/carousel/carousel.html';\n },\n scope: {\n interval: '=',\n noTransition: '=',\n noPause: '=',\n noWrap: '&',\n showBar: '=',\n showArrow: '='\n }\n };\n}).directive('uibSlide', function () {\n return {\n require: '^uibCarousel',\n transclude: true,\n replace: true,\n templateUrl: function templateUrl(element, attrs) {\n return attrs.templateUrl || 'directive/ui-bootstrap/carousel/slide.html';\n },\n scope: {\n active: '=?',\n actual: '=?',\n index: '=?'\n },\n link: function link(scope, element, attrs, carouselCtrl) {\n carouselCtrl.addSlide(scope, element);\n //when the scope is destroyed then remove the slide from the current slides array\n scope.$on('$destroy', function () {\n carouselCtrl.removeSlide(scope);\n });\n\n scope.$watch('active', function (active) {\n if (active) {\n carouselCtrl.select(scope);\n }\n });\n }\n };\n}).animation('.item', ['$animateCss', function ($animateCss) {\n var SLIDE_DIRECTION = 'uib-slideDirection';\n\n function removeClass(element, className, callback) {\n element.removeClass(className);\n if (callback) {\n callback();\n }\n }\n\n return {\n beforeAddClass: function beforeAddClass(element, className, done) {\n if (className === 'active') {\n var stopped = false;\n var direction = element.data(SLIDE_DIRECTION);\n var directionClass = direction === 'next' ? 'left' : 'right';\n var removeClassFn = removeClass.bind(this, element, directionClass + ' ' + direction, done);\n element.addClass(direction);\n\n $animateCss(element, { addClass: directionClass }).start().done(removeClassFn);\n\n return function () {\n stopped = true;\n };\n }\n done();\n },\n beforeRemoveClass: function beforeRemoveClass(element, className, done) {\n if (className === 'active') {\n var stopped = false;\n var direction = element.data(SLIDE_DIRECTION);\n var directionClass = direction === 'next' ? 'left' : 'right';\n var removeClassFn = removeClass.bind(this, element, directionClass, done);\n\n $animateCss(element, { addClass: directionClass }).start().done(removeClassFn);\n\n return function () {\n stopped = true;\n };\n }\n done();\n }\n };\n}]);\n'use strict';\n\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.position'])\n\n/**\r\n * A helper, internal data structure that stores all references attached to key\r\n */\n.factory('$$multiMap', function () {\n return {\n createNew: function createNew() {\n var map = {};\n\n return {\n entries: function entries() {\n return Object.keys(map).map(function (key) {\n return {\n key: key,\n value: map[key]\n };\n });\n },\n get: function get(key) {\n return map[key];\n },\n hasKey: function hasKey(key) {\n return !!map[key];\n },\n keys: function keys() {\n return Object.keys(map);\n },\n put: function put(key, value) {\n if (!map[key]) {\n map[key] = [];\n }\n\n map[key].push(value);\n },\n remove: function remove(key, value) {\n var values = map[key];\n\n if (!values) {\n return;\n }\n\n var idx = values.indexOf(value);\n\n if (idx !== -1) {\n values.splice(idx, 1);\n }\n\n if (!values.length) {\n delete map[key];\n }\n }\n };\n }\n };\n})\n\n/**\r\n * Pluggable resolve mechanism for the modal resolve resolution\r\n * Supports UI Router's $resolve service\r\n */\n.provider('$uibResolve', function () {\n var resolve = this;\n this.resolver = null;\n\n this.setResolver = function (resolver) {\n this.resolver = resolver;\n };\n\n this.$get = ['$injector', '$q', function ($injector, $q) {\n var resolver = resolve.resolver ? $injector.get(resolve.resolver) : null;\n return {\n resolve: function resolve(invocables, locals, parent, self) {\n if (resolver) {\n return resolver.resolve(invocables, locals, parent, self);\n }\n\n var promises = [];\n\n angular.forEach(invocables, function (value) {\n if (angular.isFunction(value) || angular.isArray(value)) {\n promises.push($q.resolve($injector.invoke(value)));\n } else if (angular.isString(value)) {\n promises.push($q.resolve($injector.get(value)));\n } else {\n promises.push($q.resolve(value));\n }\n });\n\n return $q.all(promises).then(function (resolves) {\n var resolveObj = {};\n var resolveIter = 0;\n angular.forEach(invocables, function (value, key) {\n resolveObj[key] = resolves[resolveIter++];\n });\n\n return resolveObj;\n });\n }\n };\n }];\n})\n\n/**\r\n * A helper directive for the $modal service. It creates a backdrop element.\r\n */\n.directive('uibModalBackdrop', ['$animate', '$injector', '$uibModalStack', function ($animate, $injector, $modalStack) {\n return {\n replace: true,\n templateUrl: 'directive/ui-bootstrap/modal/backdrop.html',\n compile: function compile(tElement, tAttrs) {\n tElement.addClass(tAttrs.backdropClass);\n return linkFn;\n }\n };\n\n function linkFn(scope, element, attrs) {\n if (attrs.modalInClass) {\n $animate.addClass(element, attrs.modalInClass);\n\n scope.$on($modalStack.NOW_CLOSING_EVENT, function (e, setIsAsync) {\n var done = setIsAsync();\n if (scope.modalOptions.animation) {\n $animate.removeClass(element, attrs.modalInClass).then(done);\n } else {\n done();\n }\n });\n }\n }\n}]).directive('uibModalWindow', ['$uibModalStack', '$q', '$animateCss', '$document', function ($modalStack, $q, $animateCss, $document) {\n return {\n scope: {\n index: '@'\n },\n replace: true,\n transclude: true,\n templateUrl: function templateUrl(tElement, tAttrs) {\n return tAttrs.templateUrl || 'directive/ui-bootstrap/modal/window.html';\n },\n link: function link(scope, element, attrs) {\n element.addClass(attrs.windowClass || '');\n element.addClass(attrs.windowTopClass || '');\n scope.size = attrs.size;\n scope.taiClass = [];\n if (attrs.taiClass) {\n angular.forEach(attrs.taiClass.split(','), function (item) {\n scope.taiClass.push(item);\n });\n }\n\n scope.close = function (evt) {\n\n var modal = $modalStack.getTop();\n\n // 如果是手機且關閉最後一個 Modal 時候執行\n if (!modal && DEVICE_TYPE) {\n var param = {};\n var method = \"closepopup\";\n appCallback(method, param);\n }\n\n if (modal && modal.value.backdrop && modal.value.backdrop !== 'static' && evt.target === evt.currentTarget) {\n evt.preventDefault();\n evt.stopPropagation();\n $modalStack.dismiss(modal.key, 'backdrop click');\n }\n };\n\n // moved from template to fix issue #2280\n element.on('click', scope.close);\n\n // This property is only added to the scope for the purpose of detecting when this directive is rendered.\n // We can detect that by using this property in the template associated with this directive and then use\n // {@link Attribute#$observe} on it. For more details please see {@link TableColumnResize}.\n scope.$isRendered = true;\n\n // Deferred object that will be resolved when this modal is render.\n var modalRenderDeferObj = $q.defer();\n // Observe function will be called on next digest cycle after compilation, ensuring that the DOM is ready.\n // In order to use this way of finding whether DOM is ready, we need to observe a scope property used in modal's template.\n attrs.$observe('modalRender', function (value) {\n if (value === 'true') {\n\n // 如果是手機且彈跳 Modal 時候執行\n if (DEVICE_TYPE) {\n var param = {};\n var method = \"popup\";\n appCallback(method, param);\n }\n\n modalRenderDeferObj.resolve();\n }\n });\n\n modalRenderDeferObj.promise.then(function () {\n var animationPromise = null;\n\n if (attrs.modalInClass) {\n animationPromise = $animateCss(element, {\n addClass: attrs.modalInClass\n }).start();\n\n scope.$on($modalStack.NOW_CLOSING_EVENT, function (e, setIsAsync) {\n var done = setIsAsync();\n $animateCss(element, {\n removeClass: attrs.modalInClass\n }).start().then(done);\n });\n }\n\n $q.when(animationPromise).then(function () {\n // Notify {@link $modalStack} that modal is rendered.\n var modal = $modalStack.getTop();\n if (modal) {\n $modalStack.modalRendered(modal.key);\n }\n\n /**\r\n * If something within the freshly-opened modal already has focus (perhaps via a\r\n * directive that causes focus). then no need to try and focus anything.\r\n */\n if (!($document[0].activeElement && element[0].contains($document[0].activeElement))) {\n var inputWithAutofocus = element[0].querySelector('[autofocus]');\n /**\r\n * Auto-focusing of a freshly-opened modal element causes any child elements\r\n * with the autofocus attribute to lose focus. This is an issue on touch\r\n * based devices which will show and then hide the onscreen keyboard.\r\n * Attempts to refocus the autofocus element via JavaScript will not reopen\r\n * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus\r\n * the modal element if the modal does not contain an autofocus element.\r\n */\n if (inputWithAutofocus) {\n inputWithAutofocus.focus();\n } else {\n element[0].focus();\n }\n }\n });\n });\n }\n };\n}]).directive('uibModalAnimationClass', function () {\n return {\n compile: function compile(tElement, tAttrs) {\n if (tAttrs.modalAnimation) {\n tElement.addClass(tAttrs.uibModalAnimationClass);\n }\n }\n };\n}).directive('uibModalTransclude', function () {\n return {\n link: function link(scope, element, attrs, controller, transclude) {\n transclude(scope.$parent, function (clone) {\n element.empty();\n element.append(clone);\n });\n }\n };\n}).factory('$uibModalStack', ['$animate', '$animateCss', '$document', '$compile', '$rootScope', '$q', '$$multiMap', '$$stackedMap', '$uibPosition', function ($animate, $animateCss, $document, $compile, $rootScope, $q, $$multiMap, $$stackedMap, $uibPosition) {\n var OPENED_MODAL_CLASS = 'modal-open';\n var backdropDomEl, backdropScope;\n var openedWindows = $$stackedMap.createNew();\n var openedClasses = $$multiMap.createNew();\n var $modalStack = {\n NOW_CLOSING_EVENT: 'modal.stack.now-closing'\n };\n var topModalIndex = 0;\n var previousTopOpenedModal = null;\n\n //Modal focus behavior\n var tabableSelector = 'a[href], area[href], input:not([disabled]), ' + 'button:not([disabled]),select:not([disabled]), textarea:not([disabled]), ' + 'iframe, object, embed, *[tabindex], *[contenteditable=true]';\n var scrollbarPadding;\n\n function isVisible(element) {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n }\n\n function backdropIndex() {\n var topBackdropIndex = -1;\n var opened = openedWindows.keys();\n for (var i = 0; i < opened.length; i++) {\n if (openedWindows.get(opened[i]).value.backdrop) {\n topBackdropIndex = i;\n }\n }\n\n // If any backdrop exist, ensure that it's index is always\n // right below the top modal\n if (topBackdropIndex > -1 && topBackdropIndex < topModalIndex) {\n topBackdropIndex = topModalIndex;\n }\n return topBackdropIndex;\n }\n\n $rootScope.$watch(backdropIndex, function (newBackdropIndex) {\n if (backdropScope) {\n backdropScope.index = newBackdropIndex;\n }\n });\n\n function removeModalWindow(modalInstance, elementToReceiveFocus) {\n var modalWindow = openedWindows.get(modalInstance).value;\n var appendToElement = modalWindow.appendTo;\n\n //clean up the stack\n openedWindows.remove(modalInstance);\n previousTopOpenedModal = openedWindows.top();\n if (previousTopOpenedModal) {\n topModalIndex = parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10);\n }\n\n removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function () {\n var modalBodyClass = modalWindow.openedClass || OPENED_MODAL_CLASS;\n openedClasses.remove(modalBodyClass, modalInstance);\n appendToElement.toggleClass(modalBodyClass, openedClasses.hasKey(modalBodyClass));\n if (scrollbarPadding && scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n if (scrollbarPadding.originalRight) {\n appendToElement.css({ paddingRight: scrollbarPadding.originalRight + 'px' });\n } else {\n appendToElement.css({ paddingRight: '' });\n }\n scrollbarPadding = null;\n }\n toggleTopWindowClass(true);\n }, modalWindow.closedDeferred);\n checkRemoveBackdrop();\n\n //move focus to specified element if available, or else to body\n if (elementToReceiveFocus && elementToReceiveFocus.focus) {\n elementToReceiveFocus.focus();\n } else if (appendToElement.focus) {\n appendToElement.focus();\n }\n }\n\n // Add or remove \"windowTopClass\" from the top window in the stack\n function toggleTopWindowClass(toggleSwitch) {\n var modalWindow;\n\n if (openedWindows.length() > 0) {\n modalWindow = openedWindows.top().value;\n modalWindow.modalDomEl.toggleClass(modalWindow.windowTopClass || '', toggleSwitch);\n }\n }\n\n function checkRemoveBackdrop() {\n //remove backdrop if no longer needed\n if (backdropDomEl && backdropIndex() === -1) {\n var backdropScopeRef = backdropScope;\n removeAfterAnimate(backdropDomEl, backdropScope, function () {\n backdropScopeRef = null;\n });\n backdropDomEl = undefined;\n backdropScope = undefined;\n }\n }\n\n function removeAfterAnimate(domEl, scope, done, closedDeferred) {\n var asyncDeferred;\n var asyncPromise = null;\n var setIsAsync = function setIsAsync() {\n if (!asyncDeferred) {\n asyncDeferred = $q.defer();\n asyncPromise = asyncDeferred.promise;\n }\n\n return function asyncDone() {\n asyncDeferred.resolve();\n };\n };\n scope.$broadcast($modalStack.NOW_CLOSING_EVENT, setIsAsync);\n\n // Note that it's intentional that asyncPromise might be null.\n // That's when setIsAsync has not been called during the\n // NOW_CLOSING_EVENT broadcast.\n return $q.when(asyncPromise).then(afterAnimating);\n\n function afterAnimating() {\n if (afterAnimating.done) {\n return;\n }\n afterAnimating.done = true;\n\n $animate.leave(domEl).then(function () {\n domEl.remove();\n if (closedDeferred) {\n closedDeferred.resolve();\n }\n });\n\n scope.$destroy();\n if (done) {\n done();\n }\n }\n }\n\n $document.on('keydown', keydownListener);\n\n $rootScope.$on('$destroy', function () {\n $document.off('keydown', keydownListener);\n });\n\n function keydownListener(evt) {\n if (evt.isDefaultPrevented()) {\n return evt;\n }\n\n var modal = openedWindows.top();\n if (modal) {\n switch (evt.which) {\n case 27:\n {\n if (modal.value.keyboard) {\n evt.preventDefault();\n $rootScope.$apply(function () {\n $modalStack.dismiss(modal.key, 'escape key press');\n });\n }\n break;\n }\n case 9:\n {\n var list = $modalStack.loadFocusElementList(modal);\n var focusChanged = false;\n if (evt.shiftKey) {\n if ($modalStack.isFocusInFirstItem(evt, list) || $modalStack.isModalFocused(evt, modal)) {\n focusChanged = $modalStack.focusLastFocusableElement(list);\n }\n } else {\n if ($modalStack.isFocusInLastItem(evt, list)) {\n focusChanged = $modalStack.focusFirstFocusableElement(list);\n }\n }\n\n if (focusChanged) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n break;\n }\n }\n }\n }\n\n $modalStack.open = function (modalInstance, modal) {\n var modalOpener = $document[0].activeElement,\n modalBodyClass = modal.openedClass || OPENED_MODAL_CLASS;\n\n toggleTopWindowClass(false);\n\n // Store the current top first, to determine what index we ought to use\n // for the current top modal\n previousTopOpenedModal = openedWindows.top();\n openedWindows.add(modalInstance, {\n deferred: modal.deferred,\n renderDeferred: modal.renderDeferred,\n closedDeferred: modal.closedDeferred,\n modalScope: modal.scope,\n backdrop: modal.backdrop,\n keyboard: modal.keyboard,\n openedClass: modal.openedClass,\n windowTopClass: modal.windowTopClass,\n animation: modal.animation,\n appendTo: modal.appendTo\n });\n\n openedClasses.put(modalBodyClass, modalInstance);\n\n var appendToElement = modal.appendTo,\n currBackdropIndex = backdropIndex();\n\n if (!appendToElement.length) {\n throw new Error('appendTo element not found. Make sure that the element passed is in DOM.');\n }\n\n if (currBackdropIndex >= 0 && !backdropDomEl) {\n backdropScope = $rootScope.$new(true);\n backdropScope.modalOptions = modal;\n backdropScope.index = currBackdropIndex;\n backdropDomEl = angular.element('
');\n backdropDomEl.attr('backdrop-class', modal.backdropClass);\n if (modal.animation) {\n backdropDomEl.attr('modal-animation', 'true');\n }\n $compile(backdropDomEl)(backdropScope);\n $animate.enter(backdropDomEl, appendToElement);\n }\n\n // Set the top modal index based on the index of the previous top modal\n topModalIndex = previousTopOpenedModal ? parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10) + 1 : 0;\n var angularDomEl = angular.element('
');\n angularDomEl.attr({\n 'template-url': modal.windowTemplateUrl,\n 'window-class': modal.windowClass,\n 'window-top-class': modal.windowTopClass,\n 'size': modal.size,\n 'index': topModalIndex,\n 'animate': 'animate',\n 'tai-class': modal.taiClass\n }).html(modal.content);\n if (modal.animation) {\n angularDomEl.attr('modal-animation', 'true');\n }\n\n scrollbarPadding = $uibPosition.scrollbarPadding(appendToElement);\n if (scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n appendToElement.css({ paddingRight: scrollbarPadding.right + 'px' });\n }\n appendToElement.addClass(modalBodyClass);\n $animate.enter($compile(angularDomEl)(modal.scope), appendToElement);\n\n openedWindows.top().value.modalDomEl = angularDomEl;\n openedWindows.top().value.modalOpener = modalOpener;\n\n // 解決表單有時在IE無法輸入問題\n fixIeNotAbleToInput('.modal');\n };\n\n function broadcastClosing(modalWindow, resultOrReason, closing) {\n return !modalWindow.value.modalScope.$broadcast('modal.closing', resultOrReason, closing).defaultPrevented;\n }\n\n $modalStack.close = function (modalInstance, result) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow && broadcastClosing(modalWindow, result, true)) {\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n modalWindow.value.deferred.resolve(result);\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n return true;\n }\n return !modalWindow;\n };\n\n $modalStack.dismiss = function (modalInstance, reason) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow && broadcastClosing(modalWindow, reason, false)) {\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n modalWindow.value.deferred.reject(reason);\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n return true;\n }\n return !modalWindow;\n };\n\n $modalStack.dismissAll = function (reason) {\n var topModal = this.getTop();\n while (topModal && this.dismiss(topModal.key, reason)) {\n topModal = this.getTop();\n }\n };\n\n $modalStack.getTop = function () {\n return openedWindows.top();\n };\n\n $modalStack.modalRendered = function (modalInstance) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow) {\n modalWindow.value.renderDeferred.resolve();\n }\n };\n\n $modalStack.focusFirstFocusableElement = function (list) {\n if (list.length > 0) {\n list[0].focus();\n return true;\n }\n return false;\n };\n\n $modalStack.focusLastFocusableElement = function (list) {\n if (list.length > 0) {\n list[list.length - 1].focus();\n return true;\n }\n return false;\n };\n\n $modalStack.isModalFocused = function (evt, modalWindow) {\n if (evt && modalWindow) {\n var modalDomEl = modalWindow.value.modalDomEl;\n if (modalDomEl && modalDomEl.length) {\n return (evt.target || evt.srcElement) === modalDomEl[0];\n }\n }\n return false;\n };\n\n $modalStack.isFocusInFirstItem = function (evt, list) {\n if (list.length > 0) {\n return (evt.target || evt.srcElement) === list[0];\n }\n return false;\n };\n\n $modalStack.isFocusInLastItem = function (evt, list) {\n if (list.length > 0) {\n return (evt.target || evt.srcElement) === list[list.length - 1];\n }\n return false;\n };\n\n $modalStack.loadFocusElementList = function (modalWindow) {\n if (modalWindow) {\n var modalDomE1 = modalWindow.value.modalDomEl;\n if (modalDomE1 && modalDomE1.length) {\n var elements = modalDomE1[0].querySelectorAll(tabableSelector);\n return elements ? Array.prototype.filter.call(elements, function (element) {\n return isVisible(element);\n }) : elements;\n }\n }\n };\n\n return $modalStack;\n}]).provider('$uibModal', function () {\n var $modalProvider = {\n options: {\n animation: true,\n backdrop: true, //can also be false or 'static'\n keyboard: true\n },\n $get: ['$rootScope', '$q', '$document', '$templateRequest', '$controller', '$uibResolve', '$uibModalStack', function ($rootScope, $q, $document, $templateRequest, $controller, $uibResolve, $modalStack) {\n var $modal = {};\n\n function getTemplatePromise(options) {\n return options.template ? $q.when(options.template) : $templateRequest(angular.isFunction(options.templateUrl) ? options.templateUrl() : options.templateUrl);\n }\n\n var promiseChain = null;\n $modal.getPromiseChain = function () {\n return promiseChain;\n };\n\n $modal.open = function (modalOptions) {\n var modalResultDeferred = $q.defer();\n var modalOpenedDeferred = $q.defer();\n var modalClosedDeferred = $q.defer();\n var modalRenderDeferred = $q.defer();\n //prepare an instance of a modal to be injected into controllers and returned to a caller\n var modalInstance = {\n result: modalResultDeferred.promise,\n opened: modalOpenedDeferred.promise,\n closed: modalClosedDeferred.promise,\n rendered: modalRenderDeferred.promise,\n close: function close(result) {\n return $modalStack.close(modalInstance, result);\n },\n dismiss: function dismiss(reason) {\n return $modalStack.dismiss(modalInstance, reason);\n }\n };\n\n //merge and clean up options\n modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n modalOptions.resolve = modalOptions.resolve || {};\n modalOptions.appendTo = modalOptions.appendTo || $document.find('body').eq(0);\n\n //verify options\n if (!modalOptions.template && !modalOptions.templateUrl) {\n throw new Error('One of template or templateUrl options is required.');\n }\n\n var templateAndResolvePromise = $q.all([getTemplatePromise(modalOptions), $uibResolve.resolve(modalOptions.resolve, {}, null, null)]);\n\n function resolveWithTemplate() {\n return templateAndResolvePromise;\n }\n\n // Wait for the resolution of the existing promise chain.\n // Then switch to our own combined promise dependency (regardless of how the previous modal fared).\n // Then add to $modalStack and resolve opened.\n // Finally clean up the chain variable if no subsequent modal has overwritten it.\n var samePromise;\n samePromise = promiseChain = $q.all([promiseChain]).then(resolveWithTemplate, resolveWithTemplate).then(function resolveSuccess(tplAndVars) {\n var providedScope = modalOptions.scope || $rootScope;\n\n var modalScope = providedScope.$new();\n modalScope.$close = modalInstance.close;\n modalScope.$dismiss = modalInstance.dismiss;\n\n modalScope.$on('$destroy', function () {\n if (!modalScope.$$uibDestructionScheduled) {\n modalScope.$dismiss('$uibUnscheduledDestruction');\n }\n });\n\n var ctrlInstance,\n ctrlInstantiate,\n ctrlLocals = {};\n\n //controllers\n if (modalOptions.controller) {\n ctrlLocals.$scope = modalScope;\n ctrlLocals.$uibModalInstance = modalInstance;\n angular.forEach(tplAndVars[1], function (value, key) {\n ctrlLocals[key] = value;\n });\n\n // the third param will make the controller instantiate later,private api\n // @see https://github.com/angular/angular.js/blob/master/src/ng/controller.js#L126\n ctrlInstantiate = $controller(modalOptions.controller, ctrlLocals, true);\n if (modalOptions.controllerAs) {\n ctrlInstance = ctrlInstantiate.instance;\n\n if (modalOptions.bindToController) {\n ctrlInstance.$close = modalScope.$close;\n ctrlInstance.$dismiss = modalScope.$dismiss;\n angular.extend(ctrlInstance, providedScope);\n }\n\n ctrlInstance = ctrlInstantiate();\n\n modalScope[modalOptions.controllerAs] = ctrlInstance;\n } else {\n ctrlInstance = ctrlInstantiate();\n }\n\n if (angular.isFunction(ctrlInstance.$onInit)) {\n ctrlInstance.$onInit();\n }\n }\n\n $modalStack.open(modalInstance, {\n scope: modalScope,\n deferred: modalResultDeferred,\n renderDeferred: modalRenderDeferred,\n closedDeferred: modalClosedDeferred,\n content: tplAndVars[0],\n animation: modalOptions.animation,\n backdrop: modalOptions.backdrop,\n keyboard: modalOptions.keyboard,\n backdropClass: modalOptions.backdropClass,\n windowTopClass: modalOptions.windowTopClass,\n windowClass: modalOptions.windowClass,\n windowTemplateUrl: modalOptions.windowTemplateUrl,\n size: modalOptions.size,\n openedClass: modalOptions.openedClass,\n appendTo: modalOptions.appendTo,\n taiClass: modalOptions.taiClass\n });\n modalOpenedDeferred.resolve(true);\n }, function resolveError(reason) {\n modalOpenedDeferred.reject(reason);\n modalResultDeferred.reject(reason);\n })['finally'](function () {\n if (promiseChain === samePromise) {\n promiseChain = null;\n }\n });\n\n return modalInstance;\n };\n\n return $modal;\n }]\n };\n\n return $modalProvider;\n});\n'use strict';\n\nangular.module('ui.bootstrap.pagination', ['ui.bootstrap.paging']).controller('UibPaginationController', ['$scope', '$attrs', '$parse', 'uibPaging', 'uibPaginationConfig', function ($scope, $attrs, $parse, uibPaging, uibPaginationConfig) {\n var ctrl = this;\n // Setup configuration parameters\n var maxSize = angular.isDefined($attrs.maxSize) ? $scope.$parent.$eval($attrs.maxSize) : uibPaginationConfig.maxSize,\n rotate = angular.isDefined($attrs.rotate) ? $scope.$parent.$eval($attrs.rotate) : uibPaginationConfig.rotate,\n forceEllipses = angular.isDefined($attrs.forceEllipses) ? $scope.$parent.$eval($attrs.forceEllipses) : uibPaginationConfig.forceEllipses,\n boundaryLinkNumbers = angular.isDefined($attrs.boundaryLinkNumbers) ? $scope.$parent.$eval($attrs.boundaryLinkNumbers) : uibPaginationConfig.boundaryLinkNumbers,\n pageLabel = angular.isDefined($attrs.pageLabel) ? function (idx) {\n return $scope.$parent.$eval($attrs.pageLabel, { $page: idx });\n } : angular.identity;\n $scope.boundaryLinks = angular.isDefined($attrs.boundaryLinks) ? $scope.$parent.$eval($attrs.boundaryLinks) : uibPaginationConfig.boundaryLinks;\n $scope.directionLinks = angular.isDefined($attrs.directionLinks) ? $scope.$parent.$eval($attrs.directionLinks) : uibPaginationConfig.directionLinks;\n\n uibPaging.create(this, $scope, $attrs);\n\n if ($attrs.maxSize) {\n ctrl._watchers.push($scope.$parent.$watch($parse($attrs.maxSize), function (value) {\n maxSize = parseInt(value, 10);\n ctrl.render();\n }));\n }\n\n // Create page object used in template\n function makePage(number, text, isActive) {\n return {\n number: number,\n text: text,\n active: isActive\n };\n }\n\n function getPages(currentPage, totalPages) {\n var pages = [];\n\n // Default page limits\n var startPage = 1,\n endPage = totalPages;\n var isMaxSized = angular.isDefined(maxSize) && maxSize < totalPages;\n\n // recompute if maxSize\n if (isMaxSized) {\n if (rotate) {\n // Current page is displayed in the middle of the visible ones\n startPage = Math.max(currentPage - Math.floor(maxSize / 2), 1);\n endPage = startPage + maxSize - 1;\n\n // Adjust if limit is exceeded\n if (endPage > totalPages) {\n endPage = totalPages;\n startPage = endPage - maxSize + 1;\n }\n } else {\n // Visible pages are paginated with maxSize\n startPage = (Math.ceil(currentPage / maxSize) - 1) * maxSize + 1;\n\n // Adjust last page if limit is exceeded\n endPage = Math.min(startPage + maxSize - 1, totalPages);\n }\n }\n\n // Add page number links\n for (var number = startPage; number <= endPage; number++) {\n var page = makePage(number, pageLabel(number), number === currentPage);\n pages.push(page);\n }\n\n // Add links to move between page sets\n if (isMaxSized && maxSize > 0 && (!rotate || forceEllipses || boundaryLinkNumbers)) {\n if (startPage > 1) {\n if (!boundaryLinkNumbers || startPage > 3) {\n //need ellipsis for all options unless range is too close to beginning\n var previousPageSet = makePage(startPage - 1, '...', false);\n pages.unshift(previousPageSet);\n }\n if (boundaryLinkNumbers) {\n if (startPage === 3) {\n //need to replace ellipsis when the buttons would be sequential\n var secondPageLink = makePage(2, '2', false);\n pages.unshift(secondPageLink);\n }\n //add the first page\n var firstPageLink = makePage(1, '1', false);\n pages.unshift(firstPageLink);\n }\n }\n\n if (endPage < totalPages) {\n if (!boundaryLinkNumbers || endPage < totalPages - 2) {\n //need ellipsis for all options unless range is too close to end\n var nextPageSet = makePage(endPage + 1, '...', false);\n pages.push(nextPageSet);\n }\n if (boundaryLinkNumbers) {\n if (endPage === totalPages - 2) {\n //need to replace ellipsis when the buttons would be sequential\n var secondToLastPageLink = makePage(totalPages - 1, totalPages - 1, false);\n pages.push(secondToLastPageLink);\n }\n //add the last page\n var lastPageLink = makePage(totalPages, totalPages, false);\n pages.push(lastPageLink);\n }\n }\n }\n return pages;\n }\n\n var originalRender = this.render;\n this.render = function () {\n originalRender();\n if ($scope.page > 0 && $scope.page <= $scope.totalPages) {\n $scope.pages = getPages($scope.page, $scope.totalPages);\n }\n };\n}]).constant('uibPaginationConfig', {\n itemsPerPage: 10,\n boundaryLinks: false,\n boundaryLinkNumbers: false,\n directionLinks: true,\n firstText: '<<',\n previousText: '<',\n nextText: '>',\n lastText: '>>',\n rotate: true,\n forceEllipses: false\n}).directive('uibPagination', ['$parse', 'uibPaginationConfig', function ($parse, uibPaginationConfig) {\n return {\n scope: {\n totalItems: '=',\n firstText: '@',\n previousText: '@',\n nextText: '@',\n lastText: '@',\n ngDisabled: '='\n },\n require: ['uibPagination', '?ngModel'],\n controller: 'UibPaginationController',\n controllerAs: 'pagination',\n templateUrl: function templateUrl(element, attrs) {\n return attrs.templateUrl || 'directive/ui-bootstrap/pagination/pagination.html';\n },\n replace: true,\n link: function link(scope, element, attrs, ctrls) {\n var paginationCtrl = ctrls[0],\n ngModelCtrl = ctrls[1];\n\n if (!ngModelCtrl) {\n return; // do nothing if no ng-model\n }\n\n paginationCtrl.init(ngModelCtrl, uibPaginationConfig);\n }\n };\n}]);\n'use strict';\n\nangular.module('ui.bootstrap.paging', [])\n/**\r\n * Helper internal service for generating common controller code between the\r\n * pager and pagination components\r\n */\n.factory('uibPaging', ['$parse', function ($parse) {\n return {\n create: function create(ctrl, $scope, $attrs) {\n ctrl.setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\n ctrl.ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl\n ctrl._watchers = [];\n\n ctrl.init = function (ngModelCtrl, config) {\n ctrl.ngModelCtrl = ngModelCtrl;\n ctrl.config = config;\n\n ngModelCtrl.$render = function () {\n ctrl.render();\n };\n\n if ($attrs.itemsPerPage) {\n ctrl._watchers.push($scope.$parent.$watch($attrs.itemsPerPage, function (value) {\n ctrl.itemsPerPage = parseInt(value, 10);\n $scope.totalPages = ctrl.calculateTotalPages();\n ctrl.updatePage();\n }));\n } else {\n ctrl.itemsPerPage = config.itemsPerPage;\n }\n\n $scope.$watch('totalItems', function (newTotal, oldTotal) {\n if (angular.isDefined(newTotal) || newTotal !== oldTotal) {\n $scope.totalPages = ctrl.calculateTotalPages();\n ctrl.updatePage();\n }\n });\n };\n\n ctrl.calculateTotalPages = function () {\n var totalPages = ctrl.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / ctrl.itemsPerPage);\n return Math.max(totalPages || 0, 1);\n };\n\n ctrl.render = function () {\n $scope.page = parseInt(ctrl.ngModelCtrl.$viewValue, 10) || 1;\n };\n\n $scope.selectPage = function (page, evt) {\n if (evt) {\n evt.preventDefault();\n }\n\n var clickAllowed = !$scope.ngDisabled || !evt;\n if (clickAllowed && $scope.page !== page && page > 0 && page <= $scope.totalPages) {\n if (evt && evt.target) {\n evt.target.blur();\n }\n ctrl.ngModelCtrl.$setViewValue(page);\n ctrl.ngModelCtrl.$render();\n }\n };\n\n $scope.getText = function (key) {\n return $scope[key + 'Text'] || ctrl.config[key + 'Text'];\n };\n\n $scope.noPrevious = function () {\n return $scope.page === 1;\n };\n\n $scope.noNext = function () {\n return $scope.page === $scope.totalPages;\n };\n\n ctrl.updatePage = function () {\n ctrl.setNumPages($scope.$parent, $scope.totalPages); // Readonly variable\n\n if ($scope.page > $scope.totalPages) {\n $scope.selectPage($scope.totalPages);\n } else {\n ctrl.ngModelCtrl.$render();\n }\n };\n\n $scope.$on('$destroy', function () {\n while (ctrl._watchers.length) {\n ctrl._watchers.shift()();\n }\n });\n }\n };\n}]);\n'use strict';\n\nangular.module('ui.bootstrap.tabs', []).controller('UibTabsetController', ['$scope', function ($scope) {\n var ctrl = this,\n oldIndex;\n ctrl.tabs = [];\n ctrl.select = function (index, evt) {\n if (!destroyed) {\n var previousIndex = findTabIndex(oldIndex);\n var previousSelected = ctrl.tabs[previousIndex];\n if (previousSelected) {\n previousSelected.tab.onDeselect({\n $event: evt\n });\n if (evt && evt.isDefaultPrevented()) {\n return;\n }\n previousSelected.tab.active = false;\n }\n\n var selected = ctrl.tabs[index];\n if (selected) {\n selected.tab.onSelect({\n $event: evt\n });\n selected.tab.active = true;\n ctrl.active = selected.index;\n oldIndex = selected.index;\n } else if (!selected && angular.isNumber(oldIndex)) {\n ctrl.active = null;\n oldIndex = null;\n }\n }\n };\n\n ctrl.addTab = function addTab(tab) {\n ctrl.tabs.push({\n tab: tab,\n index: tab.index\n });\n ctrl.tabs.sort(function (t1, t2) {\n if (t1.index > t2.index) {\n return 1;\n }\n\n if (t1.index < t2.index) {\n return -1;\n }\n\n return 0;\n });\n\n if (tab.index === ctrl.active || !angular.isNumber(ctrl.active) && ctrl.tabs.length === 1) {\n var newActiveIndex = findTabIndex(tab.index);\n ctrl.select(newActiveIndex);\n }\n };\n\n ctrl.removeTab = function removeTab(tab) {\n var index;\n for (var i = 0; i < ctrl.tabs.length; i++) {\n if (ctrl.tabs[i].tab === tab) {\n index = i;\n break;\n }\n }\n\n if (ctrl.tabs[index].index === ctrl.active) {\n var newActiveTabIndex = index === ctrl.tabs.length - 1 ? index - 1 : index + 1 % ctrl.tabs.length;\n ctrl.select(newActiveTabIndex);\n }\n\n ctrl.tabs.splice(index, 1);\n };\n\n $scope.$watch('tabset.active', function (val) {\n if (angular.isNumber(val) && val !== oldIndex) {\n ctrl.select(findTabIndex(val));\n }\n });\n\n var destroyed;\n $scope.$on('$destroy', function () {\n destroyed = true;\n });\n\n function findTabIndex(index) {\n for (var i = 0; i < ctrl.tabs.length; i++) {\n if (ctrl.tabs[i].index === index) {\n return i;\n }\n }\n }\n}]).directive('uibTabset', function () {\n return {\n transclude: true,\n replace: true,\n scope: {\n isNohover: '@'\n },\n bindToController: {\n active: '=?',\n type: '@'\n },\n controller: 'UibTabsetController',\n controllerAs: 'tabset',\n templateUrl: function templateUrl(element, attrs) {\n return attrs.templateUrl || 'directive/ui-bootstrap/tabs/tabset.html';\n },\n link: function link(scope, element, attrs) {\n scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false;\n scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false;\n if (angular.isUndefined(attrs.active)) {\n scope.active = 0;\n }\n }\n };\n}).directive('uibTab', ['$parse', function ($parse) {\n return {\n require: '^uibTabset',\n replace: true,\n templateUrl: function templateUrl(element, attrs) {\n return attrs.templateUrl || 'directive/ui-bootstrap/tabs/tab.html';\n },\n transclude: true,\n scope: {\n heading: '@',\n index: '=?',\n classes: '@?',\n onSelect: '&select', //This callback is called in contentHeadingTransclude\n //once it inserts the tab's content into the dom\n onDeselect: '&deselect'\n },\n controller: function controller() {\n //Empty controller so other directives can require being 'under' a tab\n },\n controllerAs: 'tab',\n link: function link(scope, elm, attrs, tabsetCtrl, transclude) {\n scope.disabled = false;\n if (attrs.disable) {\n scope.$parent.$watch($parse(attrs.disable), function (value) {\n scope.disabled = !!value;\n });\n }\n\n if (angular.isUndefined(attrs.index)) {\n if (tabsetCtrl.tabs && tabsetCtrl.tabs.length) {\n scope.index = Math.max.apply(null, tabsetCtrl.tabs.map(function (t) {\n return t.index;\n })) + 1;\n } else {\n scope.index = 0;\n }\n }\n\n if (angular.isUndefined(attrs.classes)) {\n scope.classes = '';\n }\n\n scope.select = function (evt) {\n if (!scope.disabled) {\n var index;\n for (var i = 0; i < tabsetCtrl.tabs.length; i++) {\n if (tabsetCtrl.tabs[i].tab === scope) {\n index = i;\n break;\n }\n }\n\n tabsetCtrl.select(index, evt);\n }\n };\n\n tabsetCtrl.addTab(scope);\n scope.$on('$destroy', function () {\n tabsetCtrl.removeTab(scope);\n });\n\n //We need to transclude later, once the content container is ready.\n //when this link happens, we're inside a tab heading.\n scope.$transcludeFn = transclude;\n }\n };\n}]).directive('uibTabHeadingTransclude', function () {\n return {\n restrict: 'A',\n require: '^uibTab',\n link: function link(scope, elm) {\n scope.$watch('headingElement', function updateHeadingElement(heading) {\n if (heading) {\n elm.html('');\n elm.append(heading);\n }\n });\n }\n };\n}).directive('uibTabContentTransclude', function () {\n return {\n restrict: 'A',\n require: '^uibTabset',\n link: function link(scope, elm, attrs) {\n var tab = scope.$eval(attrs.uibTabContentTransclude).tab;\n\n //Now our tab is ready to be transcluded: both the tab heading area\n //and the tab content area are loaded. Transclude 'em both.\n tab.$transcludeFn(tab.$parent, function (contents) {\n angular.forEach(contents, function (node) {\n if (isTabHeading(node)) {\n //Let tabHeadingTransclude know.\n tab.headingElement = node;\n } else {\n elm.append(node);\n }\n });\n });\n }\n };\n\n function isTabHeading(node) {\n return node.tagName && (node.hasAttribute('uib-tab-heading') || node.hasAttribute('data-uib-tab-heading') || node.hasAttribute('x-uib-tab-heading') || node.tagName.toLowerCase() === 'uib-tab-heading' || node.tagName.toLowerCase() === 'data-uib-tab-heading' || node.tagName.toLowerCase() === 'x-uib-tab-heading' || node.tagName.toLowerCase() === 'uib:tab-heading');\n }\n});\n'use strict';\n\nangular.module('ui.bootstrap.typeahead', ['ui.bootstrap.debounce', 'ui.bootstrap.position'])\n\n/**\r\n * A helper service that can parse typeahead's syntax (string provided by users)\r\n * Extracted to a separate service for ease of unit testing\r\n */\n.factory('uibTypeaheadParser', ['$parse', function ($parse) {\n // 00000111000000000000022200000000000000003333333333333330000000000044000\n var TYPEAHEAD_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+([\\s\\S]+?)$/;\n return {\n parse: function parse(input) {\n var match = input.match(TYPEAHEAD_REGEXP);\n if (!match) {\n throw new Error('Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' + ' but got \"' + input + '\".');\n }\n\n return {\n itemName: match[3],\n source: $parse(match[4]),\n viewMapper: $parse(match[2] || match[1]),\n modelMapper: $parse(match[1])\n };\n }\n };\n}]).controller('UibTypeaheadController', ['$scope', '$element', '$attrs', '$compile', '$parse', '$q', '$timeout', '$document', '$window', '$rootScope', '$$debounce', '$uibPosition', 'uibTypeaheadParser', function (originalScope, element, attrs, $compile, $parse, $q, $timeout, $document, $window, $rootScope, $$debounce, $position, typeaheadParser) {\n var HOT_KEYS = [9, 13, 27, 38, 40];\n var eventDebounceTime = 200;\n var modelCtrl, ngModelOptions;\n //SUPPORTED ATTRIBUTES (OPTIONS)\n\n //minimal no of characters that needs to be entered before typeahead kicks-in\n var minLength = originalScope.$eval(attrs.typeaheadMinLength);\n if (!minLength && minLength !== 0) {\n minLength = 1;\n }\n\n originalScope.$watch(attrs.typeaheadMinLength, function (newVal) {\n minLength = !newVal && newVal !== 0 ? 1 : newVal;\n });\n\n //minimal wait time after last character typed before typeahead kicks-in\n var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\n\n //should it restrict model values to the ones selected from the popup only?\n var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\n originalScope.$watch(attrs.typeaheadEditable, function (newVal) {\n isEditable = newVal !== false;\n });\n\n //binding to a variable that indicates if matches are being retrieved asynchronously\n var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\n\n //a callback executed when a match is selected\n var onSelectCallback = $parse(attrs.typeaheadOnSelect);\n\n //should it select highlighted popup value when losing focus?\n var isSelectOnBlur = angular.isDefined(attrs.typeaheadSelectOnBlur) ? originalScope.$eval(attrs.typeaheadSelectOnBlur) : false;\n\n //binding to a variable that indicates if there were no results after the query is completed\n var isNoResultsSetter = $parse(attrs.typeaheadNoResults).assign || angular.noop;\n\n var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\n\n var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\n\n var appendTo = attrs.typeaheadAppendTo ? originalScope.$eval(attrs.typeaheadAppendTo) : null;\n\n var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false;\n\n //If input matches an item of the list exactly, select it automatically\n var selectOnExact = attrs.typeaheadSelectOnExact ? originalScope.$eval(attrs.typeaheadSelectOnExact) : false;\n\n //binding to a variable that indicates if dropdown is open\n var isOpenSetter = $parse(attrs.typeaheadIsOpen).assign || angular.noop;\n\n var showHint = originalScope.$eval(attrs.typeaheadShowHint) || false;\n\n //INTERNAL VARIABLES\n\n //model setter executed upon match selection\n var parsedModel = $parse(attrs.ngModel);\n var invokeModelSetter = $parse(attrs.ngModel + '($$$p)');\n var $setModelValue = function $setModelValue(scope, newValue) {\n if (angular.isFunction(parsedModel(originalScope)) && ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) {\n return invokeModelSetter(scope, { $$$p: newValue });\n }\n\n return parsedModel.assign(scope, newValue);\n };\n\n //expressions used by typeahead\n var parserResult = typeaheadParser.parse(attrs.uibTypeahead);\n\n var hasFocus;\n\n //Used to avoid bug in iOS webview where iOS keyboard does not fire\n //mousedown & mouseup events\n //Issue #3699\n var selected;\n\n //create a child scope for the typeahead directive so we are not polluting original scope\n //with typeahead-specific data (matches, query etc.)\n var scope = originalScope.$new();\n var offDestroy = originalScope.$on('$destroy', function () {\n scope.$destroy();\n });\n scope.$on('$destroy', offDestroy);\n\n // WAI-ARIA\n var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(new Date().getTime() * 10000);\n element.attr({\n 'aria-autocomplete': 'list',\n 'aria-expanded': false,\n 'aria-owns': popupId\n });\n\n var inputsContainer, hintInputElem;\n //add read-only input to show hint\n if (showHint) {\n inputsContainer = angular.element('
');\n inputsContainer.css('position', 'relative');\n element.after(inputsContainer);\n hintInputElem = element.clone();\n hintInputElem.attr('placeholder', '');\n hintInputElem.attr('tabindex', '-1');\n hintInputElem.val('');\n hintInputElem.css({\n 'position': 'absolute',\n 'top': '0px',\n 'left': '0px',\n 'border-color': 'transparent',\n 'box-shadow': 'none',\n 'opacity': 1,\n 'background': 'none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)',\n 'color': '#999'\n });\n element.css({\n 'position': 'relative',\n 'vertical-align': 'top',\n 'background-color': 'transparent'\n });\n inputsContainer.append(hintInputElem);\n hintInputElem.after(element);\n }\n\n //pop-up element used to display matches\n var popUpEl = angular.element('
');\n popUpEl.attr({\n id: popupId,\n matches: 'matches',\n active: 'activeIdx',\n select: 'select(activeIdx, evt)',\n 'move-in-progress': 'moveInProgress',\n query: 'query',\n position: 'position',\n 'assign-is-open': 'assignIsOpen(isOpen)',\n debounce: 'debounceUpdate'\n });\n //custom item template\n if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\n popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\n }\n\n if (angular.isDefined(attrs.typeaheadPopupTemplateUrl)) {\n popUpEl.attr('popup-template-url', attrs.typeaheadPopupTemplateUrl);\n }\n\n var resetHint = function resetHint() {\n if (showHint) {\n hintInputElem.val('');\n }\n };\n\n var resetMatches = function resetMatches() {\n scope.matches = [];\n scope.activeIdx = -1;\n element.attr('aria-expanded', false);\n resetHint();\n };\n\n var getMatchId = function getMatchId(index) {\n return popupId + '-option-' + index;\n };\n\n // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\n // This attribute is added or removed automatically when the `activeIdx` changes.\n scope.$watch('activeIdx', function (index) {\n if (index < 0) {\n element.removeAttr('aria-activedescendant');\n } else {\n element.attr('aria-activedescendant', getMatchId(index));\n }\n });\n\n var inputIsExactMatch = function inputIsExactMatch(inputValue, index) {\n if (scope.matches.length > index && inputValue) {\n return inputValue.toUpperCase() === scope.matches[index].label.toUpperCase();\n }\n\n return false;\n };\n\n var getMatchesAsync = function getMatchesAsync(inputValue, evt) {\n var locals = { $viewValue: inputValue };\n isLoadingSetter(originalScope, true);\n isNoResultsSetter(originalScope, false);\n $q.when(parserResult.source(originalScope, locals)).then(function (matches) {\n //it might happen that several async queries were in progress if a user were typing fast\n //but we are interested only in responses that correspond to the current view value\n var onCurrentRequest = inputValue === modelCtrl.$viewValue;\n if (onCurrentRequest && hasFocus) {\n if (matches && matches.length > 0) {\n scope.activeIdx = focusFirst ? 0 : -1;\n isNoResultsSetter(originalScope, false);\n scope.matches.length = 0;\n\n //transform labels\n for (var i = 0; i < matches.length; i++) {\n locals[parserResult.itemName] = matches[i];\n scope.matches.push({\n id: getMatchId(i),\n label: parserResult.viewMapper(scope, locals),\n model: matches[i]\n });\n }\n\n scope.query = inputValue;\n //position pop-up with matches - we need to re-calculate its position each time we are opening a window\n //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\n //due to other elements being rendered\n recalculatePosition();\n\n element.attr('aria-expanded', true);\n\n //Select the single remaining option if user input matches\n if (selectOnExact && scope.matches.length === 1 && inputIsExactMatch(inputValue, 0)) {\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n $$debounce(function () {\n scope.select(0, evt);\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n } else {\n scope.select(0, evt);\n }\n }\n\n if (showHint) {\n var firstLabel = scope.matches[0].label;\n if (angular.isString(inputValue) && inputValue.length > 0 && firstLabel.slice(0, inputValue.length).toUpperCase() === inputValue.toUpperCase()) {\n hintInputElem.val(inputValue + firstLabel.slice(inputValue.length));\n } else {\n hintInputElem.val('');\n }\n }\n } else {\n resetMatches();\n isNoResultsSetter(originalScope, true);\n }\n }\n if (onCurrentRequest) {\n isLoadingSetter(originalScope, false);\n }\n }, function () {\n resetMatches();\n isLoadingSetter(originalScope, false);\n isNoResultsSetter(originalScope, true);\n });\n };\n\n // bind events only if appendToBody params exist - performance feature\n if (appendToBody) {\n angular.element($window).on('resize', fireRecalculating);\n $document.find('body').on('scroll', fireRecalculating);\n }\n\n // Declare the debounced function outside recalculating for\n // proper debouncing\n var debouncedRecalculate = $$debounce(function () {\n // if popup is visible\n if (scope.matches.length) {\n recalculatePosition();\n }\n\n scope.moveInProgress = false;\n }, eventDebounceTime);\n\n // Default progress type\n scope.moveInProgress = false;\n\n function fireRecalculating() {\n if (!scope.moveInProgress) {\n scope.moveInProgress = true;\n scope.$digest();\n }\n\n debouncedRecalculate();\n }\n\n // recalculate actual position and set new values to scope\n // after digest loop is popup in right position\n function recalculatePosition() {\n scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n scope.position.top += element.prop('offsetHeight');\n }\n\n //we need to propagate user's query so we can higlight matches\n scope.query = undefined;\n\n //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later\n var timeoutPromise;\n\n var scheduleSearchWithTimeout = function scheduleSearchWithTimeout(inputValue) {\n timeoutPromise = $timeout(function () {\n getMatchesAsync(inputValue);\n }, waitTime);\n };\n\n var cancelPreviousTimeout = function cancelPreviousTimeout() {\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n };\n\n resetMatches();\n\n scope.assignIsOpen = function (isOpen) {\n isOpenSetter(originalScope, isOpen);\n };\n\n scope.select = function (activeIdx, evt) {\n //called from within the $digest() cycle\n var locals = {};\n var model, item;\n\n selected = true;\n locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\n model = parserResult.modelMapper(originalScope, locals);\n $setModelValue(originalScope, model);\n modelCtrl.$setValidity('editable', true);\n modelCtrl.$setValidity('parse', true);\n\n onSelectCallback(originalScope, {\n $item: item,\n $model: model,\n $label: parserResult.viewMapper(originalScope, locals),\n $event: evt\n });\n\n resetMatches();\n\n //return focus to the input element if a match was selected via a mouse click event\n // use timeout to avoid $rootScope:inprog error\n if (scope.$eval(attrs.typeaheadFocusOnSelect) !== false) {\n $timeout(function () {\n element[0].focus();\n }, 0, false);\n }\n };\n\n //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\n element.on('keydown', function (evt) {\n //typeahead is open and an \"interesting\" key was pressed\n if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\n return;\n }\n\n /**\r\n * if there's nothing selected (i.e. focusFirst) and enter or tab is hit\r\n * or\r\n * shift + tab is pressed to bring focus to the previous element\r\n * then clear the results\r\n */\n if (scope.activeIdx === -1 && (evt.which === 9 || evt.which === 13) || evt.which === 9 && !!evt.shiftKey) {\n resetMatches();\n scope.$digest();\n return;\n }\n\n evt.preventDefault();\n var target;\n switch (evt.which) {\n case 9:\n case 13:\n scope.$apply(function () {\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n $$debounce(function () {\n scope.select(scope.activeIdx, evt);\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n } else {\n scope.select(scope.activeIdx, evt);\n }\n });\n break;\n case 27:\n evt.stopPropagation();\n\n resetMatches();\n originalScope.$digest();\n break;\n case 38:\n scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1;\n scope.$digest();\n target = popUpEl.find('li')[scope.activeIdx];\n target.parentNode.scrollTop = target.offsetTop;\n break;\n case 40:\n scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\n scope.$digest();\n target = popUpEl.find('li')[scope.activeIdx];\n target.parentNode.scrollTop = target.offsetTop;\n break;\n }\n });\n\n element.bind('focus', function (evt) {\n hasFocus = true;\n if (minLength === 0 && !modelCtrl.$viewValue) {\n $timeout(function () {\n getMatchesAsync(modelCtrl.$viewValue, evt);\n }, 0);\n }\n });\n\n element.bind('blur', function (evt) {\n if (isSelectOnBlur && scope.matches.length && scope.activeIdx !== -1 && !selected) {\n selected = true;\n scope.$apply(function () {\n if (angular.isObject(scope.debounceUpdate) && angular.isNumber(scope.debounceUpdate.blur)) {\n $$debounce(function () {\n scope.select(scope.activeIdx, evt);\n }, scope.debounceUpdate.blur);\n } else {\n scope.select(scope.activeIdx, evt);\n }\n });\n }\n if (!isEditable && modelCtrl.$error.editable) {\n modelCtrl.$setViewValue();\n // Reset validity as we are clearing\n modelCtrl.$setValidity('editable', true);\n modelCtrl.$setValidity('parse', true);\n element.val('');\n }\n hasFocus = false;\n selected = false;\n });\n\n // Keep reference to click handler to unbind it.\n var dismissClickHandler = function dismissClickHandler(evt) {\n // Issue #3973\n // Firefox treats right click as a click on document\n if (element[0] !== evt.target && evt.which !== 3 && scope.matches.length !== 0) {\n resetMatches();\n if (!$rootScope.$$phase) {\n originalScope.$digest();\n }\n }\n };\n\n $document.on('click', dismissClickHandler);\n\n originalScope.$on('$destroy', function () {\n $document.off('click', dismissClickHandler);\n if (appendToBody || appendTo) {\n $popup.remove();\n }\n\n if (appendToBody) {\n angular.element($window).off('resize', fireRecalculating);\n $document.find('body').off('scroll', fireRecalculating);\n }\n // Prevent jQuery cache memory leak\n popUpEl.remove();\n\n if (showHint) {\n inputsContainer.remove();\n }\n });\n\n var $popup = $compile(popUpEl)(scope);\n\n if (appendToBody) {\n $document.find('body').append($popup);\n } else if (appendTo) {\n angular.element(appendTo).eq(0).append($popup);\n } else {\n element.after($popup);\n }\n\n this.init = function (_modelCtrl, _ngModelOptions) {\n modelCtrl = _modelCtrl;\n ngModelOptions = _ngModelOptions;\n\n scope.debounceUpdate = modelCtrl.$options && $parse(modelCtrl.$options.debounce)(originalScope);\n\n //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\n //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\n modelCtrl.$parsers.unshift(function (inputValue) {\n hasFocus = true;\n\n if (minLength === 0 || inputValue && inputValue.length >= minLength) {\n if (waitTime > 0) {\n cancelPreviousTimeout();\n scheduleSearchWithTimeout(inputValue);\n } else {\n getMatchesAsync(inputValue);\n }\n } else {\n isLoadingSetter(originalScope, false);\n cancelPreviousTimeout();\n resetMatches();\n }\n\n if (isEditable) {\n return inputValue;\n }\n\n if (!inputValue) {\n // Reset in case user had typed something previously.\n modelCtrl.$setValidity('editable', true);\n return null;\n }\n\n modelCtrl.$setValidity('editable', false);\n return undefined;\n });\n\n modelCtrl.$formatters.push(function (modelValue) {\n var candidateViewValue, emptyViewValue;\n var locals = {};\n\n // The validity may be set to false via $parsers (see above) if\n // the model is restricted to selected values. If the model\n // is set manually it is considered to be valid.\n if (!isEditable) {\n modelCtrl.$setValidity('editable', true);\n }\n\n if (inputFormatter) {\n locals.$model = modelValue;\n return inputFormatter(originalScope, locals);\n }\n\n //it might happen that we don't have enough info to properly render input value\n //we need to check for this situation and simply return model value if we can't apply custom formatting\n locals[parserResult.itemName] = modelValue;\n candidateViewValue = parserResult.viewMapper(originalScope, locals);\n locals[parserResult.itemName] = undefined;\n emptyViewValue = parserResult.viewMapper(originalScope, locals);\n\n return candidateViewValue !== emptyViewValue ? candidateViewValue : modelValue;\n });\n };\n}]).directive('uibTypeahead', function () {\n return {\n controller: 'UibTypeaheadController',\n require: ['ngModel', '^?ngModelOptions', 'uibTypeahead'],\n link: function link(originalScope, element, attrs, ctrls) {\n ctrls[2].init(ctrls[0], ctrls[1]);\n }\n };\n}).directive('uibTypeaheadPopup', ['$$debounce', function ($$debounce) {\n return {\n scope: {\n matches: '=',\n query: '=',\n active: '=',\n position: '&',\n moveInProgress: '=',\n select: '&',\n assignIsOpen: '&',\n debounce: '&'\n },\n replace: true,\n templateUrl: function templateUrl(element, attrs) {\n return attrs.popupTemplateUrl || 'directive/ui-bootstrap/typeahead/typeahead-popup.html';\n },\n link: function link(scope, element, attrs) {\n scope.templateUrl = attrs.templateUrl;\n\n scope.isOpen = function () {\n var isDropdownOpen = scope.matches.length > 0;\n scope.assignIsOpen({ isOpen: isDropdownOpen });\n return isDropdownOpen;\n };\n\n scope.isActive = function (matchIdx) {\n return scope.active === matchIdx;\n };\n\n scope.selectActive = function (matchIdx) {\n scope.active = matchIdx;\n };\n\n scope.selectMatch = function (activeIdx, evt) {\n var debounce = scope.debounce();\n if (angular.isNumber(debounce) || angular.isObject(debounce)) {\n $$debounce(function () {\n scope.select({ activeIdx: activeIdx, evt: evt });\n }, angular.isNumber(debounce) ? debounce : debounce['default']);\n } else {\n scope.select({ activeIdx: activeIdx, evt: evt });\n }\n };\n }\n };\n}]).directive('uibTypeaheadMatch', ['$templateRequest', '$compile', '$parse', function ($templateRequest, $compile, $parse) {\n return {\n scope: {\n index: '=',\n match: '=',\n query: '='\n },\n link: function link(scope, element, attrs) {\n var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'directive/ui-bootstrap/typeahead/typeahead-match.html';\n $templateRequest(tplUrl).then(function (tplContent) {\n var tplEl = angular.element(tplContent.trim());\n element.replaceWith(tplEl);\n $compile(tplEl)(scope);\n });\n }\n };\n}]).filter('uibTypeaheadHighlight', ['$sce', '$injector', '$log', function ($sce, $injector, $log) {\n var isSanitizePresent;\n isSanitizePresent = $injector.has('$sanitize');\n\n function escapeRegexp(queryToEscape) {\n // Regex: capture the whole query string and replace it with the string that will be used to match\n // the results, for example if the capture is \"a\" the result will be \\a\n return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n }\n\n function containsHtml(matchItem) {\n return (/<.*>/g.test(matchItem)\n );\n }\n\n return function (matchItem, query) {\n if (!isSanitizePresent && containsHtml(matchItem)) {\n $log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger\n }\n matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; // Replaces the capture string with a the same string inside of a \"strong\" tag\n if (!isSanitizePresent) {\n matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive\n }\n return matchItem;\n };\n}]);\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('confirmDialogController', confirmDialogController);\n\n function confirmDialogController($uibModal, $uibModalInstance, config, $rootScope, blockUI) {\n var vm = this;\n //==Main==\n onInit();\n //========\n\n function onInit() {\n vm.data = dataInit();\n vm.view = viewInit();\n vm.event = eventInit();\n vm.style = styleInit();\n //=========\n vm.view.hasTitle = !!vm.data.confirmTitle;\n vm.view.hasContent = !!vm.data.confirmContent;\n vm.style.titleStyle = { padding: '10px', 'word-break': 'break-word' };\n vm.style.contentStyle = { padding: '10px', 'word-break': 'break-word' };\n vm.style.footerStyle = { padding: '10px', 'word-break': 'break-word' };\n vm.isBusy = false;\n }\n function dataInit() {\n config = config || {};\n //=====\n var result = {\n confirmTitle: config.confirmTitle || '', //..........................................詢問標題\n confirmContent: config.confirmContent || '', //......................................詢問內容\n textButtonOk: config.textButtonOk || $rootScope.translate.tsunButtonConfirmOk, //....確認按鈕文字\n textButtonCancel: config.textButtonCancel || $rootScope.translate.commonCancel, //...取消按鈕文字\n promiseAction: config.promiseAction //...動作\n };\n return result;\n }\n function viewInit() {\n var result = {\n hasTitle: false, //......是否有標題\n hasContent: false //....是否有內容\n };\n return result;\n }\n function eventInit() {\n var result = {\n ok: ok, //.........確認詢問事件,回傳true\n cancel: cancel //.拒絕詢問事件,回傳false\n };\n return result;\n }\n function styleInit() {\n var result = {\n bodyStyle: {}, //.........整個畫面的風格\n titleStyle: {}, //........標題的風格\n contentStyle: {}, //......內容的風格\n footerStyle: {} //.......尾段的風格\n };\n return result;\n }\n //=========\n function ok() {\n\n if (vm.data.promiseAction) {\n vm.isBusy = true;\n vm.data.promiseAction().then(function () {\n $uibModalInstance.close(true);\n });\n } else {\n $uibModalInstance.close(true);\n }\n }\n function cancel() {\n $uibModalInstance.close(false);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunShoppingCartController', tsunShoppingCartController);\n\n function tsunShoppingCartController($q, trainingInnerService, $uibModal, modalService, $rootScope) {\n var vm = this;\n vm.setTypeClass = setTypeClass;\n vm.openCourseModal = openCourseModal;\n vm.delCollection = delCollection;\n vm.enroll = enroll;\n //===Main===\n onInit();\n //==========\n function dataInit() {\n vm.data = {\n items: []\n };\n vm.view = {\n isMobile: modalService.isMobile(), //.是否為行動裝置\n collectionEmpty: false, //............查無資料判定\n pageLoading: false, //................頁面讀取中\n pageLoaded: false //.................頁面讀取完畢\n };\n }\n\n function logicInit() {\n //邏輯初始化。\n vm.view.pageLoading = true;\n return loadCollections().then(function (collectionList) {\n vm.data.items = collectionList || [];\n }).then(function () {\n //finally\n checkIsEmpty();\n vm.view.pageLoading = false;\n vm.view.pageLoaded = true;\n });\n }\n\n function onInit() {\n dataInit();\n logicInit();\n }\n\n function loadCollections() {\n //驗證課程收藏資料\n var courseCollection = trainingInnerService.getCollectionList();\n //取得所有課程資料\n var courseList = trainingInnerService.getCourseListAll();\n var resultSessionItems = [];\n return $q.all([courseCollection, courseList]).then(function (data) {\n //驗證課程收藏\n var dataCourseCollection = data[0];\n var dataCourseList = data[1];\n console.log(\"dataCourseList:\", dataCourseList);\n _.forEach(dataCourseList, function (data) {\n data.courseTime = data.courseTime.replace(/\\/ig, ' ');\n });\n\n //console.log(\"courseColletion Raw:\",dataCourseCollection);\n console.log(\"dataCourseList:\", dataCourseList);\n _.forEach(dataCourseCollection, function (collectionItem) {\n console.log(\"collectionItem:\", collectionItem);\n var findIndex = _.findIndex(dataCourseList, { sessionId: collectionItem.collectionSessionId });\n if (findIndex >= 0) {\n resultSessionItems.push(dataCourseList[findIndex]);\n }\n // return (findIndex >= 0);\n });\n // console.log(\"courseColletion result:\",resultSessionItems);\n return resultSessionItems;\n });\n }\n\n function setTypeClass(type) {\n if (type === 'inClass') {\n return 'fa-book';\n }\n return 'fa-desktop';\n }\n\n function openCourseModal(item) {\n var modal = modalService.courseDetail(item);\n modal.result.then(function (data) {\n if (data) {\n enrollSuccess(item);\n }\n });\n }\n\n function delCollection(item) {\n var confirmDialog = modalService.confrimDialog({\n confirmContent: format(\"{0}\\r\\n{1}\", $rootScope.translate.tsunConfirmRemove, item.sessionName)\n });\n confirmDialog.result.then(function (result) {\n result = !!result;\n if (result !== true) {\n return;\n }\n trainingInnerService.delCollection(item, true).then(function () {\n remove(item);\n });\n });\n }\n\n function checkIsEmpty() {\n if (vm.data.items.length < 1) {\n vm.view.collectionEmpty = true;\n } else {\n vm.view.collectionEmpty = false;\n }\n }\n\n function remove(item) {\n var itemIndex = _.findIndex(vm.data.items, { sessionId: item.sessionId });\n if (itemIndex > -1) {\n vm.data.items.splice(itemIndex, 1);\n }\n checkIsEmpty();\n }\n\n function enrollSuccess(item) {\n trainingInnerService.delCollection(item, false).then(function () {\n remove(item);\n });\n }\n\n function enroll(item) {\n var confirmDialog = modalService.confrimDialog({\n confirmContent: $rootScope.translate.tsunEnrollInfoNoQuestion\n });\n confirmDialog.result.then(function (result) {\n result = !!result;\n if (result !== true) {\n return;\n }\n trainingInnerService.hasEnrollQuestion(item).then(function (result) {\n if (!result) {\n trainingInnerService.postSessionAction(item, 'Enroll').then(function (result) {\n if (!result) {\n return;\n }\n enrollSuccess(item);\n });\n } else {\n var settingModel = {\n isEnroll: true\n };\n var modal = modalService.courseDetail(item, settingModel);\n modal.result.then(function (data) {\n if (data) {\n enrollSuccess(item);\n }\n });\n }\n });\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('shoppingCartService', shoppingCartService);\n\n function shoppingCartService() {\n var service = {};\n //==Main==\n return service;\n //========\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunCourseController', tsunCourseController);\n\n function tsunCourseController(modalService, trainingInnerService, userInfo, urlParam, $q, $rootScope, $scope, $uibModal) {\n var vm = this;\n //vm.selectedMenu = selectedMenu;\n vm.openCourseDetail = openCourseDetail;\n vm.addToShoppingCar = addToShoppingCar;\n vm.enroll = enroll;\n vm.openCourseCategorySelector = openCourseCategorySelector;\n vm.isMobile = modalService.isMobile();\n //==Main==\n onInit();\n //========\n function onInit() {\n menuInit();\n dataInit();\n logicInit();\n\n $scope.$watch('isSmallView', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n menuSlide();\n });\n $scope.$watch('vm.data.courseListFilter.length', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n if (!newValue) {\n newValue = 0;\n }\n vm.view.courseEmpty = newValue < 1;\n });\n }\n\n function menuInit() {\n if (location.href.indexOf('sessionId') > 0 || location.href.indexOf('courseId') > 0) {\n console.log('sessionId:', queryString('sessionId'));\n console.log('courseId:', queryString('courseId'));\n var sessionId = queryString('sessionId');\n var courseId = queryString('courseId');\n\n if (!sessionId || !courseId) {\n sessionStorage.setItem('menuSerilNo', '');\n sessionStorage.setItem('menuSerilNo', -9903);\n }\n }\n }\n\n function dataInit() {\n vm.data = {\n urlParam: urlParamFormat(urlParam) || {}, //.........網頁傳入的參數\n collectionList: null,\n courseList: [], //...................................課程資料清單\n courseListFilter: [], //.............................課程資料清單於Filter處理後結果\n courseCatagories: [],\n courseCatagoriesSelectedItemName: $rootScope.translate.commonAll\n };\n vm.viewShow = {\n slides: []\n };\n vm.view = {\n isMobile: modalService.isMobile(),\n courseEmpty: false, //.........查無資料判定\n pageLoading: false, //.........頁面讀取中\n pageLoaded: false //..........頁面讀取完畢\n };\n vm.menuIndex = -1;\n vm.menuChildIndex = -1;\n }\n\n function logicInit() {\n vm.view.pageLoading = true;\n loadMenu().then(function (catagoryId) {\n menuSlide();\n if (!catagoryId) {\n return;\n }\n return loadCourseList(-1, true);\n }).then(function () {\n vm.data.courseList = _.filter(vm.data.courseList, function (courseItem) {\n var checkCourseID = vm.data.urlParam.courseid || courseItem.courseId;\n var checkSessionID = vm.data.urlParam.sessionid || courseItem.sessionId;\n // console.log(\"courseItem\", courseItem);\n // console.log(\"checkCourseID\", checkCourseID);\n // console.log(\"checkSessionID\", checkSessionID);\n return courseItem.courseId === checkCourseID && courseItem.sessionId === checkSessionID;\n });\n }).then(function () {\n vm.view.courseEmpty = vm.data.courseList.length < 1;\n vm.view.pageLoading = false;\n vm.view.pageLoaded = true;\n });\n }\n\n function urlParamFormat(sourceData) {\n if (!sourceData) {\n return null;\n }\n var params = {};\n _.forEach(sourceData, function (value, key) {\n var keyString = (key + '').toLowerCase();\n switch (keyString) {\n case 'courseid':\n params[keyString] = parseInt(value);\n break;\n case 'sessionid':\n params[keyString] = parseInt(value);\n break;\n default:\n break;\n }\n });\n return params;\n }\n\n function menuSlide() {\n var slideNum = 4;\n if ($rootScope.isSmallView) {\n slideNum = 4;\n }\n vm.viewShow.slides = _.chunk(vm.data.courseCatagories, slideNum);\n _.forEach(vm.viewShow.slides, function (slideItem) {\n for (var index = slideItem.length; index < slideNum; index++) {\n slideItem.push({\n categoryId: null\n });\n }\n });\n //console.logconsole.log('menuSlide:', vm.viewShow.slides);\n }\n\n function loadMenu(langItem) {\n //console.log('langItem:',langItem);\n return trainingInnerService.getMenu(langItem).then(function (data) {\n // console.log(\"loadMenu data:\", data);\n // data.unshift({ categoryId: \"-1\", categoryName: $rootScope.translate.commonAll });\n // console.log(\"loadMenu data:\", data);\n vm.data.courseCatagories = data;\n if (data.length < 1) {\n return null;\n }\n vm.menuIndex = -1;\n vm.menuChildIndex = -1;\n return -1;\n //return data.data[0].categoryId;\n });\n }\n\n function loadCourseList(courseCategory, loadCollection) {\n // var courseList = trainingInnerService.getCourseList(courseCategory);\n //console.log('courseCategory:',courseCategory);\n return trainingInnerService.getCourseListAll(courseCategory).then(function (courseList) {\n console.log(\"getCourseListAll:\", courseList);\n var promisList = [trainingInnerService.checkCourseWithMenu(courseList, vm.data.courseCatagories)];\n\n if (loadCollection) {\n promisList.push(loadUserCollection());\n }\n return $q.all(promisList).then(function (data) {\n //console.log(\"getCourseListAll:\", data[0]);\n return data[0]; //courseList\n });\n }).then(function (courseListChecked) {\n //console.log('vm.data.courseList:',courseListChecked);\n _.forEach(courseListChecked, function (data) {\n //console.log('sTime:',data.courseTime);\n data.courseTime = data.courseTime.replace(/\\/ig, ' ');\n //console.log('data:',data.courseTime);\n });\n vm.data.courseList = courseListChecked;\n collectionCheck();\n return courseListChecked;\n });\n }\n\n function loadUserCollection() {\n var collectionList = trainingInnerService.getCollectionList();\n return collectionList.then(function (data) {\n vm.data.collectionList = data;\n return data;\n });\n }\n // select menu\n // function selectedMenu(categoryId) {\n // // var isSameCourse =\n // // (vm.menuIndex === index) &&\n // // (vm.menuChildIndex = menuChildIndex);\n // // if (isSameCourse) {\n // // //如果再度點選篩選中的類別,就取消選取,呈現所有資料。\n // // vm.menuIndex = -1;\n // // vm.menuChildIndex = -1;\n // // loadCourseList(-1);\n // // return;\n // // }\n // // vm.menuIndex = index;\n // // vm.menuChildIndex = menuChildIndex;\n // //loadCourseList(categoryId);\n // }\n\n // select enroll\n function enroll(item) {\n console.log('enroll');\n var confirmDialog = modalService.confrimDialog({\n confirmContent: $rootScope.translate.tsunEnrollInfoNoQuestion,\n promiseAction: function promiseAction() {\n return trainingInnerService.hasEnrollQuestion(item).then(function (result) {\n if (!result) {\n return trainingInnerService.postSessionAction(item, 'Enroll').then(function (result) {\n if (!result) {\n return;\n }\n enrollSuccess(item);\n }).then(function () {\n //clear url param\n console.log('enrollSuccess');\n if (location.href.toLowerCase().indexOf('sessionid') > 0 || location.href.toLowerCase().indexOf('courseid') > 0) {\n console.log(\"current url:\", location.href);\n //2023-07-24 Johnson 資安2023\n location.href = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('`${2.3.4(\\'/#\\')[0]+\\'/#/5/6?7=\\'+8.9(\\'a\\')}`.1(//g,\\'&c\\').1(/\"/g,\\'&d\\').1(/\\'/g,\\'&#e\\').1(/[<>!]|(\\\\(\\\\))|((f|h|i)\\\\j*\\\\(.*\\\\))/g,\\'\\');', 20, 20, '|replace|location|href|split|tsu|course|menu|sessionStorage|getItem|menuSerilNo|lt|gt|quot|x27|for||while|if|s'.split('|'), 0, {}));\n }\n });\n } else {\n var settingModel = {\n isEnroll: true\n };\n var modal = modalService.courseDetail(item, settingModel);\n modal.result.then(function (result) {\n if (!result) {\n return;\n }\n enrollSuccess(item);\n }).then(function () {\n //clear url param\n console.log('enrollSuccess');\n if (location.href.toLowerCase().indexOf('sessionid') > 0 || location.href.toLowerCase().indexOf('courseid') > 0) {\n console.log(\"current url:\", location.href);\n //2023-07-24 Johnson 資安2023\n location.href = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('`${2.3.4(\\'/#\\')[0]+\\'/#/5/6?7=\\'+8.9(\\'a\\')}`.1(//g,\\'&c\\').1(/\"/g,\\'&d\\').1(/\\'/g,\\'&#e\\').1(/[<>!]|(\\\\(\\\\))|((f|h|i)\\\\j*\\\\(.*\\\\))/g,\\'\\');', 20, 20, '|replace|location|href|split|tsu|course|menu|sessionStorage|getItem|menuSerilNo|lt|gt|quot|x27|for||while|if|s'.split('|'), 0, {}));\n }\n });\n }\n });\n }\n });\n\n // confirmDialog.result.then(function(result) {\n // result = !!result;\n // if (result !== true) {\n // return;\n // }\n // trainingInnerService.hasEnrollQuestion(item).then(function(result) {\n // if (!result) {\n // trainingInnerService.postSessionAction(item, 'Enroll')\n // .then(function(result) {\n // if (!result) { return; }\n // enrollSuccess(item);\n // });\n // } else {\n // var settingModel = {\n // isEnroll: true\n // };\n // var modal = modalService.courseDetail(item, settingModel);\n // modal.result.then(function(result) {\n // if (!result) { return; }\n // enrollSuccess(item);\n // });\n // }\n // });\n // });\n }\n\n function openCourseDetail(item) {\n var modal = modalService.courseDetail(item);\n modal.result.then(function (data) {\n if (data) {\n enrollSuccess(item);\n }\n });\n }\n\n function enrollSuccess(item) {\n trainingInnerService.delCollection(item, false).then(function () {\n var itemIndex = _.findIndex(vm.data.courseList, { sessionId: item.sessionId });\n if (itemIndex > -1) {\n vm.data.courseList.splice(itemIndex, 1);\n }\n });\n }\n\n function addToShoppingCar(item) {\n trainingInnerService.addCollection(item).then(function () {\n // console.log(\"vm.data.collectionList\",vm.data.collectionList);\n if (!vm.data.collectionList) {\n vm.data.collectionList = [];\n }\n vm.data.collectionList.push({ collectionSessionId: item.sessionId });\n item.isAdd = true;\n });\n //trainingInnerService.addToShoppingCar(item);\n }\n\n function collectionCheck() {\n //console.log(\"vm.data.collectionList\", vm.data.collectionList);\n _.forEach(vm.data.courseList, function (courseItem) {\n var indexFind = _.findIndex(vm.data.collectionList, {\n collectionSessionId: courseItem.sessionId\n });\n courseItem.isAdd = indexFind >= 0;\n });\n return vm.data.courseList;\n }\n\n function openCourseCategorySelector() {\n var item = vm.data.courseCatagories;\n var result = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/courseCategorySelector.html',\n controller: 'courseCategorySelectorController as vm',\n size: 'sm',\n backdrop: 'static',\n taiClass: modalService.getTaiClass(),\n resolve: {\n categoryItem: function categoryItem() {\n return item;\n }\n }\n });\n //這個則是接收傳回來的值\n result.result.then(function (result) {\n vm.data.courseCatagoriesSelectedItemName = result[0].categoryName;\n loadCourseList(result[0].categoryId);\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('courseService', courseService);\n\n function courseService() {\n var service = {};\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunMyTrainingController', tsunMyTrainingController);\n\n function tsunMyTrainingController($q, ssoInfo, $rootScope, $timeout, $scope, modalService) {\n var vm = this;\n //==Main==\n onInit();\n //========\n function onInit() {\n vm.method = methodList();\n vm.view = viewInit();\n vm.data = dataInit();\n logicInit();\n }\n\n function dataInit() {\n var result = {\n ssoInfo: null,\n translate: $rootScope.translate\n };\n return result;\n }\n\n function viewInit() {\n var result = {\n pageLoading: false, //.........頁面讀取中\n pageLoaded: false, //..........頁面讀取完畢\n menuType: 1, //................選單顯示樣式(磚塊[1]或是下拉[2])\n isMobile: modalService.isMobile()\n };\n return result;\n }\n\n function methodList() {\n var result = {\n menuClick: menuClick\n };\n return result;\n }\n\n function logicInit() {\n // console.log(\"ssoInfo:\", ssoInfo);\n vm.menuIndex = 0;\n vm.menuList = [];\n vm.view.pageLoading = true;\n return $q.when(menuLoad()).then(function () {\n vm.view.pageLoading = false;\n vm.view.pageLoaded = true;\n vm.menuSeletedText = vm.menuList[0].name;\n if (ssoInfo) {\n vm.data.ssoInfo = ssoInfo;\n } else {\n //另外取得使用者資訊。\n }\n $scope.$watch('isSmallView', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n menuNameEdit();\n });\n });\n }\n\n function menuLoad() {\n vm.menuList = [{ id: 1, name: '', nameValue: $rootScope.translate.tsunRepairProject }, { id: 2, name: '', nameValue: $rootScope.translate.tsunCourseLog }, { id: 3, name: '', nameValue: $rootScope.translate.tsunFinancial }, { id: 4, name: '', nameValue: $rootScope.translate.tsunExterior }, { id: 5, name: '', nameValue: $rootScope.translate.tsunBankBook }];\n menuStyleChange();\n menuNameEdit();\n }\n\n function menuStyleChange() {\n var langSelected = sessionStorage.getItem('langCode');\n switch (langSelected) {\n case '1':\n case '2':\n vm.view.menuType = 1;\n break;\n default:\n vm.view.menuType = 2;\n break;\n }\n }\n\n function menuClick(index) {\n vm.menuIndex = index;\n //console.log('menuIndex:', vm.menuIndex);\n }\n\n function menuNameEdit() {\n if (vm.menuList.length < 1) {\n return;\n }\n var langSelected = sessionStorage.getItem('langCode');\n _.forEach(vm.menuList, function (menuItem) {\n var nameLength = menuItem.nameValue.length;\n var position = 0;\n if (!$rootScope.isSmallView) {\n menuItem.name = menuItem.nameValue;\n return;\n }\n switch (langSelected) {\n case '1':\n case '2':\n //中文處理\n var numLineChange = 2;\n menuItem.name = '';\n do {\n if (nameLength - position > numLineChange) {\n menuItem.name += menuItem.nameValue.substr(position, numLineChange);\n menuItem.name += '
';\n } else {\n menuItem.name += menuItem.nameValue.substr(position, nameLength - position);\n }\n position += numLineChange;\n } while (nameLength - position > 0);\n break;\n default:\n menuItem.name = menuItem.nameValue;\n //外語處理\n break;\n }\n });\n }\n\n /* 漢堡選單click事件 */\n var menuSerilNo = parseInt(getMenuQueryString());\n //console.log('train index menu:', menuSerilNo);\n //待修\n if (menuSerilNo === -9901) {\n menuClick(0);\n }\n //修課紀錄\n if (menuSerilNo === -9906) {\n menuClick(1);\n }\n //金融 先跳過\n if (menuSerilNo === -9991 || menuSerilNo === -9992 || menuSerilNo === -9993) {\n menuClick(2);\n }\n //外訓\n if (menuSerilNo === -9904) {\n menuClick(3);\n }\n //存摺\n if (menuSerilNo === -9907) {\n menuClick(4);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMyTrainingBankBook', taiMyTrainingBankBook);\n\n function taiMyTrainingBankBook() {\n var directive = {\n bindToController: true,\n controller: taiMyTrainingBankBookController,\n controllerAs: 'vm',\n restrict: 'E',\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.bankBook.html',\n scope: {\n isFocus: '='\n }\n };\n return directive;\n }\n /* @ngInject */\n function taiMyTrainingBankBookController($q, trainingInnerService, $scope, $uibModal, modalService) {\n var vm = this;\n vm.yearChanged = yearChanged;\n vm.openYearSelector = openYearSelector;\n vm.isMobile = modalService.isMobile();\n onInit();\n\n function onInit() {\n vm.data = dataInit();\n vm.view = viewInit();\n $scope.$watch('vm.isFocus', function (newValue) {\n if (newValue === true) {\n logicInit();\n }\n });\n }\n\n function dataInit() {\n var result = {\n years: [], //........年度下拉清單的矩陣\n year: 1970, //.......選取的年度\n remainPoint: 0, //...剩餘存摺點數\n bankBook: [] //.....當年度花費點數的課程\n };\n return result;\n }\n\n function viewInit() {\n var result = {\n bankBookEmpty: false, //.......訓練存摺點數為空\n isInited: false, //............是否被初始化過\n pageLoaded: false, //..........頁面讀取完畢\n pageLoading: false //.........頁面讀取中\n };\n return result;\n }\n\n function logicInit() {\n vm.view.pageLoaded = false;\n vm.view.pageLoading = true;\n //=====\n var promiseEvt = function () {\n vm.view.isInited = true;\n vm.data.years = trainingInnerService.getYears(2011);\n vm.data.year = vm.data.years[0];\n }();\n $q.when(promiseEvt).then(function () {\n return yearChanged();\n }).then(function () {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n });\n }\n\n function loadBankBook(year) {\n // return trainingInnerService.loadLangs()\n // .then(function (langs) {\n // var bankBookItem = {\n // remainPoint: null,\n // bankBook: []\n // };\n // var promiseList = [];\n // _.forEach(langs, function (lang) {\n // promiseList.push(trainingInnerService.getBankBook(year, lang.langCode));\n // });\n // return $q.all(promiseList).then(function (data) {\n // _.forEach(data, function (perReceiveData) {\n // if (!bankBookItem.remainPoint) {\n // bankBookItem.remainPoint = perReceiveData.remainPoint;\n // }\n // Array.prototype.push.apply(bankBookItem.bankBook, perReceiveData.bankBook);\n // });\n // return bankBookItem;\n // });\n // });\n return trainingInnerService.getBankBook(year, sessionStorage.getItem(\"userLang\"));\n }\n\n function yearChanged() {\n vm.view.pageLoaded = false;\n vm.view.pageLoading = true;\n //======\n var result = loadBankBook(vm.data.year).then(function (bankBookItem) {\n if (!bankBookItem) {\n vm.data.remainPoint = 0;\n vm.data.bankBook = {};\n vm.view.bankBookEmpty = true;\n return;\n }\n //取代sessionTime中的
\n // _.forEach(bankBookItem, function(data) {\n // console.log('sTime:',data);\n // // data.courseTime = data.courseTime.replace(/\\/ig, ' ');\n // // console.log('data:',data.courseTime);\n // });\n vm.data.remainPoint = bankBookItem.remainPoint;\n vm.data.bankBook = bankBookItem.bankBook;\n vm.view.bankBookEmpty = bankBookItem.bankBook.length < 1;\n return true;\n }).then(function () {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n });\n return result;\n }\n\n function openYearSelector() {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n\n var result = modalService.openOptionSelector(vm.data.years, 'yrSelect', false);\n\n //這個則是接收傳回來的值\n result.result.then(function (data) {\n vm.data.year = data;\n loadBankBook(vm.data.year).then(function (bankBookItem) {\n if (!bankBookItem) {\n vm.data.remainPoint = 0;\n vm.data.bankBook = {};\n vm.view.bankBookEmpty = true;\n return;\n }\n vm.data.remainPoint = bankBookItem.remainPoint;\n vm.data.bankBook = bankBookItem.bankBook;\n vm.view.bankBookEmpty = bankBookItem.bankBook.length < 1;\n return true;\n }).then(function () {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n });\n });\n return result;\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMyTrainingCourseLog', taiMyTrainingCourseLog);\n\n function taiMyTrainingCourseLog() {\n var directive = {\n bindToController: true,\n controller: taiMyTrainingCourseLogController,\n controllerAs: 'vm',\n restrict: 'E',\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.courseLog.html',\n scope: {\n isFocus: '=',\n translatePool: '='\n }\n };\n return directive;\n }\n /* @ngInject */\n function taiMyTrainingCourseLogController(trainingInnerService, $q, $scope, modalService) {\n var vm = this;\n // 1.8.2 父層參數 data 無法直接從 scope 引入\n vm.translatePool = $scope.$parent.vm.data.translatePool;\n onInit();\n function onInit() {\n vm.isMobile = modalService.isMobile();\n vm.openYearSelector = openYearSelector;\n //vm.openTime = openTime;\n vm.yearChange = yearChange;\n vm.statusConvert = statusConvert;\n vm.method = methodList(); //找機會要把上面的設定移到這裡\n //======\n vm.data = dataInit();\n vm.view = viewInit();\n //======\n $scope.$watch('vm.data.courseLogFilter.length', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n if (!newValue) {\n newValue = 0;\n }\n vm.view.courseLogEmpty = newValue < 1;\n });\n $scope.$watch('vm.isFocus', function (newValue) {\n if (newValue === true) {\n logicInit();\n }\n });\n }\n\n function dataInit() {\n var result = {\n courseLogSource: [],\n courseLog: [],\n courseLogFilter: []\n };\n\n return result;\n }\n\n function viewInit() {\n var result = {\n courseLogEmpty: false, //.........查無資料判定\n isInited: false, //............是否被初始化過\n pageLoaded: false, //..........頁面讀取完畢\n pageLoading: false //.........頁面讀取中\n };\n return result;\n }\n\n function methodList() {\n var result = {\n filterSessionTimeByYear: filterSessionTimeByYear\n };\n return result;\n }\n\n function logicInit() {\n vm.view.isInited = true;\n vm.view.pageLoaded = false;\n vm.view.pageLoading = true;\n //======\n return trainingInnerService.getCourseLog(sessionStorage.getItem(\"userLang\")).then(function (courseLog) {\n //取代
\n _.forEach(courseLog, function (data) {\n //console.log('sTime:',data.sessionTime);\n data.sessionTime = data.sessionTime.replace(/\\/ig, ' ');\n //console.log('data:',data.sessionTime);\n });\n //console.log('courseLog:', courseLog);\n vm.data.courseLogSource = courseLog;\n vm.years = trainingInnerService.getYears(2011);\n vm.year = vm.years[0];\n getCourseLog();\n return true;\n }).then(function () {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n });\n }\n\n function filterSessionTimeByYear(year) {\n return _.filter(vm.data.courseLogSource, function (o) {\n return o.sessionTime.indexOf(year) !== -1;\n });\n }\n\n function getCourseLog() {\n vm.data.courseLog = vm.method.filterSessionTimeByYear(vm.year);\n vm.view.courseLogEmpty = vm.data.courseLog.length < 1;\n }\n\n function yearChange(year) {\n vm.year = year;\n getCourseLog();\n }\n\n function statusConvert(statusCode) {\n if (!statusCode && statusCode !== 0) {\n return '';\n }\n switch (statusCode + '') {\n case '-1':\n return vm.translatePool.tsunPassStatusValueNotCourage;\n case '0':\n return vm.translatePool.tsunPassStatusValueNA;\n case '1':\n return vm.translatePool.tsunPassStatusValueExemption;\n case '2':\n return vm.translatePool.tsunPassStatusValueOK;\n case '3':\n return vm.translatePool.tsunPassStatusValueNotOK;\n default:\n return '';\n }\n }\n\n function openYearSelector() {\n var result = modalService.openOptionSelector(vm.years, 'yrSelect', false);\n //這個則是接收傳回來的值\n result.result.then(function (data) {\n vm.year = data;\n getCourseLog();\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMyTrainingExterior', taiMyTrainingExterior);\n\n function taiMyTrainingExterior() {\n var directive = {\n bindToController: true,\n controller: taiMyTrainingExteriorController,\n controllerAs: 'vm',\n restrict: 'E',\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.exterior.html',\n scope: {\n isFocus: '=',\n translatePool: '='\n }\n };\n return directive;\n }\n /* @ngInject */\n function taiMyTrainingExteriorController(trainingInnerService, $uibModal, $q, modalService, $rootScope, $scope) {\n var vm = this;\n // 1.8.2 父層參數 data 無法直接從 scope 引入\n vm.translatePool = $scope.$parent.vm.data.translatePool;\n //===Main===\n onInit();\n //==========\n function onInit() {\n //===\n vm.mustRemark = false;\n vm.submit = submit;\n vm.openOrganizer = openOrganizer;\n vm.removeOrganizer = removeOrganizer;\n vm.removeTime = removeTime;\n vm.openTime = openTime;\n vm.plusTotalPricer = plusTotalPricer;\n vm.openApplicationFormTypeSelector = openApplicationFormTypeSelector;\n vm.method = methodList(); //有一天要把上面這些設定移到這裡\n vm.isMobile = modalService.isMobile();\n //===\n vm.applicationForm = applicationFormInit();\n vm.data = dataInit();\n vm.view = viewInit();\n vm.UserAccount = $rootScope.userInfo.userAccount;\n //===\n $scope.$watch('vm.isFocus', function (newValue) {\n if (newValue === true && vm.view.isInited === false) {\n logicInit();\n }\n });\n }\n\n function logicInit() {\n vm.view.isInited = true;\n vm.view.pageLoaded = false;\n vm.view.pageLoading = true;\n //=====\n var exteriorData = trainingInnerService.getExterior();\n var Externaltype = trainingInnerService.getExternaltype();\n //console.log('Externaltype:',Externaltype);\n var currency = trainingInnerService.getCurrency();\n $q.all([exteriorData, Externaltype, currency]).then(function (data) {\n // 皆需排除掉第一筆資料: ALL - 1\n\n vm.data.exteriorData = _.filter(data[0], function (o) {\n return o.id !== -1;\n });\n // vm.data.type = _.filter(data[1], function(o) {\n // return o.id !== -1;\n // });\n vm.data.type = data[1][0];\n vm.data.currency = _.filter(data[2], function (o) {\n return o.id !== -1;\n });\n\n // 設置預設選取第一個 radio btn\n vm.applicationForm.currency = _.head(vm.data.currency).id;\n }).then(function () {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n });\n }\n\n function methodList() {\n var result = {};\n return result;\n }\n\n function viewInit() {\n var result = {\n isInited: false, //............是否被初始化過\n pageLoaded: false, //..........頁面讀取完畢\n pageLoading: false //.........頁面讀取中\n };\n return result;\n }\n\n function dataInit() {\n var result = {\n organizer: [],\n exteriorData: null,\n type: null,\n currency: null,\n dateSettingList: [],\n organizerOther: 413\n };\n return result;\n }\n\n function applicationFormInit() {\n var result = {\n Name: null,\n type: null,\n Outline: null,\n Place: null,\n currency: null,\n organizer: [],\n times: null,\n dateSettingList: [],\n Remark: '',\n coursePrice: 0,\n travelPrice: 0,\n totalPrice: 0,\n allowance: 0\n };\n return result;\n }\n\n function submit() {\n if (vm.mustRemark && !vm.applicationForm.Remark) {\n vm.form1.$valid = false;\n }\n if (vm.form1.$valid === false) {\n toastr.warning(vm.translatePool.tsunFormMsgRequiredEmpty);\n return;\n }\n\n if (vm.data.organizer !== null) {\n vm.applicationForm.organizer = vm.data.organizer;\n }\n vm.applicationForm.dateSettingList = angular.copy(vm.data.dateSettingList);\n //======\n var exteriorType = angular.copy(vm.applicationForm.type) || {};\n var isAllowance = exteriorType.allowanceRate > 0;\n var isFeeEmpty = vm.applicationForm.totalPrice < 1;\n //=====\n if (isAllowance && isFeeEmpty) {\n //TODO:多國語系(英文)\n var errorMsgEmptyFee = format(vm.translatePool.tsunErrorExternalApplicateEmptyFee);\n toastr.warning(errorMsgEmptyFee);\n return;\n }\n var thisYear = new Date().getFullYear();\n trainingInnerService.getBankBook(thisYear, sessionStorage.getItem(\"userLang\")).then(function (bankBookData) {\n if (bankBookData) {\n var recentPoint = parseInt(bankBookData.remainPoint) || 0;\n var allowance = vm.applicationForm.allowance || 0;\n //=====\n var isPointEmpty = recentPoint < 1;\n if (isAllowance && isPointEmpty) {\n //TODO:多國語系(英文)\n var errorMsgEmptyPoint = format(vm.translatePool.tsunErrorExternalApplicateAllowance, allowance + '');\n toastr.warning(errorMsgEmptyPoint);\n return;\n }\n //=====\n if (isAllowance) {\n var confirmText = format(vm.translatePool.tsunConfirmExternalApplicate, recentPoint + '', allowance + '');\n var confirmDialog = modalService.confrimDialog({\n confirmContent: confirmText.replace(/,/g, \"
\")\n });\n confirmDialog.result.then(function (result) {\n result = !!result;\n if (result !== true) {\n return;\n }\n postFormData();\n });\n } else {\n postFormData();\n }\n }\n });\n }\n\n function postFormData() {\n var data = angular.copy(vm.applicationForm.dateSettingList);\n console.log('vm.applicationForm:', data);\n trainingInnerService.postExterior(vm.applicationForm).then(function (result) {\n if (result) {\n postExteriorSuccess();\n }\n });\n }\n\n function postExteriorSuccess() {\n var Externaltype = trainingInnerService.getExternaltype();\n vm.form1.$submitted = false;\n vm.data.organizer = [];\n vm.data.dateSettingList = [];\n vm.applicationForm.Name = '';\n\n //修正送出第二張申請單時,type選擇錯誤\n vm.data.type = Externaltype[0];\n vm.applicationForm.type = Externaltype[0];\n\n vm.applicationForm.Outline = '';\n vm.applicationForm.Place = '';\n vm.applicationForm.coursePrice = 0;\n vm.applicationForm.travelPrice = 0;\n vm.applicationForm.totalPrice = 0;\n vm.applicationForm.allowance = 0;\n vm.applicationForm.Remark = '';\n //vm.applicationForm.currency = vm.data.currency[0];\n vm.applicationForm.organizer = [];\n vm.applicationForm.times = null;\n vm.applicationForm.dateSettingList = [];\n }\n\n function openOrganizer() {\n var organizerResult = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingOrganizerModal.html',\n controller: 'myTrainingOrganizerModalController as vm',\n size: 'lg',\n taiClass: modalService.getTaiClass(),\n resolve: {\n params: function params() {\n return vm.data.exteriorData;\n },\n choiceList: function choiceList() {\n return vm.data.organizer;\n }\n }\n });\n organizerResult.rendered.then(function () {\n var modalBootstrap = $(\".modal-open > .modal\");\n var modalBootstrapContent = modalBootstrap.find(\"> .modal-dialog > .modal-content \");\n if (!modalBootstrap) {\n return;\n }\n var footerDiv = modalBootstrap.find(\".footer\");\n var showDiv = modalBootstrap.find(\"#content\");\n var buttonShowTrigger = false;\n //====\n renderInit();\n //====\n function renderInit() {\n buttonHide();\n adjustOrgNameWidth();\n $(document).off('submitSearchEnd').on('submitSearchEnd', function () {\n adjustOrgNameWidth();\n });\n $(document).off('submitSearchStart').on('submitSearchStart', function () {\n buttonShowTrigger = false;\n buttonHide();\n });\n $(document).off('checkboxClick').on('checkboxClick', function (event, triggerResult) {\n // console.log(\"listen checkboxClick ,trigger:\", triggerResult);\n buttonShowTrigger = !!triggerResult;\n checkboxEvent();\n });\n modalBootstrap.scroll(function () {\n scrollEvent();\n });\n }\n\n function adjustOrgNameWidth() {\n var allShowArea = modalBootstrapContent.find('.organizerNameShowArea');\n allShowArea.css(\"max-width\", modalBootstrapContent.width() - 70 + \"px\");\n }\n\n function scrollEvent() {\n checkButtonCanShow();\n }\n\n function checkboxEvent() {\n checkButtonCanShow();\n }\n\n function buttonHide() {\n if (!footerDiv) {\n return;\n }\n footerDiv.css({ \"display\": \"none\" });\n footerDiv.find('a,button').css({ \"display\": \"none\" });\n $(document).trigger('floatButtonDisplay', [false]);\n }\n\n function checkButtonCanShow() {\n // 改變Footer樣式,使其保持在最下面。\n var paddingHeight = 30;\n var checkHeight = showDiv.height() - modalBootstrap.height() - paddingHeight;\n var buttonInContent = checkHeight > modalBootstrap.scrollTop();\n // console.log(\"showDiv:\",showDiv);\n // console.log(\"modalBootstrap.scrollTop()\", modalBootstrap.scrollTop());\n // console.log(\"checkHeight\", checkHeight);\n // console.log(\"buttonShowTrigger\", buttonShowTrigger);\n // console.log(\"buttonShowTrigger\", buttonInContent);\n if (buttonInContent && buttonShowTrigger) {\n buttonShow();\n } else {\n buttonHide();\n }\n }\n\n function buttonShow() {\n if (!footerDiv) {\n return;\n }\n footerDiv.find('a,button').css({\n \"position\": \"relative\",\n \"display\": \"inline-block\",\n \"left\": \"-50%\"\n });\n var topLocation = modalBootstrap.height() + modalBootstrap.scrollTop() - footerDiv.outerHeight() * 2;\n footerDiv.css({\n \"display\": \"inline-block\",\n \"position\": \"absolute\",\n \"top\": topLocation,\n \"left\": \"50%\",\n // \"right\": \"0px\",\n \"margin-left\": \"auto\",\n \"margin-right\": \"auto\"\n });\n $(document).trigger('floatButtonDisplay', [true]);\n }\n });\n //這個則是接收傳回來的值\n organizerResult.result.then(function (data) {\n _.forEach(data, function (item) {\n if (_.findIndex(vm.data.organizer, { \"id\": item.id }) < 0) {\n vm.data.organizer.push(angular.copy(item));\n }\n });\n vm.mustRemark = _.findIndex(vm.data.organizer, { \"id\": vm.data.organizerOther }) > -1;\n });\n }\n\n function removeOrganizer(item) {\n var index = _.findIndex(vm.data.organizer, { \"id\": item.id });\n if (index < 0) {\n return;\n }\n\n var confirmDialog = modalService.confrimDialog({\n confirmContent: format(\"{0}\\r\\n{1}\", vm.translatePool.tsunConfirmRemove, item.name)\n });\n confirmDialog.result.then(function (result) {\n result = !!result;\n if (result !== true) {\n return;\n }\n vm.data.organizer.splice(index, 1);\n });\n }\n\n function openTime() {\n console.log(\"beforeSelect vm.data.dateSettingList\", vm.data.dateSettingList);\n var result = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingExteriorTimeModal.html',\n controller: 'myTrainingExteriorTimeModalController as vm',\n size: 'lg',\n backdrop: 'static',\n taiClass: modalService.getTaiClass(),\n resolve: {\n saveList: function saveList() {\n return vm.data.dateSettingList;\n }\n }\n });\n\n //這個則是接收傳回來的值\n result.result.then(function (data) {\n vm.data.dateSettingList = data;\n console.log(\"vm.data.dateSettingList\", vm.data.dateSettingList);\n });\n }\n\n // function caculateDuringTime(lisTime) {\n // var duringTimes = 0;\n // if (lisTime) {\n // _.forEach(lisTime, function (item) {\n // duringTimes += item.duringTimes;\n // });\n // }\n // if (!duringTimes) {\n // duringTimes = 0;\n // }\n // // 將時間格式化產出\n // return parseInt(duringTimes / 1000 / 60 / 60) + '.' + parseInt((duringTimes / 1000 / 60 % 60) * 100 / 60);\n // }\n\n function removeTime() {\n // var removeConfirm = confirm('確定要刪除?');\n // if (removeConfirm) {\n // _.forEach(vm.times.selected, function (item) {\n // var index = _.findIndex(vm.times, function (x) {\n // return x === item;\n // });\n // vm.times.splice(index, 1);\n // });\n // }\n // vm.timesCountString = caculateDuringTime(data);\n }\n\n function plusTotalPricer() {\n vm.applicationForm.totalPrice = vm.applicationForm.coursePrice + vm.applicationForm.travelPrice;\n if (vm.applicationForm.type) {\n var allowanceRate = vm.applicationForm.type.allowanceRate || 0;\n allowanceRate = allowanceRate;\n vm.applicationForm.allowance = Math.round(vm.applicationForm.totalPrice * allowanceRate / 100);\n }\n }\n\n function openApplicationFormTypeSelector() {\n var result = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/applicationFormTypeSelector.html',\n controller: 'applicationFormTypeSelectorController as vm',\n size: 'sm',\n backdrop: 'static',\n taiClass: modalService.getTaiClass()\n });\n //這個則是接收傳回來的值\n result.result.then(function (result) {\n vm.data.type = result;\n vm.applicationForm.type = result;\n plusTotalPricer();\n });\n }\n }\n})();\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMyTrainingFinancial', taiMyTrainingFinancial);\n\n Module.filter('licensesFlter', function () {\n //處理結果的格式化.\n return function (dataList, keyValue) {\n //==\n keyValue = keyValue || '';\n keyValue = (keyValue + '').toLowerCase();\n //==\n var result = [];\n var regExpCompare = new RegExp(keyValue, \"g\");\n _.forEach(dataList, function (perItem) {\n var compareString = perItem.name || '';\n if (compareString.toLowerCase().match(regExpCompare)) {\n result.push(angular.copy(perItem));\n }\n });\n if (result.length < 1) {\n result.push({\n name: '查無此證照名稱',\n id: -1\n });\n }\n return result;\n };\n });\n\n function taiMyTrainingFinancial() {\n var directive = {\n bindToController: true,\n controller: taiMyTrainingFinancialController,\n controllerAs: 'vm',\n restrict: 'E',\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.financial.html',\n scope: {\n translatePool: '=',\n isFocus: '=',\n ssoInfo: '='\n }\n };\n return directive;\n }\n /* @ngInject */\n function taiMyTrainingFinancialController($uibModal, $scope, modalService, trainingInnerService, $rootScope, $q, finacialLicicense, $timeout) {\n var vm = this;\n // 1.8.2 父層參數 data 無法直接從 scope 引入\n vm.translatePool = $scope.$parent.vm.data.translatePool;\n vm.ssoInfo = $scope.$parent.vm.data.ssoInfo;\n //===Main===\n onInit();\n //==========\n function onInit() {\n //console.log('onInit');\n vm.finacialLicicense = finacialLicicense;\n vm.submit = submit;\n vm.effectiveChange = effectiveChange;\n vm.openCertificateStatusSelector = openCertificateStatusSelector;\n vm.openCertificateTypeSelector = openCertificateTypeSelector;\n vm.openCourseListSelector = openCourseListSelector;\n vm.licenseKeyUp = licenseKeyUp;\n vm.certificateChange = certificateChange;\n vm.courseListSelectChange = courseListSelectChange;\n vm.getcourseList = getcourseList;\n vm.licenseBlur = licenseBlur;\n //vm.method = methodList(); //找機會要把上面的設定移到這裡\n //=======\n vm.financial = {};\n // console.log(\"taiMyTrainingFinancial onInit()\");\n vm.isMobile = modalService.isMobile();\n //vm.isMobile=true;\n vm.menuNo = parseInt(getMenuQueryString());\n vm.data = dataInit();\n vm.view = viewInit();\n\n vm.UserInfo = vm.ssoInfo.cName + \"(\" + vm.ssoInfo.empId + \")\";\n vm.UserDept = vm.ssoInfo.depName;\n vm.tabChange = tabChange;\n //console.log(\"82===>\");\n\n\n $scope.$watch('vm.data.financialFilter.length', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n if (!newValue) {\n newValue = 0;\n }\n vm.view.recordEmpty = newValue < 1;\n //console.log(\"89===>\");\n });\n $scope.$watch('vm.data.authorizedHoursFilter.length', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n if (!newValue) {\n newValue = 0;\n }\n vm.view.licienceEmpty = newValue < 1;\n //console.log(\"95===>\");\n });\n $scope.$watch('vm.isFocus', function (newValue) {\n //console.log(\"98===>\" + newValue);\n if (newValue === true) {\n logicInit();\n }\n });\n }\n\n function dataInit() {\n //console.log('dataInit');\n var result = {\n //tabIndex: 0, //................選單序號\n financial: [], //..............證照紀錄API回傳清單\n financialFilter: [], //........證照紀錄於Filter處理後結果\n authorizedHours: [], //........證照認列時數API回傳清單\n authorizedHoursFilter: [] //..證照認列時數於Filter處理後結果\n };\n return result;\n }\n\n function viewInit() {\n //console.log('viewInit');\n var result = {\n recordEmpty: false, //..............證照紀錄資料為空\n licienceEmpty: false, //.............證照認列時數為空\n isInited_Page1: false, //............是否被初始化過(Page1)\n pageLoaded_Page1: false, //..........頁面讀取完畢(Page1)\n pageLoading_Page1: false, //.........頁面讀取中(Page1)\n isInited_Page2: false, //............是否被初始化過(Page2)\n pageLoaded_Page2: false, //..........頁面讀取完畢(Page2)\n pageLoading_Page2: false, //.........頁面讀取中(Page2)\n isInited_Page3: false, //............是否被初始化過(Page3)\n pageLoaded_Page3: false, //..........頁面讀取完畢(Page3)\n pageLoading_Page3: false //.........頁面讀取中(Page3)\n };\n return result;\n }\n\n function logicInit() {\n // /* 漢堡選單click事件 */\n //console.log('logicInit ', vm.menuNo);\n\n if (vm.menuNo === -9991) {\n vm.data.tabIndex = 0;\n }\n if (vm.menuNo === -9992) {\n vm.data.tabIndex = 1;\n }\n if (vm.menuNo === -9993) {\n vm.data.tabIndex = 2;\n }\n\n switch (vm.data.tabIndex) {\n case 0:\n return logicInit_Page1();\n case 1:\n return logicInit_Page2();\n case 2:\n return logicInit_Page3();\n default:\n break;\n }\n }\n\n function logicInit_Page1() {\n //console.log('logicInit_Page1');\n // if (vm.view.isInited_Page1 === true) {\n // return;\n // }\n vm.view.isInited_Page1 = true;\n vm.view.pageLoaded_Page1 = false;\n vm.view.pageLoading_Page1 = true;\n //========\n var promiseList = [trainingInnerService.getFinancial(-1), // 證書記錄(資料)\n trainingInnerService.getEffectives()];\n return $q.all(promiseList).then(function (receiveData) {\n vm.data.financial = receiveData[0];\n vm.data.effectives = receiveData[1];\n }).then(function () {\n _.forEach(vm.data.financial, function (item) {\n item.workflow = workflowFormat(item);\n });\n\n vm.view.recordEmpty = vm.data.financial.length < 1;\n vm.effective = vm.data.effectives[0]; // 預設為全部\n }).then(function () {\n //===\n vm.view.pageLoaded_Page1 = true;\n vm.view.pageLoading_Page1 = false;\n //以menu來選定tab\n $timeout(function () {\n $scope.activeTabIndex = 0;\n });\n });\n }\n\n function logicInit_Page2() {\n //console.log('logicInit_Page2');\n if (vm.view.isInited_Page2 === true) {\n return;\n }\n vm.view.isInited_Page2 = true;\n vm.view.pageLoaded_Page2 = false;\n vm.view.pageLoading_Page2 = true;\n //========\n var promiseList = [trainingInnerService.getCertificateType()];\n //console.log('promiseList :', promiseList);\n return $q.all(promiseList).then(function (receiveData) {\n vm.data.certificateType = receiveData[0];\n }).then(function () {\n vm.certificate = vm.data.certificateType[0];\n //console.log('init vm.certificate :', vm.certificate);\n certificateChange();\n //以menu來選定tab\n $timeout(function () {\n $scope.activeTabIndex = 1;\n });\n vm.view.pageLoaded_Page2 = true;\n vm.view.pageLoading_Page2 = false;\n });\n }\n\n function logicInit_Page3() {\n //console.log('logicInit_Page3');\n // if (vm.view.isInited_Page3 === true) {\n // return;\n // }\n vm.view.isInited_Page3 = true;\n vm.view.pageLoaded_Page3 = false;\n vm.view.pageLoading_Page3 = true;\n //========\n var promiseList = [trainingInnerService.getAuthorizedHours()];\n return $q.all(promiseList).then(function (receiveData) {\n vm.data.authorizedHours = receiveData[0];\n //console.log(receiveData);\n }).then(function () {\n //內訓課程類別名稱\n var courseTypeInternal = vm.translatePool.tsunInternalCourse;\n //外訓課程類別名稱\n var courseTypeExternal = vm.translatePool.tsunExternalCourse;\n _.forEach(vm.data.authorizedHours, function (item) {\n //console.log(item);\n //證照時數可修課程清單\n // var regExFormat1 = /(\\([^\\(^\\)]*\\))/g;//.....去除括弧內資料\n // var regExFormat2 = /([\\d]*-?[\\d]*)/g;//......去除開始時間設定\n getcourseList(item).then(function (data) {\n item.courseList = _.filter(data, function (courseItem) {\n //外訓資料要回公司找經辦人員申請\n return courseItem.courseType !== 3;\n });\n //console.log('Init courseItem:', item.courseList);\n item.courseListGroup = _.chain(item.courseList).groupBy(\"courseId\").map(function (courseList) {\n _.forEach(courseList, function (courseItem, index) {\n courseItem.groupByIndex = index + 1;\n courseItem.showName = courseItem.sessionName || '';\n });\n }).value();\n if (item.courseList.length < 1) {\n item.courseList.unshift({\n //空的內訓資料,查無資料時補上\n courseId: -1,\n courseType: 1,\n showName: vm.translatePool.tsunEmptyCourse\n });\n }\n item.courseList.unshift({\n //空的外訓資料,用來顯示台新罐頭文字\n courseId: -3,\n courseType: 3,\n showName: vm.translatePool.tsunExternalCourseNotAllowForWeb\n });\n // tsunEmptyCourse\n _.forEach(item.courseList, function (courseItem) {\n if (courseItem.courseType !== 3) {\n courseItem.groupName = courseTypeInternal;\n if (courseItem.fcAuthHours) {\n courseItem.showName = courseItem.showName || '';\n courseItem.showName = courseItem.showName + \"(\" + courseItem.fcAuthHours + \"小時)\";\n }\n } else {\n courseItem.groupName = courseTypeExternal;\n }\n });\n });\n });\n }).then(function () {\n //取代時數為空的資料\n _.forEach(vm.data.authorizedHours, function (data) {\n if (data.trainingEndDate.length < 1) {\n data.trainingEndDate = data.trainingEndDate.replace('', '~');\n }\n });\n //以menu來選定tab\n $timeout(function () {\n $scope.activeTabIndex = 2;\n });\n vm.view.licienceEmpty = vm.data.authorizedHours.length < 1;\n vm.view.pageLoaded_Page3 = true;\n vm.view.pageLoading_Page3 = false;\n });\n }\n\n function workflowFormat(financialItem) {\n //console.log('workflowFormat');\n // workflow 整理\n var result = '';\n var checkList = ['workflowItem', 'workflowReason'];\n if (!financialItem) {\n return '';\n }\n _.forEach(checkList, function (propName) {\n if (!financialItem[propName]) {\n financialItem[propName] = '';\n }\n });\n\n if (financialItem.workflowItem !== '') {\n result += format(\"
  • {0}
  • \", financialItem.workflowItem);\n }\n if (financialItem.workflowReason !== '') {\n result += format(\"
  • {0}
  • \", financialItem.workflowReason);\n }\n if (result.length > 0) {\n result = format(\"
      {0}
    \", result);\n }\n return result;\n }\n\n function getcourseList(licensesItem) {\n console.log('getcourseList');\n return trainingInnerService.getAuthorizedHoursCourse(licensesItem, sessionStorage.getItem(\"userLang\"));\n }\n\n function submit() {\n // console.log(\"vm.financial.getDay\", vm.financial.getDay);\n // console.log('vm.form1.$valid:',vm.form1.$valid);\n if (vm.form1.$valid) {\n trainingInnerService.postFinancial(vm.financial).then(function (result) {\n if (!result) {\n return;\n }\n postFinancialSucess();\n toastr.success(vm.translatePool.tsunSendSuccess);\n });\n } else {\n toastr.warning(vm.translatePool.tsunFormMsgRequiredEmpty);\n }\n }\n\n function postFinancialSucess() {\n //console.log('postFinancialSucess');\n vm.form1.$submitted = false;\n vm.financial.licenses = null;\n vm.financial.licensesNO = null;\n vm.financial.getDay = '';\n vm.financial.otherMark = null;\n }\n // 證照狀態 change 事件\n function effectiveChange(result) {\n //console.log('effectiveChange');\n var status = result.id;\n //var status = vm.effective.id;\n trainingInnerService.getFinancial(status).then(function (data) {\n vm.data.financial = data;\n _.forEach(vm.data.financial, function (item) {\n item.workflow = workflowFormat(item);\n });\n });\n }\n\n // 證照名稱欄位 key up 事件\n function licenseKeyUp() {\n // 因為找不到popup的display來源,所以手動show\n //console.log('licenseKeyUp');\n $('[uib-typeahead-popup].dropdown-menu').show();\n }\n\n // 證照類別 change 事件\n function certificateChange() {\n // console.log('certificateChange');\n // console.log(\"vm.certificate\", vm.certificate);\n trainingInnerService.getLicensesNames(vm.certificate.id).then(function (data) {\n //console.log('certificateChange',data);\n vm.data.licensesNames = data;\n });\n vm.financial.licenses = [];\n }\n\n // 認列時數,可參與之課程清單 change 事件\n function courseListSelectChange(List, item) {\n //console.log('courseListSelectChange');\n // console.log('before change List:', List);\n // console.log('before change item:', item);\n if (!item) {\n return;\n }\n if (!item.sessionId) {\n return;\n }\n var modal = modalService.courseDetail(item, null, 2);\n modal.result.then(function (data) {\n if (data) {\n enrollSuccess(List, item);\n }\n });\n //console.log('after change:', item);\n }\n\n function enrollSuccess(List, item) {\n //console.log('enrollSuccess');\n var itemIndex = _.findIndex(List, { sessionId: item.sessionId });\n if (itemIndex > -1) {\n List.splice(itemIndex, 1);\n }\n }\n\n function tabChange(index) {\n //console.log('tabChange');\n if (vm.menuNo === -9991 || vm.menuNo === -9992 || vm.menuNo === -9993) return;\n vm.data.tabIndex = index;\n switch (vm.data.tabIndex) {\n case 0:\n logicInit_Page1();\n break;\n case 1:\n logicInit_Page2();\n break;\n case 2:\n logicInit_Page3();\n break;\n default:\n break;\n }\n }\n\n function licenseBlur() {\n //console.log('licenseBlur');\n if (_typeof(vm.financial.licenses).toLowerCase() !== 'object') {\n vm.financial.licenses = \"\";\n }\n if (!vm.financial.licenses.id) {\n return;\n }\n if (vm.financial.licenses.id < 1) {\n vm.financial.licenses = null;\n }\n }\n\n function openCertificateStatusSelector() {\n //console.log('openCertificateStatusSelector');\n var result = modalService.openOptionSelector(trainingInnerService.getEffectives(), 'tsunCertificateStatus', false);\n //這個則是接收傳回來的值\n result.result.then(function (result) {\n vm.effective = result;\n //console.log('result :', result);\n effectiveChange(result);\n });\n }\n\n function openCertificateTypeSelector() {\n //console.log('openCertificateTypeSelector');\n var result = modalService.openOptionSelector(trainingInnerService.getCertificateType(), 'tsunCretificateClass', false);\n //這個則是接收傳回來的值\n result.result.then(function (result) {\n vm.certificate = result;\n //console.log('result :', vm.certificate);\n certificateChange();\n });\n }\n\n function openCourseListSelector(item) {\n //console.log('openCourseListSelector',item);\n var result = $uibModal.open({\n templateUrl: 'controller/tsun/training/myTraining/modal/courseListSelector.html',\n controller: 'courseListSelectorController as vm',\n size: 'sm',\n backdrop: 'static',\n taiClass: modalService.getTaiClass(),\n resolve: {\n courseItem: function courseItem() {\n return item;\n }\n }\n });\n //這個則是接收傳回來的值\n result.result.then(function (result) {\n courseListSelectChange(result[0], result[1]);\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiMyTrainingRepairProject', taiMyTrainingRepairProject);\n\n function taiMyTrainingRepairProject() {\n var directive = {\n bindToController: true,\n controller: taiMyTrainingRepairProjectController,\n controllerAs: 'vm',\n restrict: 'E',\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.repairProject.html',\n scope: {\n isFocus: '='\n }\n };\n return directive;\n }\n\n /* @ngInject */\n function taiMyTrainingRepairProjectController(trainingInnerService, modalService, $q, $scope) {\n var vm = this;\n vm.directToCourse = directToCourse;\n //==Main==\n init();\n //========\n function init() {\n vm.isMobile = modalService.isMobile();\n vm.openDetail = openDetail;\n vm.setPercentStyle = setPercentStyle;\n vm.method = methodList(); //找機會要把上面的設定移到這裡\n //\n //=====\n vm.data = dataInit();\n vm.view = viewInit();\n //======\n $scope.$watch('vm.isFocus', function (newValue) {\n if (newValue === true) {\n logicInit();\n }\n });\n $scope.$watch('vm.data.repairProjectInFilter.length', function (newValue, oldValue) {\n if (newValue === oldValue) {\n return;\n }\n if (!newValue) {\n newValue = 0;\n }\n vm.view.courseEmpty = newValue < 1;\n });\n }\n\n function methodList() {\n var result = {};\n return result;\n }\n\n function dataInit() {\n var result = {\n timeConfig: {},\n sessionSelected: null,\n repairProject: [], //..........待修項目資料\n repairProjectInFilter: [] //..待修項目資料(查詢結果)\n };\n return result;\n }\n\n function viewInit() {\n var result = {\n courseEmpty: false, //.........查無資料判定\n isInited: false, //............是否被初始化過\n pageLoaded: false, //..........頁面讀取完畢\n pageLoading: false //.........頁面讀取中\n };\n return result;\n }\n\n function logicInit() {\n vm.view.isInited = true;\n vm.view.pageLoaded = false;\n vm.view.pageLoading = true;\n //=====\n var promiseList = [loadConfig(), loadItemList()];\n $q.all(promiseList).then(function () {\n vm.view.pageLoaded = true;\n vm.view.pageLoading = false;\n });\n }\n\n function loadConfig() {\n return trainingInnerService.getConfigSetting().then(function (configData) {\n vm.data.timeConfig = configData.data;\n });\n }\n\n function loadItemList() {\n // console.log(\"repairProjec loadItemList\");\n return trainingInnerService.loadLangs().then(function (langs) {\n var repairProject = [];\n var promiseList = [];\n //console.log('langs:', langs);\n _.forEach(langs, function (lang) {\n // console.log('lang:', lang.langCode)\n // console.log( trainingInnerService.getUnfinishedActivities(lang.langCode))\n promiseList.push(trainingInnerService.getUnfinishedActivities(lang.langCode));\n });\n return $q.all(promiseList).then(function (data) {\n _.forEach(data, function (perReceiveData) {\n // console.log('perReceiveData:',perReceiveData);\n perReceiveData = _.orderBy(perReceiveData, ['sessionTime'], ['desc']);\n Array.prototype.push.apply(repairProject, perReceiveData);\n });\n repairProject = _.uniqBy(repairProject, function (courseItem) {\n //設定唯一鍵\n return courseItem.sessionId;\n });\n //console.log('repairProject:',repairProject);\n return repairProject;\n });\n }).then(function (repairProject) {\n //取代sessionTime中的
    \n _.forEach(repairProject, function (data) {\n //console.log('sTime:',data.sessionTime);\n data.sessionTime = data.sessionTime.replace(/\\/ig, ' ');\n //console.log('data:',data.sessionTime);\n });\n vm.data.repairProject = repairProject;\n vm.view.courseEmpty = repairProject.length < 1;\n return true;\n });\n }\n\n function openDetail(item) {\n vm.data.sessionSelected = item.sessionId;\n //==========\n var param = {\n item: item,\n timeConfig: vm.data.timeConfig\n };\n var openModal = modalService.trainingSelectAction(param);\n\n openModal.result.then(function () {\n //關閉視窗時要重整頁面\n loadItemList();\n });\n }\n\n function setPercentStyle(item) {\n var progress;\n var percentage;\n var style = {};\n if (item.progress && item.progress.length > 0) {\n progress = item.progress.split('/');\n if (progress.length < 2) {\n item.progress = null;\n progress = ['0', '1'];\n }\n } else {\n item.progress = null;\n progress = ['0', '1'];\n }\n percentage = 100 * (parseFloat(progress[0]) / parseFloat(progress[1]));\n percentage = parseInt(percentage) + '';\n if (percentage === '0') {\n style = { 'display': 'none' };\n } else {\n style = { 'width': percentage + '%' };\n }\n return style;\n }\n\n function directToCourse() {\n //console.log(\"current url:\", location.href);\n var menuNo = location.href.split('menu=')[1];\n //2023-07-10 Johnson 資安2023\n location.href = eval(function (p, a, c, k, e, r) {\n e = function e(c) {\n return c.toString(a);\n };if (!''.replace(/^/, String)) {\n while (c--) {\n r[e(c)] = k[c] || e(c);\n }k = [function (e) {\n return r[e];\n }];e = function e() {\n return '\\\\w+';\n };c = 1;\n };while (c--) {\n if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }return p;\n }('2.3.4(\\'/#\\')[0]+\\'/#/5/6?7=\\'+8.1(//g,\\'&a\\').1(/\"/g,\\'&b\\').1(/\\'/g,\\'&#c\\').1(/[<>!]|(\\\\(\\\\))|((d|e|f)\\\\h*\\\\(.*\\\\))/g,\\'\\')', 18, 18, '|replace|location|href|split|tsu|course|menu|menuNo|lt|gt|quot|x27|for|while|if||s'.split('|'), 0, {}));\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunRecommendDocController', tsunRecommendDocController);\n\n function tsunRecommendDocController(trainingInnerService, $location, $q) {\n var vm = this;\n //==Main==\n init();\n //========\n function init() {\n dataInit();\n logicInit();\n }\n function dataInit() {\n vm.data = {\n innerHtml: '' //........內容顯示的HTML\n };\n vm.view = {};\n }\n function logicInit() {\n return loadData().then(function () {});\n }\n\n function loadData() {\n var recommendHtml = sessionStorage.getItem(\"recommendHTML\");\n return $q.when(recommendHtml).then(function (data) {\n vm.data.innerHtml = data;\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('tsunRecommendController', tsunRecommendController);\n\n function tsunRecommendController(trainingInnerService, $location, modalService, commonService, activeType) {\n var vm = this;\n vm.carouselClick = carouselClick;\n vm.showImg = showImg;\n vm.showVedio = showVedio;\n vm.backList = backList;\n //==Main==\n init();\n //========\n function init() {\n dataInit();\n logicInit();\n }\n\n function dataInit() {\n vm.data = {\n carousel: [], //.......................熱門推薦取得原始資料\n carouselSelected: {} //...............點選的熱門推薦\n };\n vm.view = {\n isMobile: modalService.isMobile(), //..是否為行動裝置\n pageLoading: false, //.................頁面讀取中\n pageLoaded: false, //..................頁面讀取完畢\n showCarousel: true, //.................顯示熱門推薦清單\n showEmbed: false, //...................顯示嵌入式內容\n recommendEmpty: false, //..............內容是否為空\n recommendEmptyType2: false, //.........內容為空時顯示熱門推薦訊息\n recommendEmptyType3: false, //.........內容為空時顯示微課程訊息\n isMulitiData: true //.................是否有多筆資料(使用輪播樣式)\n };\n }\n\n function logicInit() {\n vm.view.pageLoading = true;\n return loadData().then(function () {\n if (vm.data.carousel.length < 1) {\n vm.view.recommendEmpty = true;\n vm.view.recommendEmptyType2 = activeType === 2;\n vm.view.recommendEmptyType3 = activeType === 3;\n if (!vm.view.recommendEmptyType2) {\n //預設錯誤訊息為\"熱門推薦類型\"\n vm.view.recommendEmptyType2 = !vm.view.recommendEmptyType2 && !vm.view.recommendEmptyType3;\n }\n }\n\n vm.view.pageLoading = false;\n vm.view.pageLoaded = true;\n\n // 不知道為什麼不會自動跑動,所以在觸發一次囉\n $('#myCarousel').carousel({\n interval: 5000\n });\n });\n }\n\n function loadData() {\n return trainingInnerService.getCarousel(activeType).then(function (result) {\n vm.data.carousel = result;\n //console.log(\"vm.data.carousel:\", vm.data.carousel);\n //console.log(\"carousel $index\",$index);\n vm.view.isMulitiData = result.length > 1;\n });\n }\n\n function viewChange(showArea) {\n vm.view.showCarousel = false;\n vm.view.showEmbed = false;\n\n switch (showArea) {\n case 'carousel':\n vm.view.showCarousel = true;\n break;\n case 'embed':\n vm.view.showEmbed = true;\n break;\n default:\n break;\n }\n }\n\n function showImg(attachmentType) {\n return commonService.showImg(attachmentType);\n }\n\n function showVedio(attachmentType) {\n return commonService.showVedio(attachmentType);\n }\n\n function backList() {\n viewChange('carousel');\n }\n\n function carouselClick(carouselItem) {\n var newWindow;\n vm.data.carouselSelected = angular.copy(carouselItem);\n vm.data.carouselSelected.isUrl = false;\n vm.data.carouselSelected.url = vm.data.carouselSelected.url || \"\";\n if (vm.data.carouselSelected.url.length > 0) {\n vm.data.carouselSelected.isUrl = true;\n }\n switch (carouselItem.target) {\n case 2:\n viewChange('embed');\n break;\n case 3:\n if (vm.data.carouselSelected.isUrl) {\n window.location = vm.data.carouselSelected.url;\n return;\n } else {\n sessionStorage.setItem('recommendHTML', vm.data.carouselSelected.activityContent);\n $location.path('/tsu/recommendHTML');\n }\n break;\n case 1:\n //開新視窗\n newWindow = window.open('', '_blank');\n\n if (vm.data.carouselSelected.isUrl) {\n newWindow.location = vm.data.carouselSelected.url;\n } else {\n newWindow.document.write(vm.data.carouselSelected.activityContent);\n }\n newWindow.document.title = vm.data.carouselSelected.activityTitle;\n commonService.setOneWindow(newWindow);\n break;\n default:\n newWindow = window.open('', '_blank');\n if (vm.data.carouselSelected.isUrl) {\n newWindow.location = vm.data.carouselSelected.url;\n } else {\n newWindow.document.write(vm.data.carouselSelected.activityContent);\n }\n newWindow.document.title = vm.data.carouselSelected.activityTitle;\n commonService.setOneWindow(newWindow);\n break;\n }\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.service').factory('recommendInnerService', recommendInnerService);\n\n function recommendInnerService() {\n var service = {};\n return service;\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('applicationFormTypeSelectorController', applicationFormTypeSelectorController);\n\n function applicationFormTypeSelectorController($q, $rootScope, $scope, $uibModalInstance, trainingInnerService) {\n var vm = this;\n vm.cancel = cancel;\n vm.TypeSelected = TypeSelected;\n\n onInit();\n\n function onInit() {\n var promiseList = [trainingInnerService.getExternaltype()];\n return $q.all(promiseList).then(function (receiveData) {\n //console.log(receiveData);\n //vm.type = receiveData[0];\n vm.type = _.filter(receiveData[0], function (o) {\n return o.id !== -1;\n });\n });\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function TypeSelected(data) {\n //console.log('TypeSelected:',data);\n $uibModalInstance.close(data);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('courseCategorySelectorController', courseCategorySelectorController);\n\n function courseCategorySelectorController($q, $rootScope, $scope, $uibModalInstance, trainingInnerService, categoryItem) {\n var vm = this;\n vm.cancel = cancel;\n vm.itemSelected = itemSelected;\n\n onInit();\n\n function onInit() {\n console.log('categoryItem:', categoryItem);\n vm.courseCategory = categoryItem;\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function itemSelected(item) {\n var result = [];\n //courseItem.selectedItemName = item.showName;\n result.push(item);\n $uibModalInstance.close(result);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('courseListSelectorController', courseListSelectorController);\n\n function courseListSelectorController($q, $rootScope, $scope, $uibModalInstance, trainingInnerService, courseItem) {\n var vm = this;\n vm.cancel = cancel;\n vm.itemSelected = itemSelected;\n\n onInit();\n\n function onInit() {\n //console.log('courseItem:', courseItem);\n vm.courseList = courseItem.courseList;\n console.log('vm.courseList:', vm.courseList);\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function itemSelected(list, item) {\n var result = [];\n\n // courseItem.selectedItemName = item.showName;\n\n result.push(list);\n result.push(item);\n $uibModalInstance.close(result);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('myTrainingExteriorTimeModalController', myTrainingExteriorTimeModalController);\n\n function myTrainingExteriorTimeModalController($rootScope, $scope, $uibModalInstance, modalService, $q, saveList) {\n var vm = this;\n vm.ok = ok;\n vm.removeClassRange = removeClassRange;\n vm.saveAndNext = saveAndNext;\n vm.cancel = cancel;\n vm.tabDayOfMonth = tabDayOfMonth;\n vm.tabDayOfWeek = tabDayOfWeek;\n vm.openTimeSelector = openTimeSelector;\n //====Main====\n onInit();\n //============\n function dataInit() {\n //有空維護請將本頁面所使用到全部變數放置這裡視為宣告\n vm.checkView = {\n classDateValid: false,\n classTimeValid: false,\n LunchTimeValid: false,\n weekDayValid: false,\n formSubmited: false\n };\n vm.data = {\n times: [],\n hours: ['06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '00', '01', '02', '03', '04', '05'],\n mins: ['00', '05', '10', '15', '20', '25', '30', '35', '40', '45', '50', '55'],\n cycleTypeList: [{\n value: 'week',\n name: $rootScope.translate.tsunWeek || 'Week'\n }, {\n value: 'month',\n name: $rootScope.translate.tsunMonth || 'Month'\n }, {\n value: 'year',\n name: $rootScope.translate.tsunYear || 'Year'\n }],\n weekdays: {\n '1': {\n name: $rootScope.translate.tsunWeekMonday || 'Monday',\n checked: false\n },\n '2': {\n name: $rootScope.translate.tsunWeekTuesday || 'Tuesday',\n checked: false\n },\n '3': {\n name: $rootScope.translate.tsunWeekWednesday || 'Wednesday',\n checked: false\n },\n '4': {\n name: $rootScope.translate.tsunWeekThusday || 'Thusday',\n checked: false\n },\n '5': {\n name: $rootScope.translate.tsunWeekFriday || 'Friday',\n checked: false\n },\n '6': {\n name: $rootScope.translate.tsunWeekSaturday || 'Saturday',\n checked: false\n },\n '0': {\n name: $rootScope.translate.tsunWeekSunday || 'Sunday',\n checked: false\n }\n },\n cycleList: [{\n value: 1,\n name: '1'\n // name: $rootScope.translate.tsunNumberOne || '一'\n }, {\n value: 2,\n name: '2'\n }, {\n value: 3,\n name: '3'\n }, {\n value: 4,\n name: '4'\n }, {\n value: 5,\n name: '5'\n }, {\n value: 6,\n name: '6'\n }, {\n value: 7,\n name: '7'\n }, {\n value: 8,\n name: '8'\n }, {\n value: 9,\n name: '9'\n }, {\n value: 10,\n name: '10'\n }],\n cycleValue: null,\n cycleType: null,\n hasRestTime: null,\n classDateStart: null,\n classDateEnd: null,\n sessionTimeStartHour: null,\n sessionTimeStartMin: null,\n sessionTimeEndHour: null,\n sessionTimeEndMin: null,\n restTimeStartHour: null,\n restTimeStartMin: null,\n restTimeEndHour: null,\n restTimeEndMin: null,\n saveList: saveList || []\n };\n }\n\n function onInit() {\n //若要看手機環境請將此參數改成True\n vm.isMobile = modalService.isMobile();\n\n dataInit();\n clearPageData();\n }\n\n function tabDayOfMonth() {\n vm.data.week = undefined;\n vm.data.cycleWeek = undefined;\n }\n\n function tabDayOfWeek() {\n vm.data.day = undefined;\n }\n\n function ok() {\n vm.checkView.formSubmited = true;\n if (!vm.data.classDateStart && !vm.data.classDateEnd && vm.data.saveList.length > 0) {\n //若無日期設定視為空值\n $uibModalInstance.close(vm.data.saveList);\n return;\n }\n if (!checkFormData()) {\n return;\n }\n return $q.when(pushDataToStore()).then(function () {\n $uibModalInstance.close(vm.data.saveList);\n });\n }\n\n function saveAndNext() {\n vm.checkView.formSubmited = true;\n if (!checkFormData()) {\n return;\n }\n return $q.when(pushDataToStore()).then(function () {\n clearPageData();\n vm.checkView.formSubmited = false;\n // console.log(\"vm.data.saveList\", vm.data.saveList);\n });\n }\n\n function pushDataToStore() {\n // console.log(\"enter pushDataToStore\");\n var singleData = {\n cycleValue: null,\n cycleType: null,\n hasRestTime: null,\n classDateStart: null,\n classDateEnd: null,\n sessionTimeStartHour: null,\n sessionTimeStartMin: null,\n sessionTimeEndHour: null,\n sessionTimeEndMin: null,\n restTimeStartHour: null,\n restTimeStartMin: null,\n restTimeEndHour: null,\n restTimeEndMin: null,\n showText: \"\",\n selectWeekday: [],\n innerDataDate: [],\n innerDataTime: []\n };\n var selectedWeekDayText = '';\n var classDateStartDate;\n var classDateEndDate;\n var cycleTimes = 0;\n var classDateStart;\n var classDateEnd;\n var classTime = [];\n _.forEach(singleData, function (value, key) {\n // console.log(\"key:\", key, \"value:\", vm.data[key]);\n if (vm.data[key] === undefined) {\n return;\n }\n singleData[key] = angular.copy(vm.data[key]);\n });\n _.forEach(vm.data.weekdays, function (value, key) {\n if (!value.checked) {\n return;\n }\n singleData.selectWeekday.push(parseInt(key));\n });\n classDateStart = Date.parse(singleData.classDateStart);\n classDateEnd = Date.parse(singleData.classDateEnd);\n classDateStartDate = new Date(classDateStart);\n classDateEndDate = new Date(classDateEnd);\n if (!singleData.hasRestTime) {\n classTime = [format(\"{0}:{1}-{2}:{3}\", singleData.sessionTimeStartHour, singleData.sessionTimeStartMin, singleData.sessionTimeEndHour, singleData.sessionTimeEndMin)];\n } else {\n classTime = [format(\"{0}:{1}-{2}:{3}\", singleData.sessionTimeStartHour, singleData.sessionTimeStartMin, singleData.restTimeStartHour, singleData.restTimeStartMin), format(\"{0}:{1}-{2}:{3}\", singleData.restTimeEndHour, singleData.restTimeEndMin, singleData.sessionTimeEndHour, singleData.sessionTimeEndMin)];\n }\n for (var date = new Date(classDateStart); date <= classDateEnd; date.setDate(date.getDate() + 1)) {\n var cycleCompareValue;\n var cycleBaseValue;\n switch (singleData.cycleType.type) {\n case 'week':\n cycleBaseValue = Math.floor(classDateStartDate.getDate() / 7);\n cycleCompareValue = Math.floor(date.getDate() / 7);\n break;\n case 'month':\n cycleBaseValue = classDateStartDate.getMonth();\n cycleCompareValue = date.getMonth();\n break;\n case 'year':\n cycleBaseValue = classDateStartDate.getFullYear();\n cycleCompareValue = date.getFullYear();\n break;\n default:\n cycleBaseValue = 0;\n cycleCompareValue = 0;\n break;\n\n }\n // console.log(\"cycleCompareValue\", cycleCompareValue);\n // console.log(\"cycleBaseValue\", cycleBaseValue);\n // console.log(\"singleData.cycleValue.value\", singleData.cycleValue.value);\n cycleTimes = cycleCompareValue - cycleBaseValue;\n if (cycleTimes % singleData.cycleValue.value !== 0) {\n continue;\n }\n if (singleData.selectWeekday.indexOf(date.getDay()) < 0) {\n continue;\n }\n //==========\n var dateString = '';\n var dateYear = date.getFullYear() + '';\n var dateMonth = date.getMonth() + 1 + '';\n var dateDay = date.getDate() + '';\n dateString += dateYear.length < 2 ? '0' : '' + dateYear;\n dateString += '/' + (dateMonth.length < 2 ? '0' : '') + dateMonth;\n dateString += '/' + (dateDay.length < 2 ? '0' : '') + dateDay;\n for (var classTimeIndex = 0; classTimeIndex < classTime.length; classTimeIndex++) {\n singleData.innerDataDate.push(dateString);\n singleData.innerDataTime.push(classTime[classTimeIndex]);\n }\n // _.forEach(classTime, function (value) {\n // });\n }\n\n // var classDateStartDate;\n // var classDateEndDate;\n singleData.showText += format(\"{0}/{1}{2}/{3}{4}\", classDateStartDate.getFullYear(), classDateStartDate.getMonth() < 9 ? \"0\" : \"\", classDateStartDate.getMonth() + 1, classDateStartDate.getDate() < 10 ? \"0\" : \"\", classDateStartDate.getDate());\n singleData.showText += format(\"~{0}/{1}{2}/{3}{4}\", classDateEndDate.getFullYear(), classDateEndDate.getMonth() < 9 ? \"0\" : \"\", classDateEndDate.getMonth() + 1, classDateEndDate.getDate() < 10 ? \"0\" : \"\", classDateEndDate.getDate());\n\n selectedWeekDayText = '';\n if (singleData.selectWeekday.length < 7) {\n _.forEach(singleData.selectWeekday, function (value) {\n if (selectedWeekDayText.length > 0) {\n selectedWeekDayText += ',';\n }\n selectedWeekDayText += vm.data.weekdays[value].name;\n });\n selectedWeekDayText = format(\"({0})\", selectedWeekDayText);\n }\n\n if (singleData.cycleValue.value > 1) {\n singleData.showText += \"
    \";\n singleData.showText += format(\"{0} {1} {2}:{3}\", $rootScope.translate.commonEvery, singleData.cycleValue.name, singleData.cycleType.name.toLowerCase(), selectedWeekDayText);\n } else if (selectedWeekDayText.length > 0) {\n singleData.showText += \"
    \";\n singleData.showText += selectedWeekDayText;\n }\n\n singleData.showText += format(\"
    {0}:{1}-{2}:{3}\", singleData.sessionTimeStartHour, singleData.sessionTimeStartMin, singleData.sessionTimeEndHour, singleData.sessionTimeEndMin);\n if (singleData.hasRestTime) {\n singleData.showText += format(\"
    {0}:{1}:{2}-{3}:{4}\", \"午休\", singleData.restTimeStartHour, singleData.restTimeStartMin, singleData.restTimeEndHour, singleData.restTimeEndMin);\n }\n\n // console.log(\"singleData\", singleData);\n vm.data.saveList.push(singleData);\n // console.log(\"end pushDataToStore\");\n }\n\n function clearPageData() {\n vm.data.cycleValue = vm.data.cycleValue = vm.data.cycleList[0];\n vm.data.cycleType = vm.data.cycleType = vm.data.cycleTypeList[0];\n vm.data.hasRestTime = false;\n vm.data.classDateStart = \"\";\n vm.data.classDateEnd = \"\";\n vm.data.sessionTimeStartHour = vm.data.hours[0];\n vm.data.sessionTimeStartMin = vm.data.mins[0];\n vm.data.sessionTimeEndHour = vm.data.hours[0];\n vm.data.sessionTimeEndMin = vm.data.mins[0];\n vm.data.restTimeStartHour = vm.data.hours[6];\n vm.data.restTimeStartMin = vm.data.mins[0];\n vm.data.restTimeEndHour = vm.data.hours[7];\n vm.data.restTimeEndMin = vm.data.mins[0];\n _.forEach(vm.data.weekdays, function (value) {\n value.checked = true;\n });\n // console.log(\"clearPageData , vm.data:\", vm.data);\n }\n\n function checkFormData() {\n // console.log(\"enter checkFormData , vm.data:\", vm.data);\n var result = false;\n var classDateStart = Date.parse(vm.data.classDateStart); // \n var classDateEnd = Date.parse(vm.data.classDateEnd);\n var calssTimeStart = new Date(\"2000\", \"01\", \"01\", vm.data.sessionTimeStartHour, vm.data.sessionTimeStartMin, \"00\");\n var calssTimeEnd = new Date(\"2000\", \"01\", \"01\", vm.data.sessionTimeEndHour, vm.data.sessionTimeEndMin, \"00\");\n var isClassLunchTime = vm.data.hasRestTime;\n var classLunchTimeStart = new Date(\"2000\", \"01\", \"01\", vm.data.restTimeStartHour, vm.data.restTimeStartMin, \"00\");\n var classLunchTimeEnd = new Date(\"2000\", \"01\", \"01\", vm.data.restTimeEndHour, vm.data.restTimeEndMin, \"00\");\n // var cycleType = vm.data.cycleType;\n // var cycleValue = vm.data.cycleValue;\n vm.checkView.classDateValid = false;\n vm.checkView.classTimeValid = false;\n vm.checkView.LunchTimeValid = false;\n vm.checkView.weekDayValid = false;\n if (classDateStart && classDateEnd) {\n //驗證上課日期\n vm.checkView.classDateValid = classDateEnd >= classDateStart;\n }\n if (calssTimeStart && calssTimeEnd) {\n //驗證上課時間\n vm.checkView.classTimeValid = calssTimeEnd > calssTimeStart;\n }\n if (!isClassLunchTime) {\n vm.checkView.LunchTimeValid = true;\n } else if (classLunchTimeStart && classLunchTimeEnd) {\n //驗證午休\n vm.checkView.LunchTimeValid = classLunchTimeEnd > classLunchTimeStart || !isClassLunchTime;\n }\n if (vm.checkView.LunchTimeValid && isClassLunchTime) {\n //驗證午休與上課時間\n vm.checkView.LunchTimeValid = calssTimeEnd >= classLunchTimeEnd && classLunchTimeStart >= calssTimeStart;\n }\n //驗證上課日\n var selectWeekday = [];\n _.forEach(vm.data.weekdays, function (value, key) {\n if (value.checked) {\n selectWeekday.push(parseInt(key));\n }\n });\n for (var date = new Date(classDateStart); date <= classDateEnd; date.setDate(date.getDate() + 1)) {\n if (vm.checkView.weekDayValid) {\n break;\n }\n if (selectWeekday.indexOf(date.getDay()) >= 0) {\n vm.checkView.weekDayValid = true;\n }\n }\n\n result = vm.checkView.classDateValid && vm.checkView.classTimeValid && vm.checkView.LunchTimeValid && vm.checkView.weekDayValid;\n\n if (result === false) {\n toastr.warning($rootScope.translate.tsunErrorExteriorTimeEmpty);\n }\n return result;\n }\n\n function removeClassRange(index) {\n var confirmDialog = modalService.confrimDialog({\n confirmContent: format(\"{0}\\r\\n{1}\", $rootScope.translate.tsunConfirmRemove, \"\")\n });\n confirmDialog.result.then(function (result) {\n result = !!result;\n if (result !== true) {\n return;\n }\n vm.data.saveList.splice(index, 1);\n });\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function openTimeSelector(type, title) {\n var data = null;\n var isCycle = false;\n switch (type) {\n case 'sh': //小時\n case 'eh':\n case 'rsh':\n case 'reh':\n data = vm.data.hours;\n break;\n case 'sm': //分鐘\n case 'em':\n case 'rsm':\n case 'rem':\n data = vm.data.mins;\n break;\n case 'c':\n //循環週期\n data = vm.data.cycleList;\n isCycle = true;\n break;\n case 'u':\n //循環週期單位\n data = vm.data.cycleTypeList;\n isCycle = true;\n break;\n }\n\n var result = modalService.openOptionSelector(data, title, isCycle);\n console.log('openTimeSelector:', result);\n result.result.then(function (data) {\n switch (type) {\n case 'sh':\n //開始小時\n vm.data.sessionTimeStartHour = data;\n break;\n case 'eh':\n //結束小時\n vm.data.sessionTimeEndHour = data;\n break;\n case 'sm':\n //開始分鐘\n vm.data.sessionTimeStartMin = data;\n break;\n case 'em':\n //結束分鐘\n vm.data.sessionTimeEndMin = data;\n break;\n case 'rsh':\n //休息開始小時\n vm.data.restTimeStartHour = data;\n break;\n case 'reh':\n //休息結束小時\n vm.data.restTimeEndHour = data;\n break;\n case 'rsm':\n //休息開始分鐘\n vm.data.restTimeStartMin = data;\n break;\n case 'rem':\n //休息結束分鐘\n vm.data.restTimeEndMin = data;\n break;\n case 'c':\n //循環週期\n //vm.data.cycleValue.value = data.id;\n //vm.data.cycleValue.name = data.name;\n vm.data.cycleValue = data;\n break;\n case 'u':\n //循環週期單位\n //vm.data.cycleType.value = data.id;\n //vm.data.cycleType.name = data.name;\n vm.data.cycleType = data;\n break;\n }\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('myTrainingOrganizerModalController', myTrainingOrganizerModalController);\n\n function myTrainingOrganizerModalController($scope, $rootScope, $uibModalInstance, params, choiceList, modalService) {\n var vm = this;\n vm.send = send;\n vm.checkboxClick = checkboxClick;\n vm.searchResultEnd = searchResultEnd;\n vm.searchData = searchData;\n vm.cancel = cancel;\n vm.isApp = false;\n onInit();\n\n function dataInit() {\n vm.data = {\n checkedList: choiceList || [],\n sourceData: params || [],\n listData: [] //.....................主辦單位清單\n };\n vm.view = {\n // showOther: false,\n emptyParams: false, //..........尚未輸入收尋條件\n buttonShow: false, //...........確定按鈕是否出現(包含浮動)\n staticButtonShow: false, //.....確定按鈕是否出現(固定按鈕)\n orgSearchEmpty: false //.......主辦單位清單為空\n };\n }\n\n function logicInit() {\n vm.search = '';\n _.forEach(vm.data.sourceData, function (item) {\n item.checked = _.findIndex(vm.data.checkedList, { \"id\": item.id }) > -1;\n item.CheckValue = item.checked;\n });\n // searchData();\n }\n\n function onInit() {\n if (DEVICE_TOKEN !== null || DEVICE_TYPE !== null) {\n //console.log('isApp:', vm.isApp);\n vm.isApp = true;\n }\n dataInit();\n logicInit();\n Jquery();\n }\n\n function send() {\n var result = [];\n _.forEach(vm.data.listData, function (item) {\n if (item.Check) {\n result.push(item);\n }\n });\n $uibModalInstance.close(result);\n }\n\n function searchData() {\n $(document).trigger('submitSearchStart', {});\n vm.view.buttonShow = false;\n vm.view.emptyParams = false;\n vm.data.listData = [];\n // =====\n vm.search = vm.search || '';\n if (vm.search.length < 1) {\n vm.view.emptyParams = true;\n toastr.warning($rootScope.translate.tsunFormMsgRequiredEmpty);\n return;\n }\n // =====\n if (vm.search) {\n var regExpCompare = new RegExp(vm.search, \"g\");\n _.forEach(vm.data.sourceData, function (item) {\n if (item.name.match(regExpCompare)) {\n vm.data.listData.push(angular.copy(item));\n }\n });\n vm.view.orgSearchEmpty = vm.data.listData.length < 1;\n } else {\n vm.data.listData = angular.copy(vm.data.sourceData);\n }\n // vm.data.listData.push({ id: 0, name: $rootScope.translate.tsunOther });\n }\n\n function checkboxClick(item) {\n if (item.checked) {\n return;\n }\n var itemChecked = !item.Check;\n item.Check = itemChecked;\n item.CheckValue = itemChecked;\n checkHasClick();\n }\n\n function checkHasClick() {\n var checkedItemIndex = _.findIndex(vm.data.listData, { Check: true });\n vm.view.buttonShow = checkedItemIndex > -1;\n // console.log(\"call checkboxClick , trigger:\", vm.view.buttonShow);\n $(document).trigger('checkboxClick', [vm.view.buttonShow]);\n }\n\n function searchResultEnd() {\n $(document).trigger('submitSearchEnd', {});\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n //======Jquery\n function Jquery() {\n $(document).off('floatButtonDisplay').on('floatButtonDisplay', function (event, triggerResult) {\n var staticButtonShow = !triggerResult;\n if (vm.view.staticButtonShow !== staticButtonShow) {\n vm.view.staticButtonShow = staticButtonShow;\n if (!$scope.$$phase) {\n $scope.$digest();\n }\n }\n });\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('myTrainingSelectActionConfirmModalController', myTrainingSelectActionConfirmModalController);\n\n function myTrainingSelectActionConfirmModalController($uibModalInstance, $interval, $scope, ctmsConfirmTime, loginService, $location, $rootScope, $uibModalStack) {\n var DEFUALT_CONFIRMTIME = 10;\n var vm = this;\n vm.containu = containu;\n //==========\n init();\n //==========\n\n function init() {\n // console.log(\"myTrainingSelectActionConfirmModalController,ctmsConfirmTime:\", ctmsConfirmTime);\n dataInit();\n logicInit();\n }\n function dataInit() {\n vm.data = {\n ctmsConfirmTime: ctmsConfirmTime || DEFUALT_CONFIRMTIME //.......倒數計時\n };\n }\n function logicInit() {\n var promise = $interval(function () {\n // console.log(\"ctmsConfirmTime:\",ctmsConfirmTime);\n vm.data.ctmsConfirmTime--;\n if (vm.data.ctmsConfirmTime < 1) {\n // 移除目前所有 modal 視窗 \n $uibModalStack.dismissAll();\n $interval.cancel(promise);\n }\n }, 1000, vm.data.ctmsConfirmTime);\n\n $scope.$on('$destroy', function () {\n $interval.cancel(promise);\n });\n }\n\n function containu() {\n $uibModalInstance.close();\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('myTrainingSelectActionModalController', myTrainingSelectActionModalController);\n\n function myTrainingSelectActionModalController($uibModalInstance, $interval, $uibModal, $scope, $sce, $window, trainingInnerService, $timeout, courseService, modalService, $q, viewModel, ctmsService, enumService, $location, loginService, $rootScope, commonService, $anchorScroll, _sessionDecaySecs, $http, headerService, mobileService, apiUrl) {\n var DEFAULT_POPUPTIME = 600; //預設10分鐘\n var default_ctmsCourseTimeInterval = 300; //固定回傳時隔,預設5分鐘\n var vm = this;\n var timer, viewTimeInterval, sessionTimeInterval;\n vm.isMobile = modalService.isMobile();\n vm.setPathUrl = setPathUrl;\n vm.cancel = cancel;\n vm.vgPlayReady = vgPlayReady;\n vm.vgComplete = vgComplete;\n vm.actionSubmit = actionSubmit;\n vm.choiceSelectActive = choiceSelectActive;\n vm.returnActiveList = returnActiveList;\n vm.sessionChoice = sessionChoice;\n vm.tabChange = tabChange;\n vm.goTop = goTop;\n vm.setPercentStyle = setPercentStyle;\n vm.enum = {\n courseType: enumService.courseType\n };\n vm.pdfIsDone = false;\n vm.durationView = durationView;\n vm.postToIos = postToIos;\n vm.setSession = setSession;\n\n var mobile = {\n Android: function Android() {\n return navigator.userAgent.match(/Android/i);\n },\n BlackBerry: function BlackBerry() {\n return navigator.userAgent.match(/BlackBerry/i);\n },\n iOS: function iOS() {\n return navigator.userAgent.match(/iPhone|iPad|iPod/i);\n },\n Opera: function Opera() {\n return navigator.userAgent.match(/Opera Mini/i);\n },\n Windows: function Windows() {\n return navigator.userAgent.match(/IEMobile/i);\n },\n any: function any() {\n return mobile.Android() || mobile.BlackBerry() || mobile.iOS() || mobile.Opera() || mobile.Windows();\n }\n };\n\n function durationView() {\n return intConvertTime(vm.view.viewTime);\n }\n\n //===Main==\n init();\n window.addEventListener(\"beforeunload\", function (event) {\n\n postLearningRecord(false, true);\n var confirmationMessage = \"\\o/\";\n (e || event).returnValue = confirmationMessage; //Gecko + IE\n return confirmationMessage; //Webkit, Safari, Chrome etc.\n });\n //=========\n function init() {\n dataInit();\n logicInit();\n\n $scope.$on('goTop', function () {\n goTop();\n });\n $scope.$on('emitExamSubmit', function () {\n postLearningRecord(false, true);\n });\n $scope.$on('$destroy', function () {\n $interval.cancel(viewTimeInterval);\n $interval.cancel(sessionTimeInterval);\n $timeout.cancel(timer);\n });\n // console.log(\"vm.view.sessionTime\", vm.view.sessionTime);\n // console.log(\"$rootScope.userInfo\",$rootScope.userInfo);\n sessionTimeInterval = $interval(function () {\n loginService.checkToken();\n // console.log(\"sessionTimeInterval checkToken\");\n }, vm.view.sessionTime);\n }\n\n function dataInit() {\n viewModel = viewModel || {};\n vm.timeConfig = viewModel.timeConfig || {};\n vm.data = {\n pdfUrl: \"\", //............................正在觀看的pdfUrl\n iframeUrl: \"\", //.........................正在觀看的IframeUrl\n courseItem: null, //......................正在執行的學習動作教材內容(WS3)\n studyActivity: null, //..................正在觀看的學習動作\n importCourse: viewModel.item || null, //.理論上是清單列傳入的班次課程\n courageItem: null, //.....................學程資料\n courageDetail: null, //...................學程詳細資料\n courageActive: null, //...................學程包含學習動作(WS14)\n courageAction: null, //...................學程包含動作(由courageActive抽出整理)\n sessionItem: null, //.....................班次資料\n sessionDetail: null, //...................班次詳細資料\n sessionActives: null, //..................班次包含學習動作(WS14)\n sessionLms: null, //......................班次包含學習項目(由sessionActives加工整理)\n sessionAction: null, //...................班次包含學習動作(由sessionActives抽出整理)\n ctmsTime: vm.timeConfig.ctmsTime /*8*/ || DEFAULT_POPUPTIME, //.........學習項目觀看時,確認繼續課程的顯示倒數計時(秒)\n ctmsCourseTimeInterval: vm.timeConfig.ctmsCourseTimeInterval || default_ctmsCourseTimeInterval //.........學習項目觀看時,固定回傳時隔\n\n };\n vm.config = {\n sources: [],\n tracks: [{\n src: \"http://www.videogular.com/assets/subs/pale-blue-dot.vtt\",\n kind: \"subtitles\",\n srclang: \"en\",\n label: \"English\",\n default: \"\"\n }]\n };\n vm.view = {\n contentCourage: false,\n contentCourse: false,\n isDownload: false,\n isShowPdf: false,\n isShowVideo: false,\n isShowExam: false,\n isShowIframe: false,\n viewTime: 0,\n pageLoad: false,\n sessionTime: 0,\n activeContent: false,\n activeList: false,\n couragePage: false, //.............學程頁面\n sessionPage: false //.............班次頁面\n };\n vm.vgApi = null;\n vm.tabSelected = 1;\n }\n\n function logicInit() {\n vm.view.sessionTime = ($rootScope.userInfo.sessionTime <= 3 ? 20 : $rootScope.userInfo.sessionTime) * 60000;\n vm.view.sessionTime -= 1000 * 120; //TODO 不懂為何要減掉。\n vm.view.sessionTime = vm.view.sessionTime || _sessionDecaySecs;\n switch (vm.data.importCourse.courseType) {\n case 7:\n //學程\n courageInit(vm.data.importCourse).then(function () {\n Accordion();\n vm.view.couragePage = true;\n });\n break;\n default:\n //非學程就直接處理課程資訊\n sessionInit(vm.data.importCourse).then(function () {\n Accordion();\n vm.view.sessionPage = true;\n });\n break;\n }\n }\n\n function courageInit(importItem) {\n\n vm.data.courageItem = null;\n vm.data.courageDetail = null;\n vm.data.courageActive = null;\n vm.data.courageAction = null;\n if (!importItem) {\n return;\n }\n vm.data.courageItem = angular.copy(importItem);\n var selectActive = trainingInnerService.getSelectActive(vm.data.courageItem);\n var courseDetail = trainingInnerService.getCourseDetail(vm.data.courageItem);\n // console.log(\"translate:\", $rootScope.translate);\n return $q.all([selectActive, courseDetail]).then(function (data) {\n var selectActiveResult = data[0];\n var courseDetailResult = data[1];\n vm.data.courageDetail = detailFormat(courseDetailResult);\n vm.data.courageActive = selectActiveResult;\n vm.data.courageAction = actionItemFormat(selectActiveResult.availableActions);\n _.forEach(vm.data.courageDetail.courses, function (courseItem) {\n if (courseItem.status && courseItem.progress) {\n return;\n }\n trainingInnerService.getSelectActive(courseItem).then(function (data) {\n courseItem.status = 'get status Error';\n courseItem.progress = null;\n if (!data) {\n return;\n }\n courseItem.status = '';\n courseItem.progress = '';\n if (data.status) {\n courseItem.status = statusConvert(data.status);\n }\n if (data.progress) {\n courseItem.progress = data.progress;\n }\n });\n });\n });\n }\n\n function statusConvert(statusCode) {\n //通過狀態的多國語系轉換\n if (!statusCode) {\n return '';\n }\n switch (statusCode + '') {\n case '-1':\n // return $rootScope.translate.tsunPassStatusValueNotCourage;\n return '';\n case '0':\n return $rootScope.translate.tsunPassStatusValueNA;\n case '1':\n return $rootScope.translate.tsunPassStatusValueExemption;\n case '2':\n return $rootScope.translate.tsunPassStatusValueOK;\n case '3':\n return $rootScope.translate.tsunPassStatusValueNotOK;\n default:\n return '';\n }\n }\n\n function sessionInit(importItem) {\n vm.data.sessionItem = null;\n vm.data.sessionDetail = null;\n vm.data.sessionActives = null;\n vm.data.sessionAction = null;\n vm.data.sessionLms = null;\n if (!importItem) {\n return;\n }\n vm.data.sessionItem = angular.copy(importItem);\n var selectActive = trainingInnerService.getSelectActive(vm.data.sessionItem);\n var courseDetail = trainingInnerService.getCourseDetail(vm.data.sessionItem);\n return $q.all([selectActive, courseDetail]).then(function (data) {\n // console.log('selectActive:', selectActive);\n // console.log('courseDetail:', courseDetail);\n //console.log('data:', data);\n var selectActiveResult = data[0];\n var courseDetailResult = data[1];\n // console.log(\"selectActiveResult:\",selectActiveResult);\n vm.data.sessionDetail = detailFormat(courseDetailResult);\n vm.data.sessionActives = selectActiveResult;\n vm.data.sessionAction = actionItemFormat(selectActiveResult.availableActions);\n vm.data.sessionLms = lmsItemsFormat(vm.data.sessionItem);\n });\n }\n\n function detailFormat(sourceData) {\n var detailData = angular.copy(sourceData);\n if (!detailData) {\n return detailData;\n }\n //===========\n var brCheck = /(\\r?\\n)/g;\n _.forEach(detailData, function (value, key) {\n var isInt = value === parseInt(value, 10);\n var isString = typeof value === \"string\";\n if (isInt) {\n var isAsNull = value < 0;\n\n if (isAsNull) {\n detailData[key] = null;\n } else {\n detailData[key] = value + '';\n }\n } else if (isString) {\n detailData[key] = value.replace(brCheck, \"
    \");\n }\n });\n //===========\n if (detailData.reference) {\n //檢查參考文件格式\n if (!angular.isArray(detailData.reference)) {\n //參考文件必須是陣列\n detailData.reference = null;\n }\n if (detailData.reference.length <= 0) {\n //參考文件必須有內容\n detailData.reference = null;\n }\n }\n return detailData;\n }\n\n function sessionChoice(sessionItem) {\n vm.view.couragePage = false;\n vm.view.sessionPage = true;\n if (!sessionItem.courseType) {\n sessionItem.courseType = 1;\n }\n sessionInit(sessionItem).then(function () {\n vm.tabSelected = 1;\n //console.log(\"typeof Accordion\", typeof Accordion);\n //如果有要製作等待頁面讀取中可以在此實作後續機制\n });\n }\n\n function setPathUrl(filePath) {\n var pathUrl = commonService.ctmsFilePath(filePath);\n return pathUrl;\n }\n\n function actionItemFormat(actionList) {\n //---處理Sunnet WS14 availableActions屬性\n var result = [];\n _.forEach(actionList, function (value) {\n var perItem = { name: '', action: '' };\n perItem.action = angular.copy(value);\n switch (value.toLowerCase()) {\n case \"enroll\":\n perItem.name = $rootScope.translate.tsunActionEnroll;\n break;\n case \"cancel\":\n perItem.name = $rootScope.translate.tsunActionCancel;\n break;\n case \"leave\":\n perItem.name = $rootScope.translate.tsunActionLeave;\n break;\n case \"exemption\":\n perItem.name = $rootScope.translate.tsunActionExemption;\n break;\n default:\n perItem.name = value;\n break;\n }\n result.push(perItem);\n });\n return result;\n }\n\n function lmsItemsFormat(sessionItem) {\n if (!vm.data.sessionActives) {\n return;\n }\n var activeItem = [];\n var perItem;\n //====加入出缺席狀況\n if (sessionItem.courseType === vm.enum.courseType.classCourse || sessionItem.courseType === vm.enum.courseType.externalCourse) {\n perItem = {};\n perItem.isAction = false;\n perItem.itemName = format(\"【{0}】\", $rootScope.translate.tsunAttendanceRate);\n perItem.status = vm.data.sessionActives.attendanceRate + \"%\";\n perItem.extraInfo = \"\";\n activeItem.push(angular.copy(perItem));\n }\n //====加入報告繳納資訊\n if (vm.data.sessionActives.reportTotal > 0) {\n perItem = {};\n perItem.isAction = false;\n perItem.itemName = format(\"【{0}】{1}\", $rootScope.translate.tsunReportsInfo, $rootScope.translate.tsunClassReportNote);\n perItem.status = format(\"{0} / {1}\", vm.data.sessionActives.reportSubmitted, vm.data.sessionActives.reportTotal);\n perItem.extraInfo = \"\";\n activeItem.push(angular.copy(perItem));\n }\n //====加入學習動作\n if (vm.data.sessionActives.lmsItems) {\n _.forEach(vm.data.sessionActives.lmsItems, function (value) {\n if (value.action) {\n if (value.action.length < 1) {\n value.action = null;\n }\n }\n value.isAction = true;\n activeItem.push(value);\n });\n }\n\n return activeItem;\n }\n\n function refreshViewTime() {\n $q.when(viewTimeStop()).then(function () {\n viewTimeStart();\n });\n }\n\n function viewTimeStart() {\n vm.view.viewTime = 0;\n viewTimeInterval = $interval(function () {\n vm.view.viewTime++;\n }, 1000);\n // console.log(\"viewTimeInterval\", viewTimeInterval);\n }\n\n function viewTimeStop() {\n $interval.cancel(viewTimeInterval);\n $timeout.cancel(timer);\n }\n\n function countTimeStart() {\n appCallback('countDown-02_beforeTimer', null);\n timer = $timeout(function () {\n //console.log(\"timer time out\",timer);\n //先改成倒數前送出學習紀錄\n\n appCallback('countDown-02', null);\n\n postLearningRecord(false, false);\n confirmForDesktop();\n }, vm.data.ctmsTime * 1000);\n //console.log(\"timer\",timer);\n }\n\n function confirmForDesktop() {\n if (vm.view.isShowVideo && vm.vgApi) {\n vm.vgApi.pause();\n vm.vgApi.closeFullScreen();\n }\n //======\n var param = {\n SessionId: angular.copy(vm.data.sessionItem.sessionId),\n ItemId: angular.copy(vm.data.studyActivity.itemId),\n Duration: intConvertTime(vm.view.viewTime)\n };\n modalService.selectActionConfirm(vm.timeConfig.ctmsConfirmTime, param).result.then(function (data) {\n // console.log('before postRecord :',data);\n // postLearningRecord(false, false);\n if (data === 'logout') {\n $uibModalInstance.dismiss('cancel');\n $location.path('/');\n return;\n }\n refreshViewTime();\n if (vm.view.isShowVideo) {\n vm.vgApi.play();\n }\n countTimeStart();\n });\n }\n\n function cancel() {\n if (vm.view.pageLoad) {\n postLearningRecord(false, true);\n }\n // $uibModalInstance.dismiss('cancel');\n $uibModalInstance.close();\n }\n\n function vgPlayReady(api) {\n vm.vgApi = api;\n }\n\n function vgComplete() {\n postLearningRecord(true, false);\n }\n\n function postLearningRecord(alert, reset) {\n\n //因內嵌網頁需要,多加一個sessionStorage 變數\n if (sessionStorage.getItem('IsLearningRecordCommit') == 'true') {\n if (!vm.data.studyActivity) {\n return null;\n }\n if (vm.data.studyActivity.type === '測驗' || vm.data.studyActivity.type === '問卷') {\n //測驗與問卷不回傳時數。\n return;\n }\n\n var param = {\n SessionId: angular.copy(vm.data.sessionItem.sessionId),\n ItemId: angular.copy(vm.data.studyActivity.itemId),\n Duration: intConvertTime(vm.view.viewTime)\n };\n\n //console.log(\"enter postLearningRecord\");\n var result = trainingInnerService.postLearningRecord(param, alert);\n result.then(function (data) {\n // toastr.success('ok oh');\n }).catch(function (reason) {\n // chris: log for mobile\n // toastr.error(JSON.stringify(reason));\n toastr.error('發送學習記錄失敗');\n });\n if (reset) {\n vm.data.studyActivity = null;\n }\n // console.log(\"end postLearningRecord\");\n }\n }\n\n function actionSubmit(enrollTarget, action) {\n // 申請項目呼叫事件\n // 呼叫完畢要重讀頁面資訊\n\n trainingInnerService.postSessionAction(enrollTarget, action).then(function () {\n if (enrollTarget.courseType === 7) {\n courageInit(angular.copy(vm.data.courageItem));\n } else {\n sessionInit(angular.copy(vm.data.sessionItem));\n }\n });\n }\n\n function initViewState() {\n clearAll();\n if (vm.data.studyActivity) {\n switch (vm.data.studyActivity.type) {\n case '影片':\n trainingInnerService.getCourseItems(vm.data.studyActivity).then(function (data) {\n vm.data.courseItem = data;\n changeActivityType();\n });\n break;\n case '課程內容':\n trainingInnerService.getCourseItems(vm.data.studyActivity).then(function (data) {\n vm.data.courseItem = data;\n changeActivityType();\n });\n break;\n case '問卷':\n changeExam();\n break;\n case '測驗':\n changeExam();\n break;\n default:\n break;\n }\n }\n }\n\n function changeActivityType() {\n var path = vm.data.courseItem.path || '';\n if (vm.data.courseItem.href && path.length > 0) {\n path = path + '/' + vm.data.courseItem.href;\n } else if (vm.data.courseItem.href) {\n path = vm.data.courseItem.href || '';\n } else {\n // path = path;\n }\n path = path.replace(\"\\\\\", \"/\");\n var pathUrl = setPathUrl(path);\n vm.data.courseItem.fileUrl = path;\n // console.log(\"changeActivityType....courseItem:\", vm.data.courseItem, \"....pathGo:\", pathUrl);\n // $q.when(fileExist(pathUrl)).then(function (result) {\n\n\n // 取出已觀看時間 + 放於 session storage 中\n // 寫在這邊是因為不只 mp4 會用到,連 html 都會需要這個參數\n var itemId = vm.data.courseItem.id;\n var sessionLm = _.find(vm.data.sessionLms, function (o) {\n return o.itemId === itemId;\n });\n if (sessionLm) {\n var seconds = moment.duration(sessionLm.viewedTime).asSeconds();\n sessionStorage.setItem('CtmsSeekTime', seconds);\n console.log('target sessionLm:', sessionLm);\n }\n\n setSession(vm.data.courseItem); //給內嵌網頁的SessionStorage\n fileExist(vm.data.courseItem).then(function (result) {\n var fileExtension = getFileExtension(pathUrl);\n switch (fileExtension) {\n //case 'mp4':\n // appCallback('countDown-01,' + DEVICE_TYPE, null);\n // //if (!(mobile.iOS() && window.webkit)) {\n // if (!(mobile.iOS() && window.webkit) || DEVICE_TYPE == 'Android') {\n // countTimeStart();\n // }\n // vm.view.isShowVideo = true;\n // vm.vgApi.clearMedia();\n // var videos = [];\n // vm.accessBegin = moment(new Date()).format('YYYY/MM/DD HH:mm:ss');\n // videos.push({\n // src: pathUrl,\n // type: 'video/mp4'\n // });\n // vm.config.sources = videos;\n // // ready for ios video player\n // if (mobile.iOS() && window.webkit) {\n // //if(true){\n // // pass param to ios and open player\n // postToIos(vm.data.courseItem, pathUrl);\n // returnActiveList();\n // } else {\n // $timeout(function() {\n\n // // 從 sessoin storage 取出已觀看時間 \n // let ctmsSeekTime = parseInt(sessionStorage.getItem('CtmsSeekTime'));\n // ctmsSeekTime = !!ctmsSeekTime ? ctmsSeekTime - 120 : 0; // 需往前兩分鐘\n // if (ctmsSeekTime && ctmsSeekTime > 0) {\n\n // // 詢問是否從上次結束觀看影片的地方開始撥放 \n // // 只有在 Android 裝置上才需要執行的功能\n // var seekTimeConfirm = modalService.confrimDialog({\n // confirmContent: $rootScope.translate.displayVideoFromLastView,\n // });\n\n // seekTimeConfirm.result.then(function(result) {\n // if (result) {\n // // 跳至特定時間開始看\n // vm.vgApi.seekTime(ctmsSeekTime, false /*byPercent*/);\n // } \n\n // // 撥放影片\n // vm.vgApi.play();\n // });\n // } else {\n // // 沒有觀看紀錄,直接撥放影片\n // vm.vgApi.play();\n // }\n\n\n // }, vm.vgApi.isReady);\n // }\n // break;\n case 'pdf':\n countTimeStart();\n //window.open(ctmsService.getStampFile(vm.data.courseItem.path, vm.data.courseItem.name), '_blank');\n //console.log(\"path:\", vm.data.courseitem.path);\n //console.log(\"name:\", vm.data.courseitem.name);\n vm.url = ctmsService.getStampFile(vm.data.courseItem.path, vm.data.courseItem.name);\n console.log(\"vm Url:\", vm.url);\n var a = document.createElement('a');\n var el = document.body.appendChild(a);\n el.setAttribute('style', 'display: none');\n el.href = vm.url;\n el.click();\n //console.log(\"pdf pathUrl:\", apiUrl.pafUrl);\n //vm.data.pdfUrl = pathUrl;\n /*\r\n Johnson 做法用於pdf專屬站台,客戶不接受資安解釋。(//10.20.30.155:11001/?pdf=)\r\n //vm.data.pathUrl = apiUrl.pafUrl+pathUrl;\r\n */\n //vm.view.isShowPdf = true;\n //vm.pdfIsDone = true;\n break;\n case 'mp4':\n case 'html':\n case 'htm':\n //內容不明\n //countTimeStart();\n vm.data.iframeUrl = pathUrl;\n vm.view.isShowIframe = true;\n //要把內嵌網頁觀看邏輯補上\n break;\n default:\n //TODO 下載檔案回報時數?太奇怪了,暫時先取消這邊邏輯\n vm.downloadItem = {\n path: pathUrl,\n name: vm.data.courseItem.name\n };\n vm.view.isDownload = true;\n break;\n }\n }, function errorEvent(result) {\n //顯示檔案不存在並結束\n // console.log(\"errorResult\", result);\n //ios不需要後續動作\n tabChange(1);\n return;\n });\n }\n\n // 問卷\n function changeExam() {\n countTimeStart();\n vm.view.isShowExam = true;\n }\n\n function clearAll() {\n if (vm.vgApi) {\n vm.vgApi.stop();\n }\n vm.view.isDownload = false;\n vm.view.isShowPdf = false;\n vm.view.isShowVideo = false;\n vm.view.isShowExam = false;\n vm.view.isShowIframe = false;\n }\n\n function tabChange(index) {\n postLearningRecord(false, true);\n viewTimeStop();\n clearActive();\n switch (index) {\n case 0:\n //case 2:\n vm.view.couragePage = true;\n vm.view.sessionPage = false;\n if (vm.data.courageItem) {\n courageInit(angular.copy(vm.data.courageItem)).then(function () {\n // if (typeof Accordion === 'function') {\n // Accordion();\n // }\n //如果有要製作等待頁面讀取中可以在此實作後續機制\n });\n }\n break;\n case 1:\n vm.view.activeList = true;\n if (vm.data.sessionItem) {\n sessionInit(angular.copy(vm.data.sessionItem)).then(function () {\n // if (typeof Accordion === 'function') {\n // Accordion();\n // }\n //如果有要製作等待頁面讀取中可以在此實作後續機制\n });\n }\n break;\n default:\n break;\n }\n }\n\n function clearActive() {\n viewTimeStop();\n postLearningRecord(false, true);\n clearActiveView();\n clearAll();\n }\n\n function choiceSelectActive(item) {\n clearActive();\n vm.data.studyActivity = angular.copy(item);\n vm.view.pageLoad = true;\n vm.view.activeContent = true;\n initViewState();\n refreshViewTime();\n }\n\n function goTop() {\n $location.hash('PageTop');\n $anchorScroll();\n $location.hash('');\n }\n\n function returnActiveList() {\n //學習動作回清單列\n //console.log(\"returnActiveList\");\n clearActive();\n\n if (vm.data.sessionItem) {\n sessionInit(angular.copy(vm.data.sessionItem)).then(function () {\n vm.view.activeList = true;\n });\n }\n }\n\n function clearActiveView() {\n vm.view.activeContent = false;\n vm.view.activeList = false;\n }\n\n function setPercentStyle(item) {\n var progress;\n var percentage;\n var style = {};\n if (item.progress && item.progress.length > 0) {\n progress = item.progress.split('/');\n if (progress.length < 2) {\n item.progress = null;\n progress = ['0', '1'];\n }\n } else {\n item.progress = null;\n progress = ['0', '1'];\n }\n percentage = 100 * (parseFloat(progress[0]) / parseFloat(progress[1]));\n percentage = parseInt(percentage) + '';\n if (percentage === '0') {\n style = { 'display': 'none' };\n } else {\n style = { 'width': percentage + '%' };\n }\n return style;\n }\n // function fileExist(pathUrl) {\n // var request = new XMLHttpRequest();\n // request.open('HEAD', pathUrl, false);\n // request.send();\n // // console.log(\"path\", pathUrl);\n // // console.log(\"request.status\", request.status);\n // return (request.status === 200);\n // }\n\n function fileExist(item) {\n //console.log(\"fileExist,source:\", item);\n // return $q.when(true);\n return trainingInnerService.checkItem(item);\n }\n\n function getFileExtension(fileName) {\n var result = /[.]/.exec(fileName) ? /[^.]+$/.exec(fileName)[0] : undefined;\n if (result) {\n result = (result + '').toLowerCase();\n }\n // console.log(\"getFileExtension,result:\", result);\n return result;\n }\n //======Jquery====\n function Accordion() {\n $(document).off(\"click\", \".accordion .title\");\n\n $(document).on(\"click\", \".accordion .title\", function (j) {\n var dropDown = $(this).closest('.col-sm-12').find('p.acc-info');\n $(this).closest('.accordion').find('p.acc-info').not(dropDown).slideUp();\n\n if ($(this).hasClass('active')) {\n $(this).removeClass('active');\n } else {\n $(this).closest('.accordion').find('a.active').removeClass('active');\n $(this).addClass('active');\n }\n\n dropDown.stop(false, true).slideToggle();\n\n j.preventDefault();\n });\n }\n\n function postToIos(item, url) {\n\n var ctmsSeekTime = parseInt(sessionStorage.getItem('CtmsSeekTime'));\n\n var param = {\n Command: 'playVideo',\n SessionId: angular.copy(vm.data.sessionItem.sessionId),\n ItemId: angular.copy(vm.data.studyActivity.itemId),\n LanguageCode: sessionStorage.getItem('userLang'),\n UserId: $rootScope.userInfo.userAccount,\n Tkn: sessionStorage.getItem('token'),\n FileUrl: url.replace(\"\\\\\", \"/\"),\n CtmsTime: vm.data.ctmsTime, //訓練系統timeout 時數\n CtmsConfirmTime: vm.timeConfig.ctmsConfirmTime, //觀看影片時,如遇到timeout,會彈出一確認視窗,這時數就是確認視窗的倒數計時\n CtmsCourseTimeInterval: vm.data.ctmsCourseTimeInterval, //觀看影片固定回傳時隔\n CtmsSeekTime: !!ctmsSeekTime ? ctmsSeekTime : 0 //影片已觀看的秒數\n };\n console.log('postToIos:', param);\n //mobileService.postCourseInfo(param);\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(param));\n //return param;\n }\n\n function setSession(item) {\n //console.log('setSession');\n sessionStorage.setItem('sessionId', angular.copy(vm.data.sessionItem.sessionId));\n sessionStorage.setItem('itemId', angular.copy(vm.data.studyActivity.itemId));\n sessionStorage.setItem('userId', $rootScope.userInfo.userAccount);\n sessionStorage.setItem('IsLearningRecordCommit', true);\n\n // sessionStorage.setItem('sessionId',1);\n // sessionStorage.setItem('itemId',2);\n // sessionStorage.setItem('userId',3);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app').controller('optionSelectorController', optionSelectorController);\n\n function optionSelectorController($rootScope, $scope, $uibModalInstance, keyValueList, titleTranslate, isCycle) {\n var vm = this;\n vm.cancel = cancel;\n vm.dataSelected = dataSelected;\n vm.title = titleTranslate;\n vm.isCycle = isCycle;\n onInit();\n $scope.list = GetList(keyValueList);\n\n function onInit() {\n dataInit();\n }\n\n function dataInit() {\n vm.isKeyValueList = false;\n }\n\n function cancel() {\n $uibModalInstance.dismiss('cancel');\n }\n\n function GetList(keyValueList) {\n //console.log('GetList:',keyValueList);\n var list = [];\n if (Object.prototype.isPrototypeOf(keyValueList[0]) && !vm.isCycle) {\n for (var i = 0; i <= keyValueList.length - 1; i++) {\n list.push({ id: keyValueList[i].id, name: keyValueList[i].name });\n }\n vm.isKeyValueList = true;\n // console.log('result:',list);\n return list;\n //}else if(vm.isCycle){\n // for (var i = 0; i <= keyValueList.length - 1; i++) {\n // list.push({ value: keyValueList[i].id, name: keyValueList[i].name });\n // }\n // vm.isKeyValueList = true;\n // console.log('result:',list);\n // return list;\n } else {\n //console.log('result:',keyValueList);\n return keyValueList;\n }\n }\n\n function dataSelected(data) {\n $uibModalInstance.close(data);\n }\n }\n})();\n'use strict';\n\n(function () {\n 'use strict';\n\n angular.module('app.directive').directive('taiAskExam', taiAskExam);\n\n function taiAskExam() {\n var directive = {\n bindToController: true,\n controllerAs: 'vm',\n controller: ControllerController,\n link: link,\n restrict: 'E',\n templateUrl: 'controller/tsun/training/myTraining/modal/taiAskExam.html',\n scope: {\n showView: '=',\n sessionId: '=',\n courseActiveItem: '='\n }\n };\n return directive;\n\n function link() {}\n }\n /* @ngInject */\n function ControllerController($rootScope, $scope, trainingInnerService, modalService, $q, $interval) {\n var vm = this;\n vm.submitExam = submitExam;\n vm.retryTest = retryTest;\n vm.reviewContent = reviewContent;\n vm.reviewResult = reviewResult;\n vm.countingTimeShowing = countingTimeShowing;\n init();\n //================\n function init() {\n $q.when(dataInit()).then(function () {});\n $scope.$watch('vm.showView', function (newValue) {\n // if (newValue === oldValue) { return; }\n if (vm.courseActiveItem && newValue) {\n elementLoad();\n } else {\n if (vm.countingSecsInterval) {\n $interval.cancel(vm.countingSecsInterval);\n }\n }\n });\n }\n\n function dataInit() {\n //該頁會使用變數都在這裡\n vm.view = {\n show: false, //............這個元件是否應該顯示\n content: false, //..........試題頁\n examInfo: false, //.........測驗額外資訊\n result: false, //...........測驗回傳結果\n resultTest: false, //.......回傳結果顯示頁面(測試)\n resultQuest: false, //......回傳結果顯示頁面(問卷)\n dataLoadSucess: false, //...畫面讀取成功\n dataLoadFail: false, //.....畫面讀取失敗\n hasSubmit: false, //........是否送出過\n canRetry: false //.........是否能重新受測\n };\n vm.importData = {\n //為避免雙向綁定造成的一些狀況,要將來源資料保存\n courseActiveItem: null,\n sessionId: null\n };\n vm.data = {\n countingSecs: 0,\n examContent: null,\n examContentGroup: null,\n examContentRefer: null,\n result: null\n };\n vm.courseActiveItem = vm.courseActiveItem || null;\n vm.sessionId = vm.sessionId || null;\n vm.showView = vm.showView || false;\n if (vm.countingSecsInterval) {\n $interval.cancel(vm.countingSecsInterval);\n }\n }\n\n function elementLoad() {\n $q.when(dataInit()).then(function () {\n if (!vm.courseActiveItem || !vm.sessionId) {\n return;\n }\n if (vm.courseActiveItem.type !== \"測驗\" && vm.courseActiveItem.type !== \"問卷\") {\n return;\n }\n vm.view.show = true;\n vm.importData.courseActiveItem = angular.copy(vm.courseActiveItem);\n vm.importData.sessionId = angular.copy(vm.sessionId);\n //=====\n var examItemOrder;\n trainingInnerService.getExamSurveyContent(vm.importData.sessionId, vm.importData.courseActiveItem).then(function (data) {\n if (!data) {\n vm.view.dataLoadFail = true;\n return;\n }\n vm.data.examContent = data;\n vm.data.examContent.limitTimesText = limitTimesFormat(vm.data.examContent.limitTimes);\n if (vm.data.examContent.remainingTimes > vm.data.examContent.limitTimes) {\n vm.data.examContent.remainingTimes = vm.data.examContent.limitTimes;\n }\n if (vm.courseActiveItem.type === \"測驗\") {\n vm.view.examInfo = true;\n }\n if (vm.data.examContent.remainingMins > 0) {\n vm.countingSecsInterval = $interval(function () {\n if (vm.data.countingSecs < 1) {\n vm.data.countingSecs = 0;\n submitExam(true, true);\n } else {\n vm.data.countingSecs--;\n }\n }, 1000);\n }\n vm.data.countingSecs = remainingMinsFormat(vm.data.examContent.remainingMins);\n vm.view.content = true;\n vm.view.canRetry = vm.data.examContent.remainingTimes < 0 || vm.data.examContent.remainingTimes > 1;\n vm.data.examContentRefer = {}; // 作為類似DIctionary的索引\n vm.data.examContentGroup = _.chain(vm.data.examContent.questions).groupBy(\"groupName\").map(function (examList) {\n examItemOrder = 1;\n _.forEach(examList, function (examItem) {\n //===索引製作===\n if (!vm.data.examContentRefer[examItem.questionId]) {\n vm.data.examContentRefer[examItem.questionId] = [];\n }\n vm.data.examContentRefer[examItem.questionId].push(examItem);\n //=============\n //===自訂屬性===\n examItem.order = examItemOrder++;\n examItem.value = null;\n examItem.typeText = '';\n examItem.isCorrect = null;\n examItem.showOrder = false;\n examItem.choiceStyle = {\n Line: false,\n Layer: false\n };\n _.forEach(examItem.options, function (optionItem) {\n optionItem.textValue = ''; //..........專門給選擇題帶問答區塊使用(像是其他)\n optionItem.preTitle = false; //........標題是否要前置\n optionItem.correctAnswer = null; //....代表為正確答案\n });\n //=============\n switch (examItem.questionType) {\n case 2:\n //複選\n examItem.choiceStyle.Layer = true;\n examItem.typeText = $rootScope.translate.tsunTestTypeMulti;\n if (!examItem.options) {\n break;\n }\n examItem.value = [null]; //預設位置0為NULL(因為照ORDER處理)\n // _.forEach(examItem.options, function (optionItem) {\n // if (optionItem.value) {\n // examItem.value[optionItem.order] = true;\n // }\n // else {\n // examItem.value[optionItem.order] = false;\n // }\n // });\n break;\n case 3:\n //問答\n examItem.choiceStyle.Layer = true;\n examItem.typeText = $rootScope.translate.tsunTestTypeEssay;\n examItem.value = \"\";\n // if (examItem.options.length > 0) {\n // examItem.value = examItem.options[0].value;\n // }\n break;\n case 7:\n //填充\n examItem.choiceStyle.Layer = true;\n examItem.typeText = $rootScope.translate.tsunTestTypeBlankFill;\n examItem.value = \"\";\n // if (examItem.options.length > 0) {\n // examItem.value = examItem.options[0].value;\n // }\n break;\n case 1:\n case 6:\n //單選\n //是非題\n examItem.choiceStyle.Layer = true;\n examItem.typeText = $rootScope.translate.tsunTestTypeSingle;\n examItem.value = 0;\n // _.forEach(examItem.options, function (optionItem) {\n // if (examItem.value < 1 && optionItem.value && optionItem.order > 0) {\n // examItem.value = optionItem.order;\n // }\n // });\n break;\n case 4:\n case 5:\n examItem.showOrder = true;\n examItem.options[0].preTitle = true;\n examItem.choiceStyle.Line = true;\n examItem.typeText = '';\n examItem.value = 0;\n // _.forEach(examItem.options, function (optionItem) {\n // if (examItem.value < 1 && optionItem.value && optionItem.order > 0) {\n // examItem.value = optionItem.order;\n // }\n // });\n break;\n default:\n //其餘\n examItem.choiceStyle.Line = true;\n examItem.typeText = '';\n examItem.value = 0;\n // _.forEach(examItem.options, function (optionItem) {\n // if (examItem.value < 1 && optionItem.value && optionItem.order > 0) {\n // examItem.value = optionItem.order;\n // }\n // });\n break;\n }\n });\n return {\n 'key': examList[0].groupName,\n 'value': examList\n };\n }).value();\n vm.view.dataLoadSucess = true;\n\n // 解決表單有時在IE無法輸入問題\n fixIeNotAbleToInput('.modal');\n });\n });\n }\n\n function countingTimeShowing(timeSpan) {\n if (timeSpan !== parseInt(timeSpan, 10)) {\n //如果有特別顯示字樣就不處理了。\n return timeSpan;\n }\n var sec_num;\n try {\n sec_num = parseInt(timeSpan, 10); // don't forget the second param\n } catch (exp) {\n sec_num = 0;\n }\n var minutes = Math.floor(sec_num / 60);\n var seconds = sec_num - minutes * 60;\n if (minutes < 10) {\n minutes = \"0\" + minutes;\n }\n if (seconds < 10) {\n seconds = \"0\" + seconds;\n }\n return minutes + ':' + seconds;\n }\n\n function submitExam(finish, forceSubmit) {\n if (!finish) {\n return;\n }\n if (vm.countingSecsInterval) {\n $interval.cancel(vm.countingSecsInterval);\n }\n var itemType;\n var questRequiredUnAnswer = '';\n var questRequiredUnAnswerPerGroup = {};\n var questUnAnswer = '';\n var questUnAnswerPerGroup = {};\n var strEmptyGroupName = '';\n var otherAns = ''; // 其他答案的自填答案\n itemType = vm.importData.courseActiveItem ? vm.importData.courseActiveItem.type : '';\n vm.data.examContent.finish = finish ? 1 : 0;\n vm.data.examContent.answers = [];\n _.forEach(vm.data.examContent.questions, function (examItem) {\n\n if (!examItem.groupName || examItem.groupName.lenght < 1) {\n examItem.groupName = strEmptyGroupName;\n }\n var perAnswer = '';\n var examItemAnswer = '';\n if (angular.isArray(examItem.value)) {\n _.forEach(examItem.value, function (value, valueIndex) {\n //console.log('examItem:', examItem);\n if (value && valueIndex > 0) {\n if (examItemAnswer) {\n examItemAnswer += ',';\n }\n examItemAnswer += valueIndex;\n }\n });\n //加上其他答案(複選)\n if (examItem.options[examItem.options.length - 1].textValue) {\n otherAns = examItem.options[examItem.options.length - 1].textValue;\n examItemAnswer += ',clOtherAnswer=' + otherAns;\n }\n if (!examItemAnswer) {\n examItemAnswer = 0;\n }\n //console.log('examItemAnswer:', examItemAnswer);\n } else {\n examItemAnswer = angular.copy(examItem.value);\n //加上其他答案 (單選)\n if (examItem.options[examItem.options.length - 1].textValue) {\n otherAns = examItem.options[examItem.options.length - 1].textValue;\n examItemAnswer += ',clOtherAnswer=' + otherAns;\n }\n //console.log('examItem22:', examItemAnswer);\n }\n //console.log(\"exam order:\", examItem.order, \".....examItemAnswer:\", examItemAnswer);\n if (!examItemAnswer || examItemAnswer.length < 1) {\n examItemAnswer = '0';\n if (examItem.questionType === 3 || examItem.questionType === 7) {\n examItemAnswer = '\\0';\n }\n if (examItem.required) {\n if (!questRequiredUnAnswerPerGroup[examItem.groupName]) {\n questRequiredUnAnswerPerGroup[examItem.groupName] = '';\n }\n if (questRequiredUnAnswerPerGroup[examItem.groupName].length > 0) {\n questRequiredUnAnswerPerGroup[examItem.groupName] += ',';\n }\n questRequiredUnAnswerPerGroup[examItem.groupName] += examItem.order;\n } else {\n if (!questUnAnswerPerGroup[examItem.groupName]) {\n questUnAnswerPerGroup[examItem.groupName] = '';\n }\n if (questUnAnswerPerGroup[examItem.groupName].length > 0) {\n questUnAnswerPerGroup[examItem.groupName] += ',';\n }\n questUnAnswerPerGroup[examItem.groupName] += examItem.order;\n }\n }\n if (examItemAnswer) {\n perAnswer = examItemAnswer;\n perAnswer = examItem.questionId + \"_\" + perAnswer;\n }\n if (perAnswer) {\n vm.data.examContent.answers.push(perAnswer);\n }\n });\n //======必填欄位驗證\n _.forEach(questRequiredUnAnswerPerGroup, function (value, key) {\n if (key.lenght > 0) {\n questRequiredUnAnswer += key + ':';\n }\n questRequiredUnAnswer += value + '\\n';\n });\n if (questRequiredUnAnswer.length > 0 && vm.data.examContent.finish === 1 && !forceSubmit) {\n toastr.warning($rootScope.translate.tsunTest + '\\n' + questRequiredUnAnswer + $rootScope.translate.tsunTestRequiredAlert);\n return;\n }\n //=====未填欄位確認\n _.forEach(questUnAnswerPerGroup, function (value, key) {\n if (key.lenght > 0) {\n questUnAnswer += key + ':';\n }\n questUnAnswer += value + '\\n';\n });\n\n vm.data.examContent.activeItemtype = itemType; //TODO 這邊加入是為了測試環境的簡單互動,若要移除測試環境時可以將此行拿掉。\n if (questUnAnswer.length > 0 && vm.data.examContent.finish === 1 && !forceSubmit) {\n\n var confirmDialog = modalService.confrimDialog({\n confirmContent: $rootScope.translate.tsunTest + '\\n' + questUnAnswer + $rootScope.translate.tsunTestComfirm\n });\n confirmDialog.result.then(function (result) {\n result = !!result;\n if (result !== true) {\n return;\n }\n return postExamSurveyContent(finish, itemType);\n });\n } else {\n return postExamSurveyContent(finish, itemType);\n }\n }\n\n function postExamSurveyContent(finish, itemType) {\n console.log(\"examContent :\", vm.data.examContent);\n var resultPost = trainingInnerService.postExamSurveyContent(vm.importData.sessionId, vm.data.examContent);\n return resultPost.then(function (result) {\n console.log(\"postExamSurveyContent result:\", result);\n if (!result) {\n return;\n }\n vm.data.result = result;\n viewShowContentFormat();\n vm.view.hasSubmit = true;\n vm.view.examInfo = false;\n\n // 問卷後續會 emit 報名課程作業,因此由那邊顯示成功或失敗訊息即可\n if (finish && itemType === '測驗') {\n console.log('yo-postExamSurveyContent:', result);\n //應台新要求將發送成功的訊息拿掉\n //toastr.success($rootScope.translate.tsunSendSuccess); \n }\n\n if (itemType === '測驗') {\n vm.view.resultTest = true;\n }\n if (itemType === '問卷') {\n vm.view.resultQuest = true;\n }\n if (itemType === '測驗' && vm.data.examContent.finish === 1) {\n vm.view.result = true;\n //測驗結果顯示\n _.forEach(vm.data.result.questionResults, function (resultItem) {\n var referData;\n //===資料檢核===\n if (!vm.data.examContentRefer[resultItem.questionId]) {\n return;\n }\n if (!angular.isArray(vm.data.examContentRefer[resultItem.questionId])) {\n return;\n }\n //=============\n referData = vm.data.examContentRefer[resultItem.questionId];\n _.forEach(referData, function (examItem) {\n var resultCorrectAnswerForMulti = resultItem.correctAnswer.split(',');\n examItem.isCorrect = resultItem.correctAnswer === resultItem.studentAnswer;\n examItem.value = null;\n //=====處理學生填答=====\n if (examItem.questionType === 3 || examItem.questionType === 7) {\n examItem.value = resultItem.studentAnswer;\n } else if (examItem.questionType === 2) {\n var resultStudentAnswer = resultItem.studentAnswer.split(',');\n examItem.value = [];\n _.forEach(resultStudentAnswer, function (answerItem) {\n examItem.value[answerItem] = true;\n });\n } else {\n examItem.value = resultItem.studentAnswer;\n }\n //===================\n //=====正確答案處理=====\n //若resultItem.correctAnswer為空應該就是沒有正確答案 = 不用處理\n if (resultItem.correctAnswer.length < 1) {\n return;\n }\n _.forEach(examItem.options, function (optionItem) {\n var optionOrder = optionItem.order + '';\n\n if (examItem.questionType === 3 || examItem.questionType === 7) {\n // 移除此行避免用戶輸入的資料變成正確資料\n // examItem.value = resultItem.correctAnswer;\n optionItem.correctAnswer = resultItem.correctAnswer;\n //console.log('examItem:', examItem);\n } else if (examItem.questionType === 2) {\n _.forEach(resultCorrectAnswerForMulti, function (answerItem) {\n //console.log('answerItem:',answerItem);\n //optionItem.correctAnswer = false; //\n if (optionOrder === answerItem) {\n optionItem.correctAnswer = true;\n }\n });\n } else {\n optionItem.correctAnswer = optionOrder === resultItem.correctAnswer;\n }\n });\n\n //=====================\n });\n });\n }\n\n // 觸發 emitExamSubmit 執行報名作業\n // courseDetailModalController enroll\n $scope.$emit('emitExamSubmit', '');\n });\n }\n\n function viewShowContentFormat() {\n vm.view.resultTest = false;\n vm.view.resultQuest = false;\n vm.view.content = false;\n }\n\n function retryTest() {\n elementLoad();\n $scope.$emit('goTop', '');\n }\n\n function reviewContent() {\n viewShowContentFormat();\n vm.view.content = true;\n }\n\n function reviewResult() {\n viewShowContentFormat();\n vm.view.resultTest = true;\n }\n\n function limitTimesFormat(times) {\n var result = times;\n if (parseInt(times) < 0) {\n result = $rootScope.translate.tsunNoLimit;\n }\n return result;\n }\n\n function remainingMinsFormat(remainMins) {\n var result = '';\n if (remainMins > -1) {\n result = remainMins;\n } else {\n result = $rootScope.translate.tsunNoLimit;\n }\n return result;\n }\n }\n})();","var DEVICE_TYPE = null; //手機裝置才會給予內容值\r\nvar DEVICE_TOKEN = null; //手機裝置才會給予內容值\r\nvar DEVICE_ID = null; //手機裝置才會給予內容值\r\nvar USER_ID = null; //手機裝置才會給予內容值\r\n//2023-07-10 Johnson 資安2023\r\nvar PWD = eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0;',2,1,'null'.split('|'),0,{})) //手機裝置才會給予內容值\r\nvar APP_VERSION = -1; //\r\nvar IOS_VERSION = null;\r\n\r\nfunction setSsoInfo(data) {\r\n sessionStorage.setItem('token', data.Token);\r\n sessionStorage.setItem('cName', data.CName);\r\n sessionStorage.setItem('perSerilNo', data.PerSerilNo || data.PerserilNo);\r\n}\r\n\r\nfunction removeSsoInfo() {\r\n sessionStorage.removeItem('token');\r\n sessionStorage.removeItem('perSerilNo');\r\n sessionStorage.removeItem('cName');\r\n sessionStorage.removeItem('isForce');\r\n}\r\n\r\n\r\nvar errorMsgs = [];\r\n\r\n// 判斷相同錯誤是否已經提報伺服端\r\n// 避免無窮迴圈的錯誤不斷發送攻擊\r\nfunction isAlreadyReport(mewMsg) {\r\n if (errorMsgs.length > 0) {\r\n for (let index = 0; index < errorMsgs.length; index++) {\r\n const msg = errorMsgs[index];\r\n if (msg == mewMsg) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n//filter the exception that no use\r\nvar isNoUseErrors = ['$digest already in progress'];\r\n\r\nfunction isNoUseError(msg) {\r\n var result = false;\r\n for (var i = 0; i <= isNoUseErrors.length - 1; i++) {\r\n if (msg.indexOf(isNoUseErrors[i]) > -1) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n\r\nfunction postException(exception, apiUrl) {\r\n var param = {\r\n exception: exception,\r\n route: location.href,\r\n perSerilNo: sessionStorage.getItem('perSerilNo')\r\n };\r\n\r\n // 發送到後端記錄錯誤LOG (重複的LOG就不要再直直送了)\r\n if (isAlreadyReport(param.exception) == false && !isNoUseError(param.exception)) {\r\n errorMsgs.push(param.exception)\r\n\r\n console.log(\"call postException\");\r\n //console.log(data);\r\n\r\n // 20181002 停止使用前端 Log 機制,因為無意義的錯誤紀錄會造成誤解,此外也無法透過此機制得到任何除錯幫助\r\n // $.post(apiUrl.tsApi + 'log/PostFront', param).then(function(data) {\r\n // //console.log(\"call postException [\"+apiUrl.tsApi + 'log/PostFront'+\"],result:\", data);\r\n // });\r\n }\r\n\r\n}\r\n\r\nfunction queryString(name) {\r\n // console.log(\"queryString\");\r\n // console.log(\"location.href\",location.href);\r\n //2023-07-10 Johnson 資安2023\r\n var AllVars = eval(function (p, a, c, k, e, r) { e = function (c) { return c.toString(a) }; if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('3.4.5(\\'?\\')[1].0(//2,\\'&7\\').0(/\"/2,\\'&8\\').0(/\\'/2,\\' \\').0(/[<>!]|(\\\\(\\\\))|((a|b|c)\\\\d*\\\\(.*\\\\))/2,\\'\\')', 14, 14, 'replace||g|location|href|split|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}))\r\n var Vars = AllVars.split('&');\r\n for (let i = 0; i < Vars.length; i++) {\r\n var Var = Vars[i].split(\"=\");\r\n if (Var[0] == name) {\r\n return Var[1];\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nfunction getMenuQueryString() {\r\n if (location.href.split('menu=').length > 1) {\r\n return location.href.split('menu=')[1];\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction showSystemError() {\r\n var errorMessage;\r\n switch (sessionStorage['userLang']) {\r\n case 'zh-TW':\r\n errorMessage = '很抱歉!此頁面發生了一些錯誤,系統已自動通知網站管理員,將儘速為您處理,請您稍後再使用本功能。';\r\n break;\r\n case 'zh-CN':\r\n errorMessage = '很抱歉!此页面发生了一些错误,系统已自动通知网站管理员,将尽速为您处理,请您稍后再使用本功能。 ';\r\n break;\r\n case 'en-US':\r\n errorMessage = 'very sorry! Some errors occurred on this page, the system automatically notify your webmaster will process as soon as possible for you, please try again later with this function. ';\r\n break;\r\n }\r\n\r\n toastr.error(errorMessage);\r\n}\r\n// function getDefaultLangCode() {\r\n// var langSerilNo = 1;\r\n// var userLang = navigator.language || navigator.userLanguage;\r\n// sessionStorage.setItem('userLang', userLang);\r\n// userLang = _.replace(userLang, '_', '-');\r\n// switch (userLang.toLowerCase()) {\r\n// case 'zh-cn':\r\n// langSerilNo = 2;\r\n// break;\r\n// case 'en-us':\r\n// langSerilNo = 3;\r\n// break;\r\n// case 'zh-tw':\r\n// langSerilNo = 1;\r\n// break;\r\n// }\r\n// sessionStorage.setItem('langCode', langSerilNo);\r\n// return langSerilNo;\r\n// }\r\n\r\nfunction getLangCode(userLang) {\r\n\r\n var langSerilNo = 1;\r\n sessionStorage.setItem('userLang', userLang);\r\n userLang = _.replace(userLang, '_', '-');\r\n switch (userLang.toLowerCase()) {\r\n case 'zh-cn':\r\n langSerilNo = 2;\r\n break;\r\n case 'en-us':\r\n langSerilNo = 3;\r\n break;\r\n case 'zh-tw':\r\n langSerilNo = 1;\r\n break;\r\n }\r\n sessionStorage.setItem('langCode', langSerilNo);\r\n return langSerilNo;\r\n}\r\n\r\n\r\nfunction getDefaultUserLang(tsApiUrl, ieSystemLang) {\r\n return jQuery.ajax({\r\n type: \"GET\",\r\n url: tsApiUrl + 'header/acceptSupportedLanguage?ieSystemLang=' + ieSystemLang,\r\n async: false\r\n });\r\n}\r\n\r\nfunction intConvertTime(intTimeSpan) {\r\n var sec_num;\r\n try {\r\n sec_num = parseInt(intTimeSpan, 10); // don't forget the second param\r\n } catch (exp) {\r\n sec_num = 0;\r\n }\r\n var hours = Math.floor(sec_num / 3600);\r\n var minutes = Math.floor((sec_num - (hours * 3600)) / 60);\r\n var seconds = sec_num - (hours * 3600) - (minutes * 60);\r\n\r\n if (hours < 10) { hours = \"0\" + hours; }\r\n if (minutes < 10) { minutes = \"0\" + minutes; }\r\n if (seconds < 10) { seconds = \"0\" + seconds; }\r\n return hours + ':' + minutes + ':' + seconds;\r\n}\r\n\r\n\r\nfunction appCallback(method, params) {\r\n var Base64 = {\r\n _keyStr: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\r\n encode: function(e) {\r\n var t = \"\";\r\n var n, r, i, s, o, u, a;\r\n var f = 0;\r\n e = Base64._utf8_encode(e);\r\n while (f < e.length) {\r\n n = e.charCodeAt(f++);\r\n r = e.charCodeAt(f++);\r\n i = e.charCodeAt(f++);\r\n s = n >> 2;\r\n o = (n & 3) << 4 | r >> 4;\r\n u = (r & 15) << 2 | i >> 6;\r\n a = i & 63;\r\n if (isNaN(r)) { u = a = 64 } else if (isNaN(i)) { a = 64 }\r\n t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)\r\n }\r\n return t\r\n },\r\n decode: function(e) {\r\n var t = \"\";\r\n var n, r, i;\r\n var s, o, u, a;\r\n var f = 0;\r\n e = e.replace(/[^A-Za-z0-9+/=]/g, \"\");\r\n while (f < e.length) {\r\n s = this._keyStr.indexOf(e.charAt(f++));\r\n o = this._keyStr.indexOf(e.charAt(f++));\r\n u = this._keyStr.indexOf(e.charAt(f++));\r\n a = this._keyStr.indexOf(e.charAt(f++));\r\n n = s << 2 | o >> 4;\r\n r = (o & 15) << 4 | u >> 2;\r\n i = (u & 3) << 6 | a;\r\n t = t + String.fromCharCode(n);\r\n if (u != 64) {\r\n t = t + String.fromCharCode(r)\r\n }\r\n if (a != 64) { t = t + String.fromCharCode(i) }\r\n }\r\n t = Base64._utf8_decode(t);\r\n return t\r\n },\r\n _utf8_encode: function(e) {\r\n e = e.replace(/rn/g, \"n\");\r\n var t = \"\";\r\n for (var n = 0; n < e.length; n++) {\r\n var r = e.charCodeAt(n);\r\n if (r < 128) {\r\n t += String.fromCharCode(r)\r\n } else if (r > 127 && r < 2048) {\r\n t += String.fromCharCode(r >> 6 | 192);\r\n t += String.fromCharCode(r & 63 | 128)\r\n } else {\r\n t += String.fromCharCode(r >> 12 | 224);\r\n t += String.fromCharCode(r >> 6 & 63 | 128);\r\n t += String.fromCharCode(r & 63 | 128)\r\n }\r\n }\r\n return t\r\n },\r\n _utf8_decode: function(e) {\r\n var t = \"\";\r\n var n = 0;\r\n var r = c1 = c2 = 0;\r\n while (n < e.length) {\r\n r = e.charCodeAt(n);\r\n if (r < 128) {\r\n t += String.fromCharCode(r);\r\n n++\r\n } else if (r > 191 && r < 224) {\r\n c2 = e.charCodeAt(n + 1);\r\n t += String.fromCharCode((r & 31) << 6 | c2 & 63);\r\n n += 2\r\n } else {\r\n c2 = e.charCodeAt(n + 1);\r\n c3 = e.charCodeAt(n + 2);\r\n t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\r\n n += 3\r\n }\r\n }\r\n return t\r\n }\r\n };\r\n var encParams = Base64.encode(JSON.stringify(params));\r\n if (method.match('CloseWebView')) { method = 'CloseWebView' };\r\n var tmpFrame = document.createElement(\"frame\");\r\n document.documentElement.appendChild(tmpFrame);\r\n tmpFrame.src = (\"app://[method]?p=[params]\")\r\n .replace(\"[method]\", method)\r\n .replace(\"[params]\", encParams);\r\n setTimeout(function() { document.documentElement.removeChild(tmpFrame) }, 0);\r\n}\r\n\r\nfunction p(jstr) {\r\n try {\r\n return JSON.parse(jstr);\r\n } catch (e) {\r\n return {};\r\n };\r\n}\r\n\r\n\r\nfunction fixIeNotAbleToInput(selector = '') {\r\n\r\n setTimeout(function() {\r\n $(`${selector} input`).each(function() {\r\n // $(this).attr(\"placeholder\", window.location);\r\n // $(this).css({ \"background-color\": \"blue\" });\r\n $(this).focus(function() {\r\n $(this).select();\r\n });\r\n });\r\n\r\n $(`${selector} textarea`).each(function() {\r\n // $(this).attr(\"placeholder\", window.location);\r\n // $(this).css({ \"background-color\": \"blue\" });\r\n $(this).focus(function() {\r\n $(this).select();\r\n });\r\n })\r\n }, 500);\r\n}\r\n\r\nfunction infoDebug(msg) {\r\n var param = {\r\n Command: msg\r\n };\r\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(param));\r\n}","\tfunction str_encrypt(str) {\r\n var c = String.fromCharCode(str.charCodeAt(0) + str.length);\r\n\r\n for (var i = 1; i < str.length; i++) {\r\n c += String.fromCharCode(str.charCodeAt(i) + str.charCodeAt(i - 1));\r\n }\r\n\r\n return encodeURIComponent(c);\r\n }\r\n\tfunction str_decrypt(str) {\r\n str = decodeURIComponent(str);\r\n var c = String.fromCharCode(str.charCodeAt(0) - str.length);\r\n\r\n for (var i = 1; i < str.length; i++) {\r\n c += String.fromCharCode(str.charCodeAt(i) - c.charCodeAt(i - 1));\r\n }\r\n return c;\r\n }","\t/**生成一個隨機數**/\r\n\tfunction randomNum(min, max) {\r\n return Math.floor((new Date()).getTime() * (max - min) + min);\r\n }\r\n\t/**生成一個隨機色**/\r\n\tfunction randomColor(min, max) {\r\n var r = randomNum(min, max);\r\n var g = randomNum(min, max);\r\n var b= randomNum(min, max);\r\n return \"rgb(\" + r + \",\" + g + \",\" + b + \")\";\r\n }\r\n\t/**繪制驗證碼圖片**/\r\n\tfunction drawPic(parSrc) {\r\n var canvas = document.getElementById(\"canvas\");\r\n var width = canvas.width;\r\n var height = canvas.height;\r\n //獲取該canvas的2D繪圖環境 \r\n var ctx = canvas.getContext('2d'); \r\n ctx.textBaseline ='bottom';\r\n /**繪制背景色**/\r\n ctx.fillStyle = randomColor(180,240);\r\n //顏色若太深可能導致看不清\r\n ctx.fillRect(0,0,width,height);\r\n /**繪制文字**/\r\n var str ='ABCEFGHJKLMNPQRSTWXY123456789';\r\n      var code=\"\";\r\n      //生成四個驗證碼\r\n for(var i=1;i<=4;i++) {\r\n if(parSrc == undefined)\r\n var txt = str[randomNum(0,str.length)];\r\n else\r\n var txt = parSrc.substring(i-1,i);\r\n code=code+txt;\r\n ctx.fillStyle = randomColor(50,160);\r\n //隨機生成字體顏色\r\n ctx.font = randomNum(18,32) +'px SimHei';\r\n //隨機生成字體大小\r\n var x =10 +i *25;\r\n var y = randomNum(25,35);\r\n var deg = randomNum(0,45);\r\n //修改坐標原點和旋轉角度\r\n ctx.translate(x, y); \r\n ctx.rotate(deg * Math.PI /180); \r\n ctx.fillText(txt,0,0);\r\n //恢復坐標原點和旋轉角度\r\n ctx.rotate(-deg * Math.PI /180);\r\n ctx.translate(-x, -y);\r\n }\r\n \r\n /**繪制幹擾線**/\r\n for(var i=0;i<0;i++) {\r\n ctx.strokeStyle = randomColor(40, 180);\r\n ctx.beginPath();\r\n ctx.moveTo(randomNum(0,width/2), randomNum(0,height/2));\r\n ctx.lineTo(randomNum(0,width/2), randomNum(0,height));\r\n ctx.stroke();\r\n }\r\n /**繪制幹擾點**/\r\n for(var i=0;i <30;i++) {\r\n ctx.fillStyle = randomColor(255);\r\n ctx.beginPath();\r\n ctx.arc(randomNum(0, width), randomNum(0, height),1,0,2* Math.PI);\r\n ctx.fill();\r\n }\r\n }\r\n\r\n function callVerify() { \r\n var ajax_url = sessionStorage.getItem('VcUrl').replace(\"undefined\",\"\") + 'Sso/verifyCode'\r\n\r\n $.ajax({\r\n url: ajax_url,\r\n type: 'POST',\r\n error: function(){\r\n console.log('error');\r\n },\r\n success: function(e){\r\n\r\n $(\"#codeimage\").attr(\"src\", \"data:image/jpg;base64,\"+e.isPass);\r\n $('#isPass').val(e.SecretKey);\r\n \r\n }\r\n });\r\n\r\n }","(function () {\r\n 'use strict';\r\n angular.module('app.service', []);\r\n angular.module('app.directive', []);\r\n angular.module('app.filter', ['ngSanitize']);\r\n angular.module('app', [\r\n 'ui.bootstrap',\r\n 'ngMessages',\r\n 'ngAnimate',\r\n 'angular-loading-bar',\r\n 'ngTouch',\r\n 'ngRoute',\r\n 'pascalprecht.translate',\r\n 'ngSanitize',\r\n 'datePicker',\r\n 'vcRecaptcha',\r\n 'treeControl',\r\n 'blockUI',\r\n \"com.2fdevs.videogular\",\r\n \"com.2fdevs.videogular.plugins.controls\",\r\n \"com.2fdevs.videogular.plugins.overlayplay\",\r\n \"com.2fdevs.videogular.plugins.poster\",\r\n 'app.service',\r\n 'app.directive',\r\n 'app.filter'\r\n ])\r\n .constant('finacialLicicense', true)\r\n .constant('sysCode', 'MHR')\r\n .constant('_sessionDecaySecs', 1200000)\r\n .config(toastrConfig)\r\n .config(execptionConfig)\r\n .config(translateConfig)\r\n .config(httpConfig)\r\n .config(blockUIConfig).config(['$locationProvider', function($locationProvider) {\r\n $locationProvider.hashPrefix('');\r\n }]);\r\n\r\n function toastrConfig() {\r\n toastr.options = {\r\n 'closeButton': true,\r\n 'onclick': null,\r\n 'showDuration': '300',\r\n 'hideDuration': '1000',\r\n 'timeOut': '4000',\r\n 'progressBar': true,\r\n 'positionClass': 'toast-top-right',\r\n 'preventDuplicates': true,\r\n 'newestOnTop': true\r\n };\r\n }\r\n\r\n function blockUIConfig(blockUIConfig) {\r\n // Disable automatically blocking of the user interface\r\n blockUIConfig.autoBlock = false;\r\n // Change the default delay to 100ms before the blocking is visible \r\n blockUIConfig.delay = 100;\r\n // Provide a custom template to use\r\n blockUIConfig.template = `\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\r\n function execptionConfig($provide, apiUrl) {\r\n $provide.decorator('$exceptionHandler', function ($delegate) {\r\n return function (exception, cause) {\r\n $delegate(exception, cause);\r\n postException(exception, apiUrl);\r\n };\r\n });\r\n }\r\n\r\n\r\n function translateConfig($translateProvider, apiUrl) {\r\n\r\n if (!sessionStorage.getItem('userLang')) {\r\n\r\n getDefaultUserLang(apiUrl.tsApi, navigator.systemLanguage).done(function (data) {\r\n\r\n var userLang = data;\r\n sessionStorage.setItem('userLang', _.replace(userLang, '_', '-'));\r\n sessionStorage.setItem('langCode', getLangCode(userLang));\r\n\r\n $translateProvider.useSanitizeValueStrategy('escapeParameters');\r\n $translateProvider.preferredLanguage(sessionStorage['userLang']);\r\n $translateProvider.useUrlLoader(apiUrl.tsApi + 'getTranslationResource');\r\n });\r\n\r\n } else {\r\n $translateProvider.useSanitizeValueStrategy('escapeParameters');\r\n $translateProvider.preferredLanguage(sessionStorage['userLang']);\r\n $translateProvider.useUrlLoader(apiUrl.tsApi + 'getTranslationResource');\r\n }\r\n }\r\n\r\n function httpConfig($httpProvider) {\r\n $httpProvider.interceptors.push('httpInterceptor');\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular.module('app')\r\n .config(ngRouteConfig);\r\n\r\n function ngRouteConfig($routeProvider) {\r\n $routeProvider\r\n .when('/', {\r\n templateUrl: 'controller/home/home.index.html',\r\n controller: 'homeController as vm',\r\n resolve: {\r\n viewModel: function (homeService) {\r\n return homeService.getMhr();\r\n }\r\n }\r\n })\r\n .when('/login', {\r\n controller: 'loginController as vm',\r\n templateUrl: 'controller/login/login.index.html',\r\n resolve: {\r\n viewModel: function (loginService) {\r\n return loginService.get();\r\n }\r\n }\r\n })\r\n .when('/token:token', {\r\n controller: 'rootController as vm'\r\n })\r\n .when('/verifyCode/:verifyCode/:email/:sysCode', {\r\n controller: 'verifyCodeController as vm',\r\n templateUrl: 'controller/login/login.verifyCode.html'\r\n })\r\n .when('/login/forceEditPwd', {\r\n controller: 'loginForceEditPwdController as vm',\r\n templateUrl: 'controller/login/login.forceEditPwd.html'\r\n })\r\n .when('/login/directEditPwd/:userAccount/:verifyCode/:mobilTel?', {\r\n controller: 'loginDirectEditPwdController as vm',\r\n templateUrl: 'controller/login/login.directEditPwd.html'\r\n })\r\n\r\n\r\n .when('/login/forgetPwdDirectEditPwd/:userAccount/:verifyCode', {\r\n templateUrl: 'controller/login/login.forgetPwdDirectEditPwd.html',\r\n controller: 'loginForgetPwdDirectEditPwdController as vm'\r\n })\r\n\r\n .when('/tsu/', {\r\n controller: 'tsunHomeController as vm',\r\n templateUrl: 'controller/tsun/home/home.index.html',\r\n resolve: {\r\n viewModel: function (homeService) {\r\n return homeService.getTsu();\r\n }\r\n }\r\n })\r\n .when('/tsu/course', {\r\n templateUrl: 'controller/tsun/training/course/course.index.html',\r\n controller: 'tsunCourseController as vm',\r\n resolve: {\r\n // translate: function (translateService) {\r\n // return translateService.getTranslates()\r\n // .then(function (data) { return data; });\r\n // },\r\n userInfo: function (loginService, $rootScope) {\r\n return loginService.getSsoInfo().then(function (data) {\r\n $rootScope.userInfo = data.data;\r\n return $rootScope.userInfo;\r\n });\r\n },\r\n urlParam: function ($routeParams) {\r\n return $routeParams;\r\n }\r\n }\r\n })\r\n .when('/tsu/training', {\r\n templateUrl: 'controller/tsun/training/myTraining/myTraining.index.html',\r\n controller: 'tsunMyTrainingController as vm',\r\n resolve: {\r\n // translate: function (translateService) {\r\n // return translateService.getTranslates()\r\n // .then(function (data) { return data; });\r\n // },\r\n ssoInfo: function (loginService, $rootScope) {\r\n return loginService.getSsoInfo().then(function (data) {\r\n $rootScope.userInfo = data.data;\r\n return data.data;\r\n });\r\n }\r\n }\r\n })\r\n .when('/tsu/shoppingCart', {\r\n templateUrl: 'controller/tsun/training/courseCollection/shoppingCart.index.html',\r\n controller: 'tsunShoppingCartController as vm',\r\n resolve: {\r\n // translate: function (translateService) {\r\n // return translateService.getTranslates()\r\n // .then(function (data) { return data; });\r\n // },\r\n ssoInfo: function (loginService, $rootScope) {\r\n return loginService.getSsoInfo().then(function (data) {\r\n $rootScope.userInfo = data.data;\r\n return data.data;\r\n });\r\n }\r\n }\r\n })\r\n .when('/tsu/recommend2', {\r\n templateUrl: 'controller/tsun/training/recommend/recommend.index.html',\r\n controller: 'tsunRecommendController as vm',\r\n resolve: {\r\n // translate: function (translateService) {\r\n // return translateService.getTranslates()\r\n // .then(function (data) { return data; });\r\n // },\r\n activeType: function () {\r\n return 2;\r\n }\r\n }\r\n })\r\n .when('/tsu/recommend3', {\r\n templateUrl: 'controller/tsun/training/recommend/recommend.index.html',\r\n controller: 'tsunRecommendController as vm',\r\n resolve: {\r\n // translate: function (translateService) {\r\n // return translateService.getTranslates()\r\n // .then(function (data) { return data; });\r\n // },\r\n activeType: function () {\r\n return 3;\r\n }\r\n }\r\n })\r\n .when('/tsu/recommendHTML', {\r\n templateUrl: 'controller/tsun/training/recommend/recommend.Doc.html',\r\n controller: 'tsunRecommendDocController as vm',\r\n resolve: {}\r\n })\r\n .when('/tsu/visualpage/:pageSerilNo', {\r\n templateUrl: 'controller/tsun/visualpage/visualpage.index.html',\r\n controller: 'visualpageController as vm',\r\n resolve: {\r\n viewModel: function (visualPageService, $route) {\r\n return visualPageService.get($route.current.params.pageSerilNo);\r\n }\r\n }\r\n })\r\n .when('/tsu/bulletin/more', {\r\n templateUrl: 'controller/tsun/bulletin/bulletin.more.html',\r\n controller: 'tsunBulletinMoreController as vm',\r\n resolve: {\r\n viewModel: function (bulletinService) {\r\n return bulletinService.getNoticeMore();\r\n }\r\n }\r\n })\r\n .when('/tsu/bulletin/noticeDetail/:no?/:isBulletin?', {\r\n templateUrl: 'controller/tsun/bulletin/bulletin.noticeDetail.html',\r\n controller: 'tsunBulletinNoticeDetailController as vm',\r\n resolve: {\r\n viewModel: function (bulletinService, $route) {\r\n return bulletinService.getByNoForTsun($route.current.params.no);\r\n }\r\n }\r\n })\r\n .when('/bulletin/more/:isHistory?', {\r\n templateUrl: 'controller/bulletin/bulletin.more.html',\r\n controller: 'bulletinMoreController as vm',\r\n resolve: {\r\n viewModel: function (bulletinService, enumService, $route) {\r\n return bulletinService.getMore(enumService.siteCode.hrOutside, $route.current.params.isHistory);\r\n }\r\n }\r\n })\r\n .when('/bulletin/detail/:no', {\r\n templateUrl: 'controller/bulletin/bulletin.detail.html',\r\n controller: 'bulletinDetailController as vm',\r\n resolve: {\r\n viewModel: function (bulletinService, $route) {\r\n return bulletinService.getByNo($route.current.params.no);\r\n }\r\n }\r\n })\r\n .when('/header/searchResult/:keyword?/:siteCode?', {\r\n templateUrl: 'controller/header/header.searchResult.html',\r\n controller: 'headerSearchResultController as vm',\r\n resolve: {\r\n viewModel: function (headerService, $route) {\r\n return headerService.getSearchResult($route.current.params.keyword, 1 /*page*/, 1 /*all*/, $route.current.params.siteCode,true /*need Keyword Log*/);\r\n },\r\n siteCode: function ($route) {\r\n return $route.current.params.siteCode;\r\n }\r\n }\r\n })\r\n .when('/schedule', {\r\n templateUrl: 'controller/schedule/schedule.index.html',\r\n controller: 'scheduleController as vm',\r\n resolve: {\r\n viewModel: function (scheduleService) {\r\n return scheduleService.getCalendarArea();\r\n }\r\n }\r\n })\r\n .when('/nextMenu', {\r\n templateUrl: 'controller/nextMenu/nextMenu.index.html',\r\n controller: 'nextMenuController as vm',\r\n resolve: {\r\n viewModel: function (homeService) {\r\n return homeService.getNext();\r\n }\r\n }\r\n })\r\n .when('/nextMenu/detail/:no', {\r\n templateUrl: 'controller/nextMenu/nextMenu.detail.html',\r\n controller: 'nextMenuDetailController as vm',\r\n resolve: {\r\n viewModel: function (bulletinService, $route) {\r\n return bulletinService.getByNo($route.current.params.no);\r\n }\r\n }\r\n })\r\n .when('/mobile/trigger/', {\r\n templateUrl: 'controller/mobile/mobile.trigger.html',\r\n controller: 'mobileTriggerController as vm'\r\n })\r\n .when('/common/index/', {\r\n templateUrl: 'controller/common/common.index.html',\r\n controller: 'commonController as vm'\r\n })\r\n .when('/external', {\r\n templateUrl: 'controller/external/external.index.html',\r\n controller: 'externalController as vm'\r\n })\r\n .when('/external/schemaTransfer', {\r\n templateUrl: 'controller/external/external.schemaTransfer.html',\r\n controller: 'externalSchemaTransferController as vm'\r\n })\r\n .otherwise({\r\n redirectTo: '/'\r\n });\r\n }\r\n\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n\r\n angular.module('app')\r\n .run(run);\r\n\r\n function run($rootScope, $location,$uibModalStack) {\r\n\r\n\r\n $rootScope.$on('$routeChangeStart', function (event, current) {\r\n\r\n $('#taishinExternal').empty().remove();\r\n $('#captcha iframe').empty().remove();\r\n\r\n\r\n // 如果登入後到 login 頁需要轉到預設頁面\r\n // 是參考 taiHeader.directive 的判斷登入邏輯\r\n let isLogin = !_.isEmpty(sessionStorage.getItem('perSerilNo')) && !sessionStorage.getItem('isForce');\r\n var currentPage = current.originalPath;\r\n if (currentPage === '/login' && isLogin) {\r\n $location.path('/').search({});\r\n }\r\n\r\n });\r\n\r\n $rootScope.$on('$routeChangeSuccess', function (event, current) {\r\n \r\n // When the user clicks on the button, scroll to the top of the document\r\n document.body.scrollTop = 0; // For Chrome, Safari and Opera \r\n document.documentElement.scrollTop = 0; // For IE and Firefox\r\n\r\n\r\n $(\".ui-blackCover\").css(\"display\",\"none\");\r\n\r\n // 移除目前所有 modal 視窗 (避免殘存) \r\n $uibModalStack.dismissAll();\r\n\r\n // 解決表單有時在IE無法輸入問題\r\n fixIeNotAbleToInput();\r\n\r\n var isForce = sessionStorage.getItem('isForce');\r\n var currentPage = current.originalPath;\r\n //var prevPage = prev ? prev.originalPath : null;\r\n $rootScope.cName = sessionStorage.getItem('cName');\r\n\r\n if (isForce) {\r\n $location.path('/login/forceEditPwd');\r\n } else {\r\n if (currentPage === '/login/forceEditPwd' && !isForce) {\r\n $location.path('/login');\r\n }\r\n }\r\n\r\n if (currentPage === '/' && !sessionStorage.getItem('token')) {\r\n $location.path('/login').search({});\r\n }\r\n\r\n });\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular.module('app')\r\n .constant('isTestMode', false)\r\n .constant('iAmNotRobot', true)\r\n .constant('apiUrl', {\r\n tsApi: '//hr.taishinholdings.com.tw/api/',\r\n ssoApi: '//hr.taishinholdings.com.tw/sso/api/',\r\n ctmsApi: '//hr.taishinholdings.com.tw/ap/ctms/',\r\n pafUrl:'//hr.taishinholdings.com.tw/hrapp/TSDG_PDF_Web/?pdf='\r\n });\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular.module('app')\r\n .controller('rootCtrl', rootCtrl);\r\n\r\n function rootCtrl($q, $location, $rootScope, $timeout, modalService, loginService,\r\n headerService, sysCode, translateService, $window, $scope, trainingInnerService, mobileService) {\r\n var vm = this;\r\n vm.view = {\r\n loaded: false, //檢查是否將必要資源讀取完畢\r\n };\r\n vm.getBodyClass = getBodyClass;\r\n vm.appVersion = null;\r\n vm.appCurrentVersion = null;\r\n vm.getDeviceInfo = getDeviceInfo;\r\n vm.updateConfirmWording = null;\r\n vm.conAppVer = null;\r\n vm.conCurVer = null;\r\n\r\n var mobile = {\r\n Android: function() {\r\n return navigator.userAgent.match(/Android/i);\r\n },\r\n BlackBerry: function() {\r\n return navigator.userAgent.match(/BlackBerry/i);\r\n },\r\n iOS: function() {\r\n return navigator.userAgent.match(/iPhone|iPad|iPod/i);\r\n },\r\n Opera: function() {\r\n return navigator.userAgent.match(/Opera Mini/i);\r\n },\r\n Windows: function() {\r\n return navigator.userAgent.match(/IEMobile/i);\r\n },\r\n any: function() {\r\n return (mobile.Android() || mobile.BlackBerry() || mobile.iOS() || mobile.Opera() || mobile.Windows());\r\n }\r\n };\r\n\r\n onInit();\r\n eventBus();\r\n\r\n function onInit() {\r\n var promiseList = [\r\n loadTranslate(),\r\n loadSsoInfo(),\r\n ];\r\n $q.all(promiseList).then(function() {\r\n vm.view.loaded = true;\r\n });\r\n\r\n //只在首頁判斷版本\r\n if (mobile.iOS() && (window.webkit)) {\r\n //if (true) {\r\n getDeviceInfo();\r\n //console.log('appVer:',APP_VERSION);\r\n //console.log('AppUpdateRemind:',sessionStorage.getItem('AppUpdateRemind'));\r\n if (!sessionStorage.getItem('AppUpdateRemind')) {\r\n sessionStorage.setItem('AppUpdateRemind', 'N');\r\n }\r\n console.log('AppUpdateRemind:', sessionStorage.getItem('AppUpdateRemind'));\r\n if (sessionStorage.getItem('AppUpdateRemind') && sessionStorage.getItem('AppUpdateRemind') === 'N') {\r\n //getDeviceInfo那邊設定3秒call 6 次,這邊改為5秒後再執行版本確認\r\n setTimeout(function() {\r\n checkAppVersion();\r\n }, 5000);\r\n }\r\n }\r\n\r\n // 外網沒有這個需求 所以不用處理跨系統轉 token 這類事情\r\n // 也可以避免分享網址時 就在別人家的瀏覽器自動登入了\r\n // checkTokenFromOtherDomain();\r\n\r\n try {\r\n self.moveTo(0, 0);\r\n self.resizeTo(screen.availWidth, screen.availHeight);\r\n } catch (e) {\r\n // 不是重要的功能(失效也不會影響網站功能)\r\n // 在IE有時候不知道為什麼會造成錯誤,讓畫面無法繼續進行\r\n // 所以針對此問題先隱蔽\r\n }\r\n\r\n setUrl();\r\n setFontSize();\r\n $rootScope.styleUrl = '/css/edit.css';\r\n $rootScope.isTest = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';\r\n checkSmallView();\r\n }\r\n\r\n function loadTranslate() {\r\n return translateService.getTranslates().then(function(data) {\r\n //console.log(data.iosAppUpdateConfirm);\r\n vm.updateConfirmWording = data.iosAppUpdateConfirm;\r\n $rootScope.translate = data;\r\n return true;\r\n });\r\n }\r\n\r\n function loadSsoInfo() {\r\n\r\n }\r\n\r\n function checkSmallView() {\r\n if ($window.innerWidth < 470) {\r\n $rootScope.isSmallView = true;\r\n } else {\r\n $rootScope.isSmallView = false;\r\n }\r\n }\r\n\r\n function checkTokenFromOtherDomain() {\r\n //undone 跨token的部份\r\n var originUrl = location.href.split('?tkn=')[0];\r\n var urlSearch = location.href.split('?tkn=')[1];\r\n if (urlSearch) {\r\n var getToken = queryString('tkn');\r\n var getMenu = queryString('menu');\r\n var isMobile = queryString('isMobile');\r\n if (isMobile) {\r\n // sessionStorage.setItem('isMobile', true);\r\n }\r\n if (getToken) {\r\n // removeSsoInfo();\r\n getToken = getToken === undefined ? sessionStorage.getItem('token') : getToken;\r\n sessionStorage.setItem('token', getToken);\r\n var params = {\r\n token: getToken,\r\n sysCode: sysCode\r\n };\r\n loginService.checkToken(params).then(function(data) {\r\n removeSsoInfo();\r\n if (data.data) {\r\n data.data.Token = getToken;\r\n setSsoInfo(data.data);\r\n translateService.getLanguage().then(function(languageItems) {\r\n var defaultLangItem = _.find(languageItems.data, {\r\n selected: true\r\n });\r\n translateService.change(defaultLangItem).then(function() {\r\n if (getMenu) {\r\n $window.location.href = originUrl + '?menu=' + getMenu;\r\n } else {\r\n $window.location.href = originUrl;\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n if (location.href.indexOf('&isMobile=') > -1) {\r\n originUrl = location.href.split('?menu=')[0];\r\n // sessionStorage.setItem('isMobile', queryString('isMobile'));\r\n //2023-07-10 Johnson 資安2023\r\n location.href = eval(function (p, a, c, k, e, r) { e = function (c) { return c.toString(a) }; if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('3+\\'?2=\\'+4(\\'2\\').0(//1,\\'&6\\').0(/\"/1,\\'&7\\').0(/\\'/1,\\'\\').0(/[<>!]|(\\\\(\\\\))|((9|a|b)\\\\c*\\\\(.*\\\\))/1,\\'\\')', 13, 13, 'replace|g|menu|originUrl|queryString|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}))\r\n }\r\n translateService.getLanguage().then(function(languageItems) {\r\n var defaultLangItem = _.find(languageItems.data, {\r\n selected: true\r\n });\r\n translateService.change(defaultLangItem);\r\n });\r\n }\r\n }\r\n\r\n function setUrl() {\r\n var checkList = {\r\n ctmsFileUrl: sessionStorage.getItem('ctmsFileUrl'),\r\n mhrFileUrl: sessionStorage.getItem('mhrFileUrl'),\r\n VcUrl: sessionStorage.getItem('VcUrl')\r\n };\r\n headerService.getUrlSetting().then(function(data) {\r\n _.forEach(checkList, function(checkItem, key) {\r\n switch (key) {\r\n case 'ctmsFileUrl':\r\n sessionStorage.setItem('ctmsFileUrl', data.data.ctmsFileUrl);\r\n break;\r\n case 'mhrFileUrl':\r\n sessionStorage.setItem('mhrFileUrl', data.data.mhrFileUrl);\r\n break;\r\n case 'VcUrl':\r\n if(data.data.vcUrl.indexOf(location.protocol) == -1)\r\n {\r\n if(location.protocol == \"https:\")\r\n sessionStorage.setItem('VcUrl', data.data.vcUrl.replace(\"http:\",location.protocol));\r\n else\r\n sessionStorage.setItem('VcUrl', data.data.vcUrl.replace(\"https:\",location.protocol));\r\n \r\n }\r\n else\r\n sessionStorage.setItem('VcUrl', data.data.vcUrl);\r\n\r\n break;\r\n default:\r\n checkItem = 'empty';\r\n break;\r\n }\r\n });\r\n });\r\n console.log(sessionStorage.getItem('VcUrl'))\r\n }\r\n\r\n function setFontSizeProcess(fontsize) {\r\n switch (fontsize) {\r\n case 14:\r\n vm.fontSizeClass = 'small';\r\n break;\r\n case 16:\r\n vm.fontSizeClass = 'medium';\r\n break;\r\n case 18:\r\n vm.fontSizeClass = 'big';\r\n break;\r\n default:\r\n //use recursive to process default;\r\n if (fontsize < 14) { setFontSizeProcess(14); } else if (fontsize > 14) { setFontSizeProcess(18); } else { setFontSizeProcess(14); }\r\n break;\r\n }\r\n }\r\n\r\n function setFontSize() {\r\n $rootScope.$watch('fontSize', function(newValue) {\r\n if (newValue) {\r\n if (_.isString(newValue)) {\r\n newValue = newValue.replace('px', '');\r\n }\r\n newValue = parseInt(newValue);\r\n if (!newValue) { newValue = 14; }\r\n setFontSizeProcess(newValue);\r\n getBodyClass();\r\n }\r\n });\r\n }\r\n\r\n function getBodyClass() {\r\n return {\r\n small: vm.fontSizeClass === 'small',\r\n medium: vm.fontSizeClass === 'medium',\r\n big: vm.fontSizeClass === 'big',\r\n cn: parseInt(sessionStorage.getItem('langCode')) === 2\r\n };\r\n }\r\n\r\n function eventBus() {\r\n $rootScope.$on('emitCName', function(e, value) {\r\n $rootScope.$broadcast('updateCName', value);\r\n });\r\n $(window).resize(function() {\r\n if ($scope.$$phase || $rootScope.$$phase) {\r\n return;\r\n }\r\n $rootScope.$apply(function() {\r\n checkSmallView();\r\n });\r\n });\r\n }\r\n\r\n function checkAppVersion() {\r\n console.log('checkAppVersion');\r\n //從DB撈取APP現行版本\r\n //APP_VERSION = '0.0.0.9';\r\n trainingInnerService.getConfigSetting()\r\n .then(function(configData) {\r\n vm.appCurrentVersion = configData.data.appCurrentVersion;\r\n if (vm.appCurrentVersion && APP_VERSION !== null) {\r\n console.log('APP_VERSION:', APP_VERSION);\r\n var currentVer = parseInt(vm.appCurrentVersion.replace(/\\./g, ''));\r\n //var appVer = APP_VERSION ? parseInt(APP_VERSION.replace(/\\./g, '')) : -1;\r\n\r\n // 因與iosApp互動時,有可能無法抓到版本,目前改為iosAppVer的預設值為-1\r\n // 如是舊版APP,版本就會是-1\r\n // 如是新版APP,版本就會有寫入\r\n // 唯一例外只有版本號不見時,但不確定會不會被改為Null,待測\r\n var appVer = null;\r\n if (Object.is(APP_VERSION, -1)) {\r\n appVer = -1;\r\n } else {\r\n appVer = parseInt(APP_VERSION.replace(/\\./g, ''));\r\n }\r\n\r\n vm.conAppVer = appVer;\r\n vm.conCurVer = currentVer;\r\n\r\n if (appVer === currentVer) {\r\n //vm.appVersion = APP_VERSION;\r\n } else if (appVer > currentVer) {\r\n alert('You are using iTaishin beta version.');\r\n } else {\r\n // $timeout(function() {\r\n // var confirmDialog = modalService.confrimDialog({\r\n // confirmContent: (vm.updateConfirmWording),\r\n // });\r\n // confirmDialog.result.then(function(result) {\r\n // result = !!result;\r\n // if (result !== true) {\r\n // return;\r\n // }\r\n // location.href = 'itms-services://?action=download-manifest&url=https://hr.taishinholdings.com.tw/hr-app-download/appfiles/manifest.plist';\r\n // });\r\n // }, 1000);\r\n }\r\n //辨識用的flag,讓confirm只出現一次\r\n sessionStorage.setItem('AppUpdateRemind', 'Y');\r\n }\r\n });\r\n }\r\n\r\n function getDeviceInfo() {\r\n var param = {\r\n Command: 'getDeviceInfo'\r\n };\r\n ///vm.appVersion = APP_VERSION;\r\n\r\n //每500毫秒就叫一次ios傳值給我\r\n for (let i = 0; i < 6; i++) {\r\n var temp = i;\r\n setTimeout(function() {\r\n //console.log(i);\r\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(param));\r\n }, 500 * (i + 1));\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('app.directive')\r\n .directive('a', a);\r\n\r\n function a(commonService) {\r\n return {\r\n restrict: 'E',\r\n link: function (scope, elem, attrs) {\r\n if (attrs.ngClick || attrs.href === '' || attrs.href === '#') {\r\n elem.on('click', function (e) {\r\n e.preventDefault();\r\n });\r\n } else {\r\n elem.on('click', function () {\r\n if (elem.attr('href') !== undefined) {\r\n commonService.saveLogFlow(elem.attr('href'));\r\n }\r\n });\r\n }\r\n }\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular.module('app.directive')\r\n .directive('compile', ['$compile', function($compile) {\r\n return function(scope, element, attrs) {\r\n scope.$watch(\r\n function(scope) {\r\n return scope.$eval(attrs.compile);\r\n },\r\n function(value) {\r\n element.html(value);\r\n $compile(element.contents())(scope);\r\n }\r\n );\r\n };\r\n }]).controller('MyCtrl', function($scope) {\r\n var str = 'hello http://www.cnn.com';\r\n var urlRegEx = /((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[\\-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9\\.\\-]+|(?:www\\.|[\\-;:&=\\+\\$,\\w]+@)[A-Za-z0-9\\.\\-]+)((?:\\/[\\+~%\\/\\.\\w\\-]*)?\\??(?:[\\-\\+=&;%@\\.\\w]*)#?(?:[\\.\\!\\/\\\\\\w]*))?)/g;\r\n result = str.replace(urlRegEx, \"$1\");\r\n $scope.GotoLink = function() {\r\n alert();\r\n };\r\n $scope.name = result;\r\n });\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('focus', focus);\r\n\r\n function focus() {\r\n var directive = {\r\n link: link,\r\n restrict: 'A'\r\n };\r\n return directive;\r\n\r\n function link(scope, element) {\r\n element.focus();\r\n }\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('repeatEnd', repeatEnd);\r\n function repeatEnd() {\r\n // Usage:\r\n // EventCaller When ng-repeat Over\r\n // Creates:\r\n // Rhino,2017.01.04\r\n var directive = {\r\n restrict: \"A\",\r\n link: link,\r\n };\r\n return directive;\r\n\r\n function link(scope, element, attrs) {\r\n if (scope.$last) {\r\n scope.$eval(attrs.repeatEnd);\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiBulletin', taiBulletin);\r\n\r\n function taiBulletin() {\r\n // Usage:\r\n //\r\n // Creates:\r\n //\r\n var directive = {\r\n bindToController: true,\r\n controller: ControllerController,\r\n controllerAs: 'vm',\r\n link: link,\r\n templateUrl: 'directive/taiBulletin.html',\r\n restrict: 'E',\r\n scope: {\r\n data: '=',\r\n type: '@'\r\n }\r\n };\r\n return directive;\r\n\r\n function link() { }\r\n }\r\n /* @ngInject */\r\n function ControllerController(modalService,bulletinService, $routeParams, $rootScope, enumService,\r\n $timeout, $location) {\r\n let vm = this;\r\n let bulletinGetByPaggerDto = {\r\n menuSerilNo: '',\r\n bulletinTypeSerilNo: '',\r\n PaggerChoice: 1,\r\n noticePage: 1\r\n };\r\n vm.isMobile = modalService.isMobile();\r\n vm.selectFirstMenu = selectFirstMenu;\r\n vm.selectBulletinType = selectBulletinType;\r\n vm.clickDefaultType = clickDefaultType;\r\n vm.getMoreList = getMoreList;\r\n vm.getNoticeMoreList = getNoticeMoreList;\r\n vm.redirectToDetail = redirectToDetail;\r\n\r\n vm.view = {\r\n typeNo: 0\r\n };\r\n\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n //console.log('bull:',vm.data.notices.bulletins.length);\r\n $timeout(function () {\r\n vm.bulletin = $rootScope.translate.bulletin;\r\n vm.noticeCenter = $rootScope.translate.noticeCenter;\r\n }, $rootScope.translate);\r\n if (sessionStorage.getItem(\"perSerilNo\")) {\r\n vm.isLogin = true;\r\n } else {\r\n vm.isLogin = false;\r\n }\r\n getHistoryBind();\r\n }\r\n\r\n function getHistoryBind() {\r\n if ($routeParams.isHistory) {\r\n var cache = JSON.parse(sessionStorage.getItem('bulletinCache'));\r\n if (cache) {\r\n if (cache.menuItem) {\r\n vm.data.menuItem = cache.menuItem;\r\n bulletinGetByPaggerDto.menuSerilNo = cache.menuItem.menuSerilNo;\r\n }\r\n if (cache.typeSerilNo) {\r\n vm.view.typeNo = cache.typeSerilNo;\r\n bulletinGetByPaggerDto.bulletinTypeSerilNo = cache.typeSerilNo;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function selectBulletinType(item) {\r\n bulletinGetByPaggerDto.PaggerChoice = 1;\r\n vm.view.typeNo = item.bulletinTypeSerilNo;\r\n bulletinGetByPaggerDto.bulletinTypeSerilNo = item.bulletinTypeSerilNo;\r\n getBulletinDetail(bulletinGetByPaggerDto, 'bulletinType');\r\n }\r\n\r\n function selectFirstMenu() {\r\n bulletinGetByPaggerDto.PaggerChoice = 1;\r\n if (vm.data.menuItem) {\r\n bulletinGetByPaggerDto.menuSerilNo = vm.data.menuItem.menuSerilNo;\r\n } else {\r\n if ($routeParams.menuSerilNo) {\r\n bulletinGetByPaggerDto.menuSerilNo = $routeParams.menuSerilNo;\r\n } else {\r\n bulletinGetByPaggerDto.menuSerilNo = null;\r\n }\r\n }\r\n getBulletinDetail(bulletinGetByPaggerDto, 'firstMenu');\r\n }\r\n\r\n function getMoreList() {\r\n bulletinGetByPaggerDto.PaggerChoice++;\r\n getBulletinDetail(bulletinGetByPaggerDto, null);\r\n }\r\n\r\n function getNoticeMoreList() {\r\n bulletinGetByPaggerDto.noticePage++;\r\n //2為通知中心的意思\r\n bulletinGetByPaggerDto.dataType = 2;\r\n setSiteCode(bulletinGetByPaggerDto);\r\n bulletinService.getTsunMoreList(bulletinGetByPaggerDto).then(function (data) {\r\n vm.data.notices.bulletins = _.concat(vm.data.notices.bulletins, data.data.notices.bulletins);\r\n vm.data.hasNoticeMore = data.data.hasNoticeMore;\r\n });\r\n }\r\n\r\n function setSiteCode(bulletinParam) {\r\n switch (vm.type) {\r\n case 'bulletin':\r\n bulletinParam.siteCode = enumService.siteCode.hrOutside;\r\n break;\r\n case 'notice':\r\n bulletinParam.siteCode = enumService.siteCode.tsunOut;\r\n break;\r\n }\r\n }\r\n\r\n function getBulletinDetail(bulletinParam, choiceType) {\r\n // 1是公佈欄的意思\r\n bulletinParam.dataType = 1;\r\n switch (choiceType) {\r\n case 'bulletinType':\r\n bulletinParam.isChoiceBulletinType = true;\r\n break;\r\n case 'firstMenu':\r\n bulletinParam.isChoiceMenu = true;\r\n break;\r\n }\r\n setSiteCode(bulletinParam);\r\n bulletinService.getMoreByChoice(bulletinParam).then(function (data) {\r\n reBindView(choiceType, bulletinParam, data);\r\n });\r\n }\r\n\r\n function reBindView(choiceType, bulletinParam, data) {\r\n switch (choiceType) {\r\n case 'bulletinType':\r\n vm.data.menuFirstDtos = data.data.menuFirstDtos;\r\n vm.data.bulletinWithCountDto.bulletins = data.data.bulletinWithCountDto.bulletins;\r\n break;\r\n case 'firstMenu':\r\n vm.data.bulletinSearchViews = data.data.bulletinSearchViews;\r\n vm.data.bulletinWithCountDto.bulletins = data.data.bulletinWithCountDto.bulletins;\r\n break;\r\n default:\r\n vm.data.bulletinWithCountDto.bulletins = _.concat(vm.data.bulletinWithCountDto.bulletins, data.data.bulletinWithCountDto.bulletins);\r\n break;\r\n }\r\n vm.data.hasMore = data.data.hasMore;\r\n bulletinParam.isChoiceBulletinType = false;\r\n bulletinParam.isChoiceMenu = false;\r\n return bulletinParam;\r\n }\r\n\r\n function clickDefaultType() {\r\n bulletinGetByPaggerDto.PaggerChoice = 1;\r\n vm.view.typeNo = 0;\r\n bulletinGetByPaggerDto.bulletinTypeSerilNo = 0;\r\n getBulletinDetail(bulletinGetByPaggerDto, 'bulletinType');\r\n }\r\n\r\n function redirectToDetail(item) {\r\n let param = {\r\n typeSerilNo: bulletinGetByPaggerDto.bulletinTypeSerilNo,\r\n menuItem: vm.data.menuItem,\r\n };\r\n\r\n $location.path('/bulletin/detail/' + item.bulletinSerilNo).search('menu', 2);\r\n\r\n sessionStorage.setItem('bulletinCache', JSON.stringify(param));\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiBulletinDetail', taiBulletinDetail);\r\n\r\n function taiBulletinDetail() {\r\n // Usage:\r\n //\r\n // Creates:\r\n //\r\n var directive = {\r\n bindToController: true,\r\n controller: ControllerController,\r\n controllerAs: 'vm',\r\n link: link,\r\n templateUrl: 'directive/taiBulletinDetail.html',\r\n restrict: 'E',\r\n scope: {\r\n data: '=',\r\n title: '=',\r\n type: '@'\r\n }\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController(apiUrl, sysCode, commonService, headerService,\r\n $routeParams, bulletinService, $http, $scope) {\r\n var vm = this;\r\n vm.download = download;\r\n vm.getBackUrl = getBackUrl;\r\n \r\n // 1.8.2 父層參數 data 無法直接從 scope 引入\r\n // 故利用 $scope.$parent.vm 的屬性\r\n vm.data = $scope.$parent.vm.data;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n if (vm.data.attachmentSerilNo > 0) {\r\n vm.url = bulletinService.getStampFile(vm.data.attachmentSerilNo);\r\n // vm.url = apiUrl.pafUrl+vm.url\r\n const a = document.createElement('a');\r\n const el = document.body.appendChild(a);\r\n el.setAttribute('style', 'display: none');\r\n el.href = vm.url;\r\n el.click();\r\n }\r\n }\r\n\r\n function download(item) {\r\n \r\n // 先註解 看看在APP中是不是就不會發生錯誤\r\n \r\n //20180803 re-open by Anthony\r\n //台新反映外網下載附件沒有紀錄\r\n var params = {\r\n bulletinSerilNo: item.bulletinSerilNo,\r\n attachmentSerilNo: item.attachmentSerilNo\r\n };\r\n commonService.setParams(params);\r\n headerService.saveBulletinClickingAttachment(params);\r\n\r\n\r\n if (commonService.getFileType(item.attachmentUrl) !== 'pdf') {\r\n bulletinService.checkHeadStatus(item.attachmentUrl).then(() => {\r\n location.href = item.attachmentUrl;\r\n });\r\n } else {\r\n bulletinService.checkHeadStatus(item.attachmentUrl).then(() => {\r\n \r\n //location.href = bulletinService.getStampFile(item.attachmentSerilNo);\r\n //2023-07-20 Johnson 資安2023\r\n eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$8({9:\\'a\\',b:c.d(2.e),f:\\'g\\'}).h(3 i(0){j 1=0.1();4 5=1[\\'k-6\\'];4 7=l m([0.n],{6:5});o(7,2.p)},3 q(0){});',27,27,'response|headers|item|function|var|contentType|type|blob|http|method|GET|url|bulletinService|getStampFile|attachmentSerilNo|responseType|arraybuffer|then|success|let|content|new|Blob|data|saveAs|attachmentName|reject'.split('|'),0,{}))\r\n\r\n });\r\n }\r\n }\r\n\r\n function getBackUrl() {\r\n switch (vm.type) {\r\n case 'bulletin':\r\n return '#/bulletin/more/1?menu=32';\r\n case 'notice':\r\n if ($routeParams.isBulletin) {\r\n return '#/bulletin/more/1?menu=32';\r\n }\r\n return '#/tsu/bulletin/more?menu=43';\r\n default:\r\n return '#/nextMenu?menu=' + getMenuQueryString();\r\n }\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiEnter', taiEnter);\r\n\r\n function taiEnter() {\r\n return function(scope, element, attrs) {\r\n element.bind(\"keydown keypress\", function(event) {\r\n if (event.which === 13) {\r\n scope.$apply(function() {\r\n scope.$eval(attrs.taiEnter);\r\n });\r\n\r\n event.preventDefault();\r\n }\r\n });\r\n };\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiHeader', taiHeader);\r\n\r\n function taiHeader() {\r\n // Usage:\r\n //\r\n // Creates:\r\n //\r\n var directive = {\r\n bindToController: true,\r\n controller: ControllerController,\r\n controllerAs: 'vm',\r\n link: link,\r\n templateUrl: 'directive/taiHeader.directive.html',\r\n restrict: 'E',\r\n scope: {\r\n showCtms: '@',\r\n site: '@'\r\n }\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController(translateService, $route, modalService, $location,\r\n sysCode, loginService, headerService, $rootScope, menuService, $filter, trainingInnerService) {\r\n var vm = this;\r\n vm.login = login;\r\n vm.logout = logout;\r\n vm.redirecter = redirecter;\r\n vm.choiceLanguage = choiceLanguage;\r\n vm.touchWithMe = touchWithMe;\r\n vm.openSetting = openSetting;\r\n vm.searchClick = searchClick;\r\n vm.doSearch = doSearch;\r\n vm.searchChange = searchChange;\r\n vm.transferurl = transferurl;\r\n vm.getMenuList = getMenuList;\r\n vm.getfirstMenuList = getfirstMenuList;\r\n vm.getsecMenuList = getsecMenuList;\r\n vm.getthirdMenuList = getthirdMenuList;\r\n vm.navmenuClick = navmenuClick;\r\n vm.rootClick = rootClick;\r\n vm.secmenuOpen = secmenuOpen;\r\n vm.switchClose = switchClose;\r\n vm.thirdmenuOpen = thirdmenuOpen;\r\n vm.languageOpen = languageOpen;\r\n vm.appVersion = null;\r\n\r\n vm.view = {\r\n isLogin: !_.isEmpty(sessionStorage.getItem('perSerilNo')) && !sessionStorage.getItem('isForce'),\r\n showSearchList: true,\r\n showFastList: true,\r\n isMobile: sessionStorage.getItem('isMobile')\r\n };\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n\r\n $('.search-modal-sm').on('show.bs.modal', function() {\r\n vm.searchClick();\r\n });\r\n\r\n $('.search-modal-sm').on('hide.bs.modal', function() {\r\n\r\n var $content = $(\"#navmenu-content\");\r\n if ($content.css('right') !== '0px') {\r\n $('section.nav').css(\"position\", \"static\");\r\n } else {\r\n $('section.nav').css(\"position\", \"fixed\");\r\n }\r\n });\r\n\r\n vm.data = {};\r\n $rootScope.$on('updateCName', function(e, value) {\r\n vm.cName = value;\r\n });\r\n vm.cName = sessionStorage.getItem('cName');\r\n\r\n translateService.getLanguage().then(function(data) {\r\n vm.languageItems = data.data;\r\n return vm.languageItems;\r\n }).then(function(data) {\r\n vm.defaultLanguage = translateService.getDefault(data);\r\n $(\"body\").addClass(vm.defaultLanguage.langCode);\r\n //console.log(vm.defaultLanguage);\r\n\r\n //console.log('taiHeader_Init-menuItemPath:' + sessionStorage.getItem('menuItemPath'));\r\n //撈取選單資料\r\n vm.getMenuList();\r\n });\r\n\r\n headerService.getFontSize().then(function(data) {\r\n vm.fontSizes = data.data;\r\n $rootScope.fontSize = _.filter(vm.fontSizes.fontSizes, {\r\n isSelected: true\r\n })[0].sizeCode + 'px';\r\n });\r\n\r\n vm.last = { index: 0, $: null };\r\n\r\n switchSearchList('');\r\n }\r\n\r\n\r\n\r\n function getMenuList() {\r\n headerService.getMenuList().then(function(data) {\r\n vm.data.menuAllList = data.data;\r\n vm.data.menuAllList.forEach(function(allmenu) {\r\n if (sessionStorage.getItem('menuSerilNo') === null || sessionStorage.getItem('menuSerilNo') === '') {\r\n sessionStorage.setItem('menuSerilNo', getMenuQueryString());\r\n }\r\n\r\n //console.log('taiHeader_Init-menuSerilNo:' + sessionStorage.getItem('menuSerilNo'));\r\n if (allmenu.menuSerilNo === parseInt(sessionStorage.getItem('menuSerilNo')) && !allmenu.hasChild) {\r\n allmenu.menuItemStyle = { 'background-color': '#da2128', 'color': '#fff' };\r\n } else {\r\n allmenu.menuItemStyle = '';\r\n }\r\n });\r\n\r\n sessionStorage.setItem('menuAllList', JSON.stringify(vm.data.menuAllList));\r\n vm.getfirstMenuList();\r\n\r\n });\r\n }\r\n\r\n function getfirstMenuList() {\r\n var menuLists = $filter('filter')(vm.data.menuAllList, {\r\n parentId: 0,\r\n level: 1\r\n });\r\n\r\n vm.firstmenuList = menuLists;\r\n return vm.firstmenuList;\r\n }\r\n\r\n function getsecMenuList(menuSerilNo) {\r\n var menuLists = $filter('filter')(vm.data.menuAllList, {\r\n parentId: menuSerilNo,\r\n parentIdLen: String(menuSerilNo).length,\r\n level: 2\r\n });\r\n\r\n vm.secmenuList = menuLists;\r\n return vm.secmenuList;\r\n }\r\n\r\n function getthirdMenuList(menuSerilNo) {\r\n var menuLists = $filter('filter')(vm.data.menuAllList, {\r\n parentId: menuSerilNo,\r\n parentIdLen: String(menuSerilNo).length,\r\n level: 3\r\n });\r\n\r\n vm.thirdmenuList = menuLists;\r\n return vm.thirdmenuList;\r\n }\r\n\r\n function navmenuClick() {\r\n\r\n var w = $(window).width();\r\n var $content = $(\"#navmenu-content\");\r\n var $blackcover = $(\".ui-blackCover\");\r\n\r\n $content.animate({ scrollTop: 0 }, 50);\r\n $(\"div.menu-content\").css(\"right\", -w);\r\n\r\n if ($content.css('right') !== '0px') {\r\n $content.animate({ right: '0px' }, 300, 'swing');\r\n if (w < 1000) {\r\n $blackcover.css(\"display\", \"block\");\r\n $('section.nav').css(\"position\", \"fixed\");\r\n } else {\r\n $('section.nav').css(\"position\", \"static\");\r\n }\r\n } else {\r\n $content.animate({ right: '-' + w + 'px' }, 300, 'swing');\r\n if (w < 1000) {\r\n $blackcover.css(\"display\", \"none\");\r\n }\r\n\r\n $('section.nav').css(\"position\", \"static\");\r\n }\r\n\r\n //展第二及第三層功能選單資料\r\n if (sessionStorage.getItem('menuItemPath') !== null && sessionStorage.getItem('menuItemPath') !== '' && sessionStorage.getItem('menuItemPath').split(',').length !== 1) {\r\n console.log(\"navmenuClick-menuItemPath:\" + sessionStorage.getItem('menuItemPath'));\r\n //展第二層資料\r\n //console.log(\"first = \" + sessionStorage.getItem('menuItemPath').split(',')[0]); \r\n vm.firstmenuItem = vm.data.menuAllList.filter(function(menuLists) {\r\n return (menuLists.menuSerilNo === parseInt(sessionStorage.getItem('menuItemPath').split(',')[0]));\r\n });\r\n //console.log(vm.firstmenuItem);\r\n if (vm.firstmenuItem[0] !== null) {\r\n console.log(vm.firstmenuItem[0]);\r\n rootClick(vm.firstmenuItem[0], 0, true);\r\n }\r\n\r\n //展第三層資料\r\n //console.log(\"second = \" + sessionStorage.getItem('menuItemPath').split(',')[1]);\r\n if (sessionStorage.getItem('menuItemPath').split(',').length === 3) {\r\n vm.secmenuItem = vm.data.menuAllList.filter(function(menuLists) {\r\n return (menuLists.menuSerilNo === parseInt(sessionStorage.getItem('menuItemPath').split(',')[1]));\r\n });\r\n if (vm.secmenuItem[0] !== null) {\r\n console.log(vm.secmenuItem[0]);\r\n rootClick(vm.secmenuItem[0], 1, true);\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n function secmenuOpen() {\r\n var $content = $(\"#secondMenu-content\");\r\n $content.animate({ right: '0px' }, 300, 'swing');\r\n $(\"#navmenu-content\").animate({ scrollTop: 0 }, 0); //將捲軸置頂\r\n $(\"li.level_menu\").each(function() {\r\n $(this).removeClass(\"open\");\r\n });\r\n }\r\n\r\n function languageOpen() {\r\n var $content = $(\"#Language-content\");\r\n $content.animate({ right: '0px' }, 300, 'swing');\r\n }\r\n\r\n function switchClose(menuName) {\r\n var w = $(window).width();\r\n var $content = $(\"#\" + menuName);\r\n $content.animate({ right: '-' + w + 'px' }, 300, 'swing');\r\n }\r\n\r\n function thirdmenuOpen(menuName, index) {\r\n var $this = $(\"#\" + menuName + \"-open\");\r\n var $this_index = index;\r\n $this.toggleClass(\"open\");\r\n $this.siblings(\"li\").removeClass(\"open\");\r\n if ($this.hasClass(\"open\")) {\r\n var scrollgoto = $this.offset().top + $('#navmenu-content').scrollTop() - 40 - $(window).scrollTop();\r\n setTimeout(function() { $('#navmenu-content').animate({ scrollTop: scrollgoto }, 500); }, 200);\r\n //console.log(\"thirdmenuOpen-scrollgoto:\"+scrollgoto);\r\n vm.last.index = $this_index;\r\n vm.last.$ = $this;\r\n if ($this_index) {\r\n $(\".ul_padding\").css(\"height\", scrollgoto);\r\n } else {\r\n $(\".ul_padding\").css(\"height\", \"0px\");\r\n }\r\n\r\n } else {\r\n $(\".ul_padding\").css(\"height\", \"0px\");\r\n }\r\n }\r\n\r\n function rootClick(item, index, anchor) {\r\n //判斷是點選下階圖檔還是選單名稱決定要導頁或顯示下階\r\n if (anchor) {\r\n if (parseInt(item.level) === 1) {\r\n vm.firstMenuLangName = item.menuLangName;\r\n vm.getsecMenuList(item.menuSerilNo);\r\n vm.secmenuOpen();\r\n } else {\r\n vm.getthirdMenuList(item.menuSerilNo);\r\n\r\n setTimeout(function() { vm.thirdmenuOpen(item.menuName, index + 1); }, 50);\r\n }\r\n } else if (item.url) {\r\n if (!item.hasChild) {\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\r\n sessionStorage.setItem('menuItemPath', item.menuItemPath);\r\n vm.navmenuClick();\r\n // console.log('current url:', location.href);\r\n // console.log('rootClick:', item.url);\r\n if (location.href.toLowerCase().indexOf('sessionid') > 0 ||\r\n location.href.toLowerCase().indexOf('courseid') > 0) {\r\n // console.log(\"current url:\",location.href);\r\n // console.log(\"redirecter url:\",url);\r\n //2023-07-10 Johnson 資安2023\r\n location.href = eval(function (p, a, c, k, e, r) { e = function (c) { return c.toString(a) }; if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('2.3.4(\\'?\\').0(//1,\\'&6\\').0(/\"/1,\\'&7\\').0(/\\'/1,\\'\\').0(/[<>!]|(\\\\(\\\\))|((9|a|b)\\\\c*\\\\(.*\\\\))/1,\\'\\')', 13, 13, 'replace|g|location|href|split|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}))\r\n }\r\n menuService.redirectUrl(item);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n function choiceLanguage(item) {\r\n item.selected = true;\r\n vm.defaultLanguage = translateService.change(item);\r\n $(\".ui-blackCover\").css(\"display\", \"none\");\r\n $route.reload();\r\n }\r\n\r\n function login() {\r\n //debugger;\r\n var result = modalService.login();\r\n result.result.then(function(data) {\r\n if (data) {\r\n // $route.reload(); \r\n }\r\n });\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n vm.navmenuClick();\r\n }\r\n\r\n function redirecter(url) {\r\n if (location.href.toLowerCase().indexOf('sessionid') > 0 ||\r\n location.href.toLowerCase().indexOf('courseid') > 0) {\r\n // console.log(\"current url:\",location.href);\r\n // console.log(\"redirecter url:\",url);\r\n //2023-07-10 Johnson 資安2023\r\n location.href = eval(function (p, a, c, k, e, r) { e = function (c) { return c.toString(a) }; if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('2.3.4(\\'/#\\')[0]+\\'/#\\'+5+\\'?6=\\'+7.8(\\'9\\').1(//g,\\'&b\\').1(/\"/g,\\'&c\\').1(/\\'/g,\\'&#d\\').1(/[<>!]|(\\\\(\\\\))|((e|f|h)\\\\i*\\\\(.*\\\\))/g,\\'\\')', 19, 19, '|replace|location|href|split|url|menu|sessionStorage|getItem|menuSerilNo|lt|gt|quot|x27|for|while||if|s'.split('|'), 0, {}))\r\n }\r\n $location.path(url);\r\n //如果正確導向,就不會往下跑了。\r\n // console.log(\"page reload\");\r\n $route.reload(); //for SPA\r\n }\r\n\r\n function logout() {\r\n\r\n loginService.logout().then(function() {\r\n // 通知 APP 登出成功 \r\n if (DEVICE_TYPE) {\r\n var param = {};\r\n var method = \"logout\";\r\n appCallback(method, param);\r\n }\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n removeSsoInfo();\r\n $location.path('/login').search({});\r\n });\r\n\r\n $(\".ui-blackCover\").css(\"display\", \"none\");\r\n }\r\n\r\n function touchWithMe() {\r\n\r\n modalService.touchWithMe();\r\n\r\n vm.navmenuClick();\r\n }\r\n\r\n function openSetting() {\r\n\r\n modalService.setting(vm.fontSizes);\r\n\r\n vm.navmenuClick();\r\n }\r\n\r\n function searchClick($event) {\r\n\r\n let siteCode = getSiteCode(vm.site);\r\n headerService.getSearch('', siteCode).then(function(data) {\r\n vm.data.searchList = data.data;\r\n switchSearchList('');\r\n });\r\n\r\n $('section.nav').css(\"position\", \"static\");\r\n }\r\n\r\n function specialKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function searchChange() {\r\n //2020-06-11 Johnson 搜尋欄位有資料才查詢\r\n if(vm.search != \"\"){\r\n //2020-06-11 Johnson 搜尋欄位特殊字元檢核\r\n var SKV = specialKeywordVerification(vm.search);\r\n\r\n console.log('SKV:'+SKV);\r\n\r\n if(!SKV){\r\n let siteCode = getSiteCode(vm.site);\r\n headerService.getSearch(vm.search, siteCode).then(function(data) {\r\n vm.data.searchList = data.data;\r\n switchSearchList(vm.search);\r\n });\r\n }else\r\n {\r\n console.log('specialKeywords:'+$rootScope.translate.specialKeywords);\r\n toastr.warning($rootScope.translate.specialKeywords);\r\n }\r\n }\r\n }\r\n\r\n function switchSearchList(keyword) {\r\n if (keyword) {\r\n // 有輸入關鍵字,僅顯示查詢清單\r\n vm.view.showSearchList = true;\r\n vm.view.showFastList = false;\r\n } else {\r\n // 點選放大鏡圖示時(沒有輸入關鍵字),僅顯示快速選單\r\n // 但台新外網沒有快速選單,所以不顯示任何資訊\r\n vm.view.showSearchList = false;\r\n vm.view.showFastList = false;\r\n }\r\n }\r\n\r\n function doSearch(keyWord) {\r\n if (keyWord) {\r\n\r\n let siteCode = getSiteCode(vm.site);\r\n vm.view.showSearchList = false;\r\n $('body').removeClass('modal-open');\r\n $(\"body>div.modal-backdrop.fade.in\").css('display', 'none');\r\n $location.path('/header/searchResult/' + keyWord + '/' + siteCode);\r\n // $location.path('/visualpage/30');\r\n }\r\n }\r\n\r\n function getSiteCode() {\r\n let siteCode = 2;\r\n if (vm.site === 'tsun') {\r\n siteCode = 4;\r\n }\r\n return siteCode;\r\n }\r\n\r\n function transferurl(item) {\r\n $(\"body>div.modal-backdrop.fade.in\").css('display', 'none');\r\n menuService.redirectUrl(item);\r\n }\r\n }\r\n\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMenuSite', taiMenuSite);\r\n\r\n function taiMenuSite() {\r\n // Usage:\r\n //\r\n // Creates:\r\n //\r\n var directive = {\r\n bindToController: true,\r\n controller: ControllerController,\r\n controllerAs: 'vm',\r\n link: link,\r\n restrict: 'E',\r\n templateUrl: 'directive/taiMenuSite.html',\r\n scope: {\r\n data: '=',\r\n menuId: '@',\r\n showMode: '@'\r\n }\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController(menuService, $location, $http, apiUrl, commonService,$element) {\r\n var vm = this;\r\n // 1.8.2 父層傳遞參數 如果失效從 $element 取得\r\n if (vm.menuId == null || vm.menuId == undefined) {\r\n vm.menuId = $element.attr('menu-id');\r\n }\r\n if (vm.showMode == null || vm.showMode == undefined) {\r\n vm.showMode = $element.attr('show-mode');\r\n }\r\n\r\n vm.enumShowMode = {\r\n fullPath: '1', //......代表這段麵包屑是完整的,不會與其他東西串接\r\n partPath: '2', //......代表這段麵包屑只是其中一部分。\r\n };\r\n var tsunOutside = 4;\r\n var menuUrl = apiUrl.tsApi + 'menu/';\r\n vm.rootClick = rootClick;\r\n vm.childClick = childClick;\r\n vm.rootHove = rootHove;\r\n vm.rootClear = rootClear;\r\n\r\n init();\r\n\r\n function init() {\r\n vm.config = {\r\n showMode: vm.showMode || vm.enumShowMode.fullPath, //麵包屑的顯示模式設定\r\n };\r\n var param = {\r\n menuSerilNo: vm.menuId || getMenuQueryString(),\r\n siteCode: tsunOutside\r\n };\r\n commonService.setParams(param);\r\n //console.log('menu param:',param);\r\n $http.post(menuUrl + 'getMenuParent', param).then(function(data) {\r\n //console.log('menu data:',data.data);\r\n vm.parent = data.data;\r\n });\r\n }\r\n\r\n function rootClick(item) {\r\n if (!item) {\r\n return; }\r\n if (item.url) {\r\n menuService.redirectUrl(item);\r\n }\r\n }\r\n\r\n function rootHove(item) {\r\n vm.child = null;\r\n var param = {\r\n menuSerilNo: item.menuSerilNo,\r\n globalMenuSerilNo: vm.menuId || getMenuQueryString(),\r\n siteCode: tsunOutside\r\n };\r\n\r\n commonService.setParams(param);\r\n $http.post(menuUrl + 'getMenuChild', param).then(function(data) {\r\n vm.child = data.data;\r\n });\r\n }\r\n\r\n function rootClear() {\r\n vm.child = null;\r\n }\r\n\r\n function childClick(item) {\r\n menuService.redirectUrl(item);\r\n }\r\n\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMetro', taiMetro);\r\n\r\n function taiMetro() {\r\n // Usage:\r\n //\r\n // Creates:\r\n //\r\n var directive = {\r\n bindToController: true,\r\n controller: ControllerController,\r\n controllerAs: 'vm',\r\n link: link,\r\n restrict: 'E',\r\n templateUrl: 'directive/taiMetro.html',\r\n scope: {\r\n data: '='\r\n }\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController(menuService,$scope) {\r\n var vm = this;\r\n // 1.8.2 父層參數 data 無法直接從 scope 引入\r\n vm.data = $scope.$parent.vm.data;\r\n vm.redirectUrl = redirectUrl;\r\n vm.view = {\r\n isLogin: sessionStorage.getItem('token')\r\n };\r\n\r\n function redirectUrl(item) {\r\n\r\n //console.log(\"item.menuSerilNo:\"+item.menuSerilNo);\r\n if (!_.isEmpty(sessionStorage.getItem('menuAllList'))){\r\n\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n \r\n //如果Menu=37(上課與證照),就設定Menu=-9901(待修課程)\r\n if (parseInt(item.menuSerilNo)===37){\r\n sessionStorage.setItem('menuSerilNo', -9901);\r\n }\r\n else{\r\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\r\n }\r\n\r\n //點選任一動態磚即撈取是選單功能Menu資料\r\n var menuAllList = JSON.parse(sessionStorage.getItem('menuAllList')); \r\n var menuItems = menuAllList.filter(function (menuLists){\r\n return (parseInt(menuLists.menuSerilNo) === parseInt(sessionStorage.getItem('menuSerilNo')) &&\r\n menuLists.hasChild === false\r\n );\r\n });\r\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\r\n if (menuItems!==null && menuItems.length!==0){\r\n sessionStorage.setItem('menuSerilNo', menuItems[0].menuSerilNo);\r\n sessionStorage.setItem('menuItemPath', menuItems[0].menuItemPath);\r\n }\r\n else{\r\n //如是選單節點即撈取第二或第三階層是否為父階層 \r\n menuItems = menuAllList.filter(function (menuLists) {\r\n return (parseInt(menuLists.parentId) === parseInt(sessionStorage.getItem('menuSerilNo'))\r\n );\r\n });\r\n\r\n //撈取選單節點下排序第一個功能Menu\r\n if (menuItems != null && menuItems.length!==0){ \r\n var sort = Math.min(...menuItems.map(p => p.sort));\r\n var menuItem = menuItems.filter(function (menuLists) {\r\n return (parseInt(menuLists.sort) === parseInt(sort));\r\n });\r\n \r\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\r\n //console.log(menuItem);\r\n if (menuItem!==null && menuItem.length!==0){\r\n if (!menuItem[0].hasChild){\r\n sessionStorage.setItem('menuSerilNo', menuItem[0].menuSerilNo);\r\n }\r\n sessionStorage.setItem('menuItemPath', menuItem[0].menuItemPath);\r\n } \r\n }\r\n }\r\n\r\n // console.log('taiMetro_redirectUrl-menuSerilNo:'+sessionStorage.getItem('menuSerilNo'));\r\n // console.log('taiMetro_redirectUrl-menuItemPath:'+sessionStorage.getItem('menuItemPath'));\r\n }\r\n\r\n menuService.redirectUrl(item);\r\n }\r\n }\r\n \r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taishinTimeTooltip', taishinTimeTooltip);\r\n\r\n function taishinTimeTooltip() {\r\n // Usage:\r\n //\r\n // Creates:\r\n //\r\n var directive = {\r\n bindToController: true,\r\n controller: ControllerController,\r\n templateUrl: 'directive/taishinTimeTooltip.html',\r\n controllerAs: 'vm',\r\n link: link,\r\n restrict: 'E',\r\n scope: {\r\n width: '@',\r\n importData: '=',\r\n mode: '=',\r\n textAlign: '=',\r\n briefText: '=',\r\n }\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController(modalService) {\r\n var vm = this;\r\n //---Method--\r\n //vm.method = methodName; \r\n //-----------\r\n init();\r\n\r\n function dataIint() {\r\n vm.view = {\r\n show: false,\r\n moreShow: false,\r\n showBrief: false,\r\n briefIsRange: false,\r\n contentSperate: false,\r\n isForceBrief: false,\r\n //scale:-53,\r\n isMobile: modalService.isMobile,\r\n };\r\n vm.style = {\r\n contentStyle: {\r\n\r\n },\r\n textStyle: {\r\n\r\n }\r\n };\r\n vm.data = {\r\n importData: angular.copy(vm.importData) || [],\r\n dateBrief: \"\",\r\n dateList: []\r\n };\r\n }\r\n\r\n function init() {\r\n dataIint();\r\n logicInit();\r\n vm.view.show = true;\r\n //vm.view.scale=ScaleChange(vm.view.scale);\r\n //console.log('vm.view.scale:',vm.view.scale);\r\n }\r\n\r\n function logicInit() {\r\n styleLoading();\r\n if (vm.briefText || vm.briefText === 0) {\r\n vm.data.dateBrief = vm.briefText + '';\r\n vm.view.isForceBrief = true;\r\n vm.view.showBrief = true;\r\n }\r\n switch (vm.mode) {\r\n case \"rough\":\r\n roughProcess();\r\n break;\r\n default:\r\n dateProcess();\r\n vm.view.contentSperate = true;\r\n break;\r\n }\r\n }\r\n\r\n function styleLoading() {\r\n if (vm.textAlign === 'center') {\r\n vm.style.textStyle[\"text-align\"] = 'center';\r\n } else if (vm.textAlign === 'left') {\r\n vm.style.textStyle[\"text-align\"] = 'left';\r\n } else if (vm.textAlign === 'right') {\r\n vm.style.textStyle[\"text-align\"] = 'right';\r\n }\r\n\r\n if (vm.width) {\r\n vm.style.contentStyle.width = vm.width + 'px';\r\n }\r\n }\r\n\r\n function roughProcess() {\r\n vm.data.dateList = contentFixBr(vm.data.importData);\r\n // vm.data.dateBrief = \"\";\r\n vm.view.moreShow = (vm.data.importData.length > 0);\r\n }\r\n\r\n function dateProcess() {\r\n vm.data.dateList = getDateRange(vm.data.importData);\r\n if (!vm.view.isForceBrief) {\r\n vm.data.dateBrief = vm.data.dateList[0].split('~')[0];\r\n }\r\n vm.view.briefIsRange = (vm.data.dateList[0].split('~').length > 1);\r\n vm.view.moreShow = (vm.view.briefIsRange || vm.data.dateList.length > 1);\r\n vm.view.showBrief = true;\r\n }\r\n\r\n function getDateRange(rawStr) {\r\n //取得來源字串內的\"日期區間\"\r\n var getRange = /(\\d{4}\\/\\d{1,2}\\/\\d{1,2}(\\s*~\\s*)?(\\d{4}\\/\\d{1,2}\\/\\d{1,2})?(\\([\\w\\W]*\\))?)/g;\r\n var sourceStr = angular.copy(rawStr) || \"\";\r\n var resultStr = [];\r\n var match = null;\r\n //==若有其他狀況就依序取代與處理==\r\n do {\r\n if (match !== null) {\r\n var timeAry = match[0].split('~');\r\n var matchResult;\r\n if (timeAry.length > 1) {\r\n if (timeAry[0].trim() === timeAry[1].trim()) { matchResult = timeAry[0]; } else { matchResult = match[0]; }\r\n } else {\r\n matchResult = match[0];\r\n }\r\n if (resultStr.indexOf(matchResult) === -1) {\r\n resultStr.push(matchResult);\r\n }\r\n }\r\n match = getRange.exec(sourceStr);\r\n } while (match !== null);\r\n //=========\r\n if (resultStr.length < 1) { resultStr[0] = \"\"; }\r\n return resultStr;\r\n }\r\n\r\n function contentFixBr(rawData) {\r\n var getRange = /()/g;\r\n var exceptCheck = /()/;\r\n var sourceStr = (rawData && (typeof rawData === 'string')) ? angular.copy(rawData) : '';\r\n var resultStr = [];\r\n var match;\r\n try { match = sourceStr.split(getRange); } catch (exp) { console.log(\"sourceStr\", sourceStr); }\r\n match = sourceStr.split(getRange);\r\n //==若有其他狀況就依序取代與處理==\r\n _.forEach(match, function(value) {\r\n if (!value) { return; }\r\n if (value.length < 1) { return; }\r\n if (exceptCheck.test(value)) { return; }\r\n if (resultStr.indexOf(value) === -1) {\r\n resultStr.push(value);\r\n }\r\n });\r\n //=========\r\n return resultStr;\r\n }\r\n\r\n // function ScaleChange(data){\r\n // var value = data;\r\n // if(vm.view.isMobile){\r\n\r\n // //value=value-30;\r\n // }\r\n // return value;\r\n // }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiVirKeyboard', taiVirKeyboard);\r\n\r\n function taiVirKeyboard() {\r\n var directive = {\r\n require: ['^form', '^ngController'],\r\n bindToController: true,\r\n controller: ControllerController,\r\n templateUrl: 'directive/taiVirKeyboard.html',\r\n controllerAs: 'vm',\r\n link: link,\r\n restrict: 'E',\r\n scope: {\r\n data: '=',\r\n onDataChanged: '='\r\n }\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController(modalService, $scope) {\r\n var vm = this;\r\n // 1.8.2 父層參數 data 無法直接從 scope 引入\r\n vm.data = $scope.$parent.vm.virData;\r\n vm.caps = false;\r\n vm.kbType = 1; // 1-letter ; 2-symbol\r\n vm.focusObj = null;\r\n vm.keyMap = {};\r\n vm.isInitKeyboard = false;\r\n vm.showKeyboard = showKeyboard;\r\n vm.new_keybord = new_keybord;\r\n vm.initKeyElement = initKeyElement;\r\n vm.getLetterKeyboard = getLetterKeyboard;\r\n vm.getSymKeyboard = getSymKeyboard;\r\n\r\n // Virtual Keyboard Init\r\n vm.num_array = new Array();\r\n vm.sym_arr = new Array();\r\n vm.en_b_array = new Array();\r\n vm.showKeyboard();\r\n //------------------------\r\n\r\n function getMapKey(key) {\r\n if (typeof vm.keyMap[key] === \"undefined\") return key;\r\n return vm.keyMap[key];\r\n }\r\n\r\n // 顯示小鍵盤\r\n function showKeyboard() {\r\n if (!vm.isInitKeyboard) {\r\n //執行產生新鍵盤\r\n vm.initKeyElement();\r\n vm.new_keybord();\r\n\r\n vm.isInitKeyboard = true\r\n }\r\n\r\n //開啟html元素\r\n $(\"#keyboard\").show();\r\n $(\"#flashcontent\").show();\r\n }\r\n\r\n\r\n // //清除輸入欄\r\n // $(\".Keyboard_reset\").click(function() {\r\n // vm.focusObj.val(\"\");\r\n // vm.focusObj.trigger('change')\r\n // })\r\n\r\n //從一個給定的arr陣列中,隨機返回num個不重複項\r\n function getArrayItems(arr, num) {\r\n //新鍵一個陣列,將傳入的陣列複製過來,用於運算,不直接操作傳入的陣列\r\n var temp_array = new Array();\r\n for (var index in arr) {\r\n temp_array.push(arr[index]);\r\n }\r\n //取出的項目,保存在此陣列\r\n var return_array = new Array();\r\n for (var i = 0; i < num; i++) {\r\n //判斷如果陣列還有可以取出的元素,以防下標越界\r\n if (temp_array.length > 0) {\r\n //在陣列中產生一個隨機索引\r\n //2023-09-20 Johnson 資安2023\r\n var arrIndex = Math.floor(eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0.1()',2,2,'Math|random'.split('|'),0,{})) * temp_array.length);\r\n return_array[i] = temp_array[arrIndex];\r\n //刪掉此索引的陣列元素,此時temp_array變為新的陣列\r\n temp_array.splice(arrIndex, 1);\r\n } else {\r\n //陣列項目取完後,退出迴圈,比如陣列本來只有10項,但要求取出20項\r\n break;\r\n }\r\n }\r\n return return_array;\r\n }\r\n\r\n function new_keybord() {\r\n\r\n if (vm.kbType === 1) {\r\n vm.getLetterKeyboard();\r\n\r\n $(\".kb_num\").each(function () {\r\n var kbNum = $(this).attr(\"title\");\r\n $(this).addClass(\"n_\" + kbNum);\r\n });\r\n\r\n $(\".kb_en\").each(function () {\r\n var kbNum = $(this).attr(\"title\");\r\n $(this).addClass(\"l_\" + kbNum);\r\n });\r\n } else {\r\n vm.getSymKeyboard();\r\n\r\n //將背景圖的class加入含有.kb class的td中\r\n $(\".kb_sy\").each(function () {\r\n var kbNum = $(this).attr(\"title\");\r\n $(this).addClass(\"l_\" + kbNum);\r\n });\r\n }\r\n //dom建立完畢\r\n\r\n //按下小鍵盤 (取值寫入inputText)\r\n $(\".kb_num, .kb_en , .kb_sy\").click(function () {\r\n //取值\r\n vm.data = vm.data || '';\r\n var key = $(this).attr(\"title\");\r\n vm.data += getMapKey(key);\r\n vm.onDataChanged(vm.data);\r\n\r\n //console.log('data:', vm.data);\r\n });\r\n\r\n //更改樣式\r\n // $(\".kb_num, .kb_en , .kb_sy\").hover(\r\n // function () {\r\n // var $this = $(this);\r\n // $this.addClass(\"Keyboard_hover\");\r\n // },\r\n // function () {\r\n // var $this = $(this);\r\n // $this.removeClass(\"Keyboard_hover\");\r\n // }\r\n // );\r\n\r\n //按下切換\r\n $(\".Keyboard_s\").click(function () {\r\n $(\"#keyboard tr:lt(5)\").html(\"\");\r\n if (vm.kbType == 1) {\r\n vm.kbType = 2;\r\n } else {\r\n vm.kbType = 1;\r\n }\r\n vm.new_keybord();\r\n });\r\n\r\n //按下更新\r\n $(\".Keyboard_r\").click(function () {\r\n $(\"#keyboard tr:lt(5)\").html(\"\");\r\n vm.new_keybord();\r\n if (vm.caps) {\r\n $(\".Keyboard_caps\").toggleClass(\"capsDown\");\r\n $(\"#keyboard a[class^='kb_en']\").each(function () {\r\n //切換大寫title\r\n var titleName = $(this).attr(\"title\");\r\n titleName = titleName.toUpperCase();\r\n $(this).attr(\"title\", titleName);\r\n });\r\n }\r\n });\r\n\r\n //按下大寫切換\r\n $(\".Keyboard_caps\").click(function () {\r\n //判斷是否按下[大寫]\r\n if ($(\".Keyboard_caps\").hasClass(\"capsDown\")) {\r\n $(this).toggleClass(\"capsDown\");\r\n vm.caps = false;\r\n $(\"#keyboard a[class^='kb_en']\").each(function () {\r\n //切換小寫title\r\n var titleName = $(this).attr(\"title\");\r\n titleName = titleName.toLowerCase();\r\n $(this).attr(\"title\", titleName);\r\n\r\n });\r\n } else {\r\n vm.caps = true;\r\n $(this).toggleClass(\"capsDown\");\r\n $(\"#keyboard a[class^='kb_en']\").each(function () {\r\n //切換大寫title\r\n var titleName = $(this).attr(\"title\");\r\n titleName = titleName.toUpperCase();\r\n $(this).attr(\"title\", titleName);\r\n });\r\n }\r\n\r\n $(\".Keyboard_caps\").each(function () {\r\n //切換大小寫title\r\n var titleName = $(this).attr(\"title\");\r\n if (!vm.caps) {\r\n titleName = '⇧';\r\n } else {\r\n titleName = '⇡';\r\n }\r\n $(this).attr(\"title\", titleName);\r\n });\r\n })\r\n\r\n //清除輸入欄\r\n $(\".Keyboard_reset\").click(function () {\r\n vm.data = '';\r\n vm.onDataChanged(vm.data);\r\n })\r\n }\r\n\r\n /**\r\n * 定義鍵盤所需元素\r\n */\r\n function initKeyElement() {\r\n //產生0~9的html存入陣列\r\n for (var i = 0; i < 10; i++) {\r\n vm.num_array[i] = \"\"\r\n }\r\n\r\n //產生特殊字元陣列\r\n vm.sym_arr[0] = \"\";\r\n vm.sym_arr[1] = \"\";\r\n vm.sym_arr[2] = \"\";\r\n vm.sym_arr[3] = \"\";\r\n vm.sym_arr[4] = \"\";\r\n vm.sym_arr[5] = \"\";\r\n vm.sym_arr[6] = \"\";\r\n vm.sym_arr[7] = \"\";\r\n vm.sym_arr[8] = \"\";\r\n vm.sym_arr[9] = \"\";\r\n vm.sym_arr[10] = \"\";\r\n vm.sym_arr[11] = \"\";\r\n vm.sym_arr[12] = \"\";\r\n vm.sym_arr[13] = \"\";\r\n vm.sym_arr[14] = \"\";\r\n vm.sym_arr[15] = \"\";\r\n vm.sym_arr[16] = \"\";\r\n vm.sym_arr[17] = \"\";\r\n vm.sym_arr[18] = \"\";\r\n vm.sym_arr[19] = \"\";\r\n vm.sym_arr[20] = \"\";\r\n vm.sym_arr[21] = \"\";\r\n vm.sym_arr[22] = \"\";\r\n vm.sym_arr[23] = \"\";\r\n vm.sym_arr[24] = \"\";\r\n vm.sym_arr[25] = \"\";\r\n vm.sym_arr[26] = \"\";\r\n vm.sym_arr[27] = \"\";\r\n // vm.sym_arr[28] = \"\";\r\n // vm.sym_arr[29] = \"\";\r\n // vm.sym_arr[30] = \"\";\r\n // vm.sym_arr[31] = \"\";\r\n // vm.sym_arr[32] = \"\";\r\n // vm.sym_arr[33] = \"\";\r\n // vm.sym_arr[34] = \"\";\r\n // vm.sym_arr[35] = \"\";\r\n\r\n\r\n //產生a~z的html存入陣列\r\n vm.en_b_array[0] = \"\";\r\n vm.en_b_array[1] = \"\";\r\n vm.en_b_array[2] = \"\";\r\n vm.en_b_array[3] = \"\";\r\n vm.en_b_array[4] = \"\";\r\n vm.en_b_array[5] = \"\";\r\n vm.en_b_array[6] = \"\";\r\n vm.en_b_array[7] = \"\";\r\n vm.en_b_array[8] = \"\";\r\n vm.en_b_array[9] = \"\";\r\n vm.en_b_array[10] = \"\";\r\n vm.en_b_array[11] = \"\";\r\n vm.en_b_array[12] = \"\";\r\n vm.en_b_array[13] = \"\";\r\n vm.en_b_array[14] = \"\";\r\n vm.en_b_array[15] = \"\";\r\n vm.en_b_array[16] = \"\";\r\n vm.en_b_array[17] = \"\";\r\n vm.en_b_array[18] = \"\";\r\n vm.en_b_array[19] = \"\";\r\n vm.en_b_array[20] = \"\";\r\n vm.en_b_array[21] = \"\";\r\n vm.en_b_array[22] = \"\";\r\n vm.en_b_array[23] = \"\";\r\n vm.en_b_array[24] = \"\";\r\n vm.en_b_array[25] = \"\";\r\n\r\n }\r\n\r\n function getLetterKeyboard() {\r\n //取出已亂數的數字陣列,並插入至keyboard下第1個tr \t\r\n vm.num_array = getArrayItems(vm.num_array, 10);\r\n for (let i = 0; i < vm.num_array.length; i++) {\r\n $(\"#keyboard tr:eq(0)\").append(vm.num_array[i]);\r\n }\r\n\r\n //取出已亂數的小寫陣列,並插入至keyboard下第2~4個tr\r\n vm.en_b_array = getArrayItems(vm.en_b_array, 26);\r\n for (let i = 0; i < 26; i++) {\r\n if (i < 10) {\r\n $(\"#keyboard tr:eq(1)\").append(vm.en_b_array[i]);\r\n } else if (i >= 10 && i < 20) {\r\n $(\"#keyboard tr:eq(2)\").append(vm.en_b_array[i]);\r\n } else if (i == 20) {\r\n $(\"#keyboard tr:eq(3)\").append(\"\");\r\n $(\"#keyboard tr:eq(3)\").append(vm.en_b_array[i]);\r\n } else if (i == 25) {\r\n $(\"#keyboard tr:eq(3)\").append(vm.en_b_array[i]);\r\n $(\"#keyboard tr:eq(3)\").append(\"\");\r\n } else {\r\n $(\"#keyboard tr:eq(3)\").append(vm.en_b_array[i]);\r\n }\r\n }\r\n //$(\"#keyboard tr:eq(4)\").append(\"\");\r\n $(\"#keyboard tr:eq(4)\").append(\"\");\r\n }\r\n\r\n function getSymKeyboard() {\r\n //取出已亂數的數字陣列,並插入至keyboard下第1個tr \t\r\n vm.num_array = getArrayItems(vm.num_array, 10);\r\n for (let i = 0; i < vm.num_array.length; i++) {\r\n $(\"#keyboard tr:eq(0)\").append(vm.num_array[i]);\r\n }\r\n \r\n //取出已亂數的符號陣列,並插入至keyboard下第2~4個tr\r\n vm.sym_arr = getArrayItems(vm.sym_arr, 26);\r\n for (let i = 0; i < 26; i++) {\r\n if (i < 10) {\r\n $(\"#keyboard tr:eq(1)\").append(vm.sym_arr[i]);\r\n } else if (i >= 10 && i < 20) {\r\n $(\"#keyboard tr:eq(2)\").append(vm.sym_arr[i]);\r\n } else if (i == 20) {\r\n $(\"#keyboard tr:eq(3)\").append(\"\");\r\n $(\"#keyboard tr:eq(3)\").append(vm.sym_arr[i]);\r\n } else if (i == 25) { \r\n $(\"#keyboard tr:eq(3)\").append(vm.sym_arr[i]);\r\n $(\"#keyboard tr:eq(3)\").append(\"\");\r\n } else {\r\n $(\"#keyboard tr:eq(3)\").append(vm.sym_arr[i]);\r\n }\r\n\r\n }\r\n\r\n //$(\"#keyboard tr:eq(4)\").append(\"\");\r\n $(\"#keyboard tr:eq(4)\").append(\"\");\r\n \r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n angular\r\n .module('app.filter')\r\n .filter('highlight', highlight);\r\n\r\n function highlight($sce) {\r\n return function(text, phrase) {\r\n\r\n if (phrase) {\r\n if (text) {\r\n text = text.replace(new RegExp('(' + phrase + ')', 'gi'),\r\n '$1');\r\n }\r\n }\r\n\r\n return $sce.trustAsHtml(text);\r\n };\r\n }\r\n})();","(function() {\r\n\r\n 'use strict';\r\n\r\n angular\r\n .module('app.filter')\r\n .filter('newline', newline);\r\n\r\n function newline() {\r\n return html => html.replace(/\\n/g, '
    ');\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n angular\r\n .module('app.filter')\r\n .filter('trustHtml', trustHtml);\r\n\r\n function trustHtml($sce) {\r\n return function(html) {\r\n return $sce.trustAsHtml(html);\r\n };\r\n }\r\n})();\r\n\r\n","(function() {\r\n 'use strict';\r\n angular\r\n .module('app.filter')\r\n .filter('trustUrl', trustUrl);\r\n\r\n function trustUrl($sce) {\r\n return function(url) {\r\n return $sce.trustAsResourceUrl(url);\r\n };\r\n }\r\n})();\r\n\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('testData', ['enumService', testData]);\r\n\r\n function testData(enumService) {\r\n var enumCourseType = enumService.courseType;\r\n var service = {\r\n MyTrainingPoint: MyTrainingPoint,\r\n SysTypesList: SysTypesList,\r\n FCLicenseList: FCLicenseList,\r\n CourseItem: CourseItem,\r\n PublishedActivity: PublishedActivity,\r\n CourseSession: CourseSession,\r\n ExamSurveyContent: ExamSurveyContent,\r\n InteractionData: InteractionData,\r\n MyUnfinishedActivities: MyUnfinishedActivities,\r\n MyFinishedActivities: MyFinishedActivities,\r\n EnrollmentAvailableAction: EnrollmentAvailableAction,\r\n EnrollmentAction: EnrollmentAction,\r\n FCCertificatedLicenseAdd: FCCertificatedLicenseAdd,\r\n FCCertificatedLicenseList: FCCertificatedLicenseList,\r\n FCAuthorizedHoursList: FCAuthorizedHoursList,\r\n ExternalTrainingApplication: ExternalTrainingApplication,\r\n FCEnrollableActivities: FCEnrollableActivities,\r\n LearningRecordCommit: LearningRecordCommit,\r\n };\r\n\r\n return service;\r\n /**\r\n * 1.訓練存摺點數\r\n * @returns\r\n */\r\n function MyTrainingPoint(year) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultDefault;\r\n var resultYear2013;\r\n var resultYear2014;\r\n var resultYear2015;\r\n var resultYear2016;\r\n resultDefault = {\r\n Status: '200',\r\n Data: {\r\n remainPoint: 0,\r\n trainingPoints: []\r\n },\r\n ErrorMessage: '123'\r\n };\r\n resultYear2013 = {\r\n Status: '200',\r\n Data: {\r\n remainPoint: 0,\r\n trainingPoints: [{\r\n courseName: \"2013課程\",\r\n courseTime: \"2013/09/21~2013/09/21\",\r\n courseType: \"外訓課程\",\r\n point: 250\r\n }]\r\n },\r\n ErrorMessage: ''\r\n };\r\n resultYear2014 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"remainPoint\": 10000,\r\n \"trainingPoints\": [{\r\n courseName: \"2014課程1\",\r\n courseTime: \"2014/03/05~2014/03/14\",\r\n courseType: \"外訓課程\",\r\n point: 250\r\n },\r\n {\r\n courseName: \"2014課程2\",\r\n courseTime: \"2014/07/13~2014/07/13\",\r\n courseType: \"線上課程\",\r\n point: 250\r\n },\r\n ]\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultYear2015 = { \"Status\": \"200\", \"Data\": { \"remainPoint\": 10000, \"trainingPoints\": [] }, \"ErrorMessage\": \"\" };\r\n resultYear2016 = { \"Status\": \"200\", \"Data\": { \"remainPoint\": 10000, \"trainingPoints\": [] }, \"ErrorMessage\": \"\" };\r\n switch (year + '') {\r\n case '2013':\r\n result = resultYear2013;\r\n break;\r\n case '2014':\r\n result = resultYear2014;\r\n break;\r\n case '2015':\r\n result = resultYear2015;\r\n break;\r\n case '2016':\r\n result = resultYear2016;\r\n break;\r\n default:\r\n result = resultYear2016;\r\n break;\r\n }\r\n return { data: result };\r\n }\r\n\r\n /**\r\n * 2-1.取得下拉選單資料_金融證照類別\r\n * @returns\r\n */\r\n function SysTypesList(type) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultType2; /**金融證照類別 */\r\n var resultType3; /**外訓費用貨幣種類 */\r\n var resultType4; /**外訓種類 */\r\n var resultType5; /**主辦單位 */\r\n resultType2 = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"id\": -1,\r\n \"name\": \"All\"\r\n },\r\n {\r\n \"id\": 7,\r\n \"name\": \"人力資源類\"\r\n },\r\n {\r\n \"id\": 8,\r\n \"name\": \"行內自辦證照/資格類資格類資格類資格類資格類\"\r\n },\r\n {\r\n \"id\": 15,\r\n \"name\": \"法金人才庫類\"\r\n },\r\n {\r\n \"id\": 6,\r\n \"name\": \"金融證照類\"\r\n },\r\n {\r\n \"id\": 12,\r\n \"name\": \"專案管理類\"\r\n },\r\n {\r\n \"id\": 9,\r\n \"name\": \"勞工安全類\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultType3 = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"id\": -1,\r\n \"name\": \"All\"\r\n },\r\n {\r\n \"id\": 0,\r\n \"name\": \"台幣\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultType4 = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"id\": -1,\r\n \"name\": \"All\"\r\n },\r\n {\r\n \"id\": 0,\r\n \"name\": \"國外外訓\"\r\n },\r\n {\r\n \"id\": 1,\r\n \"name\": \"一般外訓\"\r\n },\r\n {\r\n \"id\": 2,\r\n \"name\": \"外語進修補助\"\r\n },\r\n {\r\n \"id\": 3,\r\n \"name\": \"電腦進修補助\"\r\n },\r\n {\r\n \"id\": 4,\r\n \"name\": \"考試補助\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultType5 = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"id\": -1,\r\n \"name\": \"All\"\r\n },\r\n {\r\n \"id\": 1,\r\n \"name\": \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"\r\n },\r\n {\r\n \"id\": 3,\r\n \"name\": \"路透社\"\r\n },\r\n {\r\n \"id\": 4,\r\n \"name\": \"工研院台北學習中心\"\r\n },\r\n {\r\n \"id\": 5,\r\n \"name\": \"中央存款保險股份有限公司\"\r\n },\r\n {\r\n \"id\": 6,\r\n \"name\": \"中原大學推廣教育中心\"\r\n },\r\n {\r\n \"id\": 7,\r\n \"name\": \"中國文化大學推廣教育部\"\r\n },\r\n {\r\n \"id\": 8,\r\n \"name\": \"中國生產力中心\"\r\n },\r\n {\r\n \"id\": 9,\r\n \"name\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"id\": 10,\r\n \"name\": \"中華人事主管協會\"\r\n },\r\n {\r\n \"id\": 11,\r\n \"name\": \"中華公司治理協會\"\r\n },\r\n {\r\n \"id\": 12,\r\n \"name\": \"中華民國工商協進會\"\r\n },\r\n {\r\n \"id\": 13,\r\n \"name\": \"中華民國工業安全衛生協會\"\r\n },\r\n {\r\n \"id\": 14,\r\n \"name\": \"中華民國內部稽核協會\"\r\n },\r\n {\r\n \"id\": 15,\r\n \"name\": \"中華民國公司組織研究發展協會\"\r\n },\r\n {\r\n \"id\": 16,\r\n \"name\": \"信託公會\"\r\n },\r\n {\r\n \"id\": 17,\r\n \"name\": \"中華民國退休基金協會〈萬寶資產管理集團〉\"\r\n },\r\n {\r\n \"id\": 18,\r\n \"name\": \"中華民國票券金融商業同業公會\"\r\n },\r\n {\r\n \"id\": 19,\r\n \"name\": \"中華民國勞資關係協進會\"\r\n },\r\n {\r\n \"id\": 20,\r\n \"name\": \"中華民國銀行商業同業公會全國聯合會\"\r\n },\r\n {\r\n \"id\": 21,\r\n \"name\": \"中華民國職工福利發展協會\"\r\n },\r\n {\r\n \"id\": 22,\r\n \"name\": \"中華民國證券投資信託暨顧問商業同業公會\"\r\n },\r\n {\r\n \"id\": 23,\r\n \"name\": \"中華汽車培訓中心\"\r\n },\r\n {\r\n \"id\": 24,\r\n \"name\": \"中華徵信所\"\r\n },\r\n {\r\n \"id\": 25,\r\n \"name\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"id\": 26,\r\n \"name\": \"台大進修推廣部\"\r\n },\r\n {\r\n \"id\": 27,\r\n \"name\": \"國稅局\"\r\n },\r\n {\r\n \"id\": 28,\r\n \"name\": \"台北市進出口商業同業公會\"\r\n },\r\n {\r\n \"id\": 29,\r\n \"name\": \"台北金融研究發展基金會\"\r\n },\r\n {\r\n \"id\": 30,\r\n \"name\": \"台北恆逸教訓訓練中心\"\r\n },\r\n {\r\n \"id\": 31,\r\n \"name\": \"台北富蘭德林諮詢有限公司\"\r\n },\r\n {\r\n \"id\": 32,\r\n \"name\": \"證券商業同業公會\"\r\n },\r\n {\r\n \"id\": 33,\r\n \"name\": \"證券暨期貨市場發展基金會\"\r\n },\r\n {\r\n \"id\": 34,\r\n \"name\": \"台北富蘭德林諮詢有限公司\"\r\n },\r\n {\r\n \"id\": 35,\r\n \"name\": \"台灣金融服務業聯合總會\"\r\n },\r\n {\r\n \"id\": 36,\r\n \"name\": \"台灣金融服務業聯合總會\"\r\n },\r\n {\r\n \"id\": 37,\r\n \"name\": \"台灣期貨交易所股份有限公司\"\r\n },\r\n {\r\n \"id\": 38,\r\n \"name\": \"巨匠電腦\"\r\n },\r\n {\r\n \"id\": 39,\r\n \"name\": \"行政院金融管理委員會\"\r\n },\r\n {\r\n \"id\": 40,\r\n \"name\": \"行政院勞工委員會\"\r\n },\r\n {\r\n \"id\": 41,\r\n \"name\": \"何嘉仁國際教育學院\"\r\n },\r\n {\r\n \"id\": 42,\r\n \"name\": \"投信投顧公會\"\r\n },\r\n {\r\n \"id\": 43,\r\n \"name\": \"亞太教育訓練\"\r\n },\r\n {\r\n \"id\": 44,\r\n \"name\": \"兩岸經華諮詢顧問股份有限公司\"\r\n },\r\n {\r\n \"id\": 45,\r\n \"name\": \"券商同業公會\"\r\n },\r\n {\r\n \"id\": 46,\r\n \"name\": \"卓越人生企管顧問公司\"\r\n },\r\n {\r\n \"id\": 47,\r\n \"name\": \"和風談判學院\"\r\n },\r\n {\r\n \"id\": 48,\r\n \"name\": \"旺旺中時媒體集團\"\r\n },\r\n {\r\n \"id\": 49,\r\n \"name\": \"東方匯理銀行\"\r\n },\r\n {\r\n \"id\": 50,\r\n \"name\": \"法國外貿銀行\"\r\n },\r\n {\r\n \"id\": 51,\r\n \"name\": \"社團法人中華採購供應管理協會\"\r\n },\r\n {\r\n \"id\": 52,\r\n \"name\": \"花旗銀行\"\r\n },\r\n {\r\n \"id\": 53,\r\n \"name\": \"金管會\"\r\n },\r\n {\r\n \"id\": 54,\r\n \"name\": \"前瞻國際顧問(股)公司\"\r\n },\r\n {\r\n \"id\": 55,\r\n \"name\": \"施羅德證券投資信託股份有限公司\"\r\n },\r\n {\r\n \"id\": 56,\r\n \"name\": \"美國銀行(Bank of America)\"\r\n },\r\n {\r\n \"id\": 57,\r\n \"name\": \"英商渣打銀行\"\r\n },\r\n {\r\n \"id\": 58,\r\n \"name\": \"財團法人會計研究發展基金會\"\r\n },\r\n {\r\n \"id\": 59,\r\n \"name\": \"高雄市銀行公會\"\r\n },\r\n {\r\n \"id\": 60,\r\n \"name\": \"動腦傳播股份有限公司\"\r\n },\r\n {\r\n \"id\": 61,\r\n \"name\": \"國際商會中華民國總會\"\r\n },\r\n {\r\n \"id\": 62,\r\n \"name\": \"富蘭德林\"\r\n },\r\n {\r\n \"id\": 63,\r\n \"name\": \"彭博資訊\"\r\n },\r\n {\r\n \"id\": 64,\r\n \"name\": \"渣打銀行\"\r\n },\r\n {\r\n \"id\": 65,\r\n \"name\": \"勤業眾信會計師事務所\\t\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n switch (type) {\r\n case 2:\r\n result = resultType2;\r\n break;\r\n case 3:\r\n result = resultType3;\r\n break;\r\n case 4:\r\n result = resultType4;\r\n break;\r\n case 5:\r\n result = resultType5;\r\n break;\r\n default:\r\n break;\r\n }\r\n return { data: result };\r\n }\r\n /**\r\n * 2-3.取得下拉選單資料_取得金融證照名稱\r\n * @returns\r\n */\r\n function FCLicenseList() {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n result = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"attTypes\": \"\",\r\n \"id\": 159,\r\n \"name\": \"ARM專業能力檢定測驗(大會考)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 177,\r\n \"name\": \"AU-910 Generic Knowledge\",\r\n \"organization\": \"Australian Securities & Investments Commission\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 190,\r\n \"name\": \"AU-927 Foreign Exchange - Knowledge & Skill\",\r\n \"organization\": \"Australian Securities & Investments Commission\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 189,\r\n \"name\": \"AU-927 Foreign Exchange - Knowledge only\",\r\n \"organization\": \"Australian Securities & Investments Commission\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 85,\r\n \"name\": \"CFA(全階)\",\r\n \"organization\": \"台灣理財顧問認證協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 83,\r\n \"name\": \"CFA(第一階段)\",\r\n \"organization\": \"台灣理財顧問認證協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 84,\r\n \"name\": \"CFA(第二階段)\",\r\n \"organization\": \"台灣理財顧問認證協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 86,\r\n \"name\": \"CFP\",\r\n \"organization\": \"台灣理財顧問認證協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 148,\r\n \"name\": \"CIA 國際內部稽核師\",\r\n \"organization\": \"中華民國內部稽核協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 149,\r\n \"name\": \"CISA 國際電腦稽核師\",\r\n \"organization\": \"中華民國內部稽核協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 87,\r\n \"name\": \"CPA(會計師)\",\r\n \"organization\": \"考試院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 88,\r\n \"name\": \"CSIA\",\r\n \"organization\": \"美國金融管理學會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 29,\r\n \"name\": \"e-HR管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 179,\r\n \"name\": \"Internal Audit in Financial Institution 金融機構稽核課程(HK)\",\r\n \"organization\": \"香港銀行學會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 89,\r\n \"name\": \"MFP\",\r\n \"organization\": \"美國金融管理學會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 90,\r\n \"name\": \"PMP國際專案經理人認証班\",\r\n \"organization\": \"Project Management Institute(PMI)\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 147,\r\n \"name\": \"PMP國際專案管理師\",\r\n \"organization\": \"Project Management Institute(PMI)\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 37,\r\n \"name\": \"一級講師\",\r\n \"organization\": \"人力資源處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 58,\r\n \"name\": \"乙種勞工安全衛生業務主管\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 26,\r\n \"name\": \"人力資源中階主管\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 12,\r\n \"name\": \"人民幣辨識資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 76,\r\n \"name\": \"人身保險代理人\",\r\n \"organization\": \"中華民國考選部\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 79,\r\n \"name\": \"人身保險業務員投資型保險商品資格測驗合格\",\r\n \"organization\": \"財團法人保險事業發展中心\"\r\n },\r\n {\r\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\r\n \"id\": 46,\r\n \"name\": \"人身保險業務員投資型商品資格登錄(登錄壽險公會)\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\r\n \"id\": 45,\r\n \"name\": \"人身保險業務員登錄(登錄壽險公會)\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 77,\r\n \"name\": \"人身保險業務員資格測驗合格\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 82,\r\n \"name\": \"人身保險業務員銷售外幣收付非投資型保險商品資格測驗合格\",\r\n \"organization\": \"財團法人保險事業發展中心\"\r\n },\r\n {\r\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\r\n \"id\": 47,\r\n \"name\": \"人身保險業務員銷售外幣收付非投資型保險商品資格登錄(登錄壽險公會)\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 153,\r\n \"name\": \"人身保險經紀人\",\r\n \"organization\": \"中華民國考選部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 24,\r\n \"name\": \"大陸人力資源管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 158,\r\n \"name\": \"大陸人力資源與勞動關係管理師\",\r\n \"organization\": \"中華人事主管協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 78,\r\n \"name\": \"不良債權處理實務研習班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 124,\r\n \"name\": \"不動產鑑價測驗合格\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 34,\r\n \"name\": \"不動產鑑價資格取得\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 73,\r\n \"name\": \"內部稽核師\",\r\n \"organization\": \"中華民國內部稽核協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 131,\r\n \"name\": \"內部講師訓完訓資格\",\r\n \"organization\": \"人力資源處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 134,\r\n \"name\": \"分行經理內部控制\",\r\n \"organization\": \"通路營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 59,\r\n \"name\": \"丙種勞工安全衛生業務主管\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 40,\r\n \"name\": \"外匯及衍生性金融商品之風險管理研習班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 91,\r\n \"name\": \"外匯交易專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 64,\r\n \"name\": \"外匯指定分行外匯人員資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 8,\r\n \"name\": \"外匯經辦人員資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 185,\r\n \"name\": \"外匯經辦人員資格(僅限客服部)\",\r\n \"organization\": \"通路營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 9,\r\n \"name\": \"外匯覆核人員資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 186,\r\n \"name\": \"外匯覆核人員資格(僅限客服部)\",\r\n \"organization\": \"通路營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 22,\r\n \"name\": \"生涯發展諮商師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 57,\r\n \"name\": \"甲種勞工安全衛生業務主管\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 74,\r\n \"name\": \"企業內部控制基本能力測驗\",\r\n \"organization\": \"證券暨期貨市場發展基金會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 157,\r\n \"name\": \"全民財經檢定(General Economic and Financial Test)\",\r\n \"organization\": \"經濟日報\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 92,\r\n \"name\": \"存款開戶課程認證\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 36,\r\n \"name\": \"年度優良講師\",\r\n \"organization\": \"人力資源處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 156,\r\n \"name\": \"利率變動型年金資格(登錄壽險公會)\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 63,\r\n \"name\": \"投信投顧相關法規(含自律規範)\",\r\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 120,\r\n \"name\": \"投信投顧業務員\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"身分證正反面影本, 最高學歷證書影本, 投信投顧業務員證照影本(或信託業務證照+投信投顧法規證照影本), 金融常識與職業道德測驗證書影本, 登錄聲明書 (下載路徑:台新大學>新手上路>新手教材>同仁篇>證照管理>投顧人員聲明書103年版), 請注意,此證照僅供「理財商品處」同仁申請登錄\",\r\n \"id\": 127,\r\n \"name\": \"投信投顧業務員-一般業務員(登錄投信投顧公會)\",\r\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 129,\r\n \"name\": \"投信投顧業務員-基金經理人(登錄投信投顧公會)\",\r\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 130,\r\n \"name\": \"投信投顧業務員-基金經理人部主管(登錄投信投顧公會)\",\r\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 128,\r\n \"name\": \"投信投顧業務員-部主管(登錄投信投顧公會)\",\r\n \"organization\": \"中華民國證券投資信託暨顧問商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 50,\r\n \"name\": \"防火管理人員\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 109,\r\n \"name\": \"其他類證照\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 21,\r\n \"name\": \"知識管理管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 102,\r\n \"name\": \"股務業務員資格\",\r\n \"organization\": \"證券暨期貨市場發展基金會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 94,\r\n \"name\": \"初階外匯人員專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 96,\r\n \"name\": \"初階授信人員專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 100,\r\n \"name\": \"金融人員授信擔保品估價專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 99,\r\n \"name\": \"金融市場常識與職業道德\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 180,\r\n \"name\": \"金融管理師(FMA)資格認證\",\r\n \"organization\": \"高級金融管理師(AFMA)委員會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 204,\r\n \"name\": \"金融數位力知識檢定測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 14,\r\n \"name\": \"信託業務人員信託業務專業測驗\",\r\n \"organization\": \"中華民國信託業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 65,\r\n \"name\": \"信託業務人員信託業務專業測驗【信託法規乙科】\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"不需檢附任何文件\",\r\n \"id\": 7,\r\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\r\n \"organization\": \"中華民國信託業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 30,\r\n \"name\": \"信託督導人員實務研習班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"不需檢附任何文件\",\r\n \"id\": 5,\r\n \"name\": \"信託督導人員審定合格(登錄信託公會)\",\r\n \"organization\": \"中華民國信託業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 31,\r\n \"name\": \"信託管理人員研習班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"不需檢附任何文件\",\r\n \"id\": 6,\r\n \"name\": \"信託管理人員審定合格(登錄信託公會)\",\r\n \"organization\": \"中華民國信託業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 80,\r\n \"name\": \"保險財產規劃師\",\r\n \"organization\": \"中華民國個人財產規劃人員協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 51,\r\n \"name\": \"急救人員訓練\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 202,\r\n \"name\": \"衍生性金融商品及風險管理培訓班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 41,\r\n \"name\": \"衍生性金融商品自辦課程測驗\",\r\n \"organization\": \"金融市場處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 205,\r\n \"name\": \"衍生性金融商品銷售人員資格測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 192,\r\n \"name\": \"衍生性商品推介人員(登錄銀行公會)\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"通過證書正本\",\r\n \"id\": 193,\r\n \"name\": \"風險管理基本能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 135,\r\n \"name\": \"香港證券-卷一 基本證券及期貨規例\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 141,\r\n \"name\": \"香港證券-卷七 金融市場\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 143,\r\n \"name\": \"香港證券-卷九 衍生工具\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 136,\r\n \"name\": \"香港證券-卷二 證券規例\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 142,\r\n \"name\": \"香港證券-卷八 證券\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 144,\r\n \"name\": \"香港證券-卷十 信貸評級服務\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 145,\r\n \"name\": \"香港證券-卷十一 機構融資\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 146,\r\n \"name\": \"香港證券-卷十二 資產管理\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 137,\r\n \"name\": \"香港證券-卷三 衍生工具規例\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 139,\r\n \"name\": \"香港證券-卷五 機構融資規例\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 140,\r\n \"name\": \"香港證券-卷六 資產管理規例\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 138,\r\n \"name\": \"香港證券-卷四 信貸評級服務規例\",\r\n \"organization\": \"香港證券專業協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 15,\r\n \"name\": \"員工任用管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 18,\r\n \"name\": \"員工福利管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 17,\r\n \"name\": \"員工薪酬管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 19,\r\n \"name\": \"員工關係管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 161,\r\n \"name\": \"晉升10職等準RM簡報(適用產金/服金/海外/產品)>僅透過HR上傳名單\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 194,\r\n \"name\": \"晉升11職等PM/PS專業能力檢定測驗>僅透過HR上傳名單\",\r\n \"organization\": \"法金產品行銷處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 162,\r\n \"name\": \"晉升11職等RM專業能力檢定測驗(大會考)>僅透過HR上傳名單\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 165,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 201,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/系統專案組)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處系統專案組\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 197,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/法金作業部)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處法金作業部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 199,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/法金管理部)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處法金管理部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 200,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/金融交易作業部)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處金融交易作業部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 198,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/客戶服務部)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處客戶服務部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 196,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/建北分行)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處建北分行\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 195,\r\n \"name\": \"晉升11職等SU專業能力檢定測驗(法金管理處/國外部)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處國外部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 163,\r\n \"name\": \"晉升12職等RM簡報>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 164,\r\n \"name\": \"晉升12職等專題簡報(適用PM/除國際聯貸以外之PS、TMO及SU)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 166,\r\n \"name\": \"晉升13職等PM專題簡報>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 160,\r\n \"name\": \"晉升9職等準RM簡報(適用環貿金融處)>僅透過HR上傳資格\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 178,\r\n \"name\": \"晉升RM資格(適用產金/服金)>僅透過HR上傳名單\",\r\n \"organization\": \"法金管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 182,\r\n \"name\": \"特級金融管理師(CFMA)資格認證\",\r\n \"organization\": \"高級金融管理師(AFMA)委員會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 152,\r\n \"name\": \"租賃人才養成認證班\",\r\n \"organization\": \"台北市租賃公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 16,\r\n \"name\": \"訓練發展管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 103,\r\n \"name\": \"財金風險管理分析師\",\r\n \"organization\": \"Global Association of Risk Professionals (GARP),全球風險專業管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 154,\r\n \"name\": \"財產保險代理人\",\r\n \"organization\": \"中華民國考選部\"\r\n },\r\n {\r\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\r\n \"id\": 176,\r\n \"name\": \"財產保險業務員(限招攬傷害及健康險)(登錄產險公會)\",\r\n \"organization\": \"中華民國產物保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請至 http://localhost/ 保險登錄專區下載登錄申請書,並備妥檢附文件,送至仁愛金控17樓。\",\r\n \"id\": 44,\r\n \"name\": \"財產保險業務員登錄(登錄產險公會)\",\r\n \"organization\": \"中華民國產物保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 81,\r\n \"name\": \"財產保險業務員資格測驗合格\",\r\n \"organization\": \"中華民國產物保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 155,\r\n \"name\": \"財產保險經紀人\",\r\n \"organization\": \"中華民國考選部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 181,\r\n \"name\": \"高級金融管理師(FMA+)資格認證\",\r\n \"organization\": \"高級金融管理師(AFMA)委員會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 188,\r\n \"name\": \"商金現勘訪廠執照資格取得\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 126,\r\n \"name\": \"基礎人資管理師\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 98,\r\n \"name\": \"理財規劃人員專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 35,\r\n \"name\": \"現勘\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 105,\r\n \"name\": \"票券商業務員\",\r\n \"organization\": \"中華民國票券金融商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 60,\r\n \"name\": \"勞工安全管理甲級技術士\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 53,\r\n \"name\": \"勞工安全管理師\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 56,\r\n \"name\": \"勞工安全衛生管理乙級技術士\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 52,\r\n \"name\": \"勞工安全衛生管理員\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 61,\r\n \"name\": \"勞工衛生管理甲級技術士\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 55,\r\n \"name\": \"勞工衛生管理師\",\r\n \"organization\": \"\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 151,\r\n \"name\": \"勞健保暨勞基法管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 20,\r\n \"name\": \"勞動法令管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 117,\r\n \"name\": \"期貨分析師\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 119,\r\n \"name\": \"期貨交易分析人員\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"不需檢附任何文件\",\r\n \"id\": 42,\r\n \"name\": \"期貨信託基金銷售機構銷售人員(登錄期貨公會)\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 43,\r\n \"name\": \"期貨信託基金銷售機構銷售人員專業科目測驗成績合格證明\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 115,\r\n \"name\": \"期貨商業務員\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 116,\r\n \"name\": \"期貨商業務員(登錄期貨公會)\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 27,\r\n \"name\": \"策略性人力資源管理\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"通過證書影本, 登錄同意書 (下載路徑:台新大學>新手上路>新手教材>同仁篇>證照管理>台新銀行結構型商品推介人員資格資料變更註銷登錄申請暨同意書)\",\r\n \"id\": 150,\r\n \"name\": \"結構型商品推介人員(登錄銀行公會)\",\r\n \"organization\": \"中華民國銀行商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"請注意,此證照僅登錄於台新大學,若因執行業務需要登錄公會,請選擇證照名稱後方(登錄XX公會)選項。\",\r\n \"id\": 39,\r\n \"name\": \"結構型商品銷售人員資格測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"此證照目前已停用,請勿申請登錄。\",\r\n \"id\": 49,\r\n \"name\": \"結構型商品銷售自律規範測驗(登錄壽險公會)\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 95,\r\n \"name\": \"進階外匯人員專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 97,\r\n \"name\": \"進階授信人員專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 13,\r\n \"name\": \"開戶對保作業資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 93,\r\n \"name\": \"債券人員\",\r\n \"organization\": \"證券暨期貨市場發展基金會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 75,\r\n \"name\": \"債權委外催收人員專業能力測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 48,\r\n \"name\": \"傳統型年金資格(登錄壽險公會)\",\r\n \"organization\": \"中華民國人壽保險商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 184,\r\n \"name\": \"新型分析工具認證-初階\",\r\n \"organization\": \"客群經營處客戶關係管理部\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 125,\r\n \"name\": \"資料倉儲權限認證\",\r\n \"organization\": \"人力資源處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 66,\r\n \"name\": \"資產配置觀念與系統操作\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 106,\r\n \"name\": \"資產證券化基本能力測驗\",\r\n \"organization\": \"證券暨期貨市場發展基金會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 69,\r\n \"name\": \"電腦稽核研習班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 33,\r\n \"name\": \"對保資格取得\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 38,\r\n \"name\": \"認證講師\",\r\n \"organization\": \"人力資源處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 67,\r\n \"name\": \"銀行內部控制與內部稽核測驗\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 122,\r\n \"name\": \"銀行辦理財富管理業務-理財業務人員及其他人員\",\r\n \"organization\": \"中華民國銀行商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 121,\r\n \"name\": \"銀行辦理財富管理業務-管理人員\",\r\n \"organization\": \"中華民國銀行商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 123,\r\n \"name\": \"徵信測驗合格\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 32,\r\n \"name\": \"徵信資格取得\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 68,\r\n \"name\": \"稽核人員研習班\",\r\n \"organization\": \"台灣金融研訓院\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 187,\r\n \"name\": \"親簽核對資格取得\",\r\n \"organization\": \"個金授信管理處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 28,\r\n \"name\": \"績效管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 23,\r\n \"name\": \"總務行政管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 62,\r\n \"name\": \"簡易外匯人員資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 25,\r\n \"name\": \"職能管理師\",\r\n \"organization\": \"中華人力資源管理協會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 11,\r\n \"name\": \"覆核作業資格\",\r\n \"organization\": \"分行營運事業處\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 107,\r\n \"name\": \"證券交易相關法規與實務\",\r\n \"organization\": \"證券暨期貨市場發展基金會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 118,\r\n \"name\": \"證券投資分析人員\",\r\n \"organization\": \"中華民國期貨業商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 70,\r\n \"name\": \"證券商內部稽核資格\",\r\n \"organization\": \"中華民國證券商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 110,\r\n \"name\": \"證券商自有資本適足比率進階計算法申報人員測驗\",\r\n \"organization\": \"台灣證券交易所\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 111,\r\n \"name\": \"證券商高級業務員\",\r\n \"organization\": \"中華民國證券商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 112,\r\n \"name\": \"證券商高級業務員(登錄證券交易所)\",\r\n \"organization\": \"台灣證券交易所\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 113,\r\n \"name\": \"證券商業務員\",\r\n \"organization\": \"中華民國證券商業同業公會\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 114,\r\n \"name\": \"證券商業務員(登錄證券交易所)\",\r\n \"organization\": \"台灣證券交易所\"\r\n },\r\n {\r\n \"attTypes\": \"\",\r\n \"id\": 10,\r\n \"name\": \"驗印資格\",\r\n \"organization\": \"分行營運事業處\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n return { data: result };\r\n }\r\n\r\n /**\r\n * 3.取得課程教材\r\n * 顯示方式;下載附件\r\n */\r\n function CourseItem(params) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var CourseItemsDownload;\r\n var CourseItemsPdf;\r\n var CourseItemsVideo;\r\n CourseItemsDownload = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"fileExt\": \"ZIP 文件\",\r\n \"id\": 1,\r\n \"name\": \"TIPS信託投資系統操作說明【91分鐘】(ZIP教材)\",\r\n \"path\": \"Storage\\\\downloadFile.zip\",\r\n \"type\": \"教材\"\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseItemsPdf = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"fileExt\": \"PDF 文件\",\r\n \"id\": 2,\r\n \"name\": \"經濟基本指標【57分鐘】\",\r\n \"path\": \"Storage\\\\pdfFile.pdf\",\r\n \"type\": \"教材\"\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseItemsVideo = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"fileExt\": \"MP4 文件\",\r\n \"id\": 3,\r\n \"name\": \"ETF介紹【19分鐘】\",\r\n // \"path\": \"Storage\\\\videoFile.mp4\",\r\n \"href\": \"-511951560-146372858133s7.mp4\",\r\n \"path\": \"Storage\\\\Content\\\\2154\\\\\",\r\n \"type\": \"教材\"\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n switch (params.ItemId) {\r\n case 2:\r\n result = CourseItemsPdf;\r\n break;\r\n case 3:\r\n result = CourseItemsVideo;\r\n break;\r\n case 1:\r\n result = CourseItemsDownload;\r\n break;\r\n default:\r\n result = CourseItemsDownload;\r\n break;\r\n }\r\n return { data: result };\r\n }\r\n\r\n /**\r\n * 4.取得課程列表\r\n * @returns\r\n */\r\n function PublishedActivity(params) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultTW;\r\n var resultCN;\r\n var resultUS;\r\n\r\n resultTW = {\r\n Status: \"200\",\r\n Data: [{\r\n \"classificationId\": 10,\r\n \"classificationName\": \"\",\r\n \"courseId\": 30390,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(繁體)\",\r\n \"courseTime\": \"2016/10/05~2016/10/05\",\r\n \"courseType\": 5,\r\n \"courseTypeName\": \"教室測驗(繁體)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 86917,\r\n \"sessionName\": \"20161005台新證券-法遵自評筆試(一般)【TEST】-教室測驗(繁體)\"\r\n\r\n },\r\n {\r\n \"classificationId\": 1,\r\n \"classificationName\": \"\",\r\n \"courseId\": 52160,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(繁體)\",\r\n \"courseTime\": \"2016/01/01~2016/12/31\",\r\n \"courseType\": 6,\r\n \"courseTypeName\": \"問卷(繁體)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 86921,\r\n \"sessionName\": \"台新大學暨人資網站改版問卷調查(2016)(繁體)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 18,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(繁體)\",\r\n \"courseTime\": \"2016/09/07~2017/12/31\",\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程(繁體)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 1232,\r\n \"sessionName\": \"EMBO課程(2016下半年)[無對應資料](繁體)\",\r\n }\r\n ],\r\n ErrorMessage: \"\"\r\n };\r\n resultCN = {\r\n \"Status\": \"200\",\r\n \"Data\": [\r\n\r\n {\r\n \"classificationId\": 10,\r\n \"classificationName\": \"\",\r\n \"courseId\": 963,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(簡中)\",\r\n \"courseTime\": \"2016/11/09
    09:00-13:00 \",\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程(簡中)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 85571,\r\n \"sessionName\": \"2016-1109信託業務人員職前訓練(4小時)-台北場(外訓包班)(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 10,\r\n \"classificationName\": \"\",\r\n \"courseId\": 59633,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(簡中)\",\r\n \"courseTime\": \"2016/09/07~2016/12/31\",\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗(簡中)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 86920,\r\n \"sessionName\": \"105下-分行業務-法令遵循自評檢核考試班(簡中)\"\r\n },\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultUS = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"classificationId\": 1,\r\n \"classificationName\": \"\",\r\n \"courseId\": 34014,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(英文)\",\r\n \"courseTime\": \"2016/01/01~2016/12/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 85908,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105年)(英文)\"\r\n },\r\n {\r\n \"classificationId\": 1,\r\n \"classificationName\": \"\",\r\n \"courseId\": 28322,\r\n \"courseName\": \"G-技能-2001簽呈寫作訓練(英文)\",\r\n \"courseTime\": \"2016/10/01~2016/10/31(區間內的Mon,Wed,Fri)
    09:00-17:00
    休息時間12:00-13:00\",\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程(英文)\",\r\n \"enrollBegin\": \"2016/09/09\",\r\n \"enrollEnd\": \"2016/11/03\",\r\n \"sessionId\": 86925,\r\n \"sessionName\": \"20161019超強記憶創造個人競爭力(網站測試班)(英文)\"\r\n },\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n\r\n\r\n // resultTW = { \"Status\": 200, \"Data\": [{ \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 2361, \"courseName\": \"G-技能-2008初階簡報技巧\", \"courseTime\": \"2017/12/12
    13:30-17:30 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/07\", \"enrollEnd\": \"2017/12/12\", \"sessionId\": 99691, \"sessionName\": \"20171212初階簡報技巧\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 64726, \"courseName\": \"M-領導力-2004跨世代領導:帶領貓型世代的關鍵技巧\", \"courseTime\": \"2017/11/11
    09:00-17:00
    休息時間12:00-13:00\", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/03\", \"enrollEnd\": \"2017/11/11\", \"sessionId\": 99689, \"sessionName\": \"20171111跨世代領導:帶領貓型世代的關鍵技巧\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 5614, \"courseName\": \"G-內講-2002內部講師培訓(一天精華版)\", \"courseTime\": \"2017/08/15
    09:00-17:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/15\", \"sessionId\": 99685, \"sessionName\": \"20170815內部講師訓(人資包班第一梯)test\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 24838, \"courseName\": \"G-語言-1004 英文會話\", \"courseTime\": \"2017/08/25~2017/10/27 每1週(區間內的Fri)
    18:00-20:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/21\", \"sessionId\": 99676, \"sessionName\": \"2017英文課金控週五人資班 \" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 72404, \"courseName\": \"8/1人力資源管理\", \"courseTime\": \"2017/08/25
    09:00-12:00 \", \"courseType\": 3, \"courseTypeName\": \"外訓課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/25\", \"sessionId\": 99680, \"sessionName\": \"8/1人力資源管理\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 272, \"courseName\": \"G-舒壓-1003健康養生講座\", \"courseTime\": \"2017/08/28
    09:00-14:00
    休息時間12:00-13:00\", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/28\", \"sessionId\": 99674, \"sessionName\": \"20170828貴婦級紓壓講座\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 10451, \"courseName\": \"P-廣告行銷-1007說故事行銷\", \"courseTime\": \"2017/08/14
    09:00-17:00
    休息時間12:00-13:00\", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/08/14\", \"sessionId\": 99677, \"sessionName\": \"20170814說故事行銷(故事王)-test\" }, { \"classificationId\": 25, \"classificationName\": \"自主\", \"courseId\": 72174, \"courseName\": \"G-語言(自主)-100016-超簡單旅遊日語\", \"courseTime\": \"2017/12/05
    18:00-20:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/12/05\", \"sessionId\": 99671, \"sessionName\": \"20171205超簡單旅遊日語(自主學習課程)\" }, { \"classificationId\": 0, \"classificationName\": \"\", \"courseId\": 2390, \"courseName\": \"G-溝通-2001掌握風格,輕鬆溝通\", \"courseTime\": \"2017/10/24
    13:30-17:30 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/08/01\", \"enrollEnd\": \"2017/10/24\", \"sessionId\": 99669, \"sessionName\": \"20171024掌握風格,輕鬆溝通\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 61240, \"courseName\": \"G-技能-3002商業簡報技巧\", \"courseTime\": \"2017/08/21
    13:30-17:30 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/07/14\", \"enrollEnd\": \"2017/08/21\", \"sessionId\": 99667, \"sessionName\": \"20170821商業簡報技巧(八德)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 2361, \"courseName\": \"G-技能-2008初階簡報技巧\", \"courseTime\": \"2017/09/04
    09:00-12:00 \", \"courseType\": 2, \"courseTypeName\": \"教室課程\", \"enrollBegin\": \"2017/07/14\", \"enrollEnd\": \"2017/09/04\", \"sessionId\": 99666, \"sessionName\": \"20170904初階簡報技巧\" }, { \"classificationId\": -1, \"classificationName\": \"\", \"courseId\": 331, \"courseName\": \"G-測試-1026-勞委會課程測試+Slide課程\", \"courseTime\": \"2017/03/15~\", \"courseType\": 7, \"courseTypeName\": \"學程\", \"enrollBegin\": \"2017/03/15\", \"enrollEnd\": \"\", \"sessionId\": 1431, \"sessionName\": \"20170315-勞委+3sbook+slide課程\" }, { \"classificationId\": -1, \"classificationName\": \"\", \"courseId\": 330, \"courseName\": \"G-測試-1029-3S課程與勞委課程\", \"courseTime\": \"2017/03/15~\", \"courseType\": 7, \"courseTypeName\": \"學程\", \"enrollBegin\": \"2017/03/15\", \"enrollEnd\": \"\", \"sessionId\": 1430, \"sessionName\": \"20170315-3S課程+勞委會課程\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 11180, \"courseName\": \"P-證券-1008(外訓) 股務單位人員教育訓練\", \"courseTime\": \"2017/09/20
    14:00-17:00 \", \"courseType\": 3, \"courseTypeName\": \"外訓課程\", \"enrollBegin\": \"2017/01/10\", \"enrollEnd\": \"2017/09/20\", \"sessionId\": 99286, \"sessionName\": \"2017-0920 股務單位人員教育訓練\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64901, \"courseName\": \"G-成長-1005珍愛一世情─呵護親子關係【MP4-23分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98930, \"sessionName\": \"珍愛一世情-呵護親子關係(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64895, \"courseName\": \"G-技能-1014遠離開會地獄—「開會一把罩」【MP4-32分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98907, \"sessionName\": \"遠離開會地獄—「開會一把罩」(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64891, \"courseName\": \"G-執行力-1003使命必達-淺談目標管理【MP4-23分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98921, \"sessionName\": \"使命必達-淺談目標管理(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64889, \"courseName\": \"G-成長-1006認識太極拳【MP4-12分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98943, \"sessionName\": \"認識太極拳(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64888, \"courseName\": \"G-成長-1007認識國標舞【MP4-17分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98942, \"sessionName\": \"認識國標舞(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64886, \"courseName\": \"G-成長-1010辦公室健康操【MP4-11分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98938, \"sessionName\": \"辦公室健康操(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64877, \"courseName\": \"G-成長-1003吃出健康【MP4-18分鐘】(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98933, \"sessionName\": \"吃出健康(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 64869, \"courseName\": \"G-溝通-1010打造職場好形象【MP4-22分鐘】(v.3)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98945, \"sessionName\": \"打造職場好形象(106年)\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 55764, \"courseName\": \"P-專業知識(信用卡)-1005信用卡進件流程與徵審作業介紹(v.3)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98975, \"sessionName\": \"信用卡進件流程與徵審作業介紹(106年)\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 29872, \"courseName\": \"P-專業知識(信用卡)-1006信用卡業務管理規範(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98976, \"sessionName\": \"信用卡業務規範(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 18025, \"courseName\": \"G-政策-1009IDP員工職涯發展計畫(v.2)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98977, \"sessionName\": \"IDP員工職涯發展計畫(106年)\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13951, \"courseName\": \"G-技能-2008【OFFICE2010】ECXEL進階應用(下)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98974, \"sessionName\": \"Excel 2010進階應用(下)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13950, \"courseName\": \"G-技能-2007【OFFICE2010】ECXEL進階應用(上)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98973, \"sessionName\": \"Excel 2010進階應用(上)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13949, \"courseName\": \"G-技能-2006【OFFICE2010】Word 2010進階應用(下)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98972, \"sessionName\": \"Word 2010進階應用(下)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13948, \"courseName\": \"G-技能-2005【OFFICE2010】Word 2010進階應用(上)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98971, \"sessionName\": \"Word 2010進階應用(上)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13939, \"courseName\": \"G-技能-1021【OFFICE2010】OUTLOOK人脈管理王(下)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98970, \"sessionName\": \"OUTLOOK人脈管理王(下)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13903, \"courseName\": \"G-技能-1020【OFFICE2010】OUTLOOK人脈管理王(上)\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98969, \"sessionName\": \"OUTLOOK人脈管理王(上)【106年】\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 13901, \"courseName\": \"G-技能-1019【OFFICE2010】POWERPOINT創意簡報王\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 1, \"courseTypeName\": \"線上課程\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98968, \"sessionName\": \"POWERPOINT創意簡報王【106年】\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 34, \"courseName\": \"P-保險-2003投資型保險證照─年金考試班\", \"courseTime\": \"2017/01/04~2017/12/31\", \"courseType\": 4, \"courseTypeName\": \"線上測驗\", \"enrollBegin\": \"2017/01/04\", \"enrollEnd\": \"2017/12/31\", \"sessionId\": 98952, \"sessionName\": \"投資型保險證照-年金考試班(106年)\" }, { \"classificationId\": 15, \"classificationName\": \"專業\", \"courseId\": 20266, \"courseName\": \"內部講師調查問券\", \"courseTime\": \"2012/08/16~2017/08/31\", \"courseType\": 6, \"courseTypeName\": \"問卷\", \"enrollBegin\": \"2012/08/16\", \"enrollEnd\": \"2017/08/31\", \"sessionId\": 24543, \"sessionName\": \"2012內部講師調查問卷\" }, { \"classificationId\": 29, \"classificationName\": \"通識\", \"courseId\": 17954, \"courseName\": \"頂峰訓練課前問卷調查\", \"courseTime\": \"2012/05/31~2017/11/01\", \"courseType\": 6, \"courseTypeName\": \"問卷\", \"enrollBegin\": \"2012/05/31\", \"enrollEnd\": \"2017/11/01\", \"sessionId\": 21085, \"sessionName\": \"2012頂峰客戶關係經營課前問卷\" }], \"ErrorMessage\": \"\" }\r\n // resultCN = {\"Status\":200,\"Data\":[{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":13938,\"courseName\":\"G-技能-1018【OFFICE2010】ECXEL精算大師(下)\",\"courseTime\":\"2017/01/04~2017/12/31\",\"courseType\":1,\"courseTypeName\":\"线上课程\",\"enrollBegin\":\"2017/01/04\",\"enrollEnd\":\"2017/12/31\",\"sessionId\":98965,\"sessionName\":\"ECXEL精算大師(下)【106年】\"},{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":13900,\"courseName\":\"G-技能-1017【OFFICE2010】ECXEL精算大師(上)\",\"courseTime\":\"2017/01/04~2017/12/31\",\"courseType\":1,\"courseTypeName\":\"线上课程\",\"enrollBegin\":\"2017/01/04\",\"enrollEnd\":\"2017/12/31\",\"sessionId\":98964,\"sessionName\":\"ECXEL精算大師(上)【106年】\"},{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":68275,\"courseName\":\"G-成長-100002-食得健康,食在安心\",\"courseTime\":\"2017/03/08
    01:00-23:00 \",\"courseType\":2,\"courseTypeName\":\"教室课程\",\"enrollBegin\":\"2016/10/03\",\"enrollEnd\":\"2018/10/04\",\"sessionId\":99381,\"sessionName\":\"食的健康(复制)错误测试_相同上课时间\"}],\"ErrorMessage\":\"\"}\r\n // resultUS = {\"Status\":200,\"Data\":[{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":13937,\"courseName\":\"G-技能-1016【OFFICE2010】WORD文書排版(下)\",\"courseTime\":\"2017/01/04~2017/12/31\",\"courseType\":1,\"courseTypeName\":\"Online course\",\"enrollBegin\":\"2017/01/04\",\"enrollEnd\":\"2017/12/31\",\"sessionId\":98963,\"sessionName\":\"WORD文書排版(下)【106年】\"},{\"classificationId\":29,\"classificationName\":\"通識\",\"courseId\":41109,\"courseName\":\"G-新人-1033Welcome to Taishin【SG】\",\"courseTime\":\"2014/08/22~2017/10/31\",\"courseType\":1,\"courseTypeName\":\"Online course\",\"enrollBegin\":\"2014/08/22\",\"enrollEnd\":\"2017/10/31\",\"sessionId\":54667,\"sessionName\":\"Welcome to Taishin【SG】(test)\"}],\"ErrorMessage\":\"\"}\r\n\r\n\r\n switch (params.LanguageCode) {\r\n case \"en-US\":\r\n result = resultUS;\r\n break;\r\n case \"zh-CN\":\r\n result = resultCN;\r\n break;\r\n default:\r\n result = resultTW;\r\n break;\r\n }\r\n result.Data = _.filter(result.Data, function (item) {\r\n item.classificationId = parseInt(item.classificationId);\r\n var compareClassficationId = parseInt(params.ClassificationId) ;\r\n // console.log('item.classificationId:',item.classificationId);\r\n // console.log('compareClassficationId:',compareClassficationId);\r\n // if (!compareClassficationId) {\r\n // compareClassficationId = -1;\r\n // }\r\n if (compareClassficationId === -1) {\r\n compareClassficationId = item.classificationId;\r\n }\r\n\r\n return (item.classificationId === compareClassficationId);\r\n });\r\n return { data: result };\r\n }\r\n\r\n\r\n /**\r\n * 6.取得課程詳細內容\r\n * @returns\r\n */\r\n function CourseSession(type) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var CourseSessionType1; /* 線上課程 */\r\n var CourseSessionType2; /* 教室課程 */\r\n var CourseSessionType3; /* 外訓 */\r\n var CourseSessionType4; /* 線上測驗 */\r\n var CourseSessionType5; /* 教室測驗 */\r\n var CourseSessionType6; /* 問卷 */\r\n var CourseSessionType7; /* 學程 */\r\n CourseSessionType1 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"costPerPerson\": 0,\r\n \"description\": \"1.最低稅負制溫故知新98進化版【29分鐘】 \\r\\n2.經濟基本指標【57分鐘】 \\r\\n3.投資境外結構型商品前的基本概念【33分鐘】 \\r\\n4.債券市場理論與實務【27分鐘】 \\r\\n5.保本及非保本型商品【41分鐘】 \\r\\n6.風險型態與分析【11分鐘】 \\r\\n7.衍生性金融商品法規介紹【29分鐘】 \\r\\n8.結構型商品參考法規─境外結構型商品相關【35分鐘】 \\r\\n9.有價證券信託【14分鐘】 \\r\\n10.雙雙得利投資帳戶【46分鐘】 \\r\\n11.SDS系統介紹【14分鐘】 \\r\\n12.組合式商品介紹【52分鐘】 \\r\\n13.組合式商品(SI/DCI/ELI)稅賦說明【30分鐘】 \\r\\n14.TIPS信託投資系統操作說明【102分鐘】 \\r\\n15.TRMS系統說明【16分鐘】 \\r\\n16.共同基金銷售關鍵資訊【63分鐘】 \\r\\n17.共同基金銷售關鍵資訊【課後測驗】 \\r\\n18.境內外基金相關法令【100分鐘】 \\r\\n19.規劃行信託相關法規簡介【21分鐘】\",\r\n \"duration\": 720,\r\n \"enrollCount\": 11,\r\n \"enrollPeriod\": \"2017/01/04~2017/06/30\",\r\n \"enrollRemain\": 5,\r\n \"enrollTime\": \"2017/01/04~2017/06/30\",\r\n \"outline\": \"1.最低稅負制溫故知新98進化版【29分鐘】 \\r\\n2.經濟基本指標【57分鐘】 \\r\\n3.投資境外結構型商品前的基本概念【33分鐘】 \\r\\n4.債券市場理論與實務【27分鐘】 \\r\\n5.保本及非保本型商品【41分鐘】 \\r\\n6.風險型態與分析【11分鐘】 \\r\\n7.衍生性金融商品法規介紹【29分鐘】 \\r\\n8.結構型商品參考法規─境外結構型商品相關【35分鐘】 \\r\\n9.有價證券信託【14分鐘】 \\r\\n10.雙雙得利投資帳戶【46分鐘】 \\r\\n11.SDS系統介紹【14分鐘】 \\r\\n12.組合式商品介紹【52分鐘】 \\r\\n13.組合式商品(SI/DCI/ELI)稅賦說明【30分鐘】 \\r\\n14.TIPS信託投資系統操作說明【102分鐘】 \\r\\n15.TRMS系統說明【16分鐘】 \\r\\n16.共同基金銷售關鍵資訊【63分鐘】 \\r\\n17.共同基金銷售關鍵資訊【課後測驗】 \\r\\n18.境內外基金相關法令【100分鐘】 \\r\\n19.規劃行信託相關法規簡介【21分鐘】\",\r\n \"reference\": [{\r\n \"fileExt\": \"PDF 文件\",\r\n \"name\": \"共同基金銷售關鍵資訊-熟知KYC、KYP,與客戶共贏\",\r\n \"path\": \"Storage\\\\Reference\\\\2703\\\\2126340124-1482803634927.pdf\"\r\n }],\r\n \"sessionName\": \"信託業務人員在職訓練課程(106上半年)\",\r\n \"sessionTime\": \"2017/01/04 ~ 2017/06/30\",\r\n \"target\": \"登錄信託公會者,每三年複訓完成本課程\",\r\n \"waitlistCount\": 5,\r\n \"waitlistRemain\": 100\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseSessionType2 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"costPerPerson\": 500,\r\n \"description\": \"\",\r\n \"enrollCount\": 0,\r\n \"enrollRemain\": 45,\r\n \"enrollTime\": \"2016/10/03~2018/10/04\",\r\n \"hours\": 22,\r\n \"intructors\": \"蔡毓昇 (840117)
    林以君 (914293)\",\r\n \"outline\": \"1. 喝水喝對了嗎?\\r\\n2. 餐具用對了嗎?\\r\\n3. 容器用對了嗎?\\r\\n4. 增強免疫力你做對了嗎?\\r\\n5. Q & A\",\r\n \"place\": \"內湖大樓203會議室\",\r\n \"reference\": [],\r\n \"sessionName\": \"食的健康(複製)錯誤測試_相同上課時間\",\r\n \"sessionTime\": \"2017/03/08
    01:00-23:00 \",\r\n \"target\": \"\",\r\n \"trainingPoint\": 0,\r\n \"waitlistCount\": 100,\r\n \"waitlistRemain\": 100\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseSessionType3 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"division\": \"信託公會(請直接至課程中報名,費用統一由HR月結支付)\",\r\n \"enrollCount\": 1,\r\n \"enrollPeriod\": \"2016/12/27~2017/04/22\",\r\n \"externalType\": \"一般外訓\",\r\n \"hours\": 6,\r\n \"note\": \"來上課\",\r\n \"outline\": \"1.各金融機構信託業業務人員\\r\\n2.財富管理相關業務人員\",\r\n \"ownCost\": 0,\r\n \"place\": \"台中市文心路二段645號11樓(新光人壽惠國大樓) \",\r\n \"reference\": [{\r\n \"fileExt\": \"pdf\",\r\n \"name\": \"1.pdf\",\r\n \"path\": \"Storage\\\\CTMSReference\\\\918\\\\547400339-1487310466496.pdf\"\r\n }],\r\n \"sessionTime\": \"2017/04/22
    09:00-16:00
    休息時間12:00-13:00\",\r\n \"subsidyCost\": 1300,\r\n \"totalCost\": 1300\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseSessionType4 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"costPerPerson\": 0,\r\n \"description\": \"測試用\",\r\n \"duration\": 30,\r\n \"enrollCount\": 2,\r\n \"enrollPeriod\": \"2017/02/22~2017/03/20\",\r\n \"enrollRemain\": 5,\r\n \"enrollTime\": \"2017/02/22~2017/03/20\",\r\n \"outline\": \"\",\r\n \"reference\": [],\r\n \"sessionName\": \"20170222(測試班)\",\r\n \"sessionTime\": \"2017/02/22 ~ 2017/03/20\",\r\n \"target\": \"測試用\",\r\n \"waitlistCount\": 5,\r\n \"waitlistRemain\": 5\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseSessionType5 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"costPerPerson\": 0,\r\n \"description\": \"\",\r\n \"enrollCount\": 5,\r\n \"enrollRemain\": 5,\r\n \"enrollTime\": \"2017/02/18~2017/05/12\",\r\n \"hours\": 1,\r\n \"intructors\": \"內部講師\",\r\n \"outline\": \"\",\r\n \"place\": \"文心分行3樓\",\r\n \"reference\": [],\r\n \"sessionName\": \"20170512徵信照會證照研習班 (補考) \",\r\n \"sessionTime\": \"2017/05/12
    09:00-10:00 \",\r\n \"target\": \"\",\r\n \"trainingPoint\": 0,\r\n \"waitlistCount\": 5,\r\n \"waitlistRemain\": 5\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseSessionType6 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"costPerPerson\": 0,\r\n \"description\": \"TEST\",\r\n \"duration\": -1,\r\n \"enrollCount\": 2,\r\n \"enrollPeriod\": \"2017/02/17~2017/06/30\",\r\n \"enrollRemain\": 5,\r\n \"enrollTime\": \"2017/02/17~2017/06/30\",\r\n \"outline\": \"\",\r\n \"reference\": [{\r\n \"fileExt\": \"PDF 文件\",\r\n \"name\": \"1\",\r\n \"path\": \"Storage\\\\Reference\\\\2767\\\\-1480076052-1487315027958.pdf\"\r\n }],\r\n \"sessionName\": \"2017問卷測試\",\r\n \"sessionTime\": \"2017/02/17 ~ 2017/06/30\",\r\n \"target\": \"對象\",\r\n \"waitlistCount\": 5,\r\n \"waitlistRemain\": 5\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n CourseSessionType7 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"costPerPerson\": 0,\r\n \"courses\": [{\r\n \"courseId\": 45,\r\n \"courseName\": \"G-政策-100002-eMBO系統-績效目標設定(v.1)\",\r\n \"courseTime\": \"2017/02/17 ~ 2017/06/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"order\": 1,\r\n \"sessionId\": 99349\r\n },\r\n {\r\n \"courseId\": 3366,\r\n \"courseName\": \"G-政策-1008eMBO系統-職場行為調整\",\r\n \"courseTime\": \"2017/02/17 ~ 2017/06/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"order\": 2,\r\n \"sessionId\": 99350\r\n },\r\n {\r\n \"courseId\": 9280,\r\n \"courseName\": \"G-政策-1020IDP員工職涯發展計畫-介紹篇\",\r\n \"courseTime\": \"2017/02/17 ~ 2017/06/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"order\": 3,\r\n \"sessionId\": 99351\r\n }\r\n ],\r\n \"description\": \"本學程共有三門課程,每門課程需閱讀達90%以上,始得通過。\\r\\n1. eMBO系統-績效目標設定:15分鐘\\r\\n2. eMBO系統-職場行為調整:6分鐘\\r\\n3. IDP員工職涯發展計畫-介紹篇:6分鐘 \",\r\n \"enrollCount\": 0,\r\n \"enrollRemain\": 10,\r\n \"enrollTime\": \"2017/02/17~2017/06/30\",\r\n \"sessionName\": \"學程2017年測試\",\r\n \"sessionTime\": \"2017/02/17 ~ 2017/06/30\",\r\n \"target\": \"MA\"\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n switch (type) {\r\n case enumCourseType.webCourse:\r\n result = CourseSessionType1;\r\n break;\r\n case enumCourseType.classCourse:\r\n result = CourseSessionType2;\r\n break;\r\n case enumCourseType.externalCourse:\r\n result = CourseSessionType3;\r\n break;\r\n case enumCourseType.webTest:\r\n result = CourseSessionType4;\r\n break;\r\n case enumCourseType.classTest:\r\n result = CourseSessionType5;\r\n break;\r\n case enumCourseType.questList:\r\n result = CourseSessionType6;\r\n break;\r\n case enumCourseType.courage:\r\n result = CourseSessionType7;\r\n break;\r\n default:\r\n result = { Status: 400, ErrorMessage: \"未知的課程類型\" };\r\n break;\r\n }\r\n return { data: result };\r\n }\r\n\r\n /**\r\n * 7.取得課程測驗內容\r\n * @returns\r\n */\r\n function ExamSurveyContent(params) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultTestData1 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"examHistoryId\": 1515029,\r\n \"itemId\": 175226,\r\n \"limitMins\": -1,\r\n \"limitTimes\": 1,\r\n \"remainingMins\": 1642,\r\n \"remainingTimes\": 4,\r\n \"questions\": [{\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42109,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"我明確知道我在這個課程要學習到什麼。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"true\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"true\"\r\n }\r\n ],\r\n \"questionId\": 42110,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程內容架構清晰、具邏輯且份量適中。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"true\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42111,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程內容完整、具正確性並符合我的學習程度。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42112,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程的表現方式(如文字、圖片、動畫、影像、聲音…等)能有效傳達學習內容。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42113,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程學習介面(如字型、組成、配置、呈現方式…等)能有效呈現學習內容。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42120,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程提供清晰、適切的學習導引功能(如:向前、後退、回主選單、離開…),並且容易操作與使用。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"2\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42114,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"系統所提供的網路頻寬與連線服務是足夠的。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"這是選項5,假定有勾選\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"這是選項4,假定有勾選\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"這是選項3,假定沒勾選\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"這是選項2,假定沒勾選\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"這是選項1,假定有勾選\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 6,\r\n \"title\": \"這是選項6,假定有勾選\",\r\n \"type\": \"2\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42115,\r\n \"questionType\": 2,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"這是複選題,用以測試是否運作正常。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42121,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課後測驗能幫助我學習,並能讓我知道是否有學習到應該習得的。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42116,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程有達到我的期望。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42117,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"課程內容對我的工作是有幫助的。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42118,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"我對人力資源處訓練發展組提供的 e-Learning 課程服務感到滿意。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 5,\r\n \"title\": \"非常同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \" \",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"非常不同意\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 42119,\r\n \"questionType\": 4,\r\n \"required\": true,\r\n \"scoreRate\": 0,\r\n \"title\": \"我會向其他同仁推薦此課程。{是必選題,題目序號後面應有標示提醒}\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \" \",\r\n \"type\": \"3\",\r\n \"value\": \"AAATE\"\r\n }],\r\n \"questionId\": 42122,\r\n \"questionType\": 3,\r\n \"required\": false,\r\n \"scoreRate\": 0,\r\n \"title\": \"如有其他相關建議,請填寫在下面空白處,謝謝!{不是必選題}\"\r\n }\r\n ]\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n var resultTestData2 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"examHistoryId\": 1515312,\r\n \"itemId\": 306761,\r\n \"limitMins\": 30,\r\n \"limitTimes\": 3,\r\n \"remainingMins\": -1,\r\n \"remainingTimes\": 6,\r\n \"questions\": [{\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88414,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"事業銷售商品或服務附送贈品,其贈品價值上限為:商品或服務價值在新臺幣100元以上者,為商品或服務價值之二分之一;商品或服務價值在新臺幣100元以下者,為新臺幣50元。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88381,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行辦理財富管理業務或對非財富管理部門客戶銷售金融商品,不得以提供贈品方式招攬新客戶開立存款帳戶,以免違反銀行法第34條之規定,至其餘贈品活動仍須遵守銀行公會會員自律公約之相關規定。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"銷售投資型保險商品予客戶時不得任意銷售風險過高、結構過於複雜之商品。但有客觀事實證明客戶有相當專業認識及風險承擔能力者,不在此限。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"就非專業投資人之年齡、對本商品相關知識、投資經驗、財產狀況、交易目的及商品理解等要素,綜合評估其風險承受能力,無須分級,只需要保人簽名確認即可。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"應請客戶提供相關財務資訊,若客戶拒絕提供,招攬人員須於要保書予以註記,並請其於註記處親自簽名確認。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"如係連結結構型商品者,另應提供客戶投資報酬與風險告知書、結構型商品中文產品說明書及中文投資人須知。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88387,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"下列關於投資型保險商品銷售應注意事項之敘述,何者正確?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88403,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行業提供投資型金融商品或服務前,應依各類金融商品或服務之特性評估金融商品或服務對金融消費者之適合度。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"該境外結構型商品因利率、匯率、有價證券市價或其他指標之變動,有直接導致本金損失或超過當初本金損失之虞者。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"該境外結構型商品因發行機構或他人之業務或財產狀況之變化,有直接導致本金損失或超過當初本金損失之虞者。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"該境外結構型商品因其他經主管機關規定足以影響投資人判斷之重要事項,有直接導致本金損失或超過當初本金損失之虞者。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"受託或銷售機構就前項境外結構型商品受託投資、受託買賣或以之為投資型保單投資標的,涉有契約權利行使期間、解除期間及效力之限制者。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88392,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"依據境外結構型商品管理規則,下列何者為受託或銷售機構受託投資,受託買賣境外結構型商品或以之為投資型保單投資標的前,應向投資人說明之事項?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"金融消費者資金操作狀況及專業能力。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"金融消費者之投資屬性、對風險之瞭解及風險承受度。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"金融消費者服務之合適性,合適之投資建議範圍。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"金融消費者之所得與資金來源。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88419,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行業提供投資型金融商品或服務,於訂立契約前,應充分瞭解金融消費者之相關資料,其內容至少應包括下列何者事項?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"客戶風險屬性與商品風險屬性不適配時,銀行仍宜與客戶進行交易。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"對於高齡、教育水準較低等弱勢族群客戶,基於風險承擔能力及商品適合度考量,銀行應避免與此類客戶承作結構型商品交易,以減少交易糾紛。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"客戶承作雙元貨幣等不保本之結構型商品之金額占其往來資金比率較高者,銀行宜主動提醒客戶相關商品之風險,避免客戶因投資部位過度集中而蒙受重大損失。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"得以存款名義銷售。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88382,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"下列何者為銀行辦理結合存款與衍生性金融商品之結構型商品業務時,應留意之事項?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"對金融消費者所負擔義務不得低於廣告之內容。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"對金融商品或服務內容之揭露如涉及利率、費用、報酬及風險時,應以衡平及顯著之方式表達。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"應忠於原著,以英文表達,必要時得附註中文。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"應以金融服務業名義為之。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88405,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"金融服務業從事廣告、業務招攬及營業促銷活動,應遵守哪些原則?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88406,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"境外結構型商品之投資人須知之重要內容,應以錄音方式保留紀錄。但對專業投資人得以交付書面或影音媒體方式取代。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88401,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行業有關外匯業務之經營,除銀行業辦理外匯業務管理辦法或央行另有規定者外,應向央行申請許可,並經發給指定證書或許可函後,始得辦理。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88388,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"最近一期經會計師查核或核閱之財務報告總資產超過新臺幣5000萬元之法人或基金,為境外結構型商品管理規則中所規定之專業投資人。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88389,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"於銷售投資型保險商品時,應審酌被保險人年齡等情況予以推介或銷售適當之商品,當被保險人投保時之保險年齡大於或等於70或本商品連結有結構型商品且被保險人於該結構型商品期滿時之保險年齡大於或等於70時,應請要保人及被保險人於要保書中之重要事項告知書或「結構型債券投資報酬與風險告知書」簽名已瞭解並願意承擔投資風險,如要保人及被保險人不願填寫則仍同意其投保。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"不得以吸收存款為目的。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"應按業務類別,分別適用各該業務法令規定及自律規範。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"贈品之單一價格以新臺幣一千元內為宜。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"銀行得為維持與客戶關係、其他業務推展或企業形象宣導等非吸收存款目的,舉辦與存款業務有關之贈品業務推廣活動。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88418,\r\n \"questionType\": 1,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"關於銀行業辦理與存款業務有關之贈品贈獎業務推廣活動時應遵循之規定,以下何者為非?\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88383,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行辦理財富管理業務,應請切實注意以誠信及充分揭露原則辦理,廣告文宣中就金融商品之可能報酬、風險及限制條件之揭露,應以衡平且顯著方式表達,不得有誇大不實陳述或誤導消費者之虞情事。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"除法令另有規定外,行銷廣告文件於對外使用前應經法令遵循主管審核。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"得使人相信能保證本金之安全或獲利。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"對於獲利與風險應作平衡報導,且得載有與向主管機關申請文件內容不符之文字或設計。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"特定投資標的之名稱應適當表達其特性及風險,不得使用可能誤導客戶之名稱。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88397,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"信託業辦理營業促銷活動時,應遵守下列何項規定?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88416,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"「銀行辦理衍生性金融商品自律規範」所稱以錄音方式保留向一般客戶宣讀結構型商品交易客戶須知之重要內容,交易遇有爭議,不必保留至爭議終結為止。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"任何說明或揭露之資訊或資料均須正確。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"所有銷售文件無須編印頁碼。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 3,\r\n \"title\": \"銷售文件之用語應以中文表達,並力求淺顯易懂,必要時得附註原文。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 4,\r\n \"title\": \"應本於誠實信用原則,並以金融消費者能充分瞭解之文字或其他方式為之。\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88409,\r\n \"questionType\": 2,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"金融服務業說明金融商品或服務契約之重要內容及揭露風險,應遵守哪些基本原則?(複選題)\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88398,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行辦理外幣保證金交易及組合式產品等業務,應制定與落實瞭解客戶(KYC )原則,並充分揭露相關風險,不得有誤導客戶情事。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [{\r\n \"attachment\": \"\",\r\n \"order\": 1,\r\n \"title\": \"是\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"order\": 2,\r\n \"title\": \"否\",\r\n \"type\": \"1\",\r\n \"value\": \"\"\r\n }\r\n ],\r\n \"questionId\": 88386,\r\n \"questionType\": 6,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行依據「銀行辦理衍生性金融商品自律規範」錄音或錄影所留存之個人資料,任何人均得於保存期限內,向銀行申請調閱。除該資料之提供有妨害銀行或第三人之重大利益外,銀行應配合提供前項紀錄,並得向當事人收取必要成本費用。\"\r\n },\r\n {\r\n \"attachment\": \"\",\r\n \"groupName\": \"\",\r\n \"options\": [\r\n // {\r\n // \"attachment\": \"\",\r\n // \"order\": 1,\r\n // \"title\": \"是\",\r\n // \"type\": \"1\",\r\n // \"value\": \"\"\r\n // },\r\n // {\r\n // \"attachment\": \"\",\r\n // \"order\": 2,\r\n // \"title\": \"否\",\r\n // \"type\": \"1\",\r\n // \"value\": \"\"\r\n // },\r\n {\r\n \"attachment\": \"\",\r\n \"correctAnswer\": false,\r\n \"order\": 1,\r\n \"preTitle\": false,\r\n \"textValue\": \"\",\r\n \"title\": \" \",\r\n \"type\": \"3\",\r\n \"value\": \"HR網站→台新大學→訓練中心\"\r\n }\r\n ],\r\n \"questionId\": 88400,\r\n \"questionType\": 3,\r\n \"required\": false,\r\n \"scoreRate\": 5,\r\n \"title\": \"銀行業經主管機關命其於一定期間內停止申辦外匯業務,於停止期間尚未屆滿或未提報適當之具體改善措施,或提報之改善措施未獲主管機關認可前,不得以函報備查方式開辦依本辦法規定得函報備查之外匯業務。\"\r\n },\r\n\r\n\r\n ]\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n // console.log(params);\r\n switch (params.type) {\r\n case '問卷':\r\n result = resultTestData1;\r\n break;\r\n case '測驗':\r\n result = resultTestData2;\r\n break;\r\n default:\r\n result = { Status: 400, Data: null, ErrorMessage: \"未知的課程類型\" };\r\n }\r\n return { data: result };\r\n }\r\n /**\r\n * 8.測驗結果(P.7~8)\r\n * @returns\r\n */\r\n function InteractionData(params) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultTestData1Answer = {\r\n \"Status\": \"200\",\r\n \"Data\": null,\r\n \"ErrorMessage\": \"\"\r\n };\r\n var resultTestData2Answer = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"questionResults\": [{\r\n \"correctAnswer\": \"1,2,3,4\",\r\n \"questionId\": 88419,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"3\",\r\n \"questionId\": 88418,\r\n \"studentAnswer\": \"x\"\r\n },\r\n {\r\n \"correctAnswer\": \"2\",\r\n \"questionId\": 88416,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1\",\r\n \"questionId\": 88414,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1,3,4\",\r\n \"questionId\": 88409,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"\",\r\n \"questionId\": 88406,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1,2,4\",\r\n \"questionId\": 88405,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1\",\r\n \"questionId\": 88403,\r\n \"studentAnswer\": \"2\"\r\n },\r\n {\r\n \"correctAnswer\": \"\",\r\n \"questionId\": 88401,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"HR網站→台新大學→訓練中心\",\r\n \"questionId\": 88400,\r\n \"studentAnswer\": \"asd\"\r\n },\r\n {\r\n \"correctAnswer\": \"1\",\r\n \"questionId\": 88398,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1,4\",\r\n \"questionId\": 88397,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1,2,3,4\",\r\n \"questionId\": 88392,\r\n \"studentAnswer\": \"x\"\r\n },\r\n {\r\n \"correctAnswer\": \"2\",\r\n \"questionId\": 88389,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"\",\r\n \"questionId\": 88388,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1,3,4\",\r\n \"questionId\": 88387,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"\",\r\n \"questionId\": 88386,\r\n \"studentAnswer\": \"2\"\r\n },\r\n {\r\n \"correctAnswer\": \"1\",\r\n \"questionId\": 88383,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"2,3\",\r\n \"questionId\": 88382,\r\n \"studentAnswer\": \"1\"\r\n },\r\n {\r\n \"correctAnswer\": \"1\",\r\n \"questionId\": 88381,\r\n \"studentAnswer\": \"1\"\r\n }\r\n ],\r\n \"right\": 0,\r\n \"score\": 0,\r\n \"totalQuestions\": 20,\r\n \"wrong\": 20\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n // console.log(\"params:\", params);\r\n switch (params.type) {\r\n case '問卷':\r\n result = resultTestData1Answer;\r\n break;\r\n case '測驗':\r\n result = resultTestData2Answer;\r\n break;\r\n default:\r\n result = { Status: 400, Data: null, ErrorMessage: \"未知的課程類型\" };\r\n }\r\n return { data: result };\r\n }\r\n\r\n\r\n /**\r\n * 11.待修課程列表\r\n * @returns\r\n */\r\n function MyUnfinishedActivities(params) {\r\n return new Promise((resolve, reject) => {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultTW;\r\n var resultCN;\r\n var resultUS;\r\n\r\n resultTW = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"courseId\": 69435,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 2165989,\r\n \"progress\": \"0/1\",\r\n \"sessionId\": 99354,\r\n \"sessionName\": \"20170512徵信照會證照研習班 (補考) \",\r\n \"sessionTime\": \"2017/05/12
    09:00-10:00 \",\r\n \"status\": \"未曾觀看\"\r\n },\r\n {\r\n \"courseId\": 67418,\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓\",\r\n \"enrollmentId\": 2165984,\r\n \"progress\": \"0/1\",\r\n \"sessionId\": 99353,\r\n \"sessionName\": \"20170306北區對保實務研習班 (補考)\",\r\n \"sessionTime\": \"2017/03/06
    09:00-10:00 \",\r\n \"status\": \"待修中\"\r\n },\r\n {\r\n \"courseId\": 10790,\r\n \"courseType\": 5,\r\n \"courseTypeName\": \"教室測驗\",\r\n \"enrollmentId\": 2165972,\r\n \"progress\": \"0/1\",\r\n \"sessionId\": 99207,\r\n \"sessionName\": \"20170302Oracle PL/SQL認證測驗 \",\r\n \"sessionTime\": \"2017/03/02
    10:00-12:00 \",\r\n \"status\": \"待修中\"\r\n },\r\n {\r\n \"courseId\": 61240,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 2165974,\r\n \"progress\": \"1/2\",\r\n \"sessionId\": 99345,\r\n \"sessionName\": \"20170420商業簡報技巧(八德)\",\r\n \"sessionTime\": \"2017/04/20
    09:00-12:00 \",\r\n \"status\": \"未完成\"\r\n },\r\n {\r\n \"courseId\": 9330,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 2165973,\r\n \"progress\": \"1/2\",\r\n \"sessionId\": 95401,\r\n \"sessionName\": \"20170417簡報製作技巧(2010版)\",\r\n \"sessionTime\": \"2017/04/17
    13:30-17:30 \",\r\n \"status\": \"等待簽核中\"\r\n },\r\n {\r\n \"courseId\": 71771,\r\n \"courseType\": 6,\r\n \"courseTypeName\": \"線上問卷\",\r\n \"enrollmentId\": 2165970,\r\n \"progress\": \"1/20\",\r\n \"sessionId\": 98593,\r\n \"sessionName\": \"信託業務人員在職訓練課程(106上半年)\",\r\n \"sessionTime\": \"2017/01/04~2017/06/30\",\r\n \"status\": \"未完成\"\r\n },\r\n {\r\n \"courseId\": 2361,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 2165963,\r\n \"progress\": \"1/2\",\r\n \"sessionId\": 98736,\r\n \"sessionName\": \"20170308初階簡報技巧\",\r\n \"sessionTime\": \"2017/03/08
    13:30-17:30 \",\r\n \"status\": \"未完成\"\r\n },\r\n {\r\n \"courseId\": 71776,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 2165962,\r\n \"progress\": \"0/3\",\r\n \"sessionId\": 98600,\r\n \"sessionName\": \"信託在職-組合式商品簡介 (106上半年)\",\r\n \"sessionTime\": \"2017/01/04~2017/06/30\",\r\n \"status\": \"未完成\"\r\n },\r\n {\r\n \"courseId\": 64877,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 2165961,\r\n \"progress\": \"0/2\",\r\n \"sessionId\": 98933,\r\n \"sessionName\": \"吃出健康(106年)\",\r\n \"sessionTime\": \"2017/01/04~2017/12/31\",\r\n \"status\": \"未完成\"\r\n },\r\n {\r\n \"courseId\": 0,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 2165976,\r\n \"progress\": \"\",\r\n \"sessionId\": 99286,\r\n \"sessionName\": \"2017-0920 股務單位人員教育訓練\",\r\n \"sessionTime\": \"~\",\r\n \"status\": \"等待簽核中\"\r\n },\r\n {\r\n \"courseId\": 0,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 2165975,\r\n \"progress\": \"\",\r\n \"sessionId\": 98652,\r\n \"sessionName\": \"2017-0422信託業務人員在職訓練-台中場\",\r\n \"sessionTime\": \"~\",\r\n \"status\": \"等待簽核中\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultCN = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"courseId\": 66903,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollmentId\": 1975394,\r\n \"progress\": \"0/3\",\r\n \"sessionId\": 91423,\r\n \"sessionName\": \"理專APP功能操作與使用(test)(簡中)\",\r\n \"sessionTime\": \"2016/07/25~2016/12/31\",\r\n \"status\": \"未完成(簡中)\"\r\n },\r\n {\r\n \"courseId\": 963,\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程(簡中)\",\r\n \"enrollmentId\": 2118844,\r\n \"progress\": \"0/2\",\r\n \"sessionId\": 93496,\r\n \"sessionName\": \"20161231信託業務人員職前訓練(4小時)-台北場(簡中)\",\r\n \"sessionTime\": \"2016/12/31
    13:00-17:00 \",\r\n \"status\": \"待修中(簡中)\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultUS = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"courseId\": 58954,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollmentId\": 2118839,\r\n \"progress\": \"0/1\",\r\n \"sessionId\": 96530,\r\n \"sessionName\": \"「看見愛的力量」微電影(2016)(英文)\",\r\n \"sessionTime\": \"2016/12/01~2016/12/31\",\r\n \"status\": \"未完成(英文)\"\r\n },\r\n {\r\n \"courseId\": 305,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程(英文)\",\r\n \"enrollmentId\": 0,\r\n \"progress\": \"0/12\",\r\n \"sessionId\": 1356,\r\n \"sessionName\": \"新人e起來(105-Q4)(英文)\",\r\n \"sessionTime\": \"2016/10/01~2016/12/31\",\r\n \"status\": \"未完成(英文)\"\r\n },\r\n {\r\n \"courseId\": 290,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程(英文)\",\r\n \"enrollmentId\": 0,\r\n \"progress\": \"0/26\",\r\n \"sessionId\": 1370,\r\n \"sessionName\": \"人身保險業務員在職訓練第一年(2016-V)人身保險業務員在職訓練第一年(2016-V)【含洗錢】(英文)\",\r\n \"sessionTime\": \"2016/11/01~2016/12/27\",\r\n \"status\": \"未完成(英文)\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n switch (params.LanguageCode) {\r\n case 'en-US':\r\n result = resultUS;\r\n break;\r\n case 'zh-CN':\r\n result = resultCN;\r\n break;\r\n default:\r\n result = resultTW;\r\n break;\r\n }\r\n\r\n if (params.LanguageCode === 'zh-TW') {\r\n setTimeout(function () {\r\n resolve({ data: result });\r\n }, 1000);\r\n } else {\r\n resolve({ data: result });\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * 12.修課記錄列表\r\n * @returns\r\n */\r\n function MyFinishedActivities(params) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultTW;\r\n var resultCN;\r\n var resultUS;\r\n\r\n resultTW = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"courseId\": 4,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 161360,\r\n \"sessionId\": 2056,\r\n \"sessionName\": \"Acrobat_PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應PDF全應用(100上半年)\",\r\n \"sessionTime\": \"2011/01/01~2011/06/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 12,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1012635,\r\n \"sessionId\": 46737,\r\n \"sessionName\": \"Time is Money:時間管理(103上半年)\",\r\n \"sessionTime\": \"2014/01/01~2014/06/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 12,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1854663,\r\n \"sessionId\": 82308,\r\n \"sessionName\": \"Time is Money:時間管理(105上半年)\",\r\n \"sessionTime\": \"2016/01/04~2016/06/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 34,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 1765530,\r\n \"sessionId\": 82149,\r\n \"sessionName\": \"投資型保險證照-年金考試班(105-01)\",\r\n \"sessionTime\": \"2016/01/04~2016/01/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 34,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 1852664,\r\n \"sessionId\": 85907,\r\n \"sessionName\": \"投資型保險證照-年金考試班(105-04)\",\r\n \"sessionTime\": \"2016/04/01~2016/04/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 34,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 1955630,\r\n \"sessionId\": 89956,\r\n \"sessionName\": \"投資型保險證照-年金考試班(105下半年)\",\r\n \"sessionTime\": \"2016/07/01~2016/12/27\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 59,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 7736,\r\n \"sessionId\": 25,\r\n \"sessionName\": \"簡易外匯機制考試班(9910-9912)\",\r\n \"sessionTime\": \"2010/10/01~2010/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 59,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 2089734,\r\n \"sessionId\": 94266,\r\n \"sessionName\": \"簡易外匯機制考試班(通路105-Q4)\",\r\n \"sessionTime\": \"2016/10/01~2016/12/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 60,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 14330,\r\n \"sessionId\": 17,\r\n \"sessionName\": \"開戶對保作業實務介紹(9910-9912)\",\r\n \"sessionTime\": \"2010/10/01~2010/12/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 60,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1765452,\r\n \"sessionId\": 82173,\r\n \"sessionName\": \"開戶對保作業實務介紹(105-Q1)\",\r\n \"sessionTime\": \"2016/01/04~2016/03/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 60,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 2131900,\r\n \"sessionId\": 94261,\r\n \"sessionName\": \"開戶對保作業實務介紹(105-Q4)\",\r\n \"sessionTime\": \"2016/10/01~2016/12/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 61,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 244471,\r\n \"sessionId\": 7229,\r\n \"sessionName\": \"自行查核相關規範及注意事項(100-Q3)\",\r\n \"sessionTime\": \"2011/07/01~2011/09/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 83,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1580993,\r\n \"sessionId\": 74983,\r\n \"sessionName\": \"認識國標舞(104下半年)\",\r\n \"sessionTime\": \"2015/08/04~2015/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 115,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 1782552,\r\n \"sessionId\": 83589,\r\n \"sessionName\": \"20160412+0419內部講師培訓 \",\r\n \"sessionTime\": \"2016/04/12
    09:00-17:00
    休息時間12:00-13:00

    2016/04/19
    09:00-17:00
    休息時間12:00-13:00\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 121,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 218800,\r\n \"sessionId\": 7151,\r\n \"sessionName\": \"20110823簽呈寫作訓練\",\r\n \"sessionTime\": \"2011/08/23
    13:30-18:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 219,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 264566,\r\n \"sessionId\": 8329,\r\n \"sessionName\": \"20111011-Fun輕鬆~~創造快樂的生活\",\r\n \"sessionTime\": \"2011/10/11
    14:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 417,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 20519,\r\n \"sessionId\": 639,\r\n \"sessionName\": \"防制洗錢,大家一起來!(2010)\",\r\n \"sessionTime\": \"2010/11/15~2010/11/26\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 440,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 16220,\r\n \"sessionId\": 656,\r\n \"sessionName\": \"理專銷售一致化法規檢測(9911)\",\r\n \"sessionTime\": \"2010/11/11~2010/11/12\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 555,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 16934,\r\n \"sessionId\": 770,\r\n \"sessionName\": \"理專銷售一致化法規檢測(題型測試)\",\r\n \"sessionTime\": \"2010/11/12~2010/11/12\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 1150,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 43260,\r\n \"sessionId\": 1544,\r\n \"sessionName\": \"1214講師座談會\",\r\n \"sessionTime\": \"2010/12/14
    14:00-17:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 1427,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 53226,\r\n \"sessionId\": 1848,\r\n \"sessionName\": \"資訊安全教育\",\r\n \"sessionTime\": \"2011/01/03~2011/01/21\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 1511,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1767571,\r\n \"sessionId\": 82177,\r\n \"sessionName\": \"覆核實務作業介紹(通路105-Q1)\",\r\n \"sessionTime\": \"2016/01/04~2016/03/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 1684,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 97963,\r\n \"sessionId\": 2348,\r\n \"sessionName\": \"員工保密規約測驗 (100-Q1)\",\r\n \"sessionTime\": \"2011/01/10~2011/03/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 1926,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 98474,\r\n \"sessionId\": 2658,\r\n \"sessionName\": \"資訊安全教育(問卷補考班)\",\r\n \"sessionTime\": \"2011/01/31~2011/02/25\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 2353,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 115681,\r\n \"sessionId\": 3672,\r\n \"sessionName\": \"20110401改變的力量(下午場)\",\r\n \"sessionTime\": \"2011/04/01
    14:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 2759,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 111186,\r\n \"sessionId\": 3622,\r\n \"sessionName\": \"當幸福來敲門【此為第一季台新大學宣傳活動,不認列訓練時數】\",\r\n \"sessionTime\": \"2011/04/14~2011/04/20 每1週(區間內的Mon,Tue,Wed,Thu,Fri)
    16:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 3062,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 121338,\r\n \"sessionId\": 4155,\r\n \"sessionName\": \"1000329測試\",\r\n \"sessionTime\": \"2011/03/29~2011/03/29\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 3366,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 137379,\r\n \"sessionId\": 4842,\r\n \"sessionName\": \"eMBO系統-職場行為調整 (一般同仁)-功能單位、法金\",\r\n \"sessionTime\": \"2011/04/18~2011/04/29\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 3620,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 147507,\r\n \"sessionId\": 4928,\r\n \"sessionName\": \"100年理專專業檢測測驗班(補考班) \",\r\n \"sessionTime\": \"2011/04/22~2011/04/22\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 3921,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 157915,\r\n \"sessionId\": 5504,\r\n \"sessionName\": \"覆核實務-小百科(5)\",\r\n \"sessionTime\": \"2011/05/04~2011/06/17\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 4033,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 166491,\r\n \"sessionId\": 5669,\r\n \"sessionName\": \"無三不成禮\",\r\n \"sessionTime\": \"2011/05/13~2011/06/17\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4102,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 172835,\r\n \"sessionId\": 5598,\r\n \"sessionName\": \"201110525體驗學習教學技巧分享\",\r\n \"sessionTime\": \"2011/05/25
    13:30-17:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4102,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 1165246,\r\n \"sessionId\": 57327,\r\n \"sessionName\": \"20140903破冰手法大解析(優秀內部講師免費活動)\",\r\n \"sessionTime\": \"2014/09/03
    13:30-17:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4102,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 1576652,\r\n \"sessionId\": 74912,\r\n \"sessionName\": \"20150922我的熱情來自於成就他人\",\r\n \"sessionTime\": \"2015/09/22
    15:00-18:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4102,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 2050891,\r\n \"sessionId\": 93035,\r\n \"sessionName\": \"20160930國際大師的創意教學技法與學習新趨勢\",\r\n \"sessionTime\": \"2016/09/30
    14:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4259,\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程\",\r\n \"enrollmentId\": 610169,\r\n \"sessionId\": 26912,\r\n \"sessionName\": \"2012-0921金融市場常識與職業道德\",\r\n \"sessionTime\": \"2012/09/21
    18:00-20:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4365,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 165743,\r\n \"sessionId\": 5911,\r\n \"sessionName\": \"OJT-3S把服務做到最好\",\r\n \"sessionTime\": \"2011/05/17
    10:00-10:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4366,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 165771,\r\n \"sessionId\": 5912,\r\n \"sessionName\": \"OJT-法令遵循及資訊安全宣導\",\r\n \"sessionTime\": \"2011/05/17
    10:30-11:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 4684,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 191644,\r\n \"sessionId\": 6213,\r\n \"sessionName\": \"100上-信用卡-法令遵循自評檢核考試班\",\r\n \"sessionTime\": \"2011/06/01~2011/06/16\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 5283,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 185889,\r\n \"sessionId\": 6758,\r\n \"sessionName\": \"個人資料保護法因應與衝擊認知教育訓練(功能、法金)\",\r\n \"sessionTime\": \"2011/06/20~2011/07/01\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 8995,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 225227,\r\n \"sessionId\": 8668,\r\n \"sessionName\": \"3Sbook,隨時分享簡單、真心、極優的每一刻!(功能、法金)\",\r\n \"sessionTime\": \"2011/07/29~2011/08/12\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 9477,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 243312,\r\n \"sessionId\": 9185,\r\n \"sessionName\": \"20110905-1 派外主管管理須知\",\r\n \"sessionTime\": \"2011/09/05
    14:00-16:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 9477,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 245342,\r\n \"sessionId\": 9420,\r\n \"sessionName\": \"20110905-2 薪資制度與稅務處理\",\r\n \"sessionTime\": \"2011/09/05
    16:30-20:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 9477,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 245343,\r\n \"sessionId\": 9422,\r\n \"sessionName\": \"20111003 員工招聘任用\",\r\n \"sessionTime\": \"2011/10/03
    17:00-20:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 9477,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 245346,\r\n \"sessionId\": 9426,\r\n \"sessionName\": \"20111013 社會保險與員工福利\",\r\n \"sessionTime\": \"2011/10/13
    17:00-20:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 9477,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 464127,\r\n \"sessionId\": 23026,\r\n \"sessionName\": \"20121003 與工會共舞\",\r\n \"sessionTime\": \"2012/10/03
    15:00-18:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 9680,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 554420,\r\n \"sessionId\": 22225,\r\n \"sessionName\": \"產險考照模擬測驗(101下半年)\",\r\n \"sessionTime\": \"2012/07/01~2012/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 10817,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 291201,\r\n \"sessionId\": 11764,\r\n \"sessionName\": \"20111107內控內稽案例暨法令宣導(人力資源處)\",\r\n \"sessionTime\": \"2011/11/07
    15:30-17:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 11371,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 288776,\r\n \"sessionId\": 11704,\r\n \"sessionName\": \"防制洗錢,大家一起來!(2011-法金、功能)\",\r\n \"sessionTime\": \"2011/10/31~2011/11/11\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 11371,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 554046,\r\n \"sessionId\": 26829,\r\n \"sessionName\": \"防制洗錢,大家一起來!(2012-功能其他單位)\",\r\n \"sessionTime\": \"2012/10/08~2012/10/25\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 11920,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 306566,\r\n \"sessionId\": 12473,\r\n \"sessionName\": \"100-11-分行作業規範測驗\",\r\n \"sessionTime\": \"2011/11/16~2011/11/29\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 13899,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1963434,\r\n \"sessionId\": 90435,\r\n \"sessionName\": \"WORD文書排版(上)【105下半年】\",\r\n \"sessionTime\": \"2016/07/01~2016/12/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 13901,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1575469,\r\n \"sessionId\": 74131,\r\n \"sessionName\": \"POWERPOINT創意簡報王【104下半年】\",\r\n \"sessionTime\": \"2015/07/20~2015/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 14828,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 399071,\r\n \"sessionId\": 17536,\r\n \"sessionName\": \"20120413 HR也要懂的行銷之道\",\r\n \"sessionTime\": \"2012/04/13
    15:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 16816,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1677300,\r\n \"sessionId\": 79221,\r\n \"sessionName\": \"信託在職─信託業務綜覽【II】(104-11)\",\r\n \"sessionTime\": \"2015/11/01~2015/11/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 16827,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 411826,\r\n \"sessionId\": 18708,\r\n \"sessionName\": \"eTag自動儲值專案(功能)\",\r\n \"sessionTime\": \"2012/05/14~2012/05/25\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 17577,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 435905,\r\n \"sessionId\": 21188,\r\n \"sessionName\": \"101上-一般版-法令遵循自評檢核考試班\",\r\n \"sessionTime\": \"2012/06/01~2012/06/15\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 18025,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1971636,\r\n \"sessionId\": 82375,\r\n \"sessionName\": \"IDP員工職涯發展計畫(105年)\",\r\n \"sessionTime\": \"2016/01/04~2016/12/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 18339,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 617003,\r\n \"sessionId\": 30447,\r\n \"sessionName\": \"自行查核相關規範及注意事項(102-Q1)\",\r\n \"sessionTime\": \"2013/01/01~2013/03/26\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 18536,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 460069,\r\n \"sessionId\": 22961,\r\n \"sessionName\": \"個資管理控管機制宣導教育訓練(功能)\",\r\n \"sessionTime\": \"2012/07/09~2012/07/26\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 20268,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 534576,\r\n \"sessionId\": 24547,\r\n \"sessionName\": \"20120918 EQ無礙,未來更high\",\r\n \"sessionTime\": \"2012/09/18
    14:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 20628,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 505062,\r\n \"sessionId\": 25030,\r\n \"sessionName\": \"20120830輔銷人員晨會及產品專業度檢測\",\r\n \"sessionTime\": \"2012/08/30~2012/08/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 23101,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 583844,\r\n \"sessionId\": 28326,\r\n \"sessionName\": \"Q3晨會TEST\",\r\n \"sessionTime\": \"2012/11/20~2012/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 25204,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 623890,\r\n \"sessionId\": 31329,\r\n \"sessionName\": \"台新銀行新光三越聯名卡競品權益比較(test)\",\r\n \"sessionTime\": \"2013/02/01~2013/02/01\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 28808,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 701659,\r\n \"sessionId\": 36017,\r\n \"sessionName\": \"防制洗錢,大家一起來!(2013功能、子公司II)\",\r\n \"sessionTime\": \"2013/05/06~2013/05/21\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 29109,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 744824,\r\n \"sessionId\": 37101,\r\n \"sessionName\": \"102上-一般版-法令遵循自評檢核考試班\",\r\n \"sessionTime\": \"2013/06/01~2013/06/15\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 29128,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 710389,\r\n \"sessionId\": 36373,\r\n \"sessionName\": \"【空中英語教室】Beating Stress (戰勝壓力)\",\r\n \"sessionTime\": \"2013/05/16~2013/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 29355,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 757635,\r\n \"sessionId\": 37097,\r\n \"sessionName\": \"台新證券-法遵自評筆試(一般)【102上】\",\r\n \"sessionTime\": \"2013/06/03~2013/06/26\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 31029,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 771493,\r\n \"sessionId\": 38973,\r\n \"sessionName\": \"OJT-法規-第二季法令遵循暨資安宣導\",\r\n \"sessionTime\": \"2013/06/26
    14:00-14:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 31158,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 781710,\r\n \"sessionId\": 39303,\r\n \"sessionName\": \"個人資料保護宣導課程(HR)\",\r\n \"sessionTime\": \"2013/07/15~2013/07/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 32901,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 845845,\r\n \"sessionId\": 42432,\r\n \"sessionName\": \"「金融消費者保護法」及其相關子法之重點說明(第一梯次)\",\r\n \"sessionTime\": \"2013/09/23~2013/10/23\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 33111,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1809577,\r\n \"sessionId\": 84810,\r\n \"sessionName\": \"2014人身保險在職訓練-零散\",\r\n \"sessionTime\": \"~\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 33112,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1809679,\r\n \"sessionId\": 84817,\r\n \"sessionName\": \"2014財產保險在職訓練-零散\",\r\n \"sessionTime\": \"~\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 33529,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 855031,\r\n \"sessionId\": 42842,\r\n \"sessionName\": \"OJT-法規-第二季法令遵循暨資安宣導\",\r\n \"sessionTime\": \"2013/09/25
    14:00-14:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 34014,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1808070,\r\n \"sessionId\": 84282,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105-03)\",\r\n \"sessionTime\": \"2016/03/01~2016/03/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 34014,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 2041573,\r\n \"sessionId\": 91701,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105下半年)\",\r\n \"sessionTime\": \"2016/08/01~2016/12/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 34181,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 872125,\r\n \"sessionId\": 43743,\r\n \"sessionName\": \"20131009 尋找羅浮宮暗畫\",\r\n \"sessionTime\": \"2013/10/09
    15:30-18:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 35308,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 909145,\r\n \"sessionId\": 45732,\r\n \"sessionName\": \"102下-一般版-法令遵循自評檢核考試班\",\r\n \"sessionTime\": \"2013/12/02~2013/12/19\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 36343,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1282161,\r\n \"sessionId\": 61835,\r\n \"sessionName\": \"信託業務人員在職訓練課程(103-12)\",\r\n \"sessionTime\": \"2014/12/01~2014/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 40306,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 994258,\r\n \"sessionId\": 51698,\r\n \"sessionName\": \"OJT-2014第一季資安暨法遵宣導課程名單\",\r\n \"sessionTime\": \"2014/03/25
    14:00-14:30 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 40351,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 996178,\r\n \"sessionId\": 51788,\r\n \"sessionName\": \"防制洗錢,大家一起來(2014功能、子公司、通路)\",\r\n \"sessionTime\": \"2014/04/02~2014/04/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 40643,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 1070380,\r\n \"sessionId\": 52424,\r\n \"sessionName\": \"20140618 複訓_勞工安全衛生 (北區_內湖_下午)\",\r\n \"sessionTime\": \"2014/06/18
    14:00-17:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 41344,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1048766,\r\n \"sessionId\": 53283,\r\n \"sessionName\": \"金融專業培訓課程--外匯業務分行篇(國外部TEST)\",\r\n \"sessionTime\": \"2014/05/16~2014/06/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 41558,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1056214,\r\n \"sessionId\": 54076,\r\n \"sessionName\": \"美國海外帳戶稅收遵循法(FATCA)介紹【2014】\",\r\n \"sessionTime\": \"2014/06/03~2014/06/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 41933,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1576041,\r\n \"sessionId\": 73482,\r\n \"sessionName\": \"台新金控的核心价值(104下半年)\",\r\n \"sessionTime\": \"2015/07/01~2015/12/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 43620,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1131157,\r\n \"sessionId\": 56980,\r\n \"sessionName\": \"個資侵害事件之應變程序\",\r\n \"sessionTime\": \"2014/08/11~2014/08/29\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 45594,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1204691,\r\n \"sessionId\": 60298,\r\n \"sessionName\": \"2014 資訊安全教育\",\r\n \"sessionTime\": \"2014/10/13~2014/10/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 45594,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1411546,\r\n \"sessionId\": 69411,\r\n \"sessionName\": \"2015 資訊安全教育\",\r\n \"sessionTime\": \"2015/05/04~2015/05/29\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 47260,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1272749,\r\n \"sessionId\": 62654,\r\n \"sessionName\": \"企業倫理\",\r\n \"sessionTime\": \"2014/12/16~2014/12/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 50199,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1387594,\r\n \"sessionId\": 68451,\r\n \"sessionName\": \"銀行業防制洗錢及打擊資助恐怖主義注意事項(2015)\",\r\n \"sessionTime\": \"2015/04/07~2015/04/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 52160,\r\n \"courseType\": 6,\r\n \"courseTypeName\": \"問卷\",\r\n \"enrollmentId\": 1425084,\r\n \"sessionId\": 69695,\r\n \"sessionName\": \"台新大學暨人資網站改版問卷調查(test)\",\r\n \"sessionTime\": \"2015/05/12~2015/05/18\",\r\n \"status\": 0\r\n },\r\n {\r\n \"courseId\": 52160,\r\n \"courseType\": 6,\r\n \"courseTypeName\": \"問卷\",\r\n \"enrollmentId\": 1437104,\r\n \"sessionId\": 69903,\r\n \"sessionName\": \"台新大學暨人資網站改版問卷調查(2015)\",\r\n \"sessionTime\": \"2015/05/18~2015/05/29\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 55764,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1765451,\r\n \"sessionId\": 82343,\r\n \"sessionName\": \"信用卡進件流程與徵審作業介紹(105上半年)\",\r\n \"sessionTime\": \"2016/01/04~2016/06/30\",\r\n \"status\": 1\r\n },\r\n {\r\n \"courseId\": 55820,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1547020,\r\n \"sessionId\": 75145,\r\n \"sessionName\": \"個資侵害事件之應變程序(2015)\",\r\n \"sessionTime\": \"2015/08/10~2015/09/07\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 58214,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1641409,\r\n \"sessionId\": 78458,\r\n \"sessionName\": \"「金融消費者保護法」及其相關子法之重點說明(2015)\",\r\n \"sessionTime\": \"2015/10/19~2015/11/13\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 58954,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1672067,\r\n \"sessionId\": 79652,\r\n \"sessionName\": \"「看見愛的力量」微電影(2015)\",\r\n \"sessionTime\": \"2015/11/05~2015/12/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 59632,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 1700490,\r\n \"sessionId\": 80745,\r\n \"sessionName\": \"104下-一般版-法令遵循自評檢核考試班\",\r\n \"sessionTime\": \"2015/12/01~2015/12/16\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 63973,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1861689,\r\n \"sessionId\": 87641,\r\n \"sessionName\": \"資訊安全教育(2016)\",\r\n \"sessionTime\": \"2016/05/03~2016/05/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 65645,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1923693,\r\n \"sessionId\": 89470,\r\n \"sessionName\": \"「票據招商 吸收存款」專案\",\r\n \"sessionTime\": \"2016/06/20~2016/07/15\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 65916,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1945653,\r\n \"sessionId\": 90607,\r\n \"sessionName\": \"金融消費者保護法及公平待客原則(含誠信經營守則、企業倫理)\",\r\n \"sessionTime\": \"2016/07/04~2016/07/29\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 66903,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1975394,\r\n \"sessionId\": 91423,\r\n \"sessionName\": \"理專APP功能操作與使用(test)\",\r\n \"sessionTime\": \"2016/07/25~2016/07/25\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 66903,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1982705,\r\n \"sessionId\": 91521,\r\n \"sessionName\": \"理專APP功能操作與使用\",\r\n \"sessionTime\": \"2016/07/26~2016/08/26\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 67327,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 1984657,\r\n \"sessionId\": 92043,\r\n \"sessionName\": \"Hahow好學校 廣告影片測試\",\r\n \"sessionTime\": \"2016/07/31~2016/08/05\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 67836,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 2042239,\r\n \"sessionId\": 93734,\r\n \"sessionName\": \"防制洗錢及打擊資助恐怖主義風險評估與管理(2016)\",\r\n \"sessionTime\": \"2016/09/12~2016/10/07\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 68146,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程\",\r\n \"enrollmentId\": 2033954,\r\n \"sessionId\": 93489,\r\n \"sessionName\": \"洗錢防制法解析與案例說明 (2016-test)\",\r\n \"sessionTime\": \"2016/09/02~2016/09/09\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 70025,\r\n \"courseType\": 2,\r\n \"courseTypeName\": \"教室課程\",\r\n \"enrollmentId\": 2118774,\r\n \"sessionId\": 96118,\r\n \"sessionName\": \"20161128樂活人生健康講座\",\r\n \"sessionTime\": \"2016/11/28
    18:00-19:00 \",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 70253,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗\",\r\n \"enrollmentId\": 2136532,\r\n \"sessionId\": 96745,\r\n \"sessionName\": \"105下-一般版-法令遵循自評檢核考試班\",\r\n \"sessionTime\": \"2016/12/01~2016/12/16\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 137,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 71853,\r\n \"sessionId\": 1223,\r\n \"sessionName\": \"分行新人e課程-專業理專(105-Q2)\",\r\n \"sessionTime\": \"2016/04/01~2016/06/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 282,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 69170,\r\n \"sessionId\": 1166,\r\n \"sessionName\": \"新人e起來(105-01~105-04)\",\r\n \"sessionTime\": \"2016/01/01~2016/04/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 291,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 77491,\r\n \"sessionId\": 1275,\r\n \"sessionName\": \"新人e起來(105-Q3)\",\r\n \"sessionTime\": \"2016/07/01~2016/09/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 305,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 81076,\r\n \"sessionId\": 1356,\r\n \"sessionName\": \"新人e起來(105-Q4)\",\r\n \"sessionTime\": \"2016/10/01~2016/12/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 312,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 81331,\r\n \"sessionId\": 1406,\r\n \"sessionName\": \"財產保險業務員在職訓練(MP4測試)\",\r\n \"sessionTime\": \"2016/12/20~2017/01/26\",\r\n \"status\": 0\r\n },\r\n {\r\n \"courseId\": 314,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 81327,\r\n \"sessionId\": 1405,\r\n \"sessionName\": \"人身保險業務員在職訓練(MP4測試)\",\r\n \"sessionTime\": \"2016/12/20~2017/01/26\",\r\n \"status\": 0\r\n },\r\n {\r\n \"courseId\": 315,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 81323,\r\n \"sessionId\": 1404,\r\n \"sessionName\": \"財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練財產保險業務員在職訓練第一年(MP4測試)\",\r\n \"sessionTime\": \"2016/12/20~2017/01/26\",\r\n \"status\": 0\r\n },\r\n {\r\n \"courseId\": 316,\r\n \"courseType\": 7,\r\n \"courseTypeName\": \"學程\",\r\n \"enrollmentId\": 81319,\r\n \"sessionId\": 1403,\r\n \"sessionName\": \"人身保險業務員在職訓練第一年(MP4測試)\",\r\n \"sessionTime\": \"2016/12/20~2017/01/26\",\r\n \"status\": 0\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultCN = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"courseId\": 4,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollmentId\": 161360,\r\n \"sessionId\": 2056,\r\n \"sessionName\": \"Acrobat_PDF全應用(100上半年)(簡中)\",\r\n \"sessionTime\": \"2011/01/01~2011/06/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 12,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollmentId\": 1012635,\r\n \"sessionId\": 46737,\r\n \"sessionName\": \"Time is Money:時間管理(103上半年)(簡中)\",\r\n \"sessionTime\": \"2014/01/01~2014/06/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 12,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollmentId\": 1854663,\r\n \"sessionId\": 82308,\r\n \"sessionName\": \"Time is Money:時間管理(105上半年)(簡中)\",\r\n \"sessionTime\": \"2016/01/04~2016/06/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 34,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗(簡中)\",\r\n \"enrollmentId\": 1765530,\r\n \"sessionId\": 82149,\r\n \"sessionName\": \"投資型保險證照-年金考試班(105-01)(簡中)\",\r\n \"sessionTime\": \"2016/01/04~2016/01/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 34,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗(簡中)\",\r\n \"enrollmentId\": 1852664,\r\n \"sessionId\": 85907,\r\n \"sessionName\": \"投資型保險證照-年金考試班(105-04)(簡中)\",\r\n \"sessionTime\": \"2016/04/01~2016/04/30\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 34,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗(簡中)\",\r\n \"enrollmentId\": 1955630,\r\n \"sessionId\": 89956,\r\n \"sessionName\": \"投資型保險證照-年金考試班(105下半年)(簡中)\",\r\n \"sessionTime\": \"2016/07/01~2016/12/31\",\r\n \"status\": 2\r\n },\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultUS = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"courseId\": 59,\r\n \"courseType\": 4,\r\n \"courseTypeName\": \"線上測驗(英文)\",\r\n \"enrollmentId\": 7736,\r\n \"sessionId\": 25,\r\n \"sessionName\": \"簡易外匯機制考試班(9910-9912)(英文)\",\r\n \"sessionTime\": \"2010/10/01~2010/12/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 60,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollmentId\": 14330,\r\n \"sessionId\": 17,\r\n \"sessionName\": \"開戶對保作業實務介紹(9910-9912)(英文)\",\r\n \"sessionTime\": \"2010/10/01~2010/12/31\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 60,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollmentId\": 1765452,\r\n \"sessionId\": 82173,\r\n \"sessionName\": \"開戶對保作業實務介紹(105-Q1)(英文)\",\r\n \"sessionTime\": \"2016/01/04~2016/03/31\",\r\n \"status\": 3\r\n },\r\n {\r\n \"courseId\": 61,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollmentId\": 244471,\r\n \"sessionId\": 7229,\r\n \"sessionName\": \"自行查核相關規範及注意事項(100-Q3)(英文)\",\r\n \"sessionTime\": \"2011/07/01~2011/09/30\",\r\n \"status\": 2\r\n },\r\n {\r\n \"courseId\": 83,\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollmentId\": 1580993,\r\n \"sessionId\": 74983,\r\n \"sessionName\": \"認識國標舞(104下半年)(英文)\",\r\n \"sessionTime\": \"2015/08/04~2015/12/31\",\r\n \"status\": 3\r\n },\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n switch (params.LanguageCode) {\r\n case 'en-US':\r\n result = resultUS;\r\n break;\r\n case 'zn-CN':\r\n result = resultCN;\r\n break;\r\n default:\r\n result = resultTW;\r\n break;\r\n }\r\n return { data: result };\r\n }\r\n /**\r\n * 14.取得修課動作&內容\r\n * @returns\r\n */\r\n function EnrollmentAvailableAction(courseItem) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultType1; /** 一般 */\r\n var resultType2; /** 測驗 */\r\n var resultType3; /** 問卷 */\r\n resultType1 = {\r\n Status: '200',\r\n Data: {\r\n \"lmsItems\": [{\r\n \"action\": \"Play\",\r\n \"completedTime\": \"2016/10/27 11:53\",\r\n \"itemId\": 3,\r\n \"itemName\": \"共同基金銷售關鍵資訊【63分鐘】(影片)\",\r\n \"score\": \"\",\r\n \"status\": \"未完成\",\r\n \"type\": \"課程內容\",\r\n \"viewedTime\": \"00:00:01\"\r\n },\r\n {\r\n \"action\": \"Test\",\r\n \"completedTime\": \"2016/10/18 10:43\",\r\n \"itemId\": 4,\r\n \"itemName\": \"共同基金銷售關鍵資訊【測驗】\",\r\n \"score\": \"\",\r\n \"status\": \"完成\",\r\n \"type\": \"測驗\",\r\n \"viewedTime\": \"00:00:31\"\r\n },\r\n {\r\n \"action\": \"???\",\r\n \"completedTime\": \"\",\r\n \"itemId\": 1,\r\n \"itemName\": \"這是ZIP教材下載\",\r\n \"score\": \"不公佈\",\r\n \"status\": \"\",\r\n \"type\": \"課程內容\",\r\n \"viewedTime\": \"\"\r\n },\r\n {\r\n \"action\": \"???\",\r\n \"completedTime\": \"\",\r\n \"itemId\": 2,\r\n \"itemName\": \"這是PDF教材\",\r\n \"score\": \"不公佈\",\r\n \"status\": \"\",\r\n \"type\": \"課程內容\",\r\n \"viewedTime\": \"\"\r\n },\r\n {\r\n \"action\": \"???\",\r\n \"completedTime\": \"2016/10/17 21:35\",\r\n \"itemId\": 4,\r\n \"itemName\": \"信託業務人員職前教育訓練課程【課後問卷】\",\r\n \"score\": \"\",\r\n \"status\": \"未曾觀看\",\r\n \"type\": \"問卷\",\r\n \"viewedTime\": \"00:00:00\"\r\n }\r\n ],\r\n \"attendanceRate\": 0,\r\n \"attendances\": [],\r\n \"availableActions\": [],\r\n \"courseSessions\": [],\r\n \"preSurveyItemId\": 0,\r\n \"progress\": \"1/5\",\r\n \"reportDeadline\": \"\",\r\n \"reportSubmitted\": 0,\r\n \"reportTotal\": 0,\r\n \"reports\": [],\r\n \"status\": -1\r\n },\r\n 'ErrorMessage': ''\r\n };\r\n resultType2 = {\r\n \"Status\": \"200\",\r\n \"Data\": {\r\n \"attendanceRate\": 0,\r\n \"attendances\": [],\r\n \"availableActions\": [\r\n \"Cancel\",\r\n \"Leave\",\r\n \"Exemption\"\r\n ],\r\n \"courseSessions\": [],\r\n \"lmsItems\": [{\r\n \"action\": \"Test\",\r\n \"completedTime\": \"2016/12/16 17:17\",\r\n \"itemId\": 336655,\r\n \"itemName\": \"G-法規-1089金控一般版-法令遵循自評檢核考試班(105上)\",\r\n \"score\": \"28.0\",\r\n \"status\": \"未通過\",\r\n \"type\": \"測驗\",\r\n \"viewedTime\": \"00:31:06\"\r\n }],\r\n \"preSurveyItemId\": 5,\r\n \"progress\": \"\",\r\n \"reportDeadline\": \"\",\r\n \"reportSubmitted\": 0,\r\n \"reportTotal\": 0,\r\n \"reports\": [],\r\n \"status\": -1\r\n },\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultType3 = {\r\n Status: '200',\r\n Data: {\r\n \"attendanceRate\": 0,\r\n \"attendances\": [],\r\n \"availableActions\": [],\r\n \"courseSessions\": [],\r\n \"lmsItems\": [{\r\n \"action\": \"\",\r\n \"completedTime\": \"2016/09/09 09:18\",\r\n \"itemId\": 268699,\r\n \"itemName\": \"台新大學暨人資網站改版問卷調查\",\r\n \"score\": \"\",\r\n \"status\": \"完成\",\r\n \"type\": \"問卷\",\r\n \"viewedTime\": \"00:01:46\"\r\n }],\r\n \"preSurveyItemId\": 0,\r\n \"reportDeadline\": \"\",\r\n \"reportSubmitted\": 0,\r\n \"progress\": \"0/1\",\r\n \"status\": \"未完成\",\r\n \"reportTotal\": 0,\r\n \"reports\": []\r\n },\r\n 'ErrorMessage': ''\r\n };\r\n\r\n switch (courseItem.courseType) {\r\n case enumCourseType.classTest:\r\n result = resultType2;\r\n break;\r\n case enumCourseType.webTest:\r\n result = resultType2;\r\n break;\r\n case enumCourseType.questList:\r\n result = resultType3;\r\n break;\r\n default:\r\n result = resultType1;\r\n break;\r\n }\r\n return { data: result };\r\n }\r\n /**\r\n * 15.課程動作(P.18)\r\n * @returns\r\n */\r\n function EnrollmentAction(param) {\r\n\r\n return new Promise((resolve, reject)=>{\r\n\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n\r\n var resultFail = {\r\n Status: '200',\r\n Data: {\r\n failCode: -2,\r\n failMessage: '',\r\n success: 0,\r\n },\r\n ErrorMessage: '',\r\n };\r\n var resultSucess = {\r\n Status: '200',\r\n Data: {\r\n failCode: -1,\r\n failMessage: '',\r\n success: 1,\r\n },\r\n ErrorMessage: '',\r\n };\r\n switch (param.IsProgram) {\r\n case 1:\r\n result = resultFail;\r\n break;\r\n default:\r\n result = resultSucess;\r\n break;\r\n }\r\n\r\n setTimeout(function() {\r\n resolve({ data: result });\r\n }, 2000);\r\n \r\n })\r\n \r\n }\r\n\r\n \r\n\r\n\r\n /**\r\n * 16.金融證照紀錄申請(P.18)\r\n * @returns\r\n */\r\n function FCCertificatedLicenseAdd() {\r\n var result = {\r\n Status: '200',\r\n Data: null,\r\n ErrorMessage: '',\r\n };\r\n return { data: result };\r\n }\r\n /**\r\n * 17.金融證照查詢\r\n * @returns\r\n */\r\n function FCCertificatedLicenseList() {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n result = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"acquireDate\": \"2016/01/04\",\r\n \"applyDate\": \"2016/01/05\",\r\n \"id\": 5,\r\n \"name\": \"信託督導人員審定合格(登錄信託公會)\",\r\n \"status\": \"申請取消\",\r\n \"validDate\": \"2019/01/03\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"2016/01/05 14:01\",\r\n \"workflowItem\": \"學員\",\r\n \"workflowName\": \"李佳憓 (990028)\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"取消\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/12/13\",\r\n \"applyDate\": \"2016/12/15\",\r\n \"id\": 6,\r\n \"name\": \"信託管理人員審定合格(登錄信託公會)\",\r\n \"status\": \"已成功完成\",\r\n \"validDate\": \"2019/12/13\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"2016/12/15 17:36\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"李佳憓 (990028)\",\r\n \"workflowReason\": \"由人資處登錄\",\r\n \"workflowResult\": \"核准\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/12/13\",\r\n \"applyDate\": \"2016/12/15\",\r\n \"id\": 7,\r\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\r\n \"status\": \"已成功完成\",\r\n \"validDate\": \"2019/12/13\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"2016/12/15 17:36\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"李佳憓 (990028)\",\r\n \"workflowReason\": \"由人資處登錄\",\r\n \"workflowResult\": \"核准\"\r\n },\r\n {\r\n \"acquireDate\": \"2010/11/10\",\r\n \"applyDate\": \"2010/11/10\",\r\n \"id\": 13,\r\n \"name\": \"開戶對保作業資格\",\r\n \"status\": \"已成功完成\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"\",\r\n \"workflowItem\": \"\",\r\n \"workflowName\": \"\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/11/02\",\r\n \"applyDate\": \"2016/12/15\",\r\n \"id\": 46,\r\n \"name\": \"人身保險業務員投資型商品資格登錄(登錄壽險公會)\",\r\n \"status\": \"簽核中\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"周孟蕎 (1000323),黃昱珩 (1020258),張瑋晏 (1040831)\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/06/29\",\r\n \"applyDate\": \"2016/07/07\",\r\n \"id\": 112,\r\n \"name\": \"證券商高級業務員(登錄證券交易所)\",\r\n \"status\": \"簽核中\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"周孟蕎 (1000323),黃昱珩 (1020258),張瑋晏 (1040831)\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/04/19\",\r\n \"applyDate\": \"2016/04/27\",\r\n \"id\": 131,\r\n \"name\": \"內部講師訓完訓資格\",\r\n \"status\": \"已成功完成\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"有效\",\r\n \"validStatusKey\": 1,\r\n \"workflowDateTime\": \"2016/04/27 16:06\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"張瑋晏 (1040831)\",\r\n \"workflowReason\": \"由人資處登錄\",\r\n \"workflowResult\": \"核准\"\r\n },\r\n {\r\n \"acquireDate\": \"2013/01/27\",\r\n \"applyDate\": \"2013/02/19\",\r\n \"id\": 7,\r\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\r\n \"status\": \"已成功完成\",\r\n \"validDate\": \"2016/01/27\",\r\n \"validStatus\": \"註銷\",\r\n \"validStatusKey\": 2,\r\n \"workflowDateTime\": \"2013/02/19 12:00\",\r\n \"workflowItem\": \"部門管理員代為申請\",\r\n \"workflowName\": \"李佳憓 (990028)\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"直接核准\"\r\n },\r\n {\r\n \"acquireDate\": \"2013/09/03\",\r\n \"applyDate\": \"2013/02/19\",\r\n \"id\": 7,\r\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\r\n \"status\": \"已拒絕\",\r\n \"validDate\": \"2016/09/02\",\r\n \"validStatus\": \"無效\",\r\n \"validStatusKey\": 0,\r\n \"workflowDateTime\": \"2013/10/01 16:56\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"黃昱珩 (1020258)\",\r\n \"workflowReason\": \"TEST(無受訓紀錄)\",\r\n \"workflowResult\": \"拒絕\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/03/01\",\r\n \"applyDate\": \"2016/03/09\",\r\n \"id\": 7,\r\n \"name\": \"信託業務人員審定合格(登錄信託公會)\",\r\n \"status\": \"已拒絕\",\r\n \"validDate\": \"2019/03/01\",\r\n \"validStatus\": \"無效\",\r\n \"validStatusKey\": 0,\r\n \"workflowDateTime\": \"2016/03/15 16:18\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"黃昱珩 (1020258)\",\r\n \"workflowReason\": \"(無測驗合格紀錄)\",\r\n \"workflowResult\": \"拒絕\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/06/29\",\r\n \"applyDate\": \"2016/07/07\",\r\n \"id\": 5,\r\n \"name\": \"信託督導人員審定合格(登錄信託公會)\",\r\n \"status\": \"已拒絕\",\r\n \"validDate\": \"2019/06/29\",\r\n \"validStatus\": \"無效\",\r\n \"validStatusKey\": 0,\r\n \"workflowDateTime\": \"2016/07/07 17:57\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"黃昱珩 (1020258)\",\r\n \"workflowReason\": \"(不屬於目前職務所需證照)\",\r\n \"workflowResult\": \"拒絕\"\r\n },\r\n {\r\n \"acquireDate\": \"2013/12/01\",\r\n \"applyDate\": \"2013/12/30\",\r\n \"id\": 44,\r\n \"name\": \"財產保險業務員登錄(登錄產險公會)\",\r\n \"status\": \"已拒絕\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"無效\",\r\n \"validStatusKey\": 0,\r\n \"workflowDateTime\": \"2013/12/30 15:43\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"黃昱珩 (1020258)\",\r\n \"workflowReason\": \"請書面送保經申請(http://localhost),通過後由保險系統直接轉入,請勿線上申請。(請書面送保經申請(http://localhost),通過後由保險系統直接轉入,請勿線上申請。)\",\r\n \"workflowResult\": \"拒絕\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/06/28\",\r\n \"applyDate\": \"2016/07/07\",\r\n \"id\": 44,\r\n \"name\": \"財產保險業務員登錄(登錄產險公會)\",\r\n \"status\": \"已拒絕\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"無效\",\r\n \"validStatusKey\": 0,\r\n \"workflowDateTime\": \"2016/07/07 18:01\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"黃昱珩 (1020258)\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"拒絕\"\r\n },\r\n {\r\n \"acquireDate\": \"2016/07/07\",\r\n \"applyDate\": \"2016/07/07\",\r\n \"id\": 127,\r\n \"name\": \"投信投顧業務員-一般業務員(登錄投信投顧公會)\",\r\n \"status\": \"已拒絕\",\r\n \"validDate\": \"永遠有效\",\r\n \"validStatus\": \"無效\",\r\n \"validStatusKey\": 0,\r\n \"workflowDateTime\": \"2016/07/07 17:54\",\r\n \"workflowItem\": \"人資經辦\",\r\n \"workflowName\": \"黃昱珩 (1020258)\",\r\n \"workflowReason\": \"\",\r\n \"workflowResult\": \"拒絕\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n return { data: result };\r\n }\r\n\r\n /**\r\n * 18.金融證照認列時數(QQ)\r\n * @returns\r\n */\r\n function FCAuthorizedHoursList() {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n result = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"licenseId\": 6,\r\n \"licenseName\": \"信託管理人員審定合格(登錄信託公會)\",\r\n \"trainingCategory\": \"在職訓練\",\r\n \"trainingEndDate\": \"2019/12/13\",\r\n \"unfinishHours\": \"尚缺外訓:0.0,尚缺內訓:0.0\",\r\n \"validStatus\": 1\r\n },\r\n {\r\n \"licenseId\": 7,\r\n \"licenseName\": \"信託業務人員審定合格(登錄信託公會)\",\r\n \"trainingCategory\": \"在職訓練\",\r\n \"trainingEndDate\": \"2019/12/13\",\r\n \"unfinishHours\": \"尚缺外訓:6.0,尚缺內訓:12.0\",\r\n \"validStatus\": 1\r\n },\r\n {\r\n \"licenseId\": 13,\r\n \"licenseName\": \"開戶對保作業資格\",\r\n \"trainingCategory\": \"受訓後取得\",\r\n \"trainingEndDate\": \"\",\r\n \"unfinishHours\": \"尚缺外訓:0.0,尚缺內訓:0.0\",\r\n \"validStatus\": 1\r\n },\r\n {\r\n \"licenseId\": 131,\r\n \"licenseName\": \"內部講師訓完訓資格\",\r\n \"trainingCategory\": \"受訓後取得\",\r\n \"trainingEndDate\": \"\",\r\n \"unfinishHours\": \"尚缺外訓:0.0,尚缺內訓:0.0\",\r\n \"validStatus\": 1\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n return { data: result };\r\n }\r\n /**\r\n * 19.金融證照紀錄申請\r\n * @returns\r\n */\r\n function ExternalTrainingApplication() {\r\n var result = {\r\n Status: '200',\r\n Data: {\r\n failCode: -1,\r\n failMessage: '',\r\n success: 0,\r\n },\r\n ErrorMessage: '',\r\n };\r\n return { data: result };\r\n }\r\n /**\r\n * 20.金融證照可報名課程(QQ)\r\n * @returns\r\n */\r\n function FCEnrollableActivities(params) {\r\n var result = {\r\n Status: 0,\r\n Data: {},\r\n ErrorMessage: \"\"\r\n };\r\n var resultEmpty;\r\n var resultTW;\r\n var resultCN;\r\n var resultUS;\r\n\r\n resultEmpty = {\r\n \"Status\": \"200\",\r\n \"Data\": [],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultTW = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 13372,\r\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/31\",\r\n \"fcAuthHours\": 1,\r\n \"hours\": 1,\r\n \"sessionId\": 84290,\r\n \"sessionName\": \"信託在職-組合式商品簡介 (105-03)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 13372,\r\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/04/01\",\r\n \"enrollEnd\": \"2016/04/30\",\r\n \"fcAuthHours\": 1,\r\n \"hours\": 1,\r\n \"sessionId\": 85914,\r\n \"sessionName\": \"信託在職-組合式商品簡介 (105-04)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1871,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 1.5,\r\n \"hours\": 1.5,\r\n \"sessionId\": 82154,\r\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-01)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1871,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 1.5,\r\n \"hours\": 1.5,\r\n \"sessionId\": 83629,\r\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-02)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1871,\r\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/31\",\r\n \"fcAuthHours\": 1.5,\r\n \"hours\": 1.5,\r\n \"sessionId\": 84289,\r\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-03)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1871,\r\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/04/01\",\r\n \"enrollEnd\": \"2016/04/30\",\r\n \"fcAuthHours\": 1.5,\r\n \"hours\": 1.5,\r\n \"sessionId\": 85913,\r\n \"sessionName\": \"信託在職-信託業務綜覽【I】(105-04)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 16788,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 2,\r\n \"hours\": 2,\r\n \"sessionId\": 82162,\r\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-01)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 16788,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 2,\r\n \"hours\": 2,\r\n \"sessionId\": 83638,\r\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-02)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 16788,\r\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/31\",\r\n \"fcAuthHours\": 2,\r\n \"hours\": 2,\r\n \"sessionId\": 84297,\r\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-03)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 16788,\r\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/04/01\",\r\n \"enrollEnd\": \"2016/04/30\",\r\n \"fcAuthHours\": 2,\r\n \"hours\": 2,\r\n \"sessionId\": 85921,\r\n \"sessionName\": \"信託在職─「TIPS信託投資系統操作說明」+ 「TRMS系統說明」(105-04)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1866,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 0.5,\r\n \"hours\": 0.5,\r\n \"sessionId\": 82153,\r\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-01)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1866,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 0.5,\r\n \"hours\": 0.5,\r\n \"sessionId\": 83628,\r\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-02)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1866,\r\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/31\",\r\n \"fcAuthHours\": 0.5,\r\n \"hours\": 0.5,\r\n \"sessionId\": 84286,\r\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-03)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1866,\r\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/04/01\",\r\n \"enrollEnd\": \"2016/04/30\",\r\n \"fcAuthHours\": 0.5,\r\n \"hours\": 0.5,\r\n \"sessionId\": 85911,\r\n \"sessionName\": \"信託在職-「有價證券信託」暨「規劃型金錢信託」(105-04)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 16816,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 1,\r\n \"hours\": 1,\r\n \"sessionId\": 82163,\r\n \"sessionName\": \"信託在職─信託業務綜覽【II】(105-01)(繁中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 16816,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(繁中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 1,\r\n \"hours\": 1,\r\n \"sessionId\": 83639,\r\n \"sessionName\": \"信託在職─信託業務綜覽【II】(105-02)(繁中)\"\r\n }\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultCN = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 34014,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 8,\r\n \"hours\": 8,\r\n \"sessionId\": 82150,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105-01)(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 34014,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 8,\r\n \"hours\": 8,\r\n \"sessionId\": 83621,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105-02)(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 34014,\r\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/31\",\r\n \"fcAuthHours\": 8,\r\n \"hours\": 8,\r\n \"sessionId\": 84282,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105-03)(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 34014,\r\n \"courseTime\": \"2016/01/01 ~ 2016/12/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollBegin\": \"2016/01/01\",\r\n \"enrollEnd\": \"2016/12/31\",\r\n \"fcAuthHours\": 8,\r\n \"hours\": 8,\r\n \"sessionId\": 85908,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105年)(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 34014,\r\n \"courseTime\": \" ~ \",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(簡中)\",\r\n \"enrollBegin\": \"\",\r\n \"enrollEnd\": \"\",\r\n \"fcAuthHours\": 8,\r\n \"hours\": 8,\r\n \"sessionId\": 86934,\r\n \"sessionName\": \"信託業務人員職前訓練課程(105年)(複製)(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 963,\r\n \"courseTime\": \"2016/02/20 ~ 2016/02/20\",\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程(簡中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/01\",\r\n \"fcAuthHours\": 4,\r\n \"hours\": 4,\r\n \"sessionId\": 83791,\r\n \"sessionName\": \"2016-0220信託業務人員職前訓練(4小時)-台北場(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 963,\r\n \"courseTime\": \"2016/03/12 ~ 2016/03/12\",\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程(簡中)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/01\",\r\n \"fcAuthHours\": 4,\r\n \"hours\": 4,\r\n \"sessionId\": 83792,\r\n \"sessionName\": \"2016-0312信託業務人員職前訓練(4小時)-高雄場(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 963,\r\n \"courseTime\": \"2016/03/26 ~ 2016/03/26\",\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程(簡中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/01\",\r\n \"fcAuthHours\": 4,\r\n \"hours\": 4,\r\n \"sessionId\": 85389,\r\n \"sessionName\": \"2016-0326信託業務人員職前訓練(4小時)-台北場(簡中)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 963,\r\n \"courseTime\": \"2016/04/09 ~ 2016/04/09\",\r\n \"courseType\": 3,\r\n \"courseTypeName\": \"外訓課程(簡中)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/01\",\r\n \"fcAuthHours\": 4,\r\n \"hours\": 4,\r\n \"sessionId\": 85570,\r\n \"sessionName\": \"2016-0409信託業務人員職前訓練(4小時)-台中場(簡中)\"\r\n },\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n resultUS = {\r\n \"Status\": \"200\",\r\n \"Data\": [{\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1861,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 3,\r\n \"hours\": 3,\r\n \"sessionId\": 82152,\r\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-01)(英文)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1861,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 3,\r\n \"hours\": 3,\r\n \"sessionId\": 83627,\r\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-02)(英文)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1861,\r\n \"courseTime\": \"2016/03/01 ~ 2016/03/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/03/01\",\r\n \"enrollEnd\": \"2016/03/31\",\r\n \"fcAuthHours\": 3,\r\n \"hours\": 3,\r\n \"sessionId\": 84284,\r\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-03)(英文)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 1861,\r\n \"courseTime\": \"2016/04/01 ~ 2016/04/30\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/04/01\",\r\n \"enrollEnd\": \"2016/04/30\",\r\n \"fcAuthHours\": 3,\r\n \"hours\": 3,\r\n \"sessionId\": 85910,\r\n \"sessionName\": \"信託在職-結構型商品理論與實務(105-04)(英文)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 13372,\r\n \"courseTime\": \"2016/01/04 ~ 2016/01/31\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/01/04\",\r\n \"enrollEnd\": \"2016/01/31\",\r\n \"fcAuthHours\": 1,\r\n \"hours\": 1,\r\n \"sessionId\": 82155,\r\n \"sessionName\": \"信託在職-組合式商品簡介 (105-01)(英文)\"\r\n },\r\n {\r\n \"classificationId\": 0,\r\n \"classificationName\": \"\",\r\n \"courseId\": 13372,\r\n \"courseTime\": \"2016/02/01 ~ 2016/02/29\",\r\n \"courseType\": 1,\r\n \"courseTypeName\": \"線上課程(英文)\",\r\n \"enrollBegin\": \"2016/02/01\",\r\n \"enrollEnd\": \"2016/02/29\",\r\n \"fcAuthHours\": 1,\r\n \"hours\": 1,\r\n \"sessionId\": 83630,\r\n \"sessionName\": \"信託在職-組合式商品簡介 (105-02)(英文)\"\r\n },\r\n ],\r\n \"ErrorMessage\": \"\"\r\n };\r\n switch (params.LanguageCode) {\r\n case \"en-US\":\r\n result = resultUS;\r\n break;\r\n case \"zh-CN\":\r\n result = resultCN;\r\n break;\r\n default:\r\n result = resultTW;\r\n break;\r\n }\r\n //result = resultEmpty; //QQ\r\n return { data: result };\r\n }\r\n /**\r\n * 21.金融證照紀錄申請\r\n * @returns\r\n */\r\n function LearningRecordCommit() {\r\n var result = {\r\n Status: '200',\r\n Data: null,\r\n ErrorMessage: '',\r\n };\r\n return { data: result };\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('bulletinService', bulletinService);\r\n\r\n function bulletinService(apiUrl, $http, sysCode, commonService, $q, headerService) {\r\n var service = {\r\n getByNo: getByNo,\r\n getMore: getMore,\r\n getNoticeMore: getNoticeMore,\r\n getMoreByChoice: getMoreByChoice,\r\n getByNoForTsun: getByNoForTsun,\r\n donwloadStampForUrl: donwloadStampForUrl,\r\n checkHeadStatus: checkHeadStatus,\r\n getStampFile: getStampFile,\r\n getTsunMoreList: getTsunMoreList\r\n };\r\n\r\n var url = apiUrl.tsApi + 'bulletin/';\r\n var noticeUrl = apiUrl.tsApi + 'notifyCenter/';\r\n\r\n function getByNo(bulletinSerilNo) {\r\n var param = {\r\n bulletinSerilNo: bulletinSerilNo\r\n };\r\n commonService.setParams(param);\r\n headerService.saveEnforcementReadRecord(bulletinSerilNo);\r\n return $http.post(url + 'bulletin', param);\r\n }\r\n\r\n function getByNoForTsun(notifySerilNo) {\r\n var param = {\r\n notifySerilNo: notifySerilNo,\r\n menuSerilNo: getMenuQueryString()\r\n };\r\n commonService.setParams(param);\r\n headerService.saveEnforcementReadRecord(notifySerilNo);\r\n return $http.post(noticeUrl + 'noticeGetForPerson', param);\r\n }\r\n\r\n function getMore(siteCode, isHistory) {\r\n var param = {\r\n siteCode: siteCode,\r\n menuSerilNo: getMenuQueryString()\r\n };\r\n commonService.setParams(param);\r\n if (isHistory) {\r\n var bulletinCache = JSON.parse(sessionStorage.getItem('bulletinCache'));\r\n if (bulletinCache) {\r\n if (bulletinCache.menuItem) {\r\n param.menuSerilNo = bulletinCache.menuItem.menuSerilNo;\r\n }\r\n if (bulletinCache.typeSerilNo) {\r\n param.bulletinTypeSerilNo = bulletinCache.typeSerilNo;\r\n }\r\n }\r\n }\r\n return $http.post(url + 'more', param);\r\n }\r\n\r\n function getTsunMoreList(param) {\r\n\r\n commonService.setParams(param);\r\n return $http.post(url + 'noticeMoreList', param);\r\n }\r\n\r\n function getNoticeMore() {\r\n var param = {\r\n menuSerilNo: getMenuQueryString()\r\n };\r\n commonService.setParams(param);\r\n return $http.post(url + 'noticeMore', param);\r\n }\r\n\r\n function getMoreByChoice(param) {\r\n commonService.setParams(param);\r\n return $http.post(url + 'bulletinChoiceByLogin', param);\r\n }\r\n\r\n function checkHeadStatus() {\r\n \r\n return $q.when(true);\r\n }\r\n\r\n function donwloadStampForUrl(param) {\r\n //2023-07-21 Johnson ��w2023\r\n console.log('donwloadStampForUrl:visualpageController�w����');\r\n\r\n }\r\n\r\n function getStampFile(attachmentSerilNo) {\r\n // console.log(format('{0}download/{1}/{2}/{3}/{4}/{5}',\r\n // url, attachmentSerilNo, sysCode, getMenuQueryString(),\r\n // sessionStorage.getItem('token'), sessionStorage.getItem('perSerilNo')))\r\n return format('{0}download/{1}/{2}/{3}/{4}/{5}',\r\n url, attachmentSerilNo, sysCode, getMenuQueryString(),\r\n sessionStorage.getItem('token'), sessionStorage.getItem('perSerilNo'));\r\n }\r\n\r\n return service;\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('commonService', commonService);\r\n\r\n function commonService(sysCode, $rootScope, $http, apiUrl) {\r\n var service = {\r\n setParams: setParams,\r\n getFileType: getFileType,\r\n setCtmsParams: setCtmsParams,\r\n saveLogFlow: saveLogFlow,\r\n ctmsFilePath: ctmsFilePath,\r\n showImg: showImg,\r\n showVedio: showVedio,\r\n windowChecker: windowChecker,\r\n setOneWindow: setOneWindow,\r\n fetchDecyrptForDirectModifyDto: fetchDecyrptForDirectModifyDto,\r\n URLCheck:URLCheck,\r\n };\r\n return service;\r\n\r\n function setOneWindow(varWindow) {\r\n //因為整個外網要共用同一個另開分頁(new Window),因此要統一由這邊判斷。\r\n if (!windowChecker(varWindow)) {\r\n varWindow = window.open();\r\n }\r\n if (!$rootScope.newWindows) {\r\n $rootScope.newWindows = [];\r\n }\r\n _.forEach($rootScope.newWindows, function (perWindow) {\r\n if (windowChecker(perWindow)) {\r\n perWindow.close();\r\n }\r\n });\r\n $rootScope.newWindows = [varWindow];\r\n return varWindow;\r\n }\r\n\r\n function windowChecker(varWindow) {\r\n //驗證是否為視窗。\r\n var windowChecker = varWindow || {};\r\n return windowChecker.self === windowChecker;\r\n }\r\n\r\n function ctmsFilePath(path) {\r\n var returnPath = sessionStorage.getItem('ctmsFileUrl') + path;\r\n return returnPath.replace(\"\\\\\", \"/\");\r\n }\r\n\r\n function saveLogFlow(url) {\r\n url = url.split('?');\r\n if (url.length > 1) {\r\n _(url).forEach(function (item) {\r\n if (item.match('menu') !== null) {\r\n var menuSerilNo = parseInt(item.split('=')[1]);\r\n var param = {\r\n menuSerilNo: menuSerilNo,\r\n menuClickLogCreatePerSerilNo: sessionStorage.getItem('perSerilNo'),\r\n langSerilNo: sessionStorage.getItem('langCode')\r\n };\r\n $http.post(apiUrl.tsApi + 'log/postFlow', param);\r\n }\r\n });\r\n }\r\n }\r\n function URLCheck(url){\r\n return url.replace(//g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''')\r\n .replace(/[<>!]|(\\(\\))|((for|while|if)\\s*\\(.*\\))/g, '');\r\n }\r\n\r\n function setParams(param) {\r\n if (sessionStorage.getItem('langCode')) {\r\n param.langSerilNo = sessionStorage.getItem('langCode');\r\n } else {\r\n param.langSerilNo = 1;\r\n }\r\n\r\n if (sessionStorage.getItem('token')) {\r\n param.token = sessionStorage.getItem('token');\r\n } else {\r\n param.token = \"\";\r\n }\r\n\r\n if (sessionStorage.getItem('perSerilNo')) {\r\n param.perSerilNo = sessionStorage.getItem('perSerilNo');\r\n } else {\r\n param.perSerilNo = \"\";\r\n }\r\n param.sysCode = sysCode;\r\n }\r\n\r\n function setCtmsParams(param) {\r\n param.UserId = $rootScope.userInfo.userAccount;\r\n param.LanguageCode = sessionStorage.getItem('userLang');\r\n param.tkn = sessionStorage.getItem('token');\r\n }\r\n\r\n function getFileType(fileName) {\r\n return fileName.split('.')[fileName.split('.').length - 1];\r\n }\r\n\r\n function showImg(attachmentType) {\r\n if (attachmentType) {\r\n switch (attachmentType.toLocaleLowerCase()) {\r\n case 'png':\r\n return true;\r\n case \"jpg\":\r\n return true;\r\n case 'jpeg':\r\n return true;\r\n case 'gif':\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n function showVedio(attachmentType) {\r\n if (attachmentType) {\r\n switch (attachmentType.toLocaleLowerCase()) {\r\n case 'mp4':\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n function fetchDecyrptForDirectModifyDto(param) {\r\n let newApiURL = apiUrl.tsApi + `function/fetchDecyrptForDirectModifyDto`;\r\n newApiURL = URLCheck(newApiURL)\r\n //2023-07-18 Johnson 資安2023\r\n return eval(function (p, a, c, k, e, r) { e = String; if (!''.replace(/^/, String)) { while (c--) r[c] = k[c] || c; k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('$0.1(2,{3:4});', 5, 5, 'http|get|newApiURL|params|param'.split('|'), 0, {}))\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('ctmsService', ctmsService);\r\n\r\n function ctmsService(commonService, isTestMode, $http, apiUrl, enumService, testData, $rootScope, $q, blockUI) {\r\n var service = {\r\n MyTrainingPoint: MyTrainingPoint,\r\n SysTypesList: SysTypesList,\r\n ActivityTypesUnderClassification: ActivityTypesUnderClassification,\r\n FCLicenseList: FCLicenseList,\r\n CourseItem: CourseItem,\r\n PublishedActivity: PublishedActivity,\r\n CourseSession: CourseSession,\r\n ExamSurveyContent: ExamSurveyContent,\r\n InteractionData: InteractionData,\r\n MyUnfinishedActivities: MyUnfinishedActivities,\r\n MyFinishedActivities: MyFinishedActivities,\r\n EnrollmentAvailableAction: EnrollmentAvailableAction,\r\n EnrollmentAction: EnrollmentAction,\r\n FCCertificatedLicenseAdd: FCCertificatedLicenseAdd,\r\n FCCertificatedLicenseList: FCCertificatedLicenseList,\r\n FCAuthorizedHoursList: FCAuthorizedHoursList,\r\n ExternalTrainingApplication: ExternalTrainingApplication,\r\n FCEnrollableActivities: FCEnrollableActivities,\r\n LearningRecordCommit: LearningRecordCommit,\r\n getStampFile: getStampFile,\r\n };\r\n return service;\r\n function MyTrainingPoint(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.MyTrainingPoint(params.Annual);\r\n }\r\n else {\r\n apiResult = callCtmsApi('MyTrainingPoint.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'MyTrainingPoint.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function SysTypesList(params) {\r\n var apiResult;\r\n // console.log(\"SysTypesList params:\",params);\r\n if (isTestMode) {\r\n apiResult = testData.SysTypesList(params.Type);\r\n }\r\n else {\r\n apiResult = callCtmsApi('SysTypesList.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'SysTypesList.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function ActivityTypesUnderClassification(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = null;\r\n }\r\n else {\r\n apiResult = callCtmsApi('ActivityTypesUnderClassification.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'ActivityTypesUnderClassification.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function FCLicenseList(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.FCLicenseList(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('FCLicenseList.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'FCLicenseList.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function CourseItem(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.CourseItem(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('CourseItem.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'CourseItem.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function PublishedActivity(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.PublishedActivity(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('PublishedActivity.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'PublishedActivity.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function CourseSession(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.CourseSession(params.CourseType);\r\n }\r\n else {\r\n apiResult = callCtmsApi('CourseSession.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'CourseSession.do');\r\n //console.log('sunnet CourseSession result:',returnResult);\r\n return returnResult;\r\n });\r\n }\r\n\r\n function ExamSurveyContent(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.ExamSurveyContent(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('ExamSurveyContent.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'ExamSurveyContent.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function InteractionData(params) {\r\n blockUI.start();\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.InteractionData(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('InteractionData.do', params);\r\n // apiResult = $http.post(apiUrl.tsApi+'ctms/InteractionData', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n blockUI.stop();\r\n var returnResult = ctmsResultFormat(data, 'InteractionData.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function MyUnfinishedActivities(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.MyUnfinishedActivities(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('MyUnfinishedActivities.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n\r\n var returnResult = ctmsResultFormat(data, 'MyUnfinishedActivities.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function MyFinishedActivities(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.MyFinishedActivities(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('MyFinishedActivities.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'MyFinishedActivities.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function EnrollmentAvailableAction(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.EnrollmentAvailableAction(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('EnrollmentAvailableAction.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'EnrollmentAvailableAction.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function EnrollmentAction(params) {\r\n\r\n // 測試錯誤情況\r\n // params.IsProgram = 1;\r\n\r\n // Block the user interface\r\n blockUI.start();\r\n\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.EnrollmentAction(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('EnrollmentAction.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n\r\n // Unblock the user interface\r\n blockUI.stop();\r\n\r\n // console.log('####################')\r\n // console.log(data)\r\n var returnResult = ctmsResultFormat(data, 'EnrollmentAction.do');\r\n if (typeof (returnResult.success) !== 'undefined' && !returnResult.success) {\r\n //代表動作失敗\r\n //var errorMsg = returnResult.failMessage || '';\r\n var errorMsg = '';\r\n var errorCode = returnResult.failCode || '0';\r\n errorCode = errorCode + '';\r\n switch (errorCode) {\r\n case '0':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll0;\r\n break;\r\n case '1':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll1;\r\n break;\r\n case '2':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll2;\r\n break;\r\n case '3':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll3;\r\n break;\r\n case '4':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll4;\r\n break;\r\n case '5':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll5;\r\n break;\r\n case '6':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll6;\r\n break;\r\n case '7':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll7;\r\n break;\r\n case '8':\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll8;\r\n break;\r\n default:\r\n errorMsg += $rootScope.translate.tsunErrorCourseEnroll0;\r\n break;\r\n }\r\n toastr.warning($rootScope.translate.tsunSendError + \":\" + errorMsg);\r\n //==\r\n return false;\r\n }\r\n return returnResult;\r\n });\r\n }\r\n\r\n function FCCertificatedLicenseAdd(params) {\r\n blockUI.start();\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.FCCertificatedLicenseAdd(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('FCCertificatedLicenseAdd.do', params);\r\n // apiResult = $http.post(apiUrl.tsApi+'ctms/FinacialLicienceApply', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n blockUI.stop();\r\n var returnResult = ctmsResultFormat(data, 'FCCertificatedLicenseAdd.do');\r\n // console.log('FCCertificatedLicenseAdd returnResult:',returnResult);\r\n return returnResult;\r\n });\r\n }\r\n\r\n function FCCertificatedLicenseList(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.FCCertificatedLicenseList(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('FCCertificatedLicenseList.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'FCCertificatedLicenseList.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function FCAuthorizedHoursList(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.FCAuthorizedHoursList(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('FCAuthorizedHoursList.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'FCAuthorizedHoursList.do');\r\n return returnResult;\r\n });\r\n }\r\n\r\n function ExternalTrainingApplication(params) {\r\n blockUI.start();\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.ExternalTrainingApplication(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('ExternalTrainingApplication.do', params);\r\n // apiResult = $http.post(apiUrl.tsApi+'ctms/ExternalCourseApply', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n blockUI.stop();\r\n var returnResult = ctmsResultFormat(data, 'ExternalTrainingApplication.do');\r\n // console.log(\"ExternalTrainingApplication return data:\",returnResult);\r\n //=========\r\n var isSuccess = (returnResult.failCode + '' === '-1'); \r\n if (isSuccess === false) {\r\n var errorMsg = '';\r\n var errorCode = returnResult.failCode || '0';\r\n errorCode = errorCode + '';\r\n switch (errorCode) {\r\n case '0':\r\n errorMsg += $rootScope.translate.tsunErrorExternalApplication0;\r\n break;\r\n case '1':\r\n errorMsg += $rootScope.translate.tsunErrorExternalApplication1;\r\n break;\r\n case '2':\r\n errorMsg += $rootScope.translate.tsunErrorExternalApplication2;\r\n break;\r\n case '3':\r\n errorMsg += $rootScope.translate.tsunErrorExternalApplication3;\r\n break;\r\n }\r\n toastr.warning($rootScope.translate.tsunSendError + \":\" + errorMsg);\r\n }\r\n return isSuccess;\r\n });\r\n }\r\n\r\n function FCEnrollableActivities(params) {\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.FCEnrollableActivities(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('FCEnrollableActivities.do', params);\r\n }\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'FCEnrollableActivities.do');\r\n return returnResult;\r\n });\r\n }\r\n function LearningRecordCommit(params) {\r\n\r\n // chris: log for mobile\r\n //postException(`ctms-learning-record: ${JSON.stringify(params)}`, apiUrl)\r\n\r\n console.log('LearningRecordCommit param:',params);\r\n var apiResult;\r\n if (isTestMode) {\r\n apiResult = testData.LearningRecordCommit(params);\r\n }\r\n else {\r\n apiResult = callCtmsApi('LearningRecordCommit.do', params);\r\n }\r\n \r\n //console.log('LearningRecordCommit Result:',apiResult);\r\n return $q.when(apiResult).then(function (data) {\r\n var returnResult = ctmsResultFormat(data, 'LearningRecordCommit.do');\r\n return returnResult;\r\n });\r\n }\r\n function callCtmsApi(action, params) {\r\n var actionUrl = apiUrl.ctmsApi + action;\r\n return $http.post(actionUrl, params, {\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n }\r\n\r\n function ctmsResultFormat(result, apiAction) {\r\n var resultData = result.data;\r\n var returnResult = null;\r\n switch (resultData.Status + '') {\r\n case '200':\r\n if(resultData.ErrorMessage){\r\n toastr.warning(resultData.ErrorMessage);\r\n }else{\r\n returnResult = resultData.Data || {};\r\n }\r\n //console.log('returnResult 200 :',resultData.Data);\r\n break;\r\n case '400':\r\n // toastr.warning($rootScope.translate.tsunSendError + \"Api[\" + apiAction + \"],\" + resultData.ErrorMessage);\r\n toastr.warning($rootScope.translate.tsunSendError + ':' + resultData.ErrorMessage);\r\n returnResult = false;\r\n break;\r\n default:\r\n apiAction = apiAction || '';\r\n var errorLog = \" Error,call sunNet Api[\" + apiAction + \"], msg:\" + resultData.ErrorMessage;\r\n postException(errorLog, apiUrl);\r\n showSystemError();\r\n returnResult = false;\r\n break;\r\n }\r\n //console.log('returnResult:',returnResult);\r\n return returnResult;\r\n }\r\n\r\n function getStampFile(attachmentPath, attachmentName) {\r\n\t\t\t\r\n\t\t\t\r\n console.log('getStampFile apiUrl:', apiUrl.tsApi + 'ctms/DownloadPdf');\r\n console.log('getStampFile token:', sessionStorage.getItem('token'));\r\n console.log('getStampFile SysCode:', 'MHR');\r\n console.log('getStampFile attachmentPath:', attachmentPath.replace(\".pdf\", \"\"));\r\n console.log('getStampFile attachmentName', attachmentName);\r\n console.log('getStampFile attachmentPath:', attachmentPath.replace(\"/\", \"_\").replace(\"\\\\\", \"_\").replace(\".pdf\", \"\"));\r\n\r\n return format('{0}/{1}/{2}/{3}/{4}',\r\n apiUrl.tsApi + 'ctms/DownloadPdf', sessionStorage.getItem('token'), \"MHR\", attachmentPath.replaceAll(\"/\", \"_\").replaceAll(\"\\\\\", \"_\").replace(\".pdf\", \"\"), attachmentName);\r\n \r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('e2eService', e2eService);\r\n\r\n function e2eService() {\r\n var service = {\r\n login: login,\r\n forgetPwd: forgetPwd,\r\n forceEditPwd: forceEditPwd,\r\n register: register,\r\n editPwdModal: editPwdModal,\r\n contactMe: contactMe,\r\n directEditPwd: directEditPwd\r\n };\r\n\r\n return service;\r\n\r\n ////////////////\r\n function login(param) {\r\n //2023-07-10 Johnson ��w2023\r\n return param;\r\n }\r\n\r\n function forgetPwd(param) {\r\n //2023-07-10 Johnson ��w2023\r\n }\r\n\r\n function forceEditPwd(params) {\r\n //2023-07-10 Johnson ��w2023\r\n }\r\n\r\n function register(params) {\r\n //2023-07-10 Johnson ��w2023\r\n }\r\n\r\n function editPwdModal(params) {\r\n //2023-07-10 Johnson ��w2023\r\n }\r\n\r\n function contactMe(params) {\r\n //2023-07-10 Johnson ��w2023\r\n }\r\n\r\n function directEditPwd(param) {\r\n //2023-07-10 Johnson ��w2023\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('enumService', enumService);\r\n\r\n function enumService() {\r\n var service = {\r\n sso: {},\r\n redirectType: {},\r\n target: {},\r\n sendTarget: {},\r\n siteCode: {},\r\n courseType: {}\r\n };\r\n\r\n service.sso = {\r\n success: '100',\r\n notExist: '201',\r\n disable: '202',\r\n isLock: '203',\r\n lockUnReslove: '204',\r\n dwpError: '205',//2023-07-10 Johnson 資安2023\r\n tokenNotExist: '206',\r\n notHaveEmail: '210',\r\n notHavePhone: '211',\r\n notFindAccount: '212',\r\n emailAlreadyRegister: '219',\r\n dwpMustBigThan: '220',//2023-07-10 Johnson 資安2023\r\n dwpNotSameAccount: '221',//2023-07-10 Johnson 資安2023\r\n dwpJustEnAndNumber: '222',//2023-07-10 Johnson 資安2023\r\n dwpNeedContainEnAndNumber: '223',//2023-07-10 Johnson 資安2023\r\n dwpNotContainueThree: '224',//2023-07-10 Johnson 資安2023\r\n dwpNotContainueThreeOrderAndDesc: '225',//2023-07-10 Johnson 資安2023\r\n dwpNotSameRecent: '226',//2023-07-10 Johnson 資安2023\r\n accountIsNotActive: '227',\r\n verifyCodeNotExist: '228',\r\n verifyCodeExpired: '229',\r\n dwpModifyWeek: '230',//2023-07-10 Johnson 資安2023\r\n dwpErrorIsLock: '231',//2023-07-10 Johnson 資安2023\r\n mustModifydwP: '232',//2023-07-10 Johnson 資安2023\r\n verifyCodeNotPass: '234',\r\n illegalRegister: '235',\r\n newdwPNotSameOlddwP: '236',\r\n userAlreadyValidate: '237',\r\n waitForLock: '238',\r\n error: '300',\r\n verifyCodeInValid: '500',\r\n isTaiEmail: '301',\r\n reCaptchaFail:'999'\r\n };\r\n\r\n service.redirectType = {\r\n direct: 0,\r\n open: 1\r\n };\r\n\r\n service.target = {\r\n open: 1,\r\n wrap: 2,\r\n direct: 3\r\n };\r\n\r\n service.sendTarget = {\r\n email: 1,\r\n sms: 2\r\n };\r\n\r\n service.siteCode = {\r\n hrInside: 1,\r\n hrOutside: 2,\r\n hrAdmin: 3,\r\n tsunOut: 4,\r\n tsunInside: 5\r\n };\r\n\r\n service.courseType = {\r\n webCourse: 1,\r\n classCourse: 2,\r\n externalCourse: 3,\r\n webTest: 4,\r\n classTest: 5,\r\n questList: 6,\r\n courage: 7\r\n };\r\n\r\n return service;\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('headerService', headerService);\r\n\r\n function headerService(apiUrl, $http, commonService, loginService) {\r\n var service = {\r\n getSearch: getSearch,\r\n getMenuName: getMenuName,\r\n getSearchResult: getSearchResult,\r\n searchMsg: searchMsg,\r\n getRelatedFunctions: getRelatedFunctions,\r\n getMenuManagers: getMenuManagers,\r\n contactMe: contactMe,\r\n getUrlSetting: getUrlSetting,\r\n setFontSize: setFontSize,\r\n getFontSize: getFontSize,\r\n saveEnforcementReadRecord: saveEnforcementReadRecord,\r\n saveBulletinClickingAttachment: saveBulletinClickingAttachment,\r\n saveMenuClickingAttachment: saveMenuClickingAttachment,\r\n saveLearnLog: saveLearnLog,\r\n getMenuList: getMenuList\r\n };\r\n\r\n var headerUrl = apiUrl.tsApi + 'header/';\r\n\r\n\r\n function getSearch(keyWord, siteCode) {\r\n\r\n var param = {\r\n keyWord: keyWord,\r\n SiteCode: siteCode,\r\n CurrentMenuSerilNo: getMenuQueryString()\r\n };\r\n commonService.setParams(param);\r\n return $http.post(headerUrl + 'getSearch/', param);\r\n }\r\n\r\n function getSearchResult(keyWord, currentPage, searchResultType, siteCode,needLog) {\r\n var param = {\r\n keyWord: keyWord,\r\n SiteCode: siteCode,\r\n currentPage: currentPage,\r\n searchResultEnum: searchResultType,\r\n needKeywordLog : needLog\r\n };\r\n commonService.setParams(param);\r\n return $http.post(headerUrl + 'getSearchResult/', param);\r\n }\r\n\r\n function getMenuName(menuId) {\r\n let newApiURL = headerUrl + 'getMenuName/' + menuId;\r\n newApiURL = commonService.URLCheck(newApiURL);\r\n //2023-07-20 Johnson 資安2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$0.1(2);',3,3,'http|get|newApiURL'.split('|'),0,{}))\r\n }\r\n\r\n function searchMsg(msg) {\r\n return msg;\r\n }\r\n\r\n function getRelatedFunctions(menuId) {\r\n let newApiURL = headerUrl + 'getRelatedFunctions/2/' + menuId;\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n //2023-07-20 Johnson 資安2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$0.1(2);',3,3,'http|get|newApiURL'.split('|'),0,{}))\r\n }\r\n\r\n function getMenuManagers(menuId) {\r\n let newApiURL = headerUrl + 'getMenuManagers/' + menuId;\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n //2023-07-20 Johnson 資安2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$0.1(2);',3,3,'http|get|newApiURL'.split('|'),0,{}))\r\n }\r\n\r\n function contactMe(param) {\r\n //recaptcha.response = recaptcha.response + 'ee';\r\n \r\n return $http.post(headerUrl + 'PostContactMe', param).then(function (res) {\r\n if (res.data === true) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n });\r\n\r\n\r\n //未登入狀態下,先做reCaptcha驗證\r\n // return $http.post(apiUrl.tsApi + 'validate/gRecaptchaValidate', vm.reCaptcha).then(function (verifyResult) {\r\n // if (verifyResult.data.success) {\r\n // headerService.contactMe(vm.data).then(function () {\r\n // toastr.success($rootScope.translate.sendMailSuccess);\r\n // $uibModalInstance.dismiss('cancel');\r\n // });\r\n // } else {\r\n // //Error Handler write here\r\n // toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n // return false;\r\n // }\r\n // });\r\n }\r\n\r\n function getUrlSetting() {\r\n var param = {};\r\n commonService.setParams(param);\r\n return $http.post(headerUrl + 'getUrlSetting', param);\r\n }\r\n\r\n function setFontSize(fontSize) {\r\n var param = {\r\n fontSize: fontSize\r\n };\r\n commonService.setParams(param);\r\n return $http.post(headerUrl + 'setFontSize', param);\r\n }\r\n\r\n function getFontSize() {\r\n if (sessionStorage.getItem('perSerilNo')) {\r\n let newApiURL = headerUrl + 'getFontSize/' + sessionStorage.getItem('langCode') + '/' + sessionStorage.getItem('perSerilNo');\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n //2023-07-20 Johnson 資安2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$2.3(4+\\'5/\\'+0.1(\\'6\\')+\\'/\\'+0.1(\\'7\\'));',8,8,'sessionStorage|getItem|http|get|headerUrl|getFontSize|langCode|perSerilNo'.split('|'),0,{}))\r\n } else {\r\n let newApiURL = headerUrl + 'getFontSize/' + sessionStorage.getItem('langCode');\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n //2023-07-20 Johnson 資安2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$0.1(2+\\'3/\\'+4.5(\\'6\\'));',7,7,'http|get|headerUrl|getFontSize|sessionStorage|getItem|langCode'.split('|'),0,{}))\r\n }\r\n }\r\n\r\n function saveEnforcementReadRecord(bulletinSerilNo) {\r\n var param = {\r\n bulletinSerilNo: bulletinSerilNo,\r\n perSerilNo: sessionStorage.getItem('perSerilNo')\r\n };\r\n return $http.post(headerUrl + 'saveEnforcementReadRecord/', param);\r\n }\r\n\r\n function saveBulletinClickingAttachment(params) {\r\n $http.post(apiUrl.tsApi + 'log/saveBulletinClickingAttachment', params);\r\n }\r\n\r\n function saveMenuClickingAttachment(param) {\r\n $http.post(apiUrl.tsApi + 'log/saveMenuClickingAttachment', param);\r\n }\r\n\r\n function saveLearnLog(str) {\r\n $http.post(apiUrl.tsApi + 'log/saveLearnLog', str);\r\n }\r\n\r\n function getMenuList() {\r\n var menuparam = {\r\n LangSerilNo: sessionStorage.getItem('langCode'),\r\n userLang: sessionStorage.getItem('userLang'),\r\n SiteCode: \"2,4\",\r\n PerSerilNo: sessionStorage.getItem('perSerilNo'),\r\n IsNormal: true,\r\n IsSpecial: false,\r\n IsSetting: false\r\n };\r\n return $http.post(apiUrl.tsApi + 'menu/getMobileMenuList', menuparam);\r\n\r\n }\r\n\r\n return service;\r\n }\r\n})();","(function () {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('app.service')\r\n\t\t.factory('homeService', homeService);\r\n\r\n\tfunction homeService(commonService, $http, apiUrl) {\r\n\t\tvar service = {\r\n\t\t\tgetMhr: getMhr,\r\n\t\t\tgetTsu: getTsu,\r\n\t\t\tgetNext: getNext,\r\n\t\t\tgetNextMore: getNextMore\r\n\t\t};\r\n\r\n\t\tvar homeUrl = apiUrl.tsApi + 'home/';\r\n\r\n\t\tfunction getMhr() {\r\n\t\t\tvar param = {\r\n\t\t\t\tmenuSerilNo: getMenuQueryString()\r\n\t\t\t};\r\n\t\t\tcommonService.setParams(param);\r\n\t\t\treturn $http.post(homeUrl + 'getMhr', param);\r\n\t\t}\r\n\r\n\t\tfunction getTsu() {\r\n\t\t\tvar param = {\r\n\t\t\t\tmenuSerilNo: getMenuQueryString(),\r\n\t\t\t\tsiteCode: 4\r\n\t\t\t};\r\n\t\t\tcommonService.setParams(param);\r\n\t\t\treturn $http.post(homeUrl + 'getTsu', param);\r\n\t\t}\r\n\r\n\t\tfunction getNext() {\r\n\t\t\tvar param = {\r\n\t\t\t\tmenuSerilNo: getMenuQueryString(),\r\n\t\t\t\tsiteCode: 2\r\n\t\t\t\t\r\n\t\t\t};\r\n\t\t\tcommonService.setParams(param);\r\n\r\n\t\t\treturn $http.post(homeUrl + 'getNext', param);\r\n\t\t}\r\n\r\n\t\tfunction getNextMore(currentPage) {\r\n\t\t\tvar param = {\r\n\t\t\t\tcurrentPage: currentPage,\r\n\t\t\t\tmenuSerilNo: getMenuQueryString(),\r\n\t\t\t\tsiteCode: 2\r\n\t\t\t};\r\n\t\t\tcommonService.setParams(param);\r\n\t\t\treturn $http.post(homeUrl + 'getNextMore', param);\r\n\t\t}\r\n\r\n\t\treturn service;\r\n\t}\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('loginService', loginService);\r\n\r\n function loginService($http, apiUrl, enumService, $rootScope, sysCode,\r\n commonService) {\r\n var service = {\r\n login: login,\r\n loginByPerSerilNo: loginByPerSerilNo,\r\n logout: logout,\r\n tokenTransfer: tokenTransfer,\r\n tokenTransferByAccount: tokenTransferByAccount,\r\n modifyUserPassword: modifyUserPassword,\r\n forgetPWD: forgetPWD,\r\n directModifyUserPassword: directModifyUserPassword,\r\n registerOutsideUser: registerOutsideUser,\r\n checkToken: checkToken,\r\n getSsoInfo: getSsoInfo,\r\n setSsoParams: setSsoParams,\r\n get: get,\r\n editUserProfile: editUserProfile,\r\n sendVerifyCodeFromPhone: sendVerifyCodeFromPhone,\r\n verifyCodeCheckFromPhone: verifyCodeCheckFromPhone,\r\n validateTel: validateTel,\r\n getPwdConstrain: getPwdConstrain,\r\n checkVerifyCode: checkVerifyCode,\r\n produceVerifyCodeFromSignUp: produceVerifyCodeFromSignUp,\r\n verifyCodeCheckFromSignUp: verifyCodeCheckFromSignUp,\r\n // QueryCaptcha: QueryCaptcha,\r\n // chkCaptcha: chkCaptcha,\r\n\r\n };\r\n\r\n function replaceFunc(data) {\r\n if (editPwdErrorLogic(data.data.Result, data.data.ResultValue)) {\r\n return data.data;\r\n }\r\n }\r\n\r\n function basicFunc(data) {\r\n if (handleSsoLogic(data.data.Result)) {\r\n return data.data;\r\n }\r\n }\r\n\r\n function multipleSerNoFunc(data) {\r\n if (data.data.length === 1 && handleSsoLogic(data.data[0].Result, data.data[0].ResultValue)) {\r\n return data.data[0];\r\n } else if (data.data.length > 1) {\r\n return data.data;\r\n }\r\n }\r\n\r\n function setSsoParams(param) {\r\n param.sysCode = sysCode;\r\n if (sessionStorage.getItem('token')) {\r\n param.token = sessionStorage.getItem('token');\r\n }\r\n }\r\n\r\n function get() {\r\n var param = {\r\n langSerilNo : 1\r\n };\r\n \r\n return $http.post(apiUrl.tsApi + 'login', param);\r\n }\r\n\r\n function handleSsoLogic(ssoCode, resultNumber) {\r\n if (!resultNumber) {\r\n resultNumber = 1;\r\n }\r\n\r\n switch (ssoCode) {\r\n case enumService.sso.success:\r\n return true;\r\n case enumService.sso.error:\r\n toastr.error($rootScope.translate.commonErrorMessage);\r\n return false;\r\n case enumService.sso.mustModifydwP://2023-07-10 Johnson 資安2023\r\n toastr.info($rootScope.translate.ssoMustModifyPwd);\r\n return true;\r\n case enumService.sso.commonErrorMessage:\r\n toastr.error($rootScope.translate.commonErrorMessage);\r\n return false;\r\n case enumService.sso.notExist:\r\n //toastr.error($rootScope.translate.ssoAccountNotExist);\r\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\r\n return false;\r\n case enumService.sso.disable:\r\n //toastr.error($rootScope.translate.commonDisable);\r\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\r\n return false;\r\n case enumService.sso.isLock:\r\n toastr.error($rootScope.translate.commonIsLock);\r\n return false;\r\n case enumService.sso.tokenNotExist:\r\n toastr.error($rootScope.translate.commonNotExistToken);\r\n return false;\r\n case enumService.sso.dwpError://2023-07-10 Johnson 資安2023\r\n //toastr.error($rootScope.translate.commonNotExist);\r\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\r\n return false;\r\n case enumService.sso.notFindAccount:\r\n toastr.error($rootScope.translate.ssoNotFindAccount);\r\n return false;\r\n case enumService.sso.accountIsNotActive:\r\n //toastr.error($rootScope.translate.ssoAccountIsNotActive);\r\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\r\n return false;\r\n case enumService.sso.illegalRegister:\r\n toastr.error($rootScope.translate.illegalRegister);\r\n return false;\r\n case enumService.sso.dwpErrorIsLock://2023-07-10 Johnson 資安2023\r\n //toastr.error($rootScope.translate.ssoPwdErrorIsLock);\r\n toastr.error($rootScope.translate.ssoErrorInCommonUse);\r\n return false;\r\n case enumService.sso.lockUnReslove:\r\n var commonUnLock = _.replace($rootScope.translate.commonUnLock, '?', resultNumber);\r\n toastr.error(commonUnLock);\r\n return false;\r\n case enumService.sso.waitForLock:\r\n toastr.error($rootScope.translate.waitForLock);\r\n return false;\r\n case enumService.sso.isTaiEmail:\r\n toastr.warning($rootScope.translate.ssoIsTaiEmail);\r\n return false;\r\n case enumService.sso.reCaptchaFail:\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n return false;\r\n }\r\n }\r\n\r\n function editPwdErrorLogic(ssoCode, resultNumber) {\r\n var ssoPwdMustBigThan = _.replace($rootScope.translate.ssoPwdMustBigThan, '?', resultNumber);\r\n var ssoPwdNotSameRecent = _.replace($rootScope.translate.ssoPwdNotSameRecent, '?', resultNumber);\r\n var ssoPwdModifyWeek = _.replace($rootScope.translate.ssoPwdModifyWeek, '?', resultNumber);\r\n\r\n switch (ssoCode) {\r\n case enumService.sso.userAlreadyValidate:\r\n toastr.info($rootScope.translate.userAlreadyValidate);\r\n return false;\r\n case enumService.sso.dwpError://2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.commonPwdError);\r\n return false;\r\n case enumService.sso.dwpJustEnAndNumber://2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.ssoPwdJustEnAndNumber);\r\n return false;\r\n case enumService.sso.dwpMustBigThan://2023-07-10 Johnson 資安2023\r\n toastr.error(ssoPwdMustBigThan);\r\n return false;\r\n case enumService.sso.dwpNeedContainEnAndNumber://2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.ssoPwdNeedContainEnAndNumber);\r\n return false;\r\n case enumService.sso.notExist:\r\n toastr.error($rootScope.translate.ssoAccountNotExist);\r\n return false;\r\n case enumService.sso.dwpNotContainueThree://2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.ssoPwdNotContainueThree);\r\n return false;\r\n case enumService.sso.dwpNotContainueThreeOrderAndDesc://2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.ssoPwdNotContainueThreeOrderAndDesc);\r\n return false;\r\n case enumService.sso.dwpNotSameAccount://2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.ssoPwdNotSameAccount);\r\n return false;\r\n case enumService.sso.dwpNotSameRecent://2023-07-10 Johnson 資安2023\r\n toastr.error(ssoPwdNotSameRecent);\r\n return false;\r\n case enumService.sso.accountNotExist:\r\n toastr.error($rootScope.translate.ssoAccountNotExist);\r\n return false;\r\n case enumService.sso.verifyCodeExpired:\r\n toastr.error($rootScope.translate.ssoVerifyCodeExpired);\r\n return false;\r\n case enumService.sso.verifyCodeNotExist:\r\n toastr.error($rootScope.translate.ssoVerifyCodeNotExist);\r\n return false;\r\n case enumService.sso.emailAlreadyRegister:\r\n toastr.error($rootScope.translate.emailAlreadyRegister);\r\n return false;\r\n case enumService.sso.dwpModifyWeek://2023-07-10 Johnson 資安2023\r\n toastr.error(ssoPwdModifyWeek);\r\n return false;\r\n case enumService.sso.verifyCodeInValid:\r\n toastr.error($rootScope.translate.ssoVerifyCodeInValid);\r\n return false;\r\n case enumService.sso.verifyCodeNotPass:\r\n toastr.error($rootScope.translate.verifyCodeNotPass);\r\n return false;\r\n case enumService.sso.newdwPNotSameOlddwP://2023-07-10 Johnson 資安2023\r\n //2023-07-10 Johnson 資安2023\r\n toastr.error($rootScope.translate.newdwPNotSameOlddwP);\r\n return false;\r\n case enumService.sso.notHavePhone:\r\n\r\n toastr.error($rootScope.translate.ssoNotHavePhone);\r\n return false;\r\n case enumService.sso.notHaveEmail:\r\n toastr.error($rootScope.translate.ssoNotHaveEmail);\r\n return false;\r\n default:\r\n return handleSsoLogic(ssoCode);\r\n }\r\n }\r\n\r\n function login(params) {\r\n setSsoParams(params);\r\n //test error situation\r\n //recaptcha.response = recaptcha.response + 'ee';\r\n //console.log('params:', params);\r\n\r\n return $http.post(apiUrl.ssoApi + 'sso/login', params).then(function (data) {\r\n //console.log('response:', data);\r\n if (data) {\r\n return multipleSerNoFunc(data);\r\n }\r\n });\r\n }\r\n\r\n function loginByPerSerilNo(params) {\r\n setSsoParams(params);\r\n return $http.post(apiUrl.ssoApi + 'sso/loginByPerSerilNo', params).then(function (data) {\r\n return basicFunc(data);\r\n });\r\n }\r\n\r\n function logout() {\r\n var params = {\r\n 'sysCode': sysCode,\r\n 'token': sessionStorage.getItem('token')\r\n };\r\n return $http.post(apiUrl.ssoApi + 'sso/logout', params).then(function (data) {\r\n return basicFunc(data);\r\n });\r\n }\r\n\r\n function tokenTransfer(params) {\r\n return $http.post(apiUrl.ssoApi + 'sso/tokenTransfer', params).then(function (data) {\r\n return multipleSerNoFunc(data);\r\n });\r\n }\r\n\r\n function tokenTransferByAccount(params) {\r\n return $http.post(apiUrl.ssoApi + 'sso/tokenTransferByAccount', params).then(function (data) {\r\n return multipleSerNoFunc(data);\r\n });\r\n }\r\n\r\n function modifyUserPassword(params) {\r\n return getSsoInfo().then(function (data) {\r\n return data.data.userAccount;\r\n }).then(function (account) {\r\n params.userAccount = account;\r\n return $http.post(apiUrl.ssoApi + 'Password/ModifyUserPassword', params).then(function (data) {\r\n return replaceFunc(data);\r\n });\r\n });\r\n }\r\n\r\n function forgetPWD(params, recaptcha) {\r\n //test error situation\r\n //recaptcha.response = recaptcha.response + 'ee';\r\n return $http.post(apiUrl.ssoApi + 'Password/ForgetPWD', params).then(function (data) {\r\n //console.log('resData:', data.data);\r\n if (data.data) {\r\n if (editPwdErrorLogic(data.data.Result, 0)) {\r\n return data.data;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function directModifyUserPassword(params) {\r\n return $http.post(apiUrl.ssoApi + 'Password/directModifyUserPassword', params).then(function (data) {\r\n return replaceFunc(data);\r\n });\r\n }\r\n\r\n function checkToken() {\r\n var param = {};\r\n setSsoParams(param);\r\n return $http.post(apiUrl.ssoApi + 'sso/checkToken', param);\r\n }\r\n\r\n function registerOutsideUser(params) {\r\n //alert('apiUrl.ssoApi:'+apiUrl.ssoApi);\r\n return $http.post(apiUrl.ssoApi + 'user/registerOutsideUser', params).then(function (data) {\r\n if (editPwdErrorLogic(data.data.Result, data.data.ResultValue)) {\r\n return data.data;\r\n }\r\n });\r\n }\r\n\r\n function getSsoInfo() {\r\n var param = {\r\n perSerilNo: sessionStorage.getItem('perSerilNo'),\r\n sysCode: sysCode,\r\n token: sessionStorage.getItem('token')\r\n };\r\n return $http.post(apiUrl.tsApi + 'employee/ssoInfo', param);\r\n }\r\n\r\n function editUserProfile(param) {\r\n setSsoParams(param);\r\n param.perSerilNo = sessionStorage.getItem('perSerilNo');\r\n $http.post(apiUrl.tsApi + 'employee/editProfile', param).then(function () {\r\n sessionStorage.setItem('cName', param.cName);\r\n $rootScope.$emit('emitCName', param.cName);\r\n toastr.success($rootScope.translate.commonSaveSuccess);\r\n });\r\n }\r\n\r\n function sendVerifyCodeFromPhone(account, recaptcha) {\r\n var param = {\r\n userAccount: account\r\n };\r\n commonService.setParams(param);\r\n return $http.post(apiUrl.ssoApi + 'sso/produceVerifyCodeFromPhone', param).then(function (data) {\r\n return handleSsoLogic(data);\r\n });\r\n }\r\n\r\n function verifyCodeCheckFromPhone(param) {\r\n commonService.setParams(param);\r\n return $http.post(apiUrl.ssoApi + 'sso/VerifyCodeCheckFromPhone', param).then(function (data) {\r\n return replaceFunc(data);\r\n });\r\n }\r\n\r\n function validateTel(param) {\r\n return $http.post(apiUrl.ssoApi + 'user/ValidateTel', param);\r\n }\r\n\r\n function getPwdConstrain() {\r\n var params = {\r\n langSerilNo: sessionStorage.getItem('langCode'),\r\n sysCode: sysCode,\r\n token: sessionStorage.getItem('token')\r\n };\r\n return $http.post(apiUrl.ssoApi + 'password/getPwdConstrainForLanguage', params);\r\n }\r\n\r\n function checkVerifyCode(params) {\r\n return $http.post(apiUrl.ssoApi + 'user/CheckVerifyCode', params);\r\n }\r\n\r\n function produceVerifyCodeFromSignUp(param) {\r\n return $http.post(apiUrl.ssoApi + 'user/produceVerifyCodeFromSignUp', param).then(function (data) {\r\n return handleSsoLogic(data);\r\n });\r\n }\r\n\r\n function verifyCodeCheckFromSignUp(param) {\r\n return $http.post(apiUrl.ssoApi + 'user/verifyCodeCheckFromSignUp', param).then(function (data) {\r\n return handleSsoLogic(data);\r\n });\r\n }\r\n\r\n // function QueryCaptcha() {\r\n // return $http.post(apiUrl.ssoApi + 'sso/QueryCaptcha').then(function (data) {\r\n // return handleSsoLogic(data);\r\n // });\r\n // }\r\n // function chkCaptcha() {\r\n // return $http.post(apiUrl.ssoApi + 'sso/chkCaptcha').then(function (data) {\r\n // return handleSsoLogic(data);\r\n // });\r\n // }\r\n return service;\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('menuService', menuService);\r\n\r\n function menuService($location, enumService, $http, apiUrl, $window, commonService, $timeout) {\r\n var service = {\r\n redirectUrl: redirectUrl,\r\n generateUrl: generateUrl,\r\n getInformationBySerilNo: getInformationBySerilNo\r\n };\r\n\r\n var menuUrl = apiUrl.tsApi + 'menu/';\r\n\r\n function getInformationBySerilNo(menuSerilNo, langSerilNo) {\r\n let newApiURL = menuUrl + 'getByMenuSerilNo/' + menuSerilNo + '/' + langSerilNo;\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n //2023-07-20 Johnson 資安2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$0.1(2);',3,3,'http|get|newApiURL'.split('|'),0,{}))\r\n }\r\n\r\n function redirectUrl(item) {\r\n var cloneItem = _.cloneDeep(item);\r\n var param = {\r\n menuSerilNo: cloneItem.menuSerilNo\r\n };\r\n param.menuClickLogCreatePerSerilNo = '';\r\n param.langSerilNo = '';\r\n\r\n commonService.setParams(param);\r\n if (sessionStorage.getItem('perSerilNo')) {\r\n param.menuClickLogCreatePerSerilNo = sessionStorage.getItem('perSerilNo');\r\n }\r\n\r\n if (sessionStorage.getItem('langCode')) {\r\n param.langSerilNo = sessionStorage.getItem('langCode');\r\n }\r\n\r\n $http.post(apiUrl.tsApi + 'log/postFlow', param);\r\n $http.post(menuUrl + 'checkMenuIsPass', param).then(function () {\r\n redirectByTarget(cloneItem, sessionStorage.getItem('token'));\r\n });\r\n }\r\n\r\n function redirectByTarget(item, token) {\r\n\r\n // 目前外網只有一種轉頁方式: 本頁直接跳轉\r\n redirectDirect(item, token);\r\n\r\n // if (item.isWindowOpen || item.target === enumService.target.open) {\r\n // redirectOpen(item, token);\r\n // return;\r\n // }\r\n\r\n // if (item.target === enumService.target.wrap) {\r\n // redirectWrap(item, token);\r\n // return;\r\n // }\r\n\r\n // if (item.target === enumService.target.direct) {\r\n // redirectDirect(item, token);\r\n // return;\r\n // }\r\n\r\n }\r\n\r\n // function redirectOpen(item, token) {\r\n // generateUrl(item, token);\r\n // if (item.isWindowOpen) {\r\n // window.open(item.url, 'searchResult');\r\n // } else {\r\n // window.open(item.url);\r\n // }\r\n // }\r\n\r\n // function redirectWrap(item) {\r\n // $location.path('external').search('menu', item.menuSerilNo);\r\n // }\r\n\r\n function redirectDirect(item, token) {\r\n\r\n if (!isOutSideUrl(item)) {\r\n $location.path(item.url).search('menu', item.menuSerilNo);\r\n return;\r\n }\r\n\r\n if (item.sysCode) {\r\n //item.url += '?menu=' + item.menuSerilNo;\r\n generateUrl(item, token);\r\n }\r\n\r\n $timeout(function () {\r\n //console.log(item.url);\r\n $window.location.href = item.url;\r\n }, 200);\r\n }\r\n\r\n\r\n function generateUrl(item, token) {\r\n\r\n if (!isOutSideUrl(item)) {\r\n item.url = format('//{0}/#{1}', location.host, item.url);\r\n }\r\n\r\n if (sessionStorage.getItem('token') && item.sysCode) {\r\n\r\n // 為了避免用戶把網址直接複製給別人\r\n // 所以如果是自己的功能就不加上Token\r\n // 如果是其他掛載的頁面,由於不知道是去那裡,所以就給予 token 讓台新其他功能(線上差勤)取用\r\n var isInitialMenu = item.initialData;\r\n\r\n if (item.url.indexOf('?menu') > -1) {\r\n item.url = item.url.split('?menu=')[0];\r\n //console.log('1.',item.url);\r\n if (isInitialMenu) {\r\n item.url += format('?menu={0}', item.menuSerilNo);\r\n //console.log('2.',item.url);\r\n } else {\r\n item.url += format('?tkn={0}&menu={1}', token, item.menuSerilNo);\r\n //console.log('3.',item.url);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (item.url.indexOf('?') > -1) {\r\n\r\n if (isInitialMenu) {\r\n item.url += format('&menu={0}', item.menuSerilNo);\r\n //console.log('4.',item.url);\r\n } else {\r\n item.url += format('&tkn={0}&menu={1}', token, item.menuSerilNo);\r\n //console.log('5.',item.url);\r\n }\r\n return;\r\n }\r\n\r\n if (item.url.indexOf('?') === -1) {\r\n\r\n if (isInitialMenu) {\r\n item.url += format('?menu={0}', item.menuSerilNo);\r\n //console.log('6.',item.url);\r\n } else {\r\n item.url += format('?tkn={0}&menu={1}', token, item.menuSerilNo);\r\n //console.log('7.',item.url);\r\n }\r\n return;\r\n }\r\n\r\n } else {\r\n if (item.url.indexOf('?menu') > -1) {\r\n item.url = item.url.split('?menu=')[0];\r\n item.url += format('?menu={0}', item.menuSerilNo);\r\n //console.log('8.',item.url);\r\n return;\r\n }\r\n\r\n if (item.url.indexOf('?') > -1) {\r\n item.url += format('&menu={0}', item.menuSerilNo);\r\n //console.log('9.',item.url);\r\n return;\r\n }\r\n\r\n if (item.url.indexOf('?') === -1) {\r\n item.url += format('?menu={0}', item.menuSerilNo);\r\n //console.log('10.',item.url);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n function isOutSideUrl(item) {\r\n\r\n var result = _.startsWith(item.url, '//') || _.startsWith(item.url, 'http://') ||\r\n _.startsWith(item.url, 'https://') || _.startsWith(item.url, 'line://');\r\n return result;\r\n }\r\n\r\n return service;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('mobileService', mobileService);\r\n\r\n function mobileService(apiUrl, $http, $q) {\r\n var service = {\r\n postMobileInfo: postMobileInfo,\r\n postCourseInfo: postCourseInfo\r\n };\r\n\r\n return service;\r\n\r\n ////////////////\r\n function postMobileInfo(data) {\r\n // 通知 APP 登入成功 (給予 token 資料)\r\n //alert('DEVICE_TYPE:',DEVICE_TYPE);\r\n if (DEVICE_TYPE) {\r\n var params = {\r\n token: data.Token\r\n };\r\n var method = \"login\";\r\n appCallback(method, params);\r\n }\r\n var param = {\r\n DEVICE_TYPE: DEVICE_TYPE,\r\n DEVICE_TOKEN: DEVICE_TOKEN,\r\n USER_TOKEN: data.Token,\r\n PerSerilNo: data.PerSerilNo || data.PerserilNo,\r\n };\r\n var isMobileApp = true;\r\n\r\n if (!param.DEVICE_TOKEN || DEVICE_TOKEN.length < 1) {\r\n isMobileApp = false;\r\n } else {\r\n if (param.DEVICE_TYPE !== '' && param.DEVICE_TYPE !== '(null)' && param.DEVICE_TYPE.toLowerCase() === 'ios') {\r\n var message = { 'DEVICE_TOKEN': param.DEVICE_TOKEN, 'DEVICE_TYPE': param.DEVICE_TYPE };\r\n window.webkit.messageHandlers.msgHandler.postMessage(message);\r\n }\r\n }\r\n if (!isMobileApp) {\r\n return $q.when({});\r\n }\r\n $http.post(apiUrl.tsApi + 'mobile', param);\r\n }\r\n\r\n function postCourseInfo(params) {\r\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(params));\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('modalService', modalService);\r\n\r\n function modalService($uibModal, $q, loginService, $timeout) {\r\n var service = {\r\n login: login,\r\n forgetPwd: forgetPwd,\r\n register: register,\r\n getChoicePerSerilNo: getChoicePerSerilNo,\r\n getTaiClass: getTaiClass,\r\n getWindowClass: getWindowClass,\r\n isMobile: isMobile,\r\n isIos: isIos,\r\n touchWithMe: touchWithMe,\r\n explanation: explanation,\r\n setting: setting,\r\n courseDetail: courseDetail,\r\n editPwd: editPwd,\r\n phoneNumber: phoneNumber,\r\n trainingSelectAction: trainingSelectAction,\r\n selectActionConfirm: selectActionConfirm,\r\n confrimDialog: confrimDialog,\r\n openOptionSelector: openOptionSelector,\r\n };\r\n return service;\r\n //=================\r\n\r\n function isMobile() {\r\n // console.log(\"check isMobile\");\r\n // console.log(\"window.orientation:\", window.orientation);\r\n // console.log(\"navigator.userAgent.indexOf(\\\"IEMobile\\\"):\", navigator.userAgent.indexOf(\"IEMobile\"));\r\n return (typeof window.orientation !== \"undefined\") || (navigator.userAgent.indexOf(\"IEMobile\") !== -1);\r\n }\r\n\r\n function isIos() {\r\n return (navigator.userAgent.match(/ip(hone|ad|od)/i) && !navigator.userAgent.match(/(iemobile)[\\/\\s]?([\\w\\.]*)/i));\r\n }\r\n\r\n function getTaiClass() {\r\n if (service.isMobile()) {\r\n return 'mobile-modal-dialog,mobile-modal-content';\r\n }\r\n }\r\n\r\n function getWindowClass() {\r\n if (!service.isMobile()) {\r\n return 'modal-margin-top';\r\n }\r\n }\r\n\r\n function getChoicePerSerilNo(param) {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/choicePerSerilNoModal.html',\r\n controller: 'choicePerSerilNoModalController as vm',\r\n size: 'sm',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n data: function() {\r\n return param;\r\n }\r\n }\r\n });\r\n return modal;\r\n }\r\n\r\n function login() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/loginModal.html',\r\n controller: 'loginModalController as vm',\r\n size: 'sm',\r\n taiClass: getTaiClass()\r\n });\r\n modal.closed.then(onDestroy);\r\n\r\n return modal;\r\n //==\r\n function onDestroy() {\r\n var defer = $q.defer();\r\n var reCaptchaCheckChild = null;\r\n do {\r\n if (reCaptchaCheckChild) {\r\n //first round skip\r\n var reCaptchaCheck = reCaptchaCheckChild.parentElement;\r\n if (reCaptchaCheck && reCaptchaCheck.parentElement) {\r\n reCaptchaCheck.parentElement.removeChild(reCaptchaCheck);\r\n }\r\n }\r\n reCaptchaCheckChild = document.getElementsByClassName(\"g-recaptcha-bubble-arrow\")[0];\r\n } while (reCaptchaCheckChild);\r\n\r\n defer.resolve('Success!');\r\n return defer.promise;\r\n }\r\n }\r\n\r\n function forgetPwd() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/forgetPwdModal.html',\r\n controller: 'forgetPwdModalController as vm',\r\n size: 'sm',\r\n taiClass: getTaiClass()\r\n });\r\n return modal;\r\n }\r\n\r\n function register() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/registerModal.html',\r\n controller: 'registerModalController as vm',\r\n size: 'lg',\r\n taiClass: getTaiClass()\r\n });\r\n return modal;\r\n }\r\n\r\n function touchWithMe() {\r\n //20180315 Anthony \r\n //在開啟這modal時,資料延遲有時間差,所以調整成先拿完資料再開啟\r\n\r\n //20180326 Anthony Add new variable for login/nonLogin\r\n var delaySec = 1;\r\n var userData = {\r\n cName: null,\r\n email: null,\r\n isLogin: false\r\n };\r\n\r\n if (sessionStorage.getItem('token')) {\r\n loginService.getSsoInfo().then(function(data) {\r\n userData.cName = sessionStorage.getItem('cName');\r\n userData.email = data.data.email;\r\n userData.isLogin = true;\r\n });\r\n\r\n delaySec = 1500;\r\n }\r\n\r\n\r\n\r\n //sso 資料回傳有延遲,這裡延遲開啟modal\r\n $timeout(function() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/contectModal.html',\r\n controller: 'contectModalController as vm',\r\n size: 'sm',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n userData: function() {\r\n return userData;\r\n }\r\n }\r\n });\r\n return modal;\r\n }, delaySec);\r\n\r\n }\r\n\r\n function confrimDialog(config) {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/confirmDialog/confirmDialog.html',\r\n controller: 'confirmDialogController as vm',\r\n size: 'md',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n config: function() {\r\n config = config || {};\r\n var paramConfig = {\r\n confirmTitle: config.confirmTitle || '',\r\n confirmContent: config.confirmContent || '',\r\n textButtonOk: config.textButtonOk || null,\r\n textButtonCancel: config.textButtonCancel || null,\r\n promiseAction: config.promiseAction\r\n };\r\n return paramConfig;\r\n }\r\n }\r\n });\r\n return modal;\r\n }\r\n\r\n function explanation() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/explanationModal.html',\r\n controller: 'explanationModalController as vm',\r\n size: 'lg',\r\n taiClass: getTaiClass()\r\n });\r\n return modal;\r\n }\r\n\r\n function setting(param) {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/settingModal.html',\r\n controller: 'settingModalController as vm',\r\n size: 'lg',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n viewModel: function() {\r\n return param;\r\n }\r\n }\r\n });\r\n return modal;\r\n }\r\n\r\n function courseDetail(item, settingModel, defaultTabIndex) {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/courseDetailModal.html',\r\n controller: 'courseDetailModalController as vm',\r\n size: 'lg',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n courseItem: item,\r\n settingModel: settingModel,\r\n defaultTabIndex: defaultTabIndex\r\n }\r\n });\r\n\r\n modal.rendered.then(function() {\r\n\r\n var modalBootstrap = $(\".modal-open > .modal\");\r\n modalBootstrap.scroll(function() {\r\n // 改變\"回頂端\"樣式,只有當下拉選單滾到一定層度才會出現\r\n var modalContent = this;\r\n var goTop = modalBootstrap.find(\"div.goTop a\");\r\n if (!goTop) { return; }\r\n if (modalContent.scrollTop < 300) {\r\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"relative\", \"top\": \"0px\", \"display\": \"none\" });\r\n } else {\r\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"absolute\", \"top\": modalContent.scrollTop, \"display\": \"block\" });\r\n }\r\n });\r\n });\r\n return modal;\r\n }\r\n\r\n function editPwd() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/editPwdModal.html',\r\n controller: 'editPwdModalController as vm',\r\n size: 'lg',\r\n taiClass: getTaiClass()\r\n });\r\n return modal;\r\n }\r\n\r\n function phoneNumber() {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/common/modal/phoneNumberModal.html',\r\n controller: 'phoneNumberModalController as vm',\r\n size: 'lg',\r\n taiClass: getTaiClass()\r\n });\r\n return modal;\r\n }\r\n\r\n function trainingSelectAction(viewModel) {\r\n var modal = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingSelectActionModal.html',\r\n controller: 'myTrainingSelectActionModalController as vm',\r\n size: 'lg',\r\n keyboard: false,\r\n backdrop: 'static',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n viewModel: function() {\r\n // console.log(\"trainingSelectAction viewModel\",viewModel);\r\n return viewModel;\r\n }\r\n }\r\n });\r\n\r\n modal.rendered.then(function() {\r\n\r\n var modalBootstrap = $(\".modal-open > .modal\");\r\n modalBootstrap.scroll(function() {\r\n // 改變\"回頂端\"樣式,只有當下拉選單滾到一定層度才會出現\r\n var modalContent = this;\r\n var goTop = modalBootstrap.find(\"div.goTop a\");\r\n if (!goTop) { return; }\r\n if (modalContent.scrollTop < 300) {\r\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"relative\", \"top\": \"0px\", \"display\": \"none\" });\r\n } else {\r\n modalBootstrap.find(\"div.goTop a\").css({ \"position\": \"absolute\", \"top\": modalContent.scrollTop, \"display\": \"block\" });\r\n }\r\n });\r\n });\r\n return modal;\r\n }\r\n\r\n function selectActionConfirm(ctmsConfirmTime, param) {\r\n //console.log('ctmsConfirmTime:',ctmsConfirmTime);\r\n var modalResult = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingSelectActionConfirmModal.html',\r\n controller: 'myTrainingSelectActionConfirmModalController as vm',\r\n size: 'lg',\r\n backdrop: 'static',\r\n keyboard: false,\r\n taiClass: getTaiClass(),\r\n windowClass: getWindowClass(),\r\n resolve: {\r\n ctmsConfirmTime: function() {\r\n return ctmsConfirmTime;\r\n },\r\n data: function() {\r\n return param;\r\n }\r\n }\r\n });\r\n return modalResult;\r\n }\r\n\r\n function openOptionSelector(data, title, isCycle) {\r\n var result = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/optionSelector.html',\r\n controller: 'optionSelectorController as vm',\r\n size: 'sm',\r\n backdrop: 'static',\r\n taiClass: getTaiClass(),\r\n resolve: {\r\n titleTranslate: function() {\r\n return title;\r\n },\r\n keyValueList: function() {\r\n return data;\r\n },\r\n isCycle: function() {\r\n return isCycle;\r\n }\r\n }\r\n\r\n });\r\n return result;\r\n }\r\n\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('scheduleService', scheduleService);\r\n\r\n function scheduleService($http, apiUrl, commonService) {\r\n var service = {\r\n get: get,\r\n donwloadIcs: donwloadIcs,\r\n getCalendarArea: getCalendarArea\r\n };\r\n\r\n var url = apiUrl.tsApi + 'schedule/';\r\n\r\n function get(thisMonth, calendarAreaNo) {\r\n var param = {\r\n thisMonth: thisMonth.format('YYYY/MM/DD'),\r\n calAreaSerilNo: calendarAreaNo,\r\n menuSerilNo: getMenuQueryString()\r\n };\r\n commonService.setParams(param);\r\n if (sessionStorage.getItem('token')) {\r\n return $http.post(url + 'get', param);\r\n }\r\n return $http.post(url + 'getByNoLogin', param);\r\n }\r\n\r\n function donwloadIcs(param,isIos) {\r\n var downloadUrl = format('{0}PostExportSchedule?calendarSerilNo={1}&menuSerilNo={2}&token={3}&perSerilNo={4}&isIos={5}',\r\n url, param.calendarSerilNo, getMenuQueryString(), sessionStorage.getItem('token'), \r\n sessionStorage.getItem('perSerilNo'),isIos);\r\n return downloadUrl;\r\n }\r\n \r\n\r\n function getCalendarArea() {\r\n let newApiURL = url + 'calendarArea/' + sessionStorage.getItem('perSerilNo');\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n //2023-07-20 Johnson ��w2023\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$0.1(2);',3,3,'http|get|newApiURL'.split('|'),0,{}))\r\n }\r\n\r\n return service;\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('translateService', translateService);\r\n\r\n function translateService($rootScope, $translate, $http, $q, apiUrl, commonService) {\r\n var service = {\r\n getLanguage: getLanguage,\r\n getDefault: getDefault,\r\n change: change,\r\n callApi: callApi,\r\n getTranslates: getTranslates,\r\n };\r\n\r\n function getLanguage(isWrite) {\r\n var param = {\r\n isWrite: isWrite\r\n };\r\n commonService.setParams(param);\r\n\r\n return $http.post(apiUrl.tsApi + 'getLanguage', param);\r\n }\r\n\r\n function getDefault(languageItems) {\r\n var defaultLanguage = _.find(languageItems, {\r\n selected: true\r\n });\r\n sessionStorage.setItem('langCode', defaultLanguage.langSerilNo);\r\n sessionStorage.setItem('userLang', defaultLanguage.langCode);\r\n callApi(sessionStorage.getItem('userLang'));\r\n return defaultLanguage;\r\n }\r\n\r\n function change(selectedItem) {\r\n sessionStorage.setItem('langCode', selectedItem.langSerilNo);\r\n return getLanguage(true).then(function(data) {\r\n sessionStorage['userLang'] = _.replace(selectedItem.langCode, '_', '-');\r\n var defaultLanguage = getDefault(data.data);\r\n return defaultLanguage;\r\n });\r\n }\r\n\r\n function callApi(languageCode) {\r\n return $translate.use(languageCode).then(function() {\r\n return getTranslates();\r\n }).then(function(data) {\r\n $rootScope.translate = data;\r\n });\r\n }\r\n\r\n function getTranslates() {\r\n var userLang = sessionStorage['userLang'];\r\n var urlTranslate = apiUrl.tsApi + 'getTranslationResource?lang=' + userLang;\r\n //2023-07-20 Johnson ��w2023\r\n //console.log(\"getTranslates:\\service\\translate.service.js\");\r\n return eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$.1(2).3(4(0){5 0});',6,6,'response|get|urlTranslate|then|function|return'.split('|'),0,{}))\r\n }\r\n return service;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('visualPageService', visualPageService);\r\n\r\n function visualPageService($http, apiUrl, commonService) {\r\n var service = {\r\n get: get\r\n };\r\n\r\n var visualPageUrl = apiUrl.tsApi + 'visualPage';\r\n\r\n function get(pageSerilNo) {\r\n var param = {\r\n pageSerilNo: pageSerilNo,\r\n menuSerilNo: getMenuQueryString()\r\n };\r\n commonService.setParams(param);\r\n return $http.post(visualPageUrl, param);\r\n }\r\n\r\n return service;\r\n }\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('bulletinDetailController', bulletinDetailController);\r\n\r\n function bulletinDetailController(viewModel) {\r\n var vm = this;\r\n vm.data=viewModel.data;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('bulletinMoreController', bulletinMoreController);\r\n\r\n function bulletinMoreController(viewModel) {\r\n var vm = this;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = viewModel.data;\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('commonController', commonController);\r\n\r\n function commonController($sce) {\r\n var vm = this;\r\n onInit();\r\n\r\n function onInit() {\r\n menuService.getInformationBySerilNo(getMenuQueryString()).then(function(data) {\r\n menuService.generateUrl(data.data, sessionStorage.getItem('token'));\r\n vm.url = $sce.trustAsResourceUrl(data.data.url);\r\n });\r\n vm.url = $sce.trustAsResourceUrl(sessionStorage.getItem('iframeUrl'));\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('externalController', externalController);\r\n\r\n function externalController($sce, menuService) {\r\n var vm = this;\r\n\r\n init();\r\n\r\n function init() {\r\n\r\n // 紀錄這次進入的 menu No 到 session storage 中\r\n // 如果需要登入就會被導到登入頁\r\n // 登入後就會依照這個參數導到該頁面中\r\n //sessionStorage.setItem('menuNo', getMenuQueryString());\r\n\r\n let langSerilNo = 1;\r\n if (sessionStorage.getItem('langCode')) {\r\n langSerilNo = sessionStorage.getItem('langCode');\r\n }\r\n\r\n menuService.getInformationBySerilNo(getMenuQueryString(), langSerilNo).then(function (data) {\r\n\r\n let isEmbed = data.data.target === 2 /*崁入式窗*/ ;\r\n if (isEmbed) {\r\n menuService.generateUrl(data.data, sessionStorage.getItem('token'));\r\n\r\n vm.url = $sce.trustAsResourceUrl(data.data.url);\r\n } else {\r\n // includ token transfer flow\r\n menuService.redirectUrl(data.data);\r\n }\r\n });\r\n\r\n }\r\n\r\n // function getCurrentLangSerilNo(){\r\n // if (sessionStorage.getItem('langCode')) {\r\n // langSerilNo = sessionStorage.getItem('langCode');\r\n // }\r\n // }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('externalSchemaTransferController', externalSchemaTransferController);\r\n\r\n function externalSchemaTransferController() {\r\n \r\n init();\r\n\r\n function init() {\r\n // 提供 APP 開啟其他 APP 的跳轉頁面\r\n var schema = getSchemaQueryString();\r\n window.location = schema + '://';\r\n }\r\n\r\n function getSchemaQueryString() {\r\n \r\n if (location.href.split('schema=').length > 1) {\r\n //2023-07-10 Johnson 資安2023\r\n return eval(function (p, a, c, k, e, r) { e = function (c) { return c.toString(a) }; if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('3.4.5(\\'6=\\')[1].0(//2,\\'&8\\').0(/\"/2,\\'&9\\').0(/\\'/2,\\'&#a\\').0(/[<>!]|(\\\\(\\\\))|((b|c|d)\\\\e*\\\\(.*\\\\))/2,\\'\\')', 15, 15, 'replace||g|location|href|split|schema|lt|gt|quot|x27|for|while|if|s'.split('|'), 0, {}))\r\n }\r\n return undefined;\r\n }\r\n }\r\n\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('headerSearchResultController', headerSearchResultController);\r\n\r\n function headerSearchResultController(modalService, headerService, $rootScope, viewModel, menuService, enumService, siteCode, $window) {\r\n var vm = this;\r\n vm.isMobile = modalService.isMobile();\r\n vm.data = viewModel.data;\r\n vm.redirectMenuSearchResult = redirectMenuSearchResult;\r\n vm.redirectContentSearchResult = redirectContentSearchResult;\r\n vm.pageChange = pageChange;\r\n vm.tabChange = tabChange;\r\n vm.search = search;\r\n vm.checkLastMenu = checkLastMenu;\r\n vm.getMoreList = getMoreList;\r\n vm.needKeywordLog = false;\r\n\r\n\r\n vm.view = {\r\n initTotal: 0\r\n };\r\n\r\n init();\r\n\r\n function init() {\r\n vm.searchedKeyword = vm.data.keyword;\r\n vm.keyword = vm.data.keyword;\r\n vm.siteCode = siteCode;\r\n }\r\n\r\n function redirectMenuSearchResult(item) {\r\n //console.log(\"item.menuSerilNo:\"+item.menuSerilNo);\r\n if (!_.isEmpty(sessionStorage.getItem('menuAllList'))) {\r\n\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n\r\n //如果Menu=37(上課與證照),就設定Menu=-9901(待修課程)\r\n if (parseInt(item.menuSerilNo) === 37) {\r\n sessionStorage.setItem('menuSerilNo', -9901);\r\n } else {\r\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\r\n }\r\n\r\n //點選任一動態磚即撈取是選單功能Menu資料\r\n var menuAllList = JSON.parse(sessionStorage.getItem('menuAllList'));\r\n var menuItems = menuAllList.filter(function (menuLists) {\r\n return (parseInt(menuLists.menuSerilNo) === parseInt(sessionStorage.getItem('menuSerilNo')) &&\r\n menuLists.hasChild === false\r\n );\r\n });\r\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\r\n if (menuItems !== null && menuItems.length !== 0) {\r\n sessionStorage.setItem('menuSerilNo', menuItems[0].menuSerilNo);\r\n sessionStorage.setItem('menuItemPath', menuItems[0].menuItemPath);\r\n } else {\r\n //如是選單節點即撈取第二或第三階層是否為父階層 \r\n menuItems = menuAllList.filter(function (menuLists) {\r\n return (parseInt(menuLists.parentId) === parseInt(sessionStorage.getItem('menuSerilNo')));\r\n });\r\n\r\n //撈取選單節點下排序第一個功能Menu\r\n if (menuItems != null && menuItems.length !== 0) {\r\n var sort = Math.min(...menuItems.map(p => p.sort));\r\n var menuItem = menuItems.filter(function (menuLists) {\r\n return (parseInt(menuLists.sort) === parseInt(sort));\r\n });\r\n\r\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\r\n //console.log(menuItem);\r\n if (menuItem !== null && menuItem.length !== 0) {\r\n if (!menuItem[0].hasChild) {\r\n sessionStorage.setItem('menuSerilNo', menuItem[0].menuSerilNo);\r\n }\r\n sessionStorage.setItem('menuItemPath', menuItem[0].menuItemPath);\r\n }\r\n }\r\n }\r\n\r\n console.log('headerSearchResult_redirectMenuSearchResult-menuSerilNo:' + sessionStorage.getItem('menuSerilNo'));\r\n console.log('headerSearchResult_redirectMenuSearchResult-menuItemPath:' + sessionStorage.getItem('menuItemPath'));\r\n }\r\n\r\n // 目前外網只有一種轉頁方式: 本頁直接跳轉\r\n menuService.redirectUrl(item);\r\n\r\n // if (item.target === enumService.target.wrap) {\r\n // window.open('//' + location.host + '/#/external?menu=' + item.menuSerilNo, 'searchResult');\r\n // } else {\r\n // item.isWindowOpen = true;\r\n // menuService.redirectUrl(item);\r\n // }\r\n }\r\n\r\n function redirectContentSearchResult(item) {\r\n\r\n // 目前外網只有一種轉頁方式: 本頁直接跳轉\r\n $window.location.href = '//' + location.host + '/#/bulletin/detail/' + item.serilNo, 'searchResult';\r\n\r\n //window.open('//' + location.host + '/#/bulletin/detail/' + item.serilNo, 'searchResult');\r\n }\r\n\r\n function pageChange() {\r\n var newPage = vm.data.currentPage;\r\n var keyword = vm.searchedKeyword;\r\n var newType = vm.data.currentSearchResultType;\r\n vm.keyword = keyword;\r\n headerService.getSearchResult(keyword, newPage, newType, vm.siteCode, vm.needKeywordLog).then(function (data) {\r\n vm.data = data.data;\r\n });\r\n }\r\n\r\n function getMoreList() {\r\n var newPage = vm.data.currentPage + 1;\r\n var keyword = vm.searchedKeyword;\r\n var newType = vm.data.currentSearchResultType;\r\n vm.keyword = keyword;\r\n headerService.getSearchResult(keyword, newPage, newType, vm.siteCode, vm.needKeywordLog).then(function (data) {\r\n\r\n // 加載資料至原本的資料清單上\r\n\r\n var result = data.data;\r\n result.menuMetroResults = _.concat(vm.data.menuMetroResults, result.menuMetroResults);\r\n result.contentResults = _.concat(vm.data.contentResults, result.contentResults);\r\n result.bulletinContentResults = _.concat(vm.data.bulletinContentResults, result.bulletinContentResults);\r\n result.formContentResults = _.concat(vm.data.formContentResults, result.formContentResults);\r\n vm.data = result;\r\n\r\n });\r\n }\r\n\r\n function tabChange(currentSearchResultType) {\r\n vm.view.initTotal++;\r\n if (vm.view.initTotal > 1) {\r\n var keyword = vm.searchedKeyword;\r\n vm.data.currentPage = 1;\r\n vm.keyword = keyword;\r\n headerService.getSearchResult(keyword, vm.data.currentPage, currentSearchResultType, vm.siteCode, vm.needKeywordLog).then(function (data) {\r\n vm.data = data.data;\r\n });\r\n }\r\n }\r\n function specialKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n function search() {\r\n \r\n var keyword = vm.keyword;\r\n if (keyword) {\r\n\r\n var SKV = specialKeywordVerification(keyword);\r\n\r\n if(!SKV){\r\n vm.data.currentPage = 1;\r\n vm.searchedKeyword = keyword;\r\n vm.needKeywordLog = true;\r\n //$location.path('/header/searchResult/' + keyword);\r\n headerService.getSearchResult(keyword,\r\n vm.data.currentPage, vm.data.currentSearchResultType, vm.siteCode, vm.needKeywordLog).then(function (data) {\r\n vm.data = data.data;\r\n });\r\n\r\n }else\r\n {\r\n console.log('specialKeywords:'+$rootScope.translate.specialKeywords);\r\n toastr.warning($rootScope.translate.specialKeywords);\r\n }\r\n\r\n \r\n }\r\n\r\n }\r\n\r\n function checkLastMenu(index, menu) {\r\n var menuSize = Object.keys(menu).length - 1;\r\n return Number(index) === menuSize;\r\n }\r\n\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('app')\r\n .controller('homeController', homeController);\r\n\r\n function homeController(viewModel) {\r\n var vm=this;\r\n\r\n init();\r\n\r\n function init() {\r\n vm.data=viewModel.data;\r\n var menuSerilNo = getMenuQueryString();\r\n if (parseInt(menuSerilNo) === 31 || menuSerilNo === undefined)\r\n {\r\n $(\".ui-blackCover\").css(\"display\",\"none\");\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"loginDirectEditPwdController\", loginDirectEditPwdController);\r\n\r\n function loginDirectEditPwdController(\r\n sysCode,\r\n loginService,\r\n $location,\r\n e2eService,\r\n $rootScope,\r\n $routeParams,\r\n commonService,\r\n iAmNotRobot,\r\n $http,\r\n apiUrl,\r\n $scope\r\n ) {\r\n var vm = this;\r\n vm.submit = submit;\r\n vm.autoFill = autoFill;\r\n vm.sendVerifyCodeFromSignUp = sendVerifyCodeFromSignUp;\r\n vm.checkVerify = checkVerify;\r\n vm.iAmNotRobot = iAmNotRobot;\r\n vm.isShowConfirmUpdate = false;\r\n\r\n vm.view = {\r\n type: \"editPwd\",\r\n };\r\n\r\n // virtual keyboard start\r\n vm.showVirKey = showVirKey;\r\n vm.isShowVirKey = false;\r\n vm.textChanged = textChanged;\r\n vm.focusObj = null;\r\n vm.virData = null;\r\n vm.canSend = false;\r\n // 針對哪個 input 使用動態鍵盤輸入\r\n vm.getFocusNewPwd = function () {\r\n vm.focusObj = \"newPwd\";\r\n vm.virData = vm.data.newPwd;\r\n };\r\n vm.getFocusConfirmPwd = function () {\r\n vm.focusObj = \"confirmPwd\";\r\n vm.virData = vm.data.confirmPwd;\r\n };\r\n vm.checkPassword = function () {\r\n if (\r\n vm.data.confirmPwd !== undefined &&\r\n vm.data.newPwd !== undefined &&\r\n vm.data.confirmPwd.length >= 6 &&\r\n vm.data.newPwd.length >= 6\r\n ) {\r\n if (vm.data.confirmPwd === vm.data.newPwd) {\r\n vm.canSend = true;\r\n }else{\r\n vm.canSend = false;\r\n }\r\n }else{\r\n vm.canSend = false;\r\n }\r\n };\r\n\r\n function textChanged(newPwd) {\r\n var e = document.getElementById(vm.focusObj);\r\n e.value = newPwd;\r\n var $e = angular.element(e);\r\n $e.triggerHandler(\"input\");\r\n }\r\n\r\n function showVirKey() {\r\n if (vm.isShowVirKey) vm.isShowVirKey = false;\r\n else vm.isShowVirKey = true;\r\n }\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n // debugger;\r\n commonService\r\n .fetchDecyrptForDirectModifyDto({\r\n phoneNumber: $routeParams.mobilTel,\r\n userAccount: $routeParams.userAccount,\r\n verifyCode: $routeParams.verifyCode,\r\n })\r\n .then((data) => {\r\n vm.data = {\r\n userAccount: data.data.userAccount,\r\n verifyCode: data.data.verifyCode,\r\n sysCode: sysCode,\r\n };\r\n\r\n vm.form2 = {\r\n mobilTel: data.data.phoneNumber,\r\n email: data.data.userAccount,\r\n };\r\n\r\n vm.form1 = {\r\n sysCode: sysCode,\r\n userAccount: data.data.userAccount,\r\n tel: data.data.phoneNumber,\r\n validCode: data.data.validCode,\r\n issend: false,\r\n };\r\n });\r\n }\r\n\r\n function submit() {\r\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\r\n if (!vm.confirmPwd) {\r\n loginService.directModifyUserPassword(vm.data).then(function (data) {\r\n if (data) {\r\n toastr.success($rootScope.translate.commonEditPwdSuccess);\r\n if ($routeParams.mobilTel) {\r\n vm.view.type = \"phone\";\r\n $(\"#divPhone\").show();\r\n } else {\r\n $location.path(\"/login\");\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n function autoFill() {\r\n e2eService.directEditPwd(vm.data);\r\n }\r\n\r\n function sendVerifyCodeFromSignUp() {\r\n //20180314 Anthony\r\n //1. Verify reCaptcha with MHRAPI and Google API\r\n //2-1. Succcess : Go Back to Login step\r\n //2-2. Fail : throw Error Messege\r\n\r\n //test error situation\r\n //recaptcha.response = recaptcha.response+'ee';\r\n if ($(\"#inputVerify\").val().length == 4) {\r\n vm.form1.issend = true;\r\n loginService.produceVerifyCodeFromSignUp(vm.form1).then(() => {\r\n toastr.success($rootScope.translate.commonAlreadySendSMS);\r\n });\r\n } else {\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n return false;\r\n }\r\n }\r\n\r\n function checkVerify() {\r\n var param = {\r\n verifyCode: vm.form1.validCode,\r\n userAccount: vm.form1.userAccount,\r\n PhoneNumber: vm.form1.tel,\r\n };\r\n loginService.verifyCodeCheckFromSignUp(param).then(function () {\r\n removeSsoInfo();\r\n toastr.success($rootScope.translate.alreadyVerifyPhoneNumber);\r\n $location.path(\"/login\");\r\n });\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('loginForceEditPwdController', loginForceEditPwdController);\r\n\r\n function loginForceEditPwdController(sysCode, loginService, $location, e2eService,$rootScope) {\r\n var vm = this;\r\n vm.submit = submit;\r\n vm.autoFill = autoFill;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = {};\r\n }\r\n\r\n function submit() {\r\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\r\n if (!vm.confirmPwd) {\r\n vm.data.sysCode = sysCode;\r\n vm.data.token = sessionStorage.getItem('token');\r\n loginService.modifyUserPassword(vm.data).then(function(data) {\r\n if (data) {\r\n removeSsoInfo();\r\n toastr.success($rootScope.translate.commonEditPwdSuccess);\r\n $location.path('/login');\r\n }\r\n });\r\n }\r\n }\r\n\r\n function autoFill() {\r\n e2eService.forceEditPwd(vm.data);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('loginForgetPwdDirectEditPwdController', loginForgetPwdDirectEditPwdController);\r\n\r\n function loginForgetPwdDirectEditPwdController(sysCode, loginService, $location, $rootScope, $routeParams, $scope) {\r\n\r\n var vm = this;\r\n vm.submit = submit;\r\n vm.isValidLink = false;\r\n\r\n // virtual keyboard start\r\n vm.showVirKey = showVirKey;\r\n vm.isShowVirKey = false;\r\n vm.isShowConfirmPwdVirKey = false;\r\n vm.textChanged = textChanged;\r\n vm.focusObj = null\r\n vm.virData = null;\r\n\r\n vm.getFocusNewPwd = function () {\r\n vm.focusObj = \"newPwd\";\r\n vm.virData = vm.data.newPwd;\r\n }\r\n vm.getFocusConfirmPwd = function () {\r\n vm.focusObj = \"confirmPwd\";\r\n vm.virData = vm.data.confirmPwd;\r\n }\r\n\r\n function textChanged(newPwd) {\r\n var e = document.getElementById(vm.focusObj);\r\n e.value = newPwd;\r\n var $e = angular.element(e);\r\n $e.triggerHandler('input');\r\n }\r\n\r\n function showVirKey() {\r\n if (vm.isShowVirKey)\r\n vm.isShowVirKey = false;\r\n else\r\n vm.isShowVirKey = true;\r\n\r\n }\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n\r\n let param = {\r\n userAccount: $routeParams.userAccount /*crypted*/ ,\r\n verifyCode: $routeParams.verifyCode /*crypted*/\r\n };\r\n\r\n // check verify code \r\n loginService.checkVerifyCode(param).then(function (data) {\r\n\r\n // console.log(data);\r\n if (data.data.Result === \"100\") {\r\n\r\n vm.data = {\r\n userAccount: data.data.userAccount,\r\n verifyCode: data.data.verifyCode,\r\n sysCode: sysCode\r\n };\r\n\r\n // show input box \r\n vm.isValidLink = true;\r\n\r\n } else {\r\n\r\n // show error message\r\n toastr.error(data.data.ResultMsg);\r\n\r\n }\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n function submit() {\r\n //console.log(vm.data);\r\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\r\n if (!vm.confirmPwd) {\r\n loginService.directModifyUserPassword(vm.data).then(function (data) {\r\n if (data) {\r\n toastr.success($rootScope.translate.commonEditPwdSuccess);\r\n removeSsoInfo();\r\n $location.path('/login');\r\n }\r\n });\r\n }\r\n }\r\n\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('loginController', loginController);\r\n\r\n function loginController(viewModel) {\r\n var vm = this;\r\n\r\n init();\r\n\r\n function init() {\r\n vm.data = viewModel.data;\r\n\r\n var menuSerilNo = getMenuQueryString();\r\n if (parseInt(menuSerilNo) === 31 || menuSerilNo === undefined)\r\n {\r\n $(\".ui-blackCover\").css(\"display\",\"none\");\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n }\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('mobileTriggerController', mobileTriggerController);\r\n\r\n function mobileTriggerController($location, modalService) {\r\n init();\r\n\r\n function init() {\r\n modalService.login();\r\n $location.path('/login');\r\n }\r\n }\r\n})();\r\n","(function() {\r\n'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('nextMenuDetailController', nextMenuDetailController);\r\n\r\n function nextMenuDetailController(viewModel) {\r\n var vm = this;\r\n vm.data=viewModel.data;\r\n }\r\n})();","(function () {\r\n\t'use strict';\r\n\r\n\tangular\r\n\t\t.module('app')\r\n\t\t.controller('nextMenuController', nextMenuController);\r\n\r\n\tfunction nextMenuController(viewModel, homeService) {\r\n\t\tvar vm = this;\r\n\t\tvm.getMoreList = getMoreList;\r\n\t\tvar currentPage = 1;\r\n\t\tinit();\r\n\r\n\t\tfunction init() {\r\n\t\t\tvm.menuSerilNo = getMenuQueryString();\r\n\t\t\tvm.data = viewModel.data;\r\n\t\t\tvm.currentPage = 1;\r\n\t\t}\r\n\r\n\t\tfunction getMoreList() {\r\n\t\t\tcurrentPage++;\r\n\t\t\thomeService.getNextMore(currentPage).then(function (data) {\r\n\t\t\t\tvm.data.hasMore = data.data.hasMore;\r\n\t\t\t\tvm.data.bulletins.bulletins = _.concat(vm.data.bulletins.bulletins, data.data.bulletins.bulletins);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('scheduleController', scheduleController);\r\n\r\n function scheduleController($scope, scheduleService, $timeout, $rootScope, viewModel) {\r\n var vm = this;\r\n vm.changeDate = changeDate;\r\n vm.outputFile = outputFile;\r\n vm.changeArea = changeArea;\r\n vm.getStartForList = getStartForList;\r\n vm.getEndForList = getEndForList;\r\n vm.getAllDay = getAllDay;\r\n vm.showButton = showButton;\r\n vm.trigger = 1;\r\n\r\n vm.view = {\r\n isLogin: sessionStorage.getItem('token')\r\n };\r\n\r\n init();\r\n\r\n function init() {\r\n vm.calendarAreas = viewModel.data;\r\n vm.schedule = moment().add(8, 'hour');\r\n getSchedule();\r\n }\r\n\r\n function changeDate() {\r\n $timeout(function() {\r\n getSchedule();\r\n }, 10);\r\n }\r\n\r\n function getSchedule() {\r\n vm.clickDay = vm.schedule.format('YYYY/MM/DD');\r\n var calendarSerilNo = vm.calendarArea ? vm.calendarArea.calendarAreaSerilNo : 0;\r\n vm.promise = scheduleService.get(vm.schedule, calendarSerilNo).then(function(data) {\r\n vm.dateItem = data.data.scheduleTodays;\r\n vm.trigger++;\r\n return data;\r\n });\r\n }\r\n\r\n function outputFile(item) {\r\n if (DEVICE_TYPE !== null && DEVICE_TYPE.toLowerCase() === 'android') {\r\n var param = {\r\n title: item.title,\r\n description: item.txtContent,\r\n isAllDay: item.isAllDay,\r\n begin: (Date.parse(item.startDate) - (8 * 60 * 60 * 1000)) / 1000,\r\n end: (Date.parse(item.endDate) - (8 * 60 * 60 * 1000)) / 1000,\r\n reminder: 0,\r\n isEveryDay: item.isEveryDay\r\n };\r\n var method = \"appendEvent\";\r\n appCallback(method, param);\r\n } else {\r\n // 瀏覽器或其他\r\n var isIos = true;\r\n if (DEVICE_TYPE !== null && DEVICE_TYPE.toLowerCase() === 'ios') {\r\n isIos = true;\r\n }\r\n location.href = scheduleService.donwloadIcs(item, isIos);\r\n toastr.success($rootScope.translate.tshrExportScheduleMessage);\r\n }\r\n }\r\n\r\n function changeArea() { \r\n getSchedule();\r\n }\r\n\r\n function getStartForList(item) {\r\n if (item.isAllDay) {\r\n return moment(item.startDate).format('YYYY/MM/DD');\r\n }\r\n return moment(item.startDate).format('YYYY/MM/DD HH:mm');\r\n }\r\n\r\n function getEndForList(item) {\r\n if (item.isEveryDay) {\r\n return $rootScope.translate.any;\r\n }\r\n\r\n if (item.isAllDay) {\r\n return moment(item.endDate).subtract(1, 'd').format('YYYY/MM/DD');\r\n }\r\n return moment(item.endDate).format('YYYY/MM/DD HH:mm');\r\n }\r\n\r\n function getAllDay(item) {\r\n if (item.isAllDay) {\r\n return $rootScope.translate.allDay;\r\n }\r\n }\r\n\r\n function showButton(item) {\r\n var show = true;\r\n var now = moment();\r\n var eventDte = moment(item.endDate); //以事件結束日期比較,事件已結束的就不顯示提醒我\r\n\r\n if (now > eventDte) {\r\n show = false;\r\n }\r\n //console.log('show:',show);\r\n return show;\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('showRelatedFunctionsModalController', showRelatedFunctionsModalController);\r\n\r\n function showRelatedFunctionsModalController(modalService,$uibModalInstance, headerService, relatedInfo, menuId, $location, menuService) {\r\n var vm = this;\r\n vm.isMobile = modalService.isMobile();\r\n vm.cancel = cancel;\r\n vm.redirectMenuSearchResult = redirectMenuSearchResult;\r\n vm.redirectContentSearchResult = redirectContentSearchResult;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = {};\r\n vm.data.relatedInfo = relatedInfo;\r\n vm.data.menuId = menuId;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function redirectMenuSearchResult(item) {\r\n //console.log(\"item.menuSerilNo:\"+item.menuSerilNo);\r\n if (!_.isEmpty(sessionStorage.getItem('menuAllList'))){\r\n \r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuItemPath', '');\r\n \r\n //如果Menu=37(上課與證照),就設定Menu=-9901(待修課程)\r\n if (parseInt(item.menuSerilNo)===37){\r\n sessionStorage.setItem('menuSerilNo', -9901);\r\n }\r\n else{\r\n sessionStorage.setItem('menuSerilNo', item.menuSerilNo);\r\n }\r\n\r\n //點選任一動態磚即撈取是選單功能Menu資料\r\n var menuAllList = JSON.parse(sessionStorage.getItem('menuAllList')); \r\n var menuItems = menuAllList.filter(function (menuLists){\r\n return (parseInt(menuLists.menuSerilNo) === parseInt(sessionStorage.getItem('menuSerilNo')) &&\r\n menuLists.hasChild === false\r\n );\r\n });\r\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\r\n if (menuItems!==null && menuItems.length!==0){\r\n sessionStorage.setItem('menuSerilNo', menuItems[0].menuSerilNo);\r\n sessionStorage.setItem('menuItemPath', menuItems[0].menuItemPath);\r\n }\r\n else{\r\n //如是選單節點即撈取第二或第三階層是否為父階層 \r\n menuItems = menuAllList.filter(function (menuLists) {\r\n return (parseInt(menuLists.parentId) === parseInt(sessionStorage.getItem('menuSerilNo'))\r\n );\r\n });\r\n\r\n //撈取選單節點下排序第一個功能Menu\r\n if (menuItems != null && menuItems.length!==0){ \r\n var sort = Math.min(...menuItems.map(p => p.sort));\r\n var menuItem = menuItems.filter(function (menuLists) {\r\n return (parseInt(menuLists.sort) === parseInt(sort));\r\n });\r\n \r\n //設定MenuSerilNo / MenuItemPath,以便點選三明治時會自動帶停駐在目前選單位置\r\n //console.log(menuItem);\r\n if (menuItem!==null && menuItem.length!==0){\r\n if (!menuItem[0].hasChild){\r\n sessionStorage.setItem('menuSerilNo', menuItem[0].menuSerilNo);\r\n }\r\n sessionStorage.setItem('menuItemPath', menuItem[0].menuItemPath);\r\n } \r\n }\r\n }\r\n\r\n console.log('showRelatedFunctions_redirectMenuSearchResult-menuSerilNo:'+sessionStorage.getItem('menuSerilNo'));\r\n console.log('showRelatedFunctions_redirectMenuSearchResult-menuItemPath:'+sessionStorage.getItem('menuItemPath'));\r\n }\r\n \r\n menuService.redirectUrl(item);\r\n $uibModalInstance.close();\r\n }\r\n\r\n function redirectContentSearchResult(item) {\r\n $location.path(\"bulletin/detail/\" + item.serilNo).search(\"menu\", 2);\r\n $uibModalInstance.close();\r\n }\r\n\r\n }\r\n})();","'use strict';\r\nvar Module = angular.module('datePicker', []);\r\n\r\nModule.constant('datePickerConfig', {\r\n //template: 'directive/datePicker/datePicker.html',\r\n view: 'month',\r\n views: ['year', 'month', 'date', 'hours', 'minutes'],\r\n momentNames: {\r\n year: 'year',\r\n month: 'month',\r\n date: 'day',\r\n hours: 'hours',\r\n minutes: 'minutes',\r\n },\r\n viewConfig: {\r\n year: ['years', 'isSameYear'],\r\n month: ['months', 'isSameMonth'],\r\n hours: ['hours', 'isSameHour'],\r\n minutes: ['minutes', 'isSameMinutes'],\r\n },\r\n step: 5\r\n});\r\n//Moment format filter.\r\nModule.filter('mFormat', function() {\r\n return function(m, format, tz) {\r\n var result = '';\r\n if (!(moment.isMoment(m))) {\r\n result = moment(m).format(format);\r\n } else {\r\n result = tz ? moment.tz(m, tz).format(format) : m.format(format);\r\n }\r\n return result;\r\n };\r\n});\r\n\r\nModule.directive('datePicker', ['datePickerConfig', 'datePickerUtils', '$timeout', '$rootScope', function datePickerDirective(datePickerConfig, datePickerUtils, $timeout, $rootScope) {\r\n //noinspection JSUnusedLocalSymbols\r\n return {\r\n // this is a bug ?\r\n require: '?ngModel',\r\n templateUrl: 'directive/datePicker/datePicker.html',\r\n scope: {\r\n model: '=datePicker',\r\n after: '=?',\r\n before: '=?',\r\n choiceDate: '=?',\r\n trigger: '=?'\r\n },\r\n link: function(scope, element, attrs, ngModel) {\r\n scope.translateWeek = translateWeek;\r\n var methodList = {\r\n //有空維護這支程式請方法(無論公有或私有)移到此區塊\r\n setDate: setDate,\r\n };\r\n var arrowClick = false,\r\n tz = scope.tz = attrs.timezone,\r\n createMoment = datePickerUtils.createMoment,\r\n eventIsForPicker = datePickerUtils.eventIsForPicker,\r\n step = parseInt(attrs.step || datePickerConfig.step, 10),\r\n partial = !!attrs.partial,\r\n minDate = getDate('minDate'),\r\n maxDate = getDate('maxDate'),\r\n pickerID = element[0].id,\r\n now = scope.now = createMoment(),\r\n selected = scope.date = createMoment(scope.model || now),\r\n autoclose = attrs.autoClose === 'true',\r\n // Either gets the 1st day from the attributes, or asks moment.js to give it to us as it is localized.\r\n firstDay = attrs.firstDay && attrs.firstDay >= 0 && attrs.firstDay <= 6 ? parseInt(attrs.firstDay, 10) : moment().weekday(0).day(),\r\n\r\n prepareViewData,\r\n isSame,\r\n clipDate,\r\n isNow,\r\n inValidRange;\r\n\r\n //==Main==\r\n init();\r\n //========\r\n function init() {\r\n //有空維護請將屬於初始設定放於此區塊\r\n datePickerUtils.setParams(tz, firstDay);\r\n }\r\n\r\n\r\n\r\n function prepareViews() {\r\n scope.views = datePickerConfig.views.concat();\r\n scope.view = attrs.view || datePickerConfig.view;\r\n scope.views = scope.views.slice(\r\n scope.views.indexOf(attrs.maxView || 'year'),\r\n scope.views.indexOf(attrs.minView || 'minutes') + 1\r\n );\r\n if (scope.views.length === 1 || scope.views.indexOf(scope.view) === -1) {\r\n scope.view = scope.views[0];\r\n }\r\n }\r\n\r\n function getDate(name) {\r\n return datePickerUtils.getDate(scope, attrs, name);\r\n }\r\n if (!scope.model) {\r\n selected.minute(Math.ceil(selected.minute() / step) * step).second(0);\r\n }\r\n\r\n scope.template = attrs.template || datePickerConfig.template;\r\n\r\n scope.watchDirectChanges = attrs.watchDirectChanges !== undefined;\r\n scope.callbackOnSetDate = attrs.dateChange ? datePickerUtils.findFunction(scope, attrs.dateChange) : undefined;\r\n\r\n prepareViews();\r\n\r\n scope.setView = function(nextView) {\r\n if (scope.views.indexOf(nextView) !== -1) {\r\n scope.view = nextView;\r\n }\r\n };\r\n //todo anson修改為了要關閉日期的地方\r\n scope.selectDate = function(date) {\r\n if (attrs.disabled) {\r\n return false;\r\n }\r\n if (isSame(scope.date, date)) {\r\n date = scope.date;\r\n }\r\n date = clipDate(date);\r\n if (!date) {\r\n return false;\r\n }\r\n scope.date = date;\r\n\r\n \r\n var nextView = scope.views[scope.views.indexOf(scope.view) + 1];\r\n if ((!nextView || partial) || scope.model) {\r\n setDate(date);\r\n }\r\n\r\n if (nextView) {\r\n scope.setView(nextView);\r\n } else if (autoclose) {\r\n element.addClass('hidden');\r\n scope.$emit('hidePicker');\r\n } else {\r\n prepareViewData();\r\n }\r\n // anson:為了不關閉,所以判斷autoClose\r\n if (attrs.minView === scope.views[0] && attrs.autoClose !== 'false') {\r\n element.addClass('hidden');\r\n scope.$emit('hidePicker');\r\n }\r\n\r\n };\r\n\r\n\r\n\r\n function setDate(date, notEmit) {\r\n //資料實際設定移到 setDate 後續監聽事件處理\r\n if (date) {\r\n scope.model = date;\r\n // if (ngModel) {\r\n // ngModel.$setViewValue(date);\r\n // }\r\n }\r\n if (!notEmit) {\r\n scope.$emit('setDate', date, scope.view);\r\n }\r\n\r\n //This is duplicated in the new functionality.\r\n if (scope.callbackOnSetDate) {\r\n scope.callbackOnSetDate(attrs.datePicker, scope.date);\r\n }\r\n };\r\n\r\n function update() {\r\n var view = scope.view;\r\n datePickerUtils.setParams(tz, firstDay);\r\n\r\n if (scope.model && !arrowClick) {\r\n scope.date = createMoment(scope.model);\r\n arrowClick = false;\r\n }\r\n\r\n var date = scope.date;\r\n switch (view) {\r\n case 'year':\r\n scope.years = datePickerUtils.getVisibleYears(date);\r\n break;\r\n case 'month':\r\n scope.months = datePickerUtils.getVisibleMonths(date);\r\n break;\r\n case 'date':\r\n scope.weekdays = scope.weekdays || datePickerUtils.getDaysOfWeek();\r\n // scope.weekdays = scope.weekdays || datePickerUtils.getWeekDays();\r\n scope.weeks = datePickerUtils.getVisibleWeeks(date);\r\n break;\r\n case 'hours':\r\n scope.hours = datePickerUtils.getVisibleHours(date);\r\n break;\r\n case 'minutes':\r\n scope.minutes = datePickerUtils.getVisibleMinutes(date, step);\r\n break;\r\n }\r\n if (scope.choiceDate) {\r\n initChoiceDate();\r\n }\r\n }\r\n\r\n // 透過外部變更 trigger 值來觸發更新行事曆資料\r\n scope.$watch('trigger', function(data) {\r\n if (data > 1) {\r\n initChoiceDate();\r\n }\r\n });\r\n\r\n function translateWeek(weekday) {\r\n weekday = weekday + '';\r\n var weekdayName = {\r\n '0': $rootScope.translate.tsunWeekSunday || 'Sunday',\r\n '1': $rootScope.translate.tsunWeekMonday || 'Monday',\r\n '2': $rootScope.translate.tsunWeekTuesday || 'Tuesday',\r\n '3': $rootScope.translate.tsunWeekWednesday || 'Wednesday',\r\n '4': $rootScope.translate.tsunWeekThusday || 'Thusday',\r\n '5': $rootScope.translate.tsunWeekFriday || 'Friday',\r\n '6': $rootScope.translate.tsunWeekSaturday || 'Saturday',\r\n };\r\n return weekdayName[weekday] || 'unknownday';\r\n }\r\n\r\n function initChoiceDate() {\r\n var classes = [],\r\n classList = '',\r\n i, j, week,\r\n weeks = scope.weeks;\r\n var choiceDateArr = [];\r\n\r\n scope.choiceDate.then(function(data) {\r\n\r\n // 目前選擇的日期\r\n // console.log('scope.date:', scope.date.toDate());\r\n\r\n // 所有行事曆資料\r\n // console.log('data.data.schedules:', jQuery.extend(true, {}, data.data.schedules));\r\n\r\n var prev2Month = moment(scope.date).subtract(2, 'M');\r\n var next1Month = moment(scope.date).add(1, 'M');\r\n var next2Month = moment(scope.date).add(2, 'M');\r\n var limitDate = moment.range(prev2Month, next2Month);\r\n\r\n _.each(data.data.schedules, function(x) {\r\n\r\n // 針對沒有 end 的事件,給予固定值填滿整個當月行事曆\r\n if (moment(x.end).isAfter(next1Month)) {\r\n x.end = next1Month.format('YYYY-MM-DDTHH:mm:ss');\r\n }\r\n\r\n // 過濾在被選擇日期的上下2月份的所有行事曆資料\r\n if (limitDate.contains(moment(x.end))) {\r\n choiceDateArr.push(x);\r\n }\r\n });\r\n\r\n // 被選擇日期的上下2月份的所有行事曆資料\r\n // console.log('choiceDateArr:', jQuery.extend(true, {}, choiceDateArr));\r\n\r\n var dateRange = _.chain(choiceDateArr)\r\n .forEach(function(x) {\r\n var end = moment(x.end);\r\n // 沒有加這行在下個階段會產生區間日期計算錯誤\r\n x.end = end.hour() < 9 ? end.subtract(1, 'day').format('YYYY-MM-DDTHH:mm:ss') : end.format('YYYY-MM-DDTHH:mm:ss');\r\n })\r\n .map(function(x) {\r\n // 計算區間中的每個日期\r\n var result = moment.range(moment(x.start).toDate(), moment(x.end).toDate()).toArray('days');\r\n return result;\r\n })\r\n .flatten()\r\n .map(function(x) {\r\n return x.format('YYYYMMDD');\r\n })\r\n .uniq()\r\n .sortBy()\r\n .value();\r\n\r\n // 需要顯示圈圈的日期\r\n // console.log('dateRange:', dateRange);\r\n\r\n for (i = 0; i < weeks.length; i++) {\r\n week = weeks[i];\r\n classes.push([]);\r\n for (j = 0; j < week.length; j++) {\r\n classList = '';\r\n _.each(dateRange, function(x) {\r\n if (x === moment(week[j]).format('YYYYMMDD')) {\r\n classList += 'choice';\r\n }\r\n });\r\n\r\n classes[i].push(classList);\r\n }\r\n }\r\n scope.classes = classes;\r\n });\r\n }\r\n\r\n function watch() {\r\n var result;\r\n if (scope.view !== 'date') {\r\n result = scope.view;\r\n } else {\r\n result = scope.date ? scope.date.month() : null;\r\n }\r\n return result;\r\n }\r\n\r\n scope.$watch(watch, function() {\r\n update();\r\n });\r\n\r\n if (scope.watchDirectChanges) {\r\n scope.$watch('model', function() {\r\n arrowClick = false;\r\n update();\r\n });\r\n }\r\n\r\n prepareViewData = function() {\r\n var view = scope.view,\r\n date = scope.date,\r\n classes = [],\r\n classList = '',\r\n i, j, choiceDay;\r\n\r\n datePickerUtils.setParams(tz, firstDay);\r\n if (view === 'date') {\r\n var weeks = scope.weeks,\r\n week;\r\n\r\n\r\n for (i = 0; i < weeks.length; i++) {\r\n week = weeks[i];\r\n classes.push([]);\r\n for (j = 0; j < week.length; j++) {\r\n classList = '';\r\n // if (datePickerUtils.isSameDay(date, week[j])) {\r\n // classList += 'active';\r\n // }\r\n // if (isNow(week[j], view)) {\r\n // classList += ' now';\r\n // }\r\n //if (week[j].month() !== date.month()) classList += ' disabled';\r\n // if (week[j].month() !== date.month() || !inValidRange(week[j])) {\r\n // classList += ' disabled';\r\n // }\r\n\r\n\r\n\r\n classes[i].push(classList);\r\n }\r\n }\r\n\r\n } else {\r\n var params = datePickerConfig.viewConfig[view],\r\n dates = scope[params[0]],\r\n compareFunc = params[1];\r\n\r\n for (i = 0; i < dates.length; i++) {\r\n classList = '';\r\n if (datePickerUtils[compareFunc](date, dates[i])) {\r\n classList += 'active';\r\n }\r\n if (isNow(dates[i], view)) {\r\n classList += ' now';\r\n }\r\n if (!inValidRange(dates[i])) {\r\n classList += ' disabled';\r\n }\r\n classes.push(classList);\r\n }\r\n }\r\n // scope.classes = classes;\r\n };\r\n\r\n scope.next = function(delta) {\r\n var date = moment(scope.date);\r\n delta = delta || 1;\r\n switch (scope.view) {\r\n case 'year':\r\n /*falls through*/\r\n case 'month':\r\n date.year(date.year() + delta);\r\n break;\r\n case 'date':\r\n date.month(date.month() + delta);\r\n break;\r\n case 'hours':\r\n /*falls through*/\r\n case 'minutes':\r\n date.hours(date.hours() + delta);\r\n break;\r\n }\r\n date = clipDate(date);\r\n\r\n if (date) {\r\n scope.date = date;\r\n setDate(date, true);\r\n arrowClick = true;\r\n }\r\n };\r\n\r\n inValidRange = function(date) {\r\n var valid = true;\r\n if (minDate && minDate.isAfter(date)) {\r\n valid = isSame(minDate, date);\r\n }\r\n if (maxDate && maxDate.isBefore(date)) {\r\n valid &= isSame(maxDate, date);\r\n }\r\n return valid;\r\n };\r\n\r\n isSame = function(date1, date2) {\r\n return date1.isSame(date2, datePickerConfig.momentNames[scope.view]) ? true : false;\r\n };\r\n\r\n clipDate = function(date) {\r\n if (minDate && minDate.isAfter(date)) {\r\n return minDate;\r\n } else if (maxDate && maxDate.isBefore(date)) {\r\n return maxDate;\r\n } else {\r\n return date;\r\n }\r\n };\r\n\r\n isNow = function(date, view) {\r\n var is = true;\r\n\r\n switch (view) {\r\n case 'minutes':\r\n is &= ~~(now.minutes() / step) === ~~(date.minutes() / step);\r\n /* falls through */\r\n case 'hours':\r\n is &= now.hours() === date.hours();\r\n /* falls through */\r\n case 'date':\r\n is &= now.date() === date.date();\r\n /* falls through */\r\n case 'month':\r\n is &= now.month() === date.month();\r\n /* falls through */\r\n case 'year':\r\n is &= now.year() === date.year();\r\n }\r\n return is;\r\n };\r\n\r\n scope.prev = function(delta) {\r\n return scope.next(-delta || -1);\r\n };\r\n\r\n if (pickerID) {\r\n scope.$on('pickerUpdate', function(event, pickerIDs, data) {\r\n if (eventIsForPicker(pickerIDs, pickerID)) {\r\n var updateViews = false,\r\n updateViewData = false;\r\n\r\n if (angular.isDefined(data.minDate)) {\r\n minDate = data.minDate ? data.minDate : false;\r\n updateViewData = true;\r\n }\r\n if (angular.isDefined(data.maxDate)) {\r\n maxDate = data.maxDate ? data.maxDate : false;\r\n updateViewData = true;\r\n }\r\n\r\n if (angular.isDefined(data.minView)) {\r\n attrs.minView = data.minView;\r\n updateViews = true;\r\n }\r\n if (angular.isDefined(data.maxView)) {\r\n attrs.maxView = data.maxView;\r\n updateViews = true;\r\n }\r\n attrs.view = data.view || attrs.view;\r\n\r\n if (updateViews) {\r\n prepareViews();\r\n }\r\n\r\n if (updateViewData) {\r\n update();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n };\r\n}]);\r\n","'use strict';\r\nvar PRISTINE_CLASS = 'ng-pristine',\r\n DIRTY_CLASS = 'ng-dirty';\r\n\r\nvar Module = angular.module('datePicker');\r\n\r\nModule.constant('dateTimeConfig', {\r\n template: function (attrs, id) {\r\n return '' +\r\n '
    ';\r\n },\r\n format: 'YYYY-MM-DD HH:mm',\r\n views: ['date', 'year', 'month', 'hours', 'minutes'],\r\n autoClose: true,\r\n position: 'relative'\r\n});\r\n\r\nModule.directive('dateTimeAppend', function () {\r\n return {\r\n link: function (scope, element) {\r\n element.bind('click', function () {\r\n element.find('input')[0].focus();\r\n });\r\n }\r\n };\r\n});\r\n\r\nModule.filter('resultFormat', function () {\r\n //處理結果的格式化.\r\n return function (newValue, oldValue, formatConfig) {\r\n // console.log(\"enter resultFormat\");\r\n // console.log(\"newValue:\",newValue);\r\n // console.log(\"oldValue:\",oldValue);\r\n var result = '';\r\n var newValueDate = Date.parse(newValue);\r\n var oldValueDate = Date.parse(oldValue);\r\n if (!newValueDate) {\r\n if (oldValueDate && newValue) {\r\n // console.log(\"resultValue set as oldValue\");\r\n result = oldValue;\r\n }\r\n else if (formatConfig.getDefault) {\r\n // console.log(\"checking default\");\r\n result = formatConfig.defaultValue\r\n ? formatConfig.defaultValue\r\n : moment(new Date()).format(formatConfig.format);\r\n }\r\n else {\r\n result = '';\r\n }\r\n }\r\n else if (!(moment.isMoment(newValue))) {\r\n // console.log(\"normale Setting,newValue is not moment\");\r\n result = moment(newValue, formatConfig.format).format(formatConfig.format);\r\n }\r\n else {\r\n // console.log(\"normale Setting,newValue is moment\");\r\n result = formatConfig.timezone\r\n ? moment.tz(newValueDate, formatConfig.timezone).format(formatConfig.format)\r\n : moment(newValue).format(formatConfig.format);\r\n }\r\n // console.log(\"end resultFormat...result\", result);\r\n return result;\r\n };\r\n});\r\nModule.directive('dateTime', ['$compile', '$timeout', '$document', '$filter', 'dateTimeConfig', '$parse', 'datePickerUtils',\r\n function ($compile, $timeout, $document, $filter, dateTimeConfig, $parse, datePickerUtils) {\r\n var body = $document.find('body');\r\n // var dateFilter = $filter('mFormat');\r\n var dateFilter = $filter('resultFormat');\r\n\r\n return {\r\n require: 'ngModel',\r\n scope: {\r\n model: '=ngModel',\r\n appendAlign: '@',\r\n onEvent: '&'\r\n },\r\n link: function (scope, element, attrs, ngModel, $scope) {\r\n var configs = {\r\n //有空維護這隻程式請將所屬控制類別參數改放此區塊\r\n formatConfig: {\r\n // 日期格式化校正設定\r\n format: attrs.format || dateTimeConfig.format,\r\n timezone: attrs.timezone || false,\r\n getDefault: attrs.getDefault ? (attrs.getDefault === 'true') : true,\r\n defaultValue: attrs.defaultValue || null,\r\n },\r\n };\r\n var data = {\r\n oldValue: '',\r\n template: dateTimeConfig.template(attrs),\r\n //有空維護這隻程式請將所屬資料類別參數改放此區塊\r\n };\r\n var format = attrs.format || dateTimeConfig.format,\r\n parentForm = element.inheritedData('$formController'),\r\n views = $parse(attrs.views)(scope) || dateTimeConfig.views.concat(),\r\n view = attrs.view || views[0],\r\n index = views.indexOf(view),\r\n dismiss = attrs.autoClose ? $parse(attrs.autoClose)(scope) : dateTimeConfig.autoClose,\r\n picker = null,\r\n pickerID = element[0].id,\r\n position = attrs.position || dateTimeConfig.position,\r\n container = null,\r\n minDate = null,\r\n minValid = null,\r\n maxDate = null,\r\n maxValid = null,\r\n timezone = attrs.timezone || false,\r\n eventIsForPicker = datePickerUtils.eventIsForPicker,\r\n dateChange = null,\r\n shownOnce = false,\r\n dateRequired;\r\n //===Main==\r\n init();\r\n //=========\r\n function logicInit() {\r\n if (!scope.appendAlign) {\r\n scope.appendAlign = 'down';\r\n }\r\n if (index === -1) {\r\n views.splice(index, 1);\r\n }\r\n views.unshift(view);\r\n\r\n if (angular.isDefined(attrs.minDate)) {\r\n setMin(datePickerUtils.findParam(scope, attrs.minDate));\r\n\r\n ngModel.$validators.min = function (value) {\r\n //If we don't have a min / max value, then any value is valid.\r\n return minValid ? moment.isMoment(value) && (minDate.isSame(value) || minDate.isBefore(value)) : true;\r\n };\r\n }\r\n\r\n if (angular.isDefined(attrs.maxDate)) {\r\n setMax(datePickerUtils.findParam(scope, attrs.maxDate));\r\n\r\n ngModel.$validators.max = function (value) {\r\n return maxValid ? moment.isMoment(value) && (maxDate.isSame(value) || maxDate.isAfter(value)) : true;\r\n };\r\n }\r\n\r\n if (angular.isDefined(attrs.dateChange)) {\r\n dateChange = datePickerUtils.findFunction(scope, attrs.dateChange);\r\n }\r\n\r\n if (pickerID) {\r\n scope.$on('pickerUpdate', function (event, pickerIDs, data) {\r\n if (eventIsForPicker(pickerIDs, pickerID)) {\r\n if (picker) {\r\n //Need to handle situation where the data changed but the picker is currently open.\r\n //To handle this, we can create the inner picker with a random ID, then forward\r\n //any events received to it.\r\n } else {\r\n var validateRequired = false;\r\n if (angular.isDefined(data.minDate)) {\r\n setMin(data.minDate);\r\n validateRequired = true;\r\n }\r\n if (angular.isDefined(data.maxDate)) {\r\n setMax(data.maxDate);\r\n validateRequired = true;\r\n }\r\n\r\n if (angular.isDefined(data.minView)) {\r\n attrs.minView = data.minView;\r\n }\r\n if (angular.isDefined(data.maxView)) {\r\n attrs.maxView = data.maxView;\r\n }\r\n\r\n attrs.view = data.view || attrs.view;\r\n\r\n if (validateRequired) {\r\n ngModel.$validate();\r\n }\r\n if (angular.isDefined(data.format)) {\r\n format = attrs.format = data.format || dateTimeConfig.format;\r\n ngModel.$modelValue = -1; //Triggers formatters. This value will be discarded.\r\n }\r\n // getTemplate();\r\n }\r\n }\r\n });\r\n }\r\n\r\n // getTemplate();\r\n element.change();\r\n }\r\n function init() {\r\n //console.log(\"dateTime...ngModel:\", ngModel);\r\n //todo anson為了自訂datePicker需要新增一筆以上才能通過驗証\r\n scope.$watch(attrs.dateRequired, function (value) {\r\n if (!value) {\r\n ngModel.$invalid = true;\r\n }\r\n });\r\n scope.$on('setDate', function (event, date, view) {\r\n setDateProcess(event, date, view);\r\n });\r\n scope.$on('hidePicker', function () {\r\n element.triggerHandler('blur');\r\n });\r\n scope.$on('$destroy', clear);\r\n element.bind('focus', showPicker);\r\n element.bind('blur', clear);\r\n element.change(function () {\r\n // console.log(\"enter change event\");\r\n // console.log(\"scope.model:\",scope.model);\r\n // console.log(\" data.oldValue:\", data.oldValue);\r\n var resultDate = dateFilter(scope.model, data.oldValue, configs.formatConfig);\r\n element.val(resultDate);\r\n scope.model = resultDate;\r\n data.oldValue = resultDate;\r\n if (dateChange) {\r\n dateChange(attrs.ngModel, scope.model);\r\n }\r\n // console.log(\"scope.model:\", resultDate);\r\n // console.log(\"scope:\", scope);\r\n // console.log(\"end change event\");\r\n });\r\n logicInit();\r\n }\r\n\r\n function setDateProcess(event, date, view) {\r\n //console.log(\"detect setDate on\");\r\n //console.log(\"viewValue set:\", date);\r\n scope.model = date;\r\n element.change();\r\n event.stopPropagation();\r\n if (attrs.minView === view) {\r\n if (dismiss && views[views.length - 1] === view) {\r\n clear();\r\n }\r\n element.blur();\r\n }\r\n }\r\n function parser(viewValue) {\r\n //console.log(\"parser viewValue:\", viewValue);\r\n var parsed = moment(viewValue, format);\r\n var result = undefined;\r\n if (parsed.isValid()) {\r\n result = parsed;\r\n }\r\n //console.log(\"parser result:\", result);\r\n return result;\r\n }\r\n\r\n function setMin(date) {\r\n minDate = date;\r\n attrs.minDate = date ? date.format() : date;\r\n minValid = moment.isMoment(date);\r\n }\r\n\r\n function setMax(date) {\r\n maxDate = date;\r\n attrs.maxDate = date ? date.format() : date;\r\n maxValid = moment.isMoment(date);\r\n }\r\n\r\n function clear() {\r\n // return;\r\n // console.log(\"enter clear...picker:\", picker, \"container:\", container);\r\n if (picker) {\r\n picker.remove();\r\n picker = null;\r\n }\r\n if (container) {\r\n container.remove();\r\n container = null;\r\n }\r\n // console.log(\"end clear...picker:\", picker, \"container:\", container);\r\n }\r\n\r\n // function getTemplate() {\r\n // template = dateTimeConfig.template(attrs);\r\n // }\r\n\r\n function showPicker() {\r\n if (picker) {\r\n return;\r\n }\r\n var bodyHeight = document.body.scrollHeight;\r\n // create picker element\r\n picker = $compile(data.template)(scope);\r\n picker.css({\r\n display: 'block',\r\n position: position,\r\n });\r\n picker.bind('mousedown', function (evt) {\r\n evt.preventDefault();\r\n });\r\n scope.$digest();\r\n\r\n // move picker below input element\r\n if (position === 'absolute') {\r\n body.append(picker);\r\n $timeout(function () {\r\n //這段可能會有BUG\r\n //BUG原因是scope.$digest()其實還沒跑完(這方法好像是非同步)\r\n //因此要徹底解決需要找到後置的處理方案\r\n var width = 400;\r\n if (body.width() < width) {\r\n width = body.width() - 10;\r\n }\r\n var pos = element[0].getBoundingClientRect();\r\n var pickerHeight = picker.height();\r\n var height = pos.height || element[0].offsetHeight;// Support IE8\r\n var scrollHeight = body.scrollTop();\r\n var showTop = pos.top + height + scrollHeight;\r\n if ((showTop + pickerHeight) > bodyHeight) {\r\n showTop = bodyHeight - pickerHeight;\r\n }\r\n\r\n picker.css({\r\n top: showTop + 'px',\r\n left: pos.left + 'px',\r\n position: position,\r\n width: width + 'px'\r\n });\r\n }, 50);\r\n } else {\r\n // relative\r\n container = angular.element('
    ');\r\n element[0].parentElement.insertBefore(container[0], element[0]);\r\n container.append(picker);\r\n picker.css({ top: element[0].offsetHeight + 'px', display: 'block' });\r\n }\r\n // console.log(\"scope.appendAlign:\", scope.appendAlign);\r\n // console.log(\"top:\", element[0].offsetHeight);\r\n // console.log(\"picker\",picker);\r\n // console.log(\"picker.height:\", picker.height());\r\n // console.log(\"container\",container);\r\n // console.log(\"container.height:\", container.height());\r\n }\r\n\r\n\r\n }\r\n };\r\n }]);\r\n","'use strict';\r\nangular.module('datePicker').factory('datePickerUtils', function () {\r\n var tz, firstDay;\r\n var createNewDate = function (year, month, day, hour, minute) {\r\n var utc = Date.UTC(year | 0, month | 0, day | 0, hour | 0, minute | 0);\r\n return tz ? moment.tz(utc, tz) : moment(utc);\r\n };\r\n\r\n return {\r\n getVisibleMinutes: function (m, step) {\r\n var year = m.year(),\r\n month = m.month(),\r\n day = m.date(),\r\n hour = m.hours(), pushedDate,\r\n offset = m.utcOffset() / 60,\r\n minutes = [], minute;\r\n\r\n for (minute = 0; minute < 60; minute += step) {\r\n pushedDate = createNewDate(year, month, day, hour - offset, minute);\r\n minutes.push(pushedDate);\r\n }\r\n return minutes;\r\n },\r\n getVisibleWeeks: function (m) {\r\n m = moment(m);\r\n var startYear = m.year(),\r\n startMonth = m.month();\r\n\r\n //Set date to the first day of the month\r\n m.date(1);\r\n\r\n //Grab day of the week\r\n var day = m.day();\r\n //Go back the required number of days to arrive at the previous week start\r\n m.date(firstDay - (day + (firstDay >= day ? 6 : -1)));\r\n\r\n var weeks = [];\r\n while (weeks.length < 6) {\r\n if (m.year() === startYear && m.month() > startMonth) {\r\n break;\r\n }\r\n weeks.push(this.getDaysOfWeek(m));\r\n m.add(7, 'd');\r\n }\r\n return weeks;\r\n },\r\n getVisibleYears: function (d) {\r\n var m = moment(d),\r\n year = m.year();\r\n\r\n m.year(year - (year % 10));\r\n year = m.year();\r\n\r\n var offset = m.utcOffset() / 60,\r\n years = [],\r\n pushedDate,\r\n actualOffset;\r\n\r\n for (var i = 0; i < 12; i++) {\r\n pushedDate = createNewDate(year, 0, 1, 0 - offset);\r\n actualOffset = pushedDate.utcOffset() / 60;\r\n if (actualOffset !== offset) {\r\n pushedDate = createNewDate(year, 0, 1, 0 - actualOffset);\r\n offset = actualOffset;\r\n }\r\n years.push(pushedDate);\r\n year++;\r\n }\r\n return years;\r\n },\r\n getWeekDays: function () {\r\n return [0, 1, 2, 3, 4, 5, 6];\r\n },\r\n getDaysOfWeek: function (m) {\r\n m = m ? m : (tz ? moment.tz(tz).day(firstDay) : moment().day(firstDay));\r\n\r\n var year = m.year(),\r\n month = m.month(),\r\n day = m.date(),\r\n days = [],\r\n pushedDate,\r\n offset = m.utcOffset() / 60,\r\n actualOffset;\r\n\r\n for (var i = 0; i < 7; i++) {\r\n pushedDate = createNewDate(year, month, day, 0 - offset, 0, false);\r\n actualOffset = pushedDate.utcOffset() / 60;\r\n if (actualOffset !== offset) {\r\n pushedDate = createNewDate(year, month, day, 0 - actualOffset, 0, false);\r\n }\r\n days.push(pushedDate);\r\n day++;\r\n }\r\n return days;\r\n },\r\n getVisibleMonths: function (m) {\r\n var year = m.year(),\r\n offset = m.utcOffset() / 60,\r\n months = [],\r\n pushedDate,\r\n actualOffset;\r\n\r\n for (var month = 0; month < 12; month++) {\r\n pushedDate = createNewDate(year, month, 1, 0 - offset, 0, false);\r\n actualOffset = pushedDate.utcOffset() / 60;\r\n if (actualOffset !== offset) {\r\n pushedDate = createNewDate(year, month, 1, 0 - actualOffset, 0, false);\r\n }\r\n months.push(pushedDate);\r\n }\r\n return months;\r\n },\r\n getVisibleHours: function (m) {\r\n var year = m.year(),\r\n month = m.month(),\r\n day = m.date(),\r\n hours = [],\r\n hour, pushedDate, actualOffset,\r\n offset = m.utcOffset() / 60;\r\n\r\n for (hour = 0; hour < 24; hour++) {\r\n pushedDate = createNewDate(year, month, day, hour - offset, 0, false);\r\n actualOffset = pushedDate.utcOffset() / 60;\r\n if (actualOffset !== offset) {\r\n pushedDate = createNewDate(year, month, day, hour - actualOffset, 0, false);\r\n }\r\n hours.push(pushedDate);\r\n }\r\n\r\n return hours;\r\n },\r\n isAfter: function (model, date) {\r\n return model && model.unix() >= date.unix();\r\n },\r\n isBefore: function (model, date) {\r\n return model.unix() <= date.unix();\r\n },\r\n isSameYear: function (model, date) {\r\n return model && model.year() == date.year();\r\n },\r\n isSameMonth: function (model, date) {\r\n return this.isSameYear(model, date) && model.month() === date.month();\r\n },\r\n isSameDay: function (model, date) {\r\n return this.isSameMonth(model, date) && model.date() === date.date();\r\n },\r\n isSameHour: function (model, date) {\r\n return this.isSameDay(model, date) && model.hours() === date.hours();\r\n },\r\n isSameMinutes: function (model, date) {\r\n return this.isSameHour(model, date) && model.minutes() === date.minutes();\r\n },\r\n setParams: function (zone, fd) {\r\n tz = zone;\r\n firstDay = fd;\r\n },\r\n scopeSearch: function (scope, name, comparisonFn) {\r\n var parentScope = scope,\r\n nameArray = name.split('.'),\r\n target, i, j = nameArray.length;\r\n\r\n do {\r\n target = parentScope = parentScope.$parent;\r\n\r\n //Loop through provided names.\r\n for (i = 0; i < j; i++) {\r\n target = target[nameArray[i]];\r\n if (!target) {\r\n continue;\r\n }\r\n }\r\n\r\n //If we reached the end of the list for this scope,\r\n //and something was found, trigger the comparison\r\n //function. If the comparison function is happy, return\r\n //found result. Otherwise, continue to the next parent scope\r\n if (target && comparisonFn(target)) {\r\n return target;\r\n }\r\n\r\n } while (parentScope.$parent);\r\n\r\n return false;\r\n },\r\n findFunction: function (scope, name) {\r\n //Search scope ancestors for a matching function.\r\n return this.scopeSearch(scope, name, function (target) {\r\n //Property must also be a function\r\n return angular.isFunction(target);\r\n });\r\n },\r\n findParam: function (scope, name) {\r\n //Search scope ancestors for a matching parameter.\r\n return this.scopeSearch(scope, name, function () {\r\n //As long as the property exists, we're good\r\n return true;\r\n });\r\n },\r\n createMoment: function (m) {\r\n if (tz) {\r\n return moment.tz(m, tz);\r\n } else {\r\n //If input is a moment, and we have no TZ info, we need to remove TZ\r\n //info from the moment, otherwise the newly created moment will take\r\n //the timezone of the input moment. The easiest way to do that is to\r\n //take the unix timestamp, and use that to create a new moment.\r\n //The new moment will use the local timezone of the user machine.\r\n return moment.isMoment(m) ? moment.unix(m.unix()) : moment(m);\r\n }\r\n },\r\n getDate: function (scope, attrs, name) {\r\n var result = false;\r\n if (attrs[name]) {\r\n result = this.createMoment(attrs[name]);\r\n if (!result.isValid()) {\r\n result = this.findParam(scope, attrs[name]);\r\n if (result) {\r\n result = this.createMoment(result);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n //Checks if an event targeted at a specific picker, via either a string name, or an array of strings.\r\n eventIsForPicker: function (targetIDs, pickerID) {\r\n function matches(id) {\r\n if (id instanceof RegExp) {\r\n return id.test(pickerID);\r\n }\r\n return id === pickerID;\r\n }\r\n\r\n if (angular.isArray(targetIDs)) {\r\n return targetIDs.some(matches);\r\n }\r\n return matches(targetIDs);\r\n }\r\n };\r\n});\r\n","'use strict';\r\nvar Module = angular.module('datePicker');\r\n\r\nModule.directive('dateRange', ['$compile', 'datePickerUtils', 'dateTimeConfig', function ($compile, datePickerUtils, dateTimeConfig) {\r\n function getTemplate(attrs, id, model, min, max) {\r\n return dateTimeConfig.template(angular.extend(attrs, {\r\n ngModel: model,\r\n minDate: min && moment.isMoment(min) ? min.format() : false,\r\n maxDate: max && moment.isMoment(max) ? max.format() : false\r\n }), id);\r\n }\r\n\r\n function randomName() {\r\n return 'picker' + (new Date()).getTime().toString().substr(2);\r\n }\r\n\r\n return {\r\n scope: {\r\n start: '=',\r\n end: '='\r\n },\r\n link: function (scope, element, attrs) {\r\n var dateChange = null,\r\n pickerRangeID = element[0].id,\r\n pickerIDs = [randomName(), randomName()],\r\n createMoment = datePickerUtils.createMoment,\r\n eventIsForPicker = datePickerUtils.eventIsForPicker;\r\n\r\n scope.dateChange = function (modelName, newDate) {\r\n //Notify user if callback exists.\r\n if (dateChange) {\r\n dateChange(modelName, newDate);\r\n }\r\n };\r\n\r\n function setMax(date) {\r\n scope.$broadcast('pickerUpdate', pickerIDs[0], {\r\n maxDate: date\r\n });\r\n }\r\n\r\n function setMin(date) {\r\n scope.$broadcast('pickerUpdate', pickerIDs[1], {\r\n minDate: date\r\n });\r\n }\r\n\r\n if (pickerRangeID) {\r\n scope.$on('pickerUpdate', function (event, targetIDs, data) {\r\n if (eventIsForPicker(targetIDs, pickerRangeID)) {\r\n //If we received an update event, dispatch it to the inner pickers using their IDs.\r\n scope.$broadcast('pickerUpdate', pickerIDs, data);\r\n }\r\n });\r\n }\r\n\r\n datePickerUtils.setParams(attrs.timezone);\r\n\r\n scope.start = createMoment(scope.start);\r\n scope.end = createMoment(scope.end);\r\n\r\n scope.$watchGroup(['start', 'end'], function (dates) {\r\n //Scope data changed, update picker min/max\r\n setMin(dates[0]);\r\n setMax(dates[1]);\r\n });\r\n\r\n if (angular.isDefined(attrs.dateChange)) {\r\n dateChange = datePickerUtils.findFunction(scope, attrs.dateChange);\r\n }\r\n\r\n attrs.onSetDate = 'dateChange';\r\n\r\n var template = '
    ' +\r\n getTemplate(attrs, pickerIDs[0], 'start', false, scope.end) +\r\n '' +\r\n getTemplate(attrs, pickerIDs[1], 'end', scope.start, false) +\r\n '
    ';\r\n\r\n var picker = $compile(template)(scope);\r\n element.append(picker);\r\n }\r\n };\r\n}]);\r\n","angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])\r\n\r\n.constant('uibDropdownConfig', {\r\n appendToOpenClass: 'uib-dropdown-open',\r\n openClass: 'open'\r\n})\r\n\r\n.service('uibDropdownService', ['$document', '$rootScope', function($document, $rootScope) {\r\n var openScope = null;\r\n\r\n this.open = function(dropdownScope) {\r\n if (!openScope) {\r\n $document.on('click', closeDropdown);\r\n $document.on('keydown', keybindFilter);\r\n }\r\n\r\n if (openScope && openScope !== dropdownScope) {\r\n openScope.isOpen = false;\r\n }\r\n\r\n openScope = dropdownScope;\r\n };\r\n\r\n this.close = function(dropdownScope) {\r\n if (openScope === dropdownScope) {\r\n openScope = null;\r\n $document.off('click', closeDropdown);\r\n $document.off('keydown', keybindFilter);\r\n }\r\n };\r\n\r\n var closeDropdown = function(evt) {\r\n // This method may still be called during the same mouse event that\r\n // unbound this event handler. So check openScope before proceeding.\r\n if (!openScope) { return; }\r\n\r\n if (evt && openScope.getAutoClose() === 'disabled') { return; }\r\n\r\n if (evt && evt.which === 3) { return; }\r\n\r\n var toggleElement = openScope.getToggleElement();\r\n if (evt && toggleElement && toggleElement[0].contains(evt.target)) {\r\n return;\r\n }\r\n\r\n var dropdownElement = openScope.getDropdownElement();\r\n if (evt && openScope.getAutoClose() === 'outsideClick' &&\r\n dropdownElement && dropdownElement[0].contains(evt.target)) {\r\n return;\r\n }\r\n\r\n openScope.isOpen = false;\r\n\r\n if (!$rootScope.$$phase) {\r\n openScope.$apply();\r\n }\r\n };\r\n\r\n var keybindFilter = function(evt) {\r\n if (evt.which === 27) {\r\n openScope.focusToggleElement();\r\n closeDropdown();\r\n } else if (openScope.isKeynavEnabled() && [38, 40].indexOf(evt.which) !== -1 && openScope.isOpen) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n openScope.focusDropdownEntry(evt.which);\r\n }\r\n };\r\n}])\r\n\r\n.controller('UibDropdownController', ['$scope', '$element', '$attrs', '$parse', 'uibDropdownConfig', 'uibDropdownService', '$animate', '$uibPosition', '$document', '$compile', '$templateRequest', function($scope, $element, $attrs, $parse, dropdownConfig, uibDropdownService, $animate, $position, $document, $compile, $templateRequest) {\r\n var self = this,\r\n scope = $scope.$new(), // create a child scope so we are not polluting original one\r\n templateScope,\r\n appendToOpenClass = dropdownConfig.appendToOpenClass,\r\n openClass = dropdownConfig.openClass,\r\n getIsOpen,\r\n setIsOpen = angular.noop,\r\n toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop,\r\n appendToBody = false,\r\n appendTo = null,\r\n keynavEnabled = false,\r\n selectedOption = null,\r\n body = $document.find('body');\r\n\r\n $element.addClass('dropdown');\r\n\r\n this.init = function() {\r\n if ($attrs.isOpen) {\r\n getIsOpen = $parse($attrs.isOpen);\r\n setIsOpen = getIsOpen.assign;\r\n\r\n $scope.$watch(getIsOpen, function(value) {\r\n scope.isOpen = !!value;\r\n });\r\n }\r\n\r\n if (angular.isDefined($attrs.dropdownAppendTo)) {\r\n var appendToEl = $parse($attrs.dropdownAppendTo)(scope);\r\n if (appendToEl) {\r\n appendTo = angular.element(appendToEl);\r\n }\r\n }\r\n\r\n appendToBody = angular.isDefined($attrs.dropdownAppendToBody);\r\n keynavEnabled = angular.isDefined($attrs.keyboardNav);\r\n\r\n if (appendToBody && !appendTo) {\r\n appendTo = body;\r\n }\r\n\r\n if (appendTo && self.dropdownMenu) {\r\n appendTo.append(self.dropdownMenu);\r\n $element.on('$destroy', function handleDestroyEvent() {\r\n self.dropdownMenu.remove();\r\n });\r\n }\r\n };\r\n\r\n this.toggle = function(open) {\r\n scope.isOpen = arguments.length ? !!open : !scope.isOpen;\r\n if (angular.isFunction(setIsOpen)) {\r\n setIsOpen(scope, scope.isOpen);\r\n }\r\n\r\n return scope.isOpen;\r\n };\r\n\r\n // Allow other directives to watch status\r\n this.isOpen = function() {\r\n return scope.isOpen;\r\n };\r\n\r\n scope.getToggleElement = function() {\r\n return self.toggleElement;\r\n };\r\n\r\n scope.getAutoClose = function() {\r\n return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled'\r\n };\r\n\r\n scope.getElement = function() {\r\n return $element;\r\n };\r\n\r\n scope.isKeynavEnabled = function() {\r\n return keynavEnabled;\r\n };\r\n\r\n scope.focusDropdownEntry = function(keyCode) {\r\n var elems = self.dropdownMenu ? //If append to body is used.\r\n angular.element(self.dropdownMenu).find('a') :\r\n $element.find('ul').eq(0).find('a');\r\n\r\n switch (keyCode) {\r\n case 40: {\r\n if (!angular.isNumber(self.selectedOption)) {\r\n self.selectedOption = 0;\r\n } else {\r\n self.selectedOption = self.selectedOption === elems.length - 1 ?\r\n self.selectedOption :\r\n self.selectedOption + 1;\r\n }\r\n break;\r\n }\r\n case 38: {\r\n if (!angular.isNumber(self.selectedOption)) {\r\n self.selectedOption = elems.length - 1;\r\n } else {\r\n self.selectedOption = self.selectedOption === 0 ?\r\n 0 : self.selectedOption - 1;\r\n }\r\n break;\r\n }\r\n }\r\n elems[self.selectedOption].focus();\r\n };\r\n\r\n scope.getDropdownElement = function() {\r\n return self.dropdownMenu;\r\n };\r\n\r\n scope.focusToggleElement = function() {\r\n if (self.toggleElement) {\r\n self.toggleElement[0].focus();\r\n }\r\n };\r\n\r\n scope.$watch('isOpen', function(isOpen, wasOpen) {\r\n if (appendTo && self.dropdownMenu) {\r\n var pos = $position.positionElements($element, self.dropdownMenu, 'bottom-left', true),\r\n css,\r\n rightalign;\r\n\r\n css = {\r\n top: pos.top + 'px',\r\n display: isOpen ? 'block' : 'none'\r\n };\r\n\r\n rightalign = self.dropdownMenu.hasClass('dropdown-menu-right');\r\n if (!rightalign) {\r\n css.left = pos.left + 'px';\r\n css.right = 'auto';\r\n } else {\r\n css.left = 'auto';\r\n css.right = window.innerWidth -\r\n (pos.left + $element.prop('offsetWidth')) + 'px';\r\n }\r\n\r\n // Need to adjust our positioning to be relative to the appendTo container\r\n // if it's not the body element\r\n if (!appendToBody) {\r\n var appendOffset = $position.offset(appendTo);\r\n\r\n css.top = pos.top - appendOffset.top + 'px';\r\n\r\n if (!rightalign) {\r\n css.left = pos.left - appendOffset.left + 'px';\r\n } else {\r\n css.right = window.innerWidth -\r\n (pos.left - appendOffset.left + $element.prop('offsetWidth')) + 'px';\r\n }\r\n }\r\n\r\n self.dropdownMenu.css(css);\r\n }\r\n\r\n var openContainer = appendTo ? appendTo : $element;\r\n var hasOpenClass = openContainer.hasClass(appendTo ? appendToOpenClass : openClass);\r\n\r\n if (hasOpenClass === !isOpen) {\r\n $animate[isOpen ? 'addClass' : 'removeClass'](openContainer, appendTo ? appendToOpenClass : openClass).then(function() {\r\n if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\r\n toggleInvoker($scope, { open: !!isOpen });\r\n }\r\n });\r\n }\r\n\r\n if (isOpen) {\r\n if (self.dropdownMenuTemplateUrl) {\r\n $templateRequest(self.dropdownMenuTemplateUrl).then(function(tplContent) {\r\n templateScope = scope.$new();\r\n $compile(tplContent.trim())(templateScope, function(dropdownElement) {\r\n var newEl = dropdownElement;\r\n self.dropdownMenu.replaceWith(newEl);\r\n self.dropdownMenu = newEl;\r\n });\r\n });\r\n }\r\n\r\n scope.focusToggleElement();\r\n uibDropdownService.open(scope);\r\n } else {\r\n if (self.dropdownMenuTemplateUrl) {\r\n if (templateScope) {\r\n templateScope.$destroy();\r\n }\r\n var newEl = angular.element('
      ');\r\n self.dropdownMenu.replaceWith(newEl);\r\n self.dropdownMenu = newEl;\r\n }\r\n\r\n uibDropdownService.close(scope);\r\n self.selectedOption = null;\r\n }\r\n\r\n if (angular.isFunction(setIsOpen)) {\r\n setIsOpen($scope, isOpen);\r\n }\r\n });\r\n}])\r\n\r\n.directive('uibDropdown', function() {\r\n return {\r\n controller: 'UibDropdownController',\r\n link: function(scope, element, attrs, dropdownCtrl) {\r\n dropdownCtrl.init();\r\n }\r\n };\r\n})\r\n\r\n.directive('uibDropdownMenu', function() {\r\n return {\r\n restrict: 'A',\r\n require: '?^uibDropdown',\r\n link: function(scope, element, attrs, dropdownCtrl) {\r\n if (!dropdownCtrl || angular.isDefined(attrs.dropdownNested)) {\r\n return;\r\n }\r\n\r\n element.addClass('dropdown-menu');\r\n\r\n var tplUrl = attrs.templateUrl;\r\n if (tplUrl) {\r\n dropdownCtrl.dropdownMenuTemplateUrl = tplUrl;\r\n }\r\n\r\n if (!dropdownCtrl.dropdownMenu) {\r\n dropdownCtrl.dropdownMenu = element;\r\n }\r\n }\r\n };\r\n})\r\n\r\n.directive('uibDropdownToggle', function() {\r\n return {\r\n require: '?^uibDropdown',\r\n link: function(scope, element, attrs, dropdownCtrl) {\r\n if (!dropdownCtrl) {\r\n return;\r\n }\r\n\r\n element.addClass('dropdown-toggle');\r\n\r\n dropdownCtrl.toggleElement = element;\r\n\r\n var toggleDropdown = function(event) {\r\n event.preventDefault();\r\n\r\n if (!element.hasClass('disabled') && !attrs.disabled) {\r\n scope.$apply(function() {\r\n dropdownCtrl.toggle();\r\n });\r\n }\r\n };\r\n\r\n element.bind('click', toggleDropdown);\r\n\r\n // WAI-ARIA\r\n element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\r\n scope.$watch(dropdownCtrl.isOpen, function(isOpen) {\r\n element.attr('aria-expanded', !!isOpen);\r\n });\r\n\r\n scope.$on('$destroy', function() {\r\n element.unbind('click', toggleDropdown);\r\n });\r\n }\r\n };\r\n});\r\n","angular.module('ui.bootstrap.position', [])\r\n\r\n/**\r\n * A set of utility methods for working with the DOM.\r\n * It is meant to be used where we need to absolute-position elements in\r\n * relation to another element (this is the case for tooltips, popovers,\r\n * typeahead suggestions etc.).\r\n */\r\n .factory('$uibPosition', ['$document', '$window', function($document, $window) {\r\n /**\r\n * Used by scrollbarWidth() function to cache scrollbar's width.\r\n * Do not access this variable directly, use scrollbarWidth() instead.\r\n */\r\n var SCROLLBAR_WIDTH;\r\n /**\r\n * scrollbar on body and html element in IE and Edge overlay\r\n * content and should be considered 0 width.\r\n */\r\n var BODY_SCROLLBAR_WIDTH;\r\n var OVERFLOW_REGEX = {\r\n normal: /(auto|scroll)/,\r\n hidden: /(auto|scroll|hidden)/\r\n };\r\n var PLACEMENT_REGEX = {\r\n auto: /\\s?auto?\\s?/i,\r\n primary: /^(top|bottom|left|right)$/,\r\n secondary: /^(top|bottom|left|right|center)$/,\r\n vertical: /^(top|bottom)$/\r\n };\r\n var BODY_REGEX = /(HTML|BODY)/;\r\n\r\n return {\r\n\r\n /**\r\n * Provides a raw DOM element from a jQuery/jQLite element.\r\n *\r\n * @param {element} elem - The element to convert.\r\n *\r\n * @returns {element} A HTML element.\r\n */\r\n getRawNode: function(elem) {\r\n return elem.nodeName ? elem : elem[0] || elem;\r\n },\r\n\r\n /**\r\n * Provides a parsed number for a style property. Strips\r\n * units and casts invalid numbers to 0.\r\n *\r\n * @param {string} value - The style value to parse.\r\n *\r\n * @returns {number} A valid number.\r\n */\r\n parseStyle: function(value) {\r\n value = parseFloat(value);\r\n return isFinite(value) ? value : 0;\r\n },\r\n\r\n /**\r\n * Provides the closest positioned ancestor.\r\n *\r\n * @param {element} element - The element to get the offest parent for.\r\n *\r\n * @returns {element} The closest positioned ancestor.\r\n */\r\n offsetParent: function(elem) {\r\n elem = this.getRawNode(elem);\r\n\r\n var offsetParent = elem.offsetParent || $document[0].documentElement;\r\n\r\n function isStaticPositioned(el) {\r\n return ($window.getComputedStyle(el).position || 'static') === 'static';\r\n }\r\n\r\n while (offsetParent && offsetParent !== $document[0].documentElement && isStaticPositioned(offsetParent)) {\r\n offsetParent = offsetParent.offsetParent;\r\n }\r\n\r\n return offsetParent || $document[0].documentElement;\r\n },\r\n\r\n /**\r\n * Provides the scrollbar width, concept from TWBS measureScrollbar()\r\n * function in https://github.com/twbs/bootstrap/blob/master/js/modal.js\r\n * In IE and Edge, scollbar on body and html element overlay and should\r\n * return a width of 0.\r\n *\r\n * @returns {number} The width of the browser scollbar.\r\n */\r\n scrollbarWidth: function(isBody) {\r\n if (isBody) {\r\n if (angular.isUndefined(BODY_SCROLLBAR_WIDTH)) {\r\n var bodyElem = $document.find('body');\r\n bodyElem.addClass('uib-position-body-scrollbar-measure');\r\n BODY_SCROLLBAR_WIDTH = $window.innerWidth - bodyElem[0].clientWidth;\r\n BODY_SCROLLBAR_WIDTH = isFinite(BODY_SCROLLBAR_WIDTH) ? BODY_SCROLLBAR_WIDTH : 0;\r\n bodyElem.removeClass('uib-position-body-scrollbar-measure');\r\n }\r\n return BODY_SCROLLBAR_WIDTH;\r\n }\r\n\r\n if (angular.isUndefined(SCROLLBAR_WIDTH)) {\r\n var scrollElem = angular.element('
      ');\r\n $document.find('body').append(scrollElem);\r\n SCROLLBAR_WIDTH = scrollElem[0].offsetWidth - scrollElem[0].clientWidth;\r\n SCROLLBAR_WIDTH = isFinite(SCROLLBAR_WIDTH) ? SCROLLBAR_WIDTH : 0;\r\n scrollElem.remove();\r\n }\r\n\r\n return SCROLLBAR_WIDTH;\r\n },\r\n\r\n /**\r\n * Provides the padding required on an element to replace the scrollbar.\r\n *\r\n * @returns {object} An object with the following properties:\r\n *
        \r\n *
      • **scrollbarWidth**: the width of the scrollbar
      • \r\n *
      • **widthOverflow**: whether the the width is overflowing
      • \r\n *
      • **right**: the amount of right padding on the element needed to replace the scrollbar
      • \r\n *
      • **rightOriginal**: the amount of right padding currently on the element
      • \r\n *
      • **heightOverflow**: whether the the height is overflowing
      • \r\n *
      • **bottom**: the amount of bottom padding on the element needed to replace the scrollbar
      • \r\n *
      • **bottomOriginal**: the amount of bottom padding currently on the element
      • \r\n *
      \r\n */\r\n scrollbarPadding: function(elem) {\r\n elem = this.getRawNode(elem);\r\n\r\n var elemStyle = $window.getComputedStyle(elem);\r\n var paddingRight = this.parseStyle(elemStyle.paddingRight);\r\n var paddingBottom = this.parseStyle(elemStyle.paddingBottom);\r\n var scrollParent = this.scrollParent(elem, false, true);\r\n var scrollbarWidth = this.scrollbarWidth(scrollParent, BODY_REGEX.test(scrollParent.tagName));\r\n\r\n return {\r\n scrollbarWidth: scrollbarWidth,\r\n widthOverflow: scrollParent.scrollWidth > scrollParent.clientWidth,\r\n right: paddingRight + scrollbarWidth,\r\n originalRight: paddingRight,\r\n heightOverflow: scrollParent.scrollHeight > scrollParent.clientHeight,\r\n bottom: paddingBottom + scrollbarWidth,\r\n originalBottom: paddingBottom\r\n };\r\n },\r\n\r\n /**\r\n * Checks to see if the element is scrollable.\r\n *\r\n * @param {element} elem - The element to check.\r\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\r\n * default is false.\r\n *\r\n * @returns {boolean} Whether the element is scrollable.\r\n */\r\n isScrollable: function(elem, includeHidden) {\r\n elem = this.getRawNode(elem);\r\n\r\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\r\n var elemStyle = $window.getComputedStyle(elem);\r\n return overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX);\r\n },\r\n\r\n /**\r\n * Provides the closest scrollable ancestor.\r\n * A port of the jQuery UI scrollParent method:\r\n * https://github.com/jquery/jquery-ui/blob/master/ui/scroll-parent.js\r\n *\r\n * @param {element} elem - The element to find the scroll parent of.\r\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\r\n * default is false.\r\n * @param {boolean=} [includeSelf=false] - Should the element being passed be\r\n * included in the scrollable llokup.\r\n *\r\n * @returns {element} A HTML element.\r\n */\r\n scrollParent: function(elem, includeHidden, includeSelf) {\r\n elem = this.getRawNode(elem);\r\n\r\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\r\n var documentEl = $document[0].documentElement;\r\n var elemStyle = $window.getComputedStyle(elem);\r\n if (includeSelf && overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX)) {\r\n return elem;\r\n }\r\n var excludeStatic = elemStyle.position === 'absolute';\r\n var scrollParent = elem.parentElement || documentEl;\r\n\r\n if (scrollParent === documentEl || elemStyle.position === 'fixed') {\r\n return documentEl;\r\n }\r\n\r\n while (scrollParent.parentElement && scrollParent !== documentEl) {\r\n var spStyle = $window.getComputedStyle(scrollParent);\r\n if (excludeStatic && spStyle.position !== 'static') {\r\n excludeStatic = false;\r\n }\r\n\r\n if (!excludeStatic && overflowRegex.test(spStyle.overflow + spStyle.overflowY + spStyle.overflowX)) {\r\n break;\r\n }\r\n scrollParent = scrollParent.parentElement;\r\n }\r\n\r\n return scrollParent;\r\n },\r\n\r\n /**\r\n * Provides read-only equivalent of jQuery's position function:\r\n * http://api.jquery.com/position/ - distance to closest positioned\r\n * ancestor. Does not account for margins by default like jQuery position.\r\n *\r\n * @param {element} elem - The element to caclulate the position on.\r\n * @param {boolean=} [includeMargins=false] - Should margins be accounted\r\n * for, default is false.\r\n *\r\n * @returns {object} An object with the following properties:\r\n *
        \r\n *
      • **width**: the width of the element
      • \r\n *
      • **height**: the height of the element
      • \r\n *
      • **top**: distance to top edge of offset parent
      • \r\n *
      • **left**: distance to left edge of offset parent
      • \r\n *
      \r\n */\r\n position: function(elem, includeMagins) {\r\n elem = this.getRawNode(elem);\r\n\r\n var elemOffset = this.offset(elem);\r\n if (includeMagins) {\r\n var elemStyle = $window.getComputedStyle(elem);\r\n elemOffset.top -= this.parseStyle(elemStyle.marginTop);\r\n elemOffset.left -= this.parseStyle(elemStyle.marginLeft);\r\n }\r\n var parent = this.offsetParent(elem);\r\n var parentOffset = {top: 0, left: 0};\r\n\r\n if (parent !== $document[0].documentElement) {\r\n parentOffset = this.offset(parent);\r\n parentOffset.top += parent.clientTop - parent.scrollTop;\r\n parentOffset.left += parent.clientLeft - parent.scrollLeft;\r\n }\r\n\r\n return {\r\n width: Math.round(angular.isNumber(elemOffset.width) ? elemOffset.width : elem.offsetWidth),\r\n height: Math.round(angular.isNumber(elemOffset.height) ? elemOffset.height : elem.offsetHeight),\r\n top: Math.round(elemOffset.top - parentOffset.top),\r\n left: Math.round(elemOffset.left - parentOffset.left)\r\n };\r\n },\r\n\r\n /**\r\n * Provides read-only equivalent of jQuery's offset function:\r\n * http://api.jquery.com/offset/ - distance to viewport. Does\r\n * not account for borders, margins, or padding on the body\r\n * element.\r\n *\r\n * @param {element} elem - The element to calculate the offset on.\r\n *\r\n * @returns {object} An object with the following properties:\r\n *
        \r\n *
      • **width**: the width of the element
      • \r\n *
      • **height**: the height of the element
      • \r\n *
      • **top**: distance to top edge of viewport
      • \r\n *
      • **right**: distance to bottom edge of viewport
      • \r\n *
      \r\n */\r\n offset: function(elem) {\r\n elem = this.getRawNode(elem);\r\n\r\n var elemBCR = elem.getBoundingClientRect();\r\n return {\r\n width: Math.round(angular.isNumber(elemBCR.width) ? elemBCR.width : elem.offsetWidth),\r\n height: Math.round(angular.isNumber(elemBCR.height) ? elemBCR.height : elem.offsetHeight),\r\n top: Math.round(elemBCR.top + ($window.pageYOffset || $document[0].documentElement.scrollTop)),\r\n left: Math.round(elemBCR.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft))\r\n };\r\n },\r\n\r\n /**\r\n * Provides offset distance to the closest scrollable ancestor\r\n * or viewport. Accounts for border and scrollbar width.\r\n *\r\n * Right and bottom dimensions represent the distance to the\r\n * respective edge of the viewport element. If the element\r\n * edge extends beyond the viewport, a negative value will be\r\n * reported.\r\n *\r\n * @param {element} elem - The element to get the viewport offset for.\r\n * @param {boolean=} [useDocument=false] - Should the viewport be the document element instead\r\n * of the first scrollable element, default is false.\r\n * @param {boolean=} [includePadding=true] - Should the padding on the offset parent element\r\n * be accounted for, default is true.\r\n *\r\n * @returns {object} An object with the following properties:\r\n *
        \r\n *
      • **top**: distance to the top content edge of viewport element
      • \r\n *
      • **bottom**: distance to the bottom content edge of viewport element
      • \r\n *
      • **left**: distance to the left content edge of viewport element
      • \r\n *
      • **right**: distance to the right content edge of viewport element
      • \r\n *
      \r\n */\r\n viewportOffset: function(elem, useDocument, includePadding) {\r\n elem = this.getRawNode(elem);\r\n includePadding = includePadding !== false ? true : false;\r\n\r\n var elemBCR = elem.getBoundingClientRect();\r\n var offsetBCR = {top: 0, left: 0, bottom: 0, right: 0};\r\n\r\n var offsetParent = useDocument ? $document[0].documentElement : this.scrollParent(elem);\r\n var offsetParentBCR = offsetParent.getBoundingClientRect();\r\n\r\n offsetBCR.top = offsetParentBCR.top + offsetParent.clientTop;\r\n offsetBCR.left = offsetParentBCR.left + offsetParent.clientLeft;\r\n if (offsetParent === $document[0].documentElement) {\r\n offsetBCR.top += $window.pageYOffset;\r\n offsetBCR.left += $window.pageXOffset;\r\n }\r\n offsetBCR.bottom = offsetBCR.top + offsetParent.clientHeight;\r\n offsetBCR.right = offsetBCR.left + offsetParent.clientWidth;\r\n\r\n if (includePadding) {\r\n var offsetParentStyle = $window.getComputedStyle(offsetParent);\r\n offsetBCR.top += this.parseStyle(offsetParentStyle.paddingTop);\r\n offsetBCR.bottom -= this.parseStyle(offsetParentStyle.paddingBottom);\r\n offsetBCR.left += this.parseStyle(offsetParentStyle.paddingLeft);\r\n offsetBCR.right -= this.parseStyle(offsetParentStyle.paddingRight);\r\n }\r\n\r\n return {\r\n top: Math.round(elemBCR.top - offsetBCR.top),\r\n bottom: Math.round(offsetBCR.bottom - elemBCR.bottom),\r\n left: Math.round(elemBCR.left - offsetBCR.left),\r\n right: Math.round(offsetBCR.right - elemBCR.right)\r\n };\r\n },\r\n\r\n /**\r\n * Provides an array of placement values parsed from a placement string.\r\n * Along with the 'auto' indicator, supported placement strings are:\r\n *
        \r\n *
      • top: element on top, horizontally centered on host element.
      • \r\n *
      • top-left: element on top, left edge aligned with host element left edge.
      • \r\n *
      • top-right: element on top, lerightft edge aligned with host element right edge.
      • \r\n *
      • bottom: element on bottom, horizontally centered on host element.
      • \r\n *
      • bottom-left: element on bottom, left edge aligned with host element left edge.
      • \r\n *
      • bottom-right: element on bottom, right edge aligned with host element right edge.
      • \r\n *
      • left: element on left, vertically centered on host element.
      • \r\n *
      • left-top: element on left, top edge aligned with host element top edge.
      • \r\n *
      • left-bottom: element on left, bottom edge aligned with host element bottom edge.
      • \r\n *
      • right: element on right, vertically centered on host element.
      • \r\n *
      • right-top: element on right, top edge aligned with host element top edge.
      • \r\n *
      • right-bottom: element on right, bottom edge aligned with host element bottom edge.
      • \r\n *
      \r\n * A placement string with an 'auto' indicator is expected to be\r\n * space separated from the placement, i.e: 'auto bottom-left' If\r\n * the primary and secondary placement values do not match 'top,\r\n * bottom, left, right' then 'top' will be the primary placement and\r\n * 'center' will be the secondary placement. If 'auto' is passed, true\r\n * will be returned as the 3rd value of the array.\r\n *\r\n * @param {string} placement - The placement string to parse.\r\n *\r\n * @returns {array} An array with the following values\r\n *
        \r\n *
      • **[0]**: The primary placement.
      • \r\n *
      • **[1]**: The secondary placement.
      • \r\n *
      • **[2]**: If auto is passed: true, else undefined.
      • \r\n *
      \r\n */\r\n parsePlacement: function(placement) {\r\n var autoPlace = PLACEMENT_REGEX.auto.test(placement);\r\n if (autoPlace) {\r\n placement = placement.replace(PLACEMENT_REGEX.auto, '');\r\n }\r\n\r\n placement = placement.split('-');\r\n\r\n placement[0] = placement[0] || 'top';\r\n if (!PLACEMENT_REGEX.primary.test(placement[0])) {\r\n placement[0] = 'top';\r\n }\r\n\r\n placement[1] = placement[1] || 'center';\r\n if (!PLACEMENT_REGEX.secondary.test(placement[1])) {\r\n placement[1] = 'center';\r\n }\r\n\r\n if (autoPlace) {\r\n placement[2] = true;\r\n } else {\r\n placement[2] = false;\r\n }\r\n\r\n return placement;\r\n },\r\n\r\n /**\r\n * Provides coordinates for an element to be positioned relative to\r\n * another element. Passing 'auto' as part of the placement parameter\r\n * will enable smart placement - where the element fits. i.e:\r\n * 'auto left-top' will check to see if there is enough space to the left\r\n * of the hostElem to fit the targetElem, if not place right (same for secondary\r\n * top placement). Available space is calculated using the viewportOffset\r\n * function.\r\n *\r\n * @param {element} hostElem - The element to position against.\r\n * @param {element} targetElem - The element to position.\r\n * @param {string=} [placement=top] - The placement for the targetElem,\r\n * default is 'top'. 'center' is assumed as secondary placement for\r\n * 'top', 'left', 'right', and 'bottom' placements. Available placements are:\r\n *
        \r\n *
      • top
      • \r\n *
      • top-right
      • \r\n *
      • top-left
      • \r\n *
      • bottom
      • \r\n *
      • bottom-left
      • \r\n *
      • bottom-right
      • \r\n *
      • left
      • \r\n *
      • left-top
      • \r\n *
      • left-bottom
      • \r\n *
      • right
      • \r\n *
      • right-top
      • \r\n *
      • right-bottom
      • \r\n *
      \r\n * @param {boolean=} [appendToBody=false] - Should the top and left values returned\r\n * be calculated from the body element, default is false.\r\n *\r\n * @returns {object} An object with the following properties:\r\n *
        \r\n *
      • **top**: Value for targetElem top.
      • \r\n *
      • **left**: Value for targetElem left.
      • \r\n *
      • **placement**: The resolved placement.
      • \r\n *
      \r\n */\r\n positionElements: function(hostElem, targetElem, placement, appendToBody) {\r\n hostElem = this.getRawNode(hostElem);\r\n targetElem = this.getRawNode(targetElem);\r\n\r\n // need to read from prop to support tests.\r\n var targetWidth = angular.isDefined(targetElem.offsetWidth) ? targetElem.offsetWidth : targetElem.prop('offsetWidth');\r\n var targetHeight = angular.isDefined(targetElem.offsetHeight) ? targetElem.offsetHeight : targetElem.prop('offsetHeight');\r\n\r\n placement = this.parsePlacement(placement);\r\n\r\n var hostElemPos = appendToBody ? this.offset(hostElem) : this.position(hostElem);\r\n var targetElemPos = {top: 0, left: 0, placement: ''};\r\n\r\n if (placement[2]) {\r\n var viewportOffset = this.viewportOffset(hostElem, appendToBody);\r\n\r\n var targetElemStyle = $window.getComputedStyle(targetElem);\r\n var adjustedSize = {\r\n width: targetWidth + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginLeft) + this.parseStyle(targetElemStyle.marginRight))),\r\n height: targetHeight + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginTop) + this.parseStyle(targetElemStyle.marginBottom)))\r\n };\r\n\r\n placement[0] = placement[0] === 'top' && adjustedSize.height > viewportOffset.top && adjustedSize.height <= viewportOffset.bottom ? 'bottom' :\r\n placement[0] === 'bottom' && adjustedSize.height > viewportOffset.bottom && adjustedSize.height <= viewportOffset.top ? 'top' :\r\n placement[0] === 'left' && adjustedSize.width > viewportOffset.left && adjustedSize.width <= viewportOffset.right ? 'right' :\r\n placement[0] === 'right' && adjustedSize.width > viewportOffset.right && adjustedSize.width <= viewportOffset.left ? 'left' :\r\n placement[0];\r\n\r\n placement[1] = placement[1] === 'top' && adjustedSize.height - hostElemPos.height > viewportOffset.bottom && adjustedSize.height - hostElemPos.height <= viewportOffset.top ? 'bottom' :\r\n placement[1] === 'bottom' && adjustedSize.height - hostElemPos.height > viewportOffset.top && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom ? 'top' :\r\n placement[1] === 'left' && adjustedSize.width - hostElemPos.width > viewportOffset.right && adjustedSize.width - hostElemPos.width <= viewportOffset.left ? 'right' :\r\n placement[1] === 'right' && adjustedSize.width - hostElemPos.width > viewportOffset.left && adjustedSize.width - hostElemPos.width <= viewportOffset.right ? 'left' :\r\n placement[1];\r\n\r\n if (placement[1] === 'center') {\r\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\r\n var xOverflow = hostElemPos.width / 2 - targetWidth / 2;\r\n if (viewportOffset.left + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.right) {\r\n placement[1] = 'left';\r\n } else if (viewportOffset.right + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.left) {\r\n placement[1] = 'right';\r\n }\r\n } else {\r\n var yOverflow = hostElemPos.height / 2 - adjustedSize.height / 2;\r\n if (viewportOffset.top + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom) {\r\n placement[1] = 'top';\r\n } else if (viewportOffset.bottom + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.top) {\r\n placement[1] = 'bottom';\r\n }\r\n }\r\n }\r\n }\r\n\r\n switch (placement[0]) {\r\n case 'top':\r\n targetElemPos.top = hostElemPos.top - targetHeight;\r\n break;\r\n case 'bottom':\r\n targetElemPos.top = hostElemPos.top + hostElemPos.height;\r\n break;\r\n case 'left':\r\n targetElemPos.left = hostElemPos.left - targetWidth;\r\n break;\r\n case 'right':\r\n targetElemPos.left = hostElemPos.left + hostElemPos.width;\r\n break;\r\n }\r\n\r\n switch (placement[1]) {\r\n case 'top':\r\n targetElemPos.top = hostElemPos.top;\r\n break;\r\n case 'bottom':\r\n targetElemPos.top = hostElemPos.top + hostElemPos.height - targetHeight;\r\n break;\r\n case 'left':\r\n targetElemPos.left = hostElemPos.left;\r\n break;\r\n case 'right':\r\n targetElemPos.left = hostElemPos.left + hostElemPos.width - targetWidth;\r\n break;\r\n case 'center':\r\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\r\n targetElemPos.left = hostElemPos.left + hostElemPos.width / 2 - targetWidth / 2;\r\n } else {\r\n targetElemPos.top = hostElemPos.top + hostElemPos.height / 2 - targetHeight / 2;\r\n }\r\n break;\r\n }\r\n\r\n targetElemPos.top = Math.round(targetElemPos.top);\r\n targetElemPos.left = Math.round(targetElemPos.left);\r\n targetElemPos.placement = placement[1] === 'center' ? placement[0] : placement[0] + '-' + placement[1];\r\n\r\n return targetElemPos;\r\n },\r\n\r\n /**\r\n * Provides a way for positioning tooltip & dropdown\r\n * arrows when using placement options beyond the standard\r\n * left, right, top, or bottom.\r\n *\r\n * @param {element} elem - The tooltip/dropdown element.\r\n * @param {string} placement - The placement for the elem.\r\n */\r\n positionArrow: function(elem, placement) {\r\n elem = this.getRawNode(elem);\r\n\r\n var innerElem = elem.querySelector('.tooltip-inner, .popover-inner');\r\n if (!innerElem) {\r\n return;\r\n }\r\n\r\n var isTooltip = angular.element(innerElem).hasClass('tooltip-inner');\r\n\r\n var arrowElem = isTooltip ? elem.querySelector('.tooltip-arrow') : elem.querySelector('.arrow');\r\n if (!arrowElem) {\r\n return;\r\n }\r\n\r\n var arrowCss = {\r\n top: '',\r\n bottom: '',\r\n left: '',\r\n right: ''\r\n };\r\n\r\n placement = this.parsePlacement(placement);\r\n if (placement[1] === 'center') {\r\n // no adjustment necessary - just reset styles\r\n angular.element(arrowElem).css(arrowCss);\r\n return;\r\n }\r\n\r\n var borderProp = 'border-' + placement[0] + '-width';\r\n var borderWidth = $window.getComputedStyle(arrowElem)[borderProp];\r\n\r\n var borderRadiusProp = 'border-';\r\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\r\n borderRadiusProp += placement[0] + '-' + placement[1];\r\n } else {\r\n borderRadiusProp += placement[1] + '-' + placement[0];\r\n }\r\n borderRadiusProp += '-radius';\r\n var borderRadius = $window.getComputedStyle(isTooltip ? innerElem : elem)[borderRadiusProp];\r\n\r\n switch (placement[0]) {\r\n case 'top':\r\n arrowCss.bottom = isTooltip ? '0' : '-' + borderWidth;\r\n break;\r\n case 'bottom':\r\n arrowCss.top = isTooltip ? '0' : '-' + borderWidth;\r\n break;\r\n case 'left':\r\n arrowCss.right = isTooltip ? '0' : '-' + borderWidth;\r\n break;\r\n case 'right':\r\n arrowCss.left = isTooltip ? '0' : '-' + borderWidth;\r\n break;\r\n }\r\n\r\n arrowCss[placement[1]] = borderRadius;\r\n\r\n angular.element(arrowElem).css(arrowCss);\r\n }\r\n };\r\n }]);\r\n","angular.module('ui.bootstrap.stackedMap', [])\r\n/**\r\n * A helper, internal data structure that acts as a map but also allows getting / removing\r\n * elements in the LIFO order\r\n */\r\n .factory('$$stackedMap', function() {\r\n return {\r\n createNew: function() {\r\n var stack = [];\r\n\r\n return {\r\n add: function(key, value) {\r\n stack.push({\r\n key: key,\r\n value: value\r\n });\r\n },\r\n get: function(key) {\r\n for (var i = 0; i < stack.length; i++) {\r\n if (key === stack[i].key) {\r\n return stack[i];\r\n }\r\n }\r\n },\r\n keys: function() {\r\n var keys = [];\r\n for (var i = 0; i < stack.length; i++) {\r\n keys.push(stack[i].key);\r\n }\r\n return keys;\r\n },\r\n top: function() {\r\n return stack[stack.length - 1];\r\n },\r\n remove: function(key) {\r\n var idx = -1;\r\n for (var i = 0; i < stack.length; i++) {\r\n if (key === stack[i].key) {\r\n idx = i;\r\n break;\r\n }\r\n }\r\n return stack.splice(idx, 1)[0];\r\n },\r\n removeTop: function() {\r\n return stack.splice(stack.length - 1, 1)[0];\r\n },\r\n length: function() {\r\n return stack.length;\r\n }\r\n };\r\n }\r\n };\r\n });","angular.module('ui.bootstrap',\r\n [\r\n 'ui.bootstrap.modal',\r\n 'ui.bootstrap.tabs',\r\n 'ui.bootstrap.carousel',\r\n 'ui.bootstrap.dropdown',\r\n 'ui.bootstrap.typeahead',\r\n 'ui.bootstrap.pagination'\r\n ]);","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('httpInterceptor', httpInterceptor);\r\n\r\n function httpInterceptor($httpParamSerializer, $location, $q, $rootScope, apiUrl, blockUI) {\r\n var service = {\r\n response: response,\r\n request: request,\r\n responseError: responseError\r\n };\r\n\r\n function response(data) {\r\n return data;\r\n }\r\n\r\n function responseError(error) {\r\n\r\n blockUI.stop();\r\n \r\n switch (error.status) {\r\n case 406:\r\n toastr.warning($rootScope.translate.pleaseSetNo);\r\n $location.path('/').search('menu', 31);\r\n break;\r\n case 404:\r\n toastr.warning(error.data);\r\n break;\r\n case 403:\r\n toastr.warning($rootScope.translate.canNotAccess);\r\n $location.path('/').search('menu', 31);\r\n break;\r\n case 401:\r\n if (sessionStorage.getItem('token')) {\r\n if ($rootScope.translate) {\r\n toastr.warning($rootScope.translate.tokenIsTimeout);\r\n }\r\n }\r\n removeSsoInfo();\r\n $location.path('/login').search({});\r\n break;\r\n case 400:\r\n toastr.warning(error.data.message);\r\n break;\r\n case 303:\r\n var isConfirm = confirm(error.data);\r\n if (isConfirm) {\r\n if (sessionStorage.getItem('token')) {\r\n $location.path('/').search('menu', 1);\r\n } else {\r\n $location.path('/login').search({});\r\n }\r\n } else {\r\n return $q.resolve(error);\r\n }\r\n break;\r\n\r\n case -1:\r\n\r\n // 在 IOS APP 中停留一段時間\r\n // 在按上一頁面就會產生 -1 的錯誤訊息\r\n // 但此 error 不包含任何 data / message 資訊\r\n // 所以就先這樣 避免進入 default 跳出錯誤訊息\r\n\r\n break;\r\n\r\n default:\r\n\r\n // post error message to server\r\n var status = '', data = '', message = '';\r\n if (error) {\r\n if (error.statu) { \r\n status = error.status;\r\n }\r\n if (error.data) {\r\n data = error.data;\r\n if (error.data.message) {\r\n message = error.data.message;\r\n }\r\n }\r\n }\r\n \r\n var errorLog = `[httpInterceptor] status: ${error.status}, data: ${error.data}, message: ${message}`;\r\n postException(errorLog, apiUrl);\r\n\r\n showSystemError();\r\n break;\r\n }\r\n return $q.reject(error);\r\n }\r\n\r\n function request(config) {\r\n var contentType = _.get(config.headers, 'Content-Type');\r\n if (!_.startsWith(contentType, 'application/json')) {\r\n config.headers = {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n };\r\n config.transformRequest = function (data) {\r\n return $httpParamSerializer(data);\r\n };\r\n }\r\n\r\n\r\n // config.headers[\"Accept-Language\"] = sessionStorage.getItem(\"userLang\");\r\n\r\n // if (sessionStorage.getItem('langCode')) {\r\n // config.headers.LangCode = sessionStorage.getItem('langCode');\r\n // } else {\r\n // config.headers.LangCode = getDefaultLangCode();\r\n // sessionStorage.setItem('langCode', getDefaultLangCode());\r\n // }\r\n\r\n if (sessionStorage.getItem('langCode')) {\r\n config.headers.LangCode = sessionStorage.getItem('langCode');\r\n config.headers[\"Accept-Language\"] = sessionStorage.getItem('userLang');\r\n } else {\r\n\r\n getDefaultUserLang(apiUrl.tsApi, navigator.systemLanguage).done(function (data) {\r\n\r\n var userLang = data;\r\n var langCode = getLangCode(userLang);\r\n config.headers.LangCode = langCode;\r\n sessionStorage.setItem('langCode', langCode);\r\n \r\n });\r\n\r\n }\r\n\r\n\r\n\r\n return config;\r\n }\r\n\r\n return service;\r\n }\r\n})();","(function() {\r\n'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('choicePerSerilNoModalController', choicePerSerilNoModalController);\r\n \r\n function choicePerSerilNoModalController($uibModal,data,$uibModalInstance) {\r\n var vm = this;\r\n vm.choiceSeirlNo=choiceSeirlNo;\r\n vm.data=data;\r\n \r\n function choiceSeirlNo(item){\r\n return $uibModalInstance.close(item);\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('contectModalController', contectModalController);\r\n\r\n function contectModalController($uibModalInstance, modalService, e2eService, headerService,\r\n $rootScope, loginService, iAmNotRobot, userData, $http, apiUrl) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.autoFill = autoFill;\r\n vm.submit = submit;\r\n vm.iAmNotRobot = iAmNotRobot;\r\n\r\n init();\r\n\r\n function init() {\r\n vm.view={\r\n show: false\r\n }\r\n vm.data = {};\r\n vm.isLogin = userData.isLogin;\r\n vm.data.name = userData.cName;\r\n vm.data.email = userData.email;\r\n \r\n if (!sessionStorage.getItem('token')) {\r\n // loginService.getSsoInfo().then(function(data) {\r\n // vm.data.name = sessionStorage.getItem('cName');\r\n // vm.data.email = data.data.email;\r\n // vm.isLogin = true;\r\n // });\r\n vm.view.show = true;\r\n }\r\n\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function autoFill() {\r\n e2eService.contactMe(vm.data);\r\n }\r\n\r\n function specialKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function submit() {\r\n if(specialKeywordVerification(vm.data.name))\r\n {\r\n toastr.warning($rootScope.translate.commonName + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n else if(specialKeywordVerification(vm.data.content))\r\n {\r\n toastr.warning($rootScope.translate.commonContent + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n\r\n\r\n if (vm.isLogin) {\r\n //已登入狀態下,略過圖形驗證\r\n headerService.contactMe(vm.data).then(function () {\r\n toastr.success($rootScope.translate.sendMailSuccess);\r\n $uibModalInstance.dismiss('cancel');\r\n });\r\n } else {\r\n if(specialKeywordVerification(vm.login.inputVerify))\r\n {\r\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n \r\n if($('#inputVerify').val().length == 4){\r\n var paramsData = {\r\n name: vm.data.name,\r\n email: vm.data.email,\r\n content: vm.data.content,\r\n inputVerify: $('#inputVerify').val().toUpperCase(),\r\n isPass: $('#isPass').val(),\r\n SecretKey: \"1\"\r\n };\r\n \r\n headerService.contactMe(paramsData).then(function (data) {\r\n \r\n if (data) {\r\n toastr.success($rootScope.translate.sendMailSuccess);\r\n $uibModalInstance.dismiss('cancel');\r\n }else{\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n }\r\n });\r\n }else\r\n {\r\n toastr.warning($rootScope.translate.commonIncorrectFormat);\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n angular.module('app')\r\n .controller('courseDetailModalController', courseDetailModalController);\r\n\r\n function courseDetailModalController(modalService,$uibModalInstance, $q, $scope, enumService,\r\n trainingInnerService, courseItem, settingModel, $location, $anchorScroll, commonService, defaultTabIndex) {\r\n\r\n var vm = this;\r\n vm.isMobile = modalService.isMobile();\r\n vm.setPathUrl = setPathUrl;\r\n vm.goTop = goTop;\r\n vm.cancel = cancel;\r\n vm.enroll = enroll;\r\n vm.tabChange = tabChange;\r\n vm.sessionChoice = sessionChoice;\r\n vm.enum = {\r\n courseType: enumService.courseType\r\n };\r\n //===Main==\r\n init();\r\n //=========\r\n function init() {\r\n dataInit();\r\n logicInit();\r\n $scope.$on('emitExamSubmit', function () {\r\n enroll();\r\n });\r\n }\r\n\r\n function dataInit() {\r\n settingModel = settingModel || {};\r\n vm.data = {\r\n importCourse: courseItem || null, //.....理論上是清單列傳入的班次課程\r\n importCourseActivities: null,//..........傳入的班次課程包含學習動作(WS14)\r\n sessionItem: null,//.....................班次資料\r\n sessionDetail: null,//...................班次詳細資料\r\n courageItem: null,//.....................學程資料\r\n courageDetail: null,//...................學程詳細資料\r\n enrollQuestionItem: null,//..............報名前問卷\r\n enrollActivity: null,//..................報名問卷\r\n tabIndex: 0,//...........................畫面頁籤\r\n };\r\n vm.view = {\r\n enrollQuestionMode: settingModel.isEnroll || false,\r\n hasEnrollQuestion: false,//..............有報名前問卷\r\n contentCourage: false,\r\n contentCourse: false,\r\n pageLoad: false,\r\n couragePage: false,//.............學程頁面\r\n sessionPage: false,//.............班次頁面\r\n };\r\n }\r\n function logicInit() {\r\n return sessionInit(vm.data.importCourse)\r\n .then(function () {\r\n var selectActive = trainingInnerService.getSelectActive(vm.data.importCourse);\r\n return selectActive.then(function (data) {\r\n //console.log(\"selectActiveResult:\", data);\r\n vm.data.importCourseActivities = data;\r\n });\r\n })\r\n .then(function () {\r\n vm.view.hasEnrollQuestion = (vm.data.importCourseActivities.preSurveyItemId > 0);\r\n //console.log('hasQues:',vm.view.hasEnrollQuestion );\r\n if (vm.view.hasEnrollQuestion) {\r\n vm.data.enrollActivity = {\r\n type: '問卷',\r\n itemId: vm.data.importCourseActivities.preSurveyItemId,\r\n };\r\n }\r\n vm.data.tabIndex = vm.view.enrollQuestionMode ? 2 : vm.data.tabIndex;\r\n Accordion();\r\n\r\n });\r\n }\r\n\r\n function sessionInit(importItem) {\r\n if (!importItem) { return; }\r\n var courseDetail = trainingInnerService.getCourseDetail(importItem);\r\n return courseDetail.then(function (data) {\r\n var courseDetailResult = detailFormat(data);\r\n switch (parseInt(importItem.courseType)) {\r\n case vm.enum.courseType.courage:\r\n //學程\r\n vm.data.courageItem = angular.copy(importItem);\r\n vm.data.courageDetail = courseDetailResult;\r\n vm.view.couragePage = true;\r\n vm.data.tabIndex = defaultTabIndex ? defaultTabIndex : 0; // 第一頁籤是 0,但客戶要求預設顯示第2頁籤\r\n break;\r\n default:\r\n //非學程\r\n vm.data.sessionItem = angular.copy(importItem);\r\n vm.data.sessionDetail = courseDetailResult;\r\n vm.view.sessionPage = true;\r\n vm.data.tabIndex = defaultTabIndex ? defaultTabIndex : 1; // 第一頁籤是 1,但客戶要求預設顯示第2頁籤\r\n break;\r\n }\r\n });\r\n }\r\n\r\n\r\n function detailFormat(sourceData) {\r\n var detailData = angular.copy(sourceData);\r\n if (!detailData) { return detailData; }\r\n //===========\r\n var brCheck = /(\\r?\\n)/g;\r\n _.forEach(detailData, function (value, key) {\r\n var isInt = (value === parseInt(value, 10));\r\n var isString = (typeof value === \"string\");\r\n if (isInt) {\r\n var isAsNull = (value < 0);\r\n\r\n if (isAsNull) {\r\n detailData[key] = null;\r\n }\r\n else {\r\n detailData[key] = value + '';\r\n }\r\n }\r\n else if (isString) {\r\n detailData[key] = value.replace(brCheck, \"
      \");\r\n }\r\n });\r\n //===========\r\n if (detailData.reference) {\r\n //檢查參考文件格式\r\n if (!angular.isArray(detailData.reference)) {\r\n //參考文件必須是陣列\r\n detailData.reference = null;\r\n }\r\n if (detailData.reference.length <= 0) {\r\n //參考文件必須有內容\r\n detailData.reference = null;\r\n }\r\n }\r\n return detailData;\r\n }\r\n function goTop() {\r\n $location.hash('PageTop');\r\n $anchorScroll();\r\n $location.hash('');\r\n }\r\n function enroll() {\r\n trainingInnerService.postSessionAction(vm.data.importCourse, 'Enroll')\r\n .then(function (result) {\r\n if (!result) {\r\n $uibModalInstance.dismiss('cancel');\r\n return;\r\n }\r\n $uibModalInstance.close(result);\r\n });\r\n }\r\n function tabChange(index) {\r\n vm.view.couragePage = false;\r\n vm.view.sessionPage = false;\r\n switch (index) {\r\n case 0:\r\n vm.view.couragePage = true;\r\n vm.data.sessionItem = null;\r\n vm.data.sessionDetail = null;\r\n vm.data.tabIndex = 0;\r\n break;\r\n case 1:\r\n vm.view.sessionPage = true;\r\n vm.data.tabIndex = 1;\r\n break;\r\n case 2:\r\n vm.data.tabIndex = 2;\r\n break;\r\n default: break;\r\n }\r\n // console.log(\"enter tabChange , index:\", vm.data.tabIndex);\r\n }\r\n\r\n function sessionChoice(sessionItem) {\r\n // console.log(\"enter sessionChoice,sessionItem:\", sessionItem);\r\n if (!sessionItem.courseType) {\r\n sessionItem.courseType = 1;\r\n }\r\n return sessionInit(sessionItem).then(function () {\r\n tabChange(1);\r\n });\r\n }\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function setPathUrl(filePath) {\r\n var pathUrl = commonService.ctmsFilePath(filePath);\r\n return pathUrl;\r\n }\r\n //======Jquery====\r\n function Accordion() {\r\n $(document).off(\"click\", \".accordion .title\");\r\n\r\n $(document).on(\"click\", \".accordion .title\", function (j) {\r\n var dropDown = $(this).closest('.col-sm-12').find('p.acc-info');\r\n $(this).closest('.accordion').find('p.acc-info').not(dropDown).slideUp();\r\n\r\n if ($(this).hasClass('active')) {\r\n $(this).removeClass('active');\r\n } else {\r\n $(this).closest('.accordion').find('a.active').removeClass('active');\r\n $(this).addClass('active');\r\n }\r\n\r\n dropDown.stop(false, true).slideToggle();\r\n\r\n j.preventDefault();\r\n });\r\n }\r\n\r\n\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('editPwdModalController', editPwdModalController);\r\n\r\n function editPwdModalController(loginService, sysCode, e2eService,\r\n $rootScope, $uibModalInstance, $route, $scope) {\r\n var vm = this;\r\n vm.submit = submit;\r\n vm.autoFill = autoFill;\r\n vm.cancel = cancel;\r\n\r\n // virtual keyboard start\r\n vm.showVirKey = showVirKey;\r\n vm.isShowVirKey = false;\r\n vm.textChanged = textChanged;\r\n vm.focusObj = null\r\n vm.virData = null;\r\n\r\n // 針對哪個 input 使用動態鍵盤輸入\r\n vm.getFocusOldPwd = function () {\r\n vm.focusObj = \"oldPwd\";\r\n vm.virData = vm.data.oldPwd;\r\n }\r\n vm.getFocusNewPwd = function () {\r\n vm.focusObj = \"newPwd\";\r\n vm.virData = vm.data.newPwd;\r\n }\r\n vm.getFocusConfirmPwd = function () {\r\n vm.focusObj = \"confirmPwd\";\r\n vm.virData = vm.data.confirmPwd;\r\n }\r\n\r\n\r\n function textChanged(newPwd) {\r\n console.log(\"vm.focusObj:\",vm.focusObj);\r\n var e = document.getElementById(vm.focusObj);\r\n e.value = newPwd;\r\n console.log(\"newPwd:\",newPwd);\r\n var $e = angular.element(e);\r\n $e.triggerHandler('input');\r\n }\r\n\r\n function showVirKey() {\r\n if (vm.isShowVirKey)\r\n vm.isShowVirKey = false;\r\n else\r\n vm.isShowVirKey = true;\r\n }\r\n\r\n init();\r\n\r\n function init() {\r\n vm.data = {};\r\n loginService.getSsoInfo().then(function(data) {\r\n vm.data.userAccount = data.data.userAccount;\r\n });\r\n }\r\n\r\n function submit() {\r\n vm.confirmPwd = vm.data.newPwd == vm.data.oldPwd;\r\n if (!vm.confirmPwd){\r\n vm.confirmPwd = vm.data.newPwd !== vm.data.confirmPwd;\r\n }\r\n \r\n if (!vm.confirmPwd) {\r\n loginService.setSsoParams(vm.data);\r\n loginService.modifyUserPassword(vm.data).then(function(data) {\r\n\t\t\t\t\tif(data !== undefined){\r\n\t\t\t\t\t\tremoveSsoInfo();\r\n\t\t\t\t\t\t$route.reload();\r\n\t\t\t\t\t\ttoastr.success($rootScope.translate.commonEditPwdSuccess);\r\n\t\t\t\t\t\t$uibModalInstance.close();\r\n\t\t\t\t\t}\r\n \r\n });\r\n }\r\n }\r\n\r\n function autoFill() {\r\n e2eService.editPwdModal(vm.data);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('explanationModalController', explanationModalController);\r\n\r\n function explanationModalController($uibModalInstance, loginService) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n\r\n loginService.getPwdConstrain().then(function(data) {\r\n vm.data = data.data;\r\n });\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('forgetPwdModalController', forgetPwdModalController);\r\n\r\n function forgetPwdModalController($uibModalInstance, $uibModal, sysCode, loginService,\r\n $rootScope, e2eService, enumService, iAmNotRobot) {\r\n var vm = this;\r\n vm.sendMail = sendMail;\r\n vm.submit = submit;\r\n vm.cancel = cancel;\r\n vm.forgetAutoFill = forgetAutoFill;\r\n vm.iAmNotRobot = iAmNotRobot;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = {};\r\n vm.state = 'typeAccount';\r\n vm.data.target = 1;\r\n }\r\n\r\n function specialKeywordVerificationUserAccount(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function specialKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function sendMail() {\r\n\r\n if(specialKeywordVerificationUserAccount($('#inputUserAccount').val()))\r\n {\r\n toastr.warning($rootScope.translate.tsdgLoginAccount + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n else if(specialKeywordVerification($('#inputVerify').val()))\r\n {\r\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n \r\n //console.log('sendMail recaptcha:',vm.reCaptcha);\r\n if($('#inputVerify').val().length == 4){\r\n //將登入帳號轉成小寫\r\n if (vm.data.userAccount.indexOf('@') >= 0){\r\n vm.data.userAccount = vm.data.userAccount.toLowerCase();\r\n }\r\n\r\n var params = {\r\n userAccount: vm.data.userAccount,\r\n sysCode: sysCode,\r\n target: vm.data.target,\r\n inputVerify: $('#inputVerify').val().toUpperCase(),\r\n isPass: $('#isPass').val(),\r\n SecretKey: \"1\"\r\n };\r\n \r\n loginService.forgetPWD(params).then(function(data) {\r\n\r\n if (data) {\r\n switch (parseInt(params.target)) {\r\n case enumService.sendTarget.email:\r\n // console.log(data);\r\n toastr.success($rootScope.translate.commonAlreadySendMail);\r\n break;\r\n case enumService.sendTarget.sms:\r\n toastr.success($rootScope.translate.commonAlreadySendSMS);\r\n break;\r\n }\r\n \r\n return data;\r\n }\r\n }).then(function(data) {\r\n if (data && params.target !== enumService.sendTarget.email) {\r\n vm.state = 'directEditPwd';\r\n }else\r\n {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n });\r\n\r\n \r\n }else\r\n {\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n \r\n }\r\n }\r\n\r\n function submit() {\r\n\r\n vm.data.sysCode = sysCode;\r\n loginService.directModifyUserPassword(vm.data).then(function(data) {\r\n if (data) {\r\n toastr.success($rootScope.translate.commonEditPwdSuccess);\r\n $uibModalInstance.close('ok');\r\n }\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel'); \r\n }\r\n\r\n function forgetAutoFill() {\r\n e2eService.forgetPwd(vm.data);\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('loginModalController', loginModalController);\r\n\r\n function loginModalController($rootScope, $scope, $uibModalInstance, loginService, $location, modalService,\r\n enumService, e2eService, mobileService, translateService, iAmNotRobot) {\r\n // console.log(\"iAmNotRobot:\",iAmNotRobot);\r\n var vm = this;\r\n vm.isMobile = modalService.isMobile();\r\n vm.iAmNotRobot = iAmNotRobot;\r\n vm.cancel = cancel;\r\n vm.submit = submit;\r\n vm.autoFill = autoFill;\r\n vm.autoFill2 = autoFill2;\r\n vm.openForgetPwd = openForgetPwd;\r\n vm.openRegister = openRegister;\r\n vm.openExplanation = openExplanation;\r\n //vm.enableLogin = enableLogin;\r\n vm.deviceToken = deviceToken;\r\n\r\n // virtual kb need\r\n vm.isInitKeyboard = false;\r\n vm.showVirKey = showVirKey;\r\n vm.isShowVirKey = false;\r\n vm.pwdChanged = pwdChanged;\r\n vm.focusObj = null;\r\n vm.virData = null;\r\n\r\n // ------------------------\r\n // 針對哪個 input 使用動態鍵盤輸入\r\n vm.getFocusUserAccount = function () {\r\n vm.focusObj = \"userAccount\";\r\n //vm.virData = vm.login.userAccount; //2019-09-23 修正focus:TypeError: 無法取得未定義或 Null 參考的屬性 'userAccount'\r\n }\r\n vm.getFocusUserPwd = function () {\r\n vm.focusObj = \"userPwd\";\r\n //vm.virData = vm.login.pwd; //2019-09-23 修正focus:TypeError: 無法取得未定義或 Null 參考的屬性 'pwd'\r\n }\r\n vm.enableLogin = function () {\r\n enableLogin;\r\n }\r\n\r\n function pwdChanged(newPwd) {\r\n if(vm.focusObj == null) //2019-09-23 修正未指定focus造成錯誤:修正為NULL帶預設欄位為帳號\r\n vm.focusObj = \"userAccount\";\r\n \r\n var e = document.getElementById(vm.focusObj);\r\n e.value = newPwd;\r\n var $e = angular.element(e);\r\n $e.triggerHandler('input');\r\n \r\n }\r\n\r\n function showVirKey() {\r\n if (vm.isShowVirKey)\r\n vm.isShowVirKey = false;\r\n else\r\n vm.isShowVirKey = true;\r\n }\r\n\r\n // -----------------------\r\n\r\n // 測試是否有抓到 Device Token\r\n function deviceToken() {\r\n let myDeviceToken = \"device token is empty\";\r\n if (DEVICE_TOKEN) {\r\n myDeviceToken = DEVICE_TOKEN;\r\n }\r\n return myDeviceToken;\r\n }\r\n\r\n vm.view = {\r\n loginBefore: false\r\n };\r\n //讀入Google reCaptcha需要的key\r\n\r\n \r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function specialKeywordVerificationUserAccount(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function specialKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function submit() {\r\n\r\n if(specialKeywordVerificationUserAccount(vm.login.userAccount))\r\n {\r\n toastr.warning($rootScope.translate.tsdgLoginAccount + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n else if(specialKeywordVerification(vm.login.inputVerify))\r\n {\r\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n\r\n if($('#inputVerify').val().length == 4){\r\n \r\n \r\n var paramsLogin = {\r\n userAccount: btoa(vm.login.userAccount),\r\n pwd: btoa(vm.login.pwd),\r\n inputVerify: $('#inputVerify').val().toUpperCase(),\r\n isPass: $('#isPass').val(),\r\n SecretKey: \"1\"\r\n };\r\n \r\n //console.log(\"submit pass\");\r\n //已在SP中統一做大小寫比較\r\n // if (vm.login.userAccount.indexOf('@') >= 0){\r\n // vm.login.userAccount = vm.login.userAccount.toLowerCase();\r\n // }\r\n // console.log('vm:', vm);\r\n // console.log('vm.login:', vm.login);\r\n // console.log(' vm.login.isPass:', vm.login.isPass);\r\n \r\n loginService.login(paramsLogin).then(function (data) {\r\n if (data) {\r\n if (data.length > 1) {\r\n var result = modalService.getChoicePerSerilNo(data);\r\n result.result.then(function (item) {\r\n var params = {\r\n pwd: vm.login.pwd,\r\n perSerilNo: item.PerserilNo,\r\n userAccount: item.UserAccount\r\n };\r\n loginService.loginByPerSerilNo(params).then(function (data) {\r\n if (data) {\r\n loginToEditOrHome(data);\r\n mobileService.postMobileInfo(data);\r\n }\r\n });\r\n });\r\n } else {\r\n //console.log('sso item:',data);\r\n loginToEditOrHome(data);\r\n mobileService.postMobileInfo(data);\r\n }\r\n vm.view.loginBefore = false;\r\n return data;\r\n } else if(!data === undefined){\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n //2023-07-13 Johnson 資安2023\r\n vm.login.pwd = eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0;',2,1,'null'.split('|'),0,{}))\r\n\r\n }\r\n }).catch(() => {\r\n vm.view.loginBefore = false;\r\n });\r\n\r\n\r\n }else\r\n {\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n }\r\n \r\n }\r\n\r\n /**\r\n * 判斷要登入到首頁或強制修改密碼頁\r\n * \r\n * @param data (description)\r\n */\r\n function loginToEditOrHome(data) {\r\n setSsoInfo(data);\r\n $uibModalInstance.close('ok');\r\n $('#captcha iframe').empty().remove();\r\n translateService.getLanguage().then(function (languageItems) {\r\n var defaultLangItem = _.find(languageItems.data, {\r\n selected: true\r\n });\r\n translateService.change(defaultLangItem);\r\n if (data.IsForce) {\r\n sessionStorage.setItem('isForce', true);\r\n $location.path('/login/forceEditPwd');\r\n } else if (data.isFirstLogin) {\r\n modalService.phoneNumber();\r\n } else {\r\n $location.path('/').search('menu', 31);\r\n }\r\n });\r\n }\r\n\r\n function autoFill() {\r\n vm.login = {};\r\n e2eService.login(vm.login);\r\n //debugger;\r\n //var result = loginService.QueryCaptcha();\r\n\r\n }\r\n function autoFill2() {\r\n vm.login = {};\r\n e2eService.login(vm.login);\r\n //debugger;\r\n //var result = loginService.chkCaptcha();\r\n\r\n }\r\n function openForgetPwd() {\r\n modalService.forgetPwd();\r\n }\r\n\r\n function openRegister() {\r\n modalService.register();\r\n }\r\n\r\n function openExplanation() {\r\n modalService.explanation();\r\n }\r\n\r\n function enableLogin() {\r\n vm.view.loginBefore = false;\r\n }\r\n\r\n\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('phoneNumberModalController', phoneNumberModalController);\r\n\r\n function phoneNumberModalController($uibModalInstance, loginService, $rootScope, $uibModalStack) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.sendVerifyCodeFromPhone = sendVerifyCodeFromPhone;\r\n vm.checkVerify = checkVerify;\r\n vm.isSended = false;\r\n\r\n init();\r\n\r\n function init() {\r\n loginService.getSsoInfo().then(function(data) {\r\n vm.form1 = {\r\n userAccount: data.data.userAccount,\r\n tel: data.data.tel\r\n };\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function sendVerifyCodeFromPhone() {\r\n loginService.sendVerifyCodeFromPhone(vm.form1.userAccount).then(() => {\r\n toastr.success($rootScope.translate.commonAlreadySendSMS);\r\n });\r\n vm.isSended=true;\r\n }\r\n\r\n function checkVerify() {\r\n var param = {\r\n verifyCode: vm.form1.validCode,\r\n userAccount: vm.form1.userAccount,\r\n PhoneNumber: vm.form1.tel\r\n };\r\n loginService.verifyCodeCheckFromPhone(param).then(function(data) {\r\n if (data) {\r\n toastr.success($rootScope.translate.alreadyVerifyPhoneNumber);\r\n $uibModalStack.dismissAll();\r\n }\r\n });\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('registerModalController', registerModalController);\r\n\r\n function registerModalController($uibModalInstance, loginService, $rootScope, sysCode,\r\n e2eService, blockUI, iAmNotRobot) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.submit = submit;\r\n vm.autoFill = autoFill;\r\n vm.iAmNotRobot = iAmNotRobot;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = {};\r\n vm.sendType = [\r\n { id: 1, name: 'Email' },\r\n { id: 2, name: $rootScope.translate.commonSMS }\r\n ];\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function specialKeywordVerificationUserAccount(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function specialKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【\\】【/】【<】【>】【'】【\"】【(】【)】【%】【.】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n keyWord = keyWord.replace(/\\\\/g,\"/\");\r\n var pattern = new RegExp(\"[/\\\\/<>'\\\"()%.]\");\r\n var result = false; \r\n for (var i = 0; i < keyWord.length; i++) {\r\n console.log('for keyWord:'+keyWord.substr(i, 1) +' pattern:'+keyWord.substr(i, 1).replace(pattern, 'false'));\r\n if (keyWord.substr(i, 1).replace(pattern, 'false') == \"false\") {result=true; }\r\n } \r\n return result;\r\n }\r\n\r\n function phoneKeywordVerification(keyWord){\r\n /*2020-06-11 Johnson\r\n 特殊字元 【0-9】\r\n 問題單:2020/05/13 2020 APP滲透測試報告\r\n https://app.asana.com/0/742244134012369/1175524709436847\r\n */\r\n var result = false; \r\n var str = keyWord.replace(/[^0-9]/g,'false');\r\n if(str.indexOf('false') != -1)\r\n result = true; \r\n \r\n return result;\r\n }\r\n \r\n function submit() {\r\n\r\n if(specialKeywordVerificationUserAccount(vm.data.email))\r\n {\r\n toastr.warning($rootScope.translate.tsdgLoginAccount + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n else if(specialKeywordVerificationUserAccount(vm.data.cName))\r\n {\r\n toastr.warning($rootScope.translate.tsdgName + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n else if(phoneKeywordVerification(vm.data.perTel))\r\n {\r\n toastr.warning($rootScope.translate.commonMobile + $rootScope.translate.commonIncorrectFormat);\r\n return false;\r\n }\r\n else if(specialKeywordVerification(vm.login.inputVerify))\r\n {\r\n toastr.warning($rootScope.translate.validateCode + $rootScope.translate.specialKeywords);\r\n return false;\r\n }\r\n\r\n // Block the user interface\r\n if($('#inputVerify').val().length == 4){\r\n blockUI.start();\r\n\r\n vm.data.target = 1;\r\n vm.data.sysCode = sysCode;\r\n\r\n var params = {\r\n cName: vm.data.cName,\r\n email: vm.data.email,\r\n target: vm.data.target,\r\n sysCode: vm.data.sysCode,\r\n pwd: vm.data.pwd,\r\n perTel: vm.data.perTel,\r\n confirmPwd: vm.data.confirmPwd,\r\n inputVerify: $('#inputVerify').val().toUpperCase(),\r\n isPass: $('#isPass').val(),\r\n SecretKey: \"1\"\r\n };\r\n\r\n loginService.registerOutsideUser(params).then(function(data) {\r\n // Unblock the user interface\r\n blockUI.stop();\r\n if (data) {\r\n toastr.success($rootScope.translate.commonAlreadySendMail);\r\n $uibModalInstance.close('ok');\r\n }\r\n });\r\n }else\r\n {\r\n toastr.warning($rootScope.translate.commonReCaptchaFail);\r\n }\r\n }\r\n\r\n function autoFill() {\r\n e2eService.register(vm.data);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('settingModalController', settingModalController);\r\n\r\n function settingModalController($uibModalInstance, loginService, $rootScope, modalService,\r\n viewModel, $q, headerService) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.submit = submit;\r\n vm.openEditPwd = openEditPwd;\r\n vm.openPhoneNumber = openPhoneNumber;\r\n vm.setFontSize = setFontSize;\r\n vm.enableperTel = enableperTel;\r\n\r\n vm.view = {\r\n isEmployee: false,\r\n isperTel: true\r\n };\r\n\r\n init();\r\n\r\n function init() {\r\n vm.settings = viewModel;\r\n loginService.getSsoInfo().then(function(data) {\r\n vm.data = {\r\n cName: data.data.cName,\r\n perTel: data.data.tel\r\n };\r\n vm.view.isEmployee = data.data.isEmployee;\r\n vm.view.perTelcheck = data.data.tel;\r\n //判斷=1,顯示手機驗證碼按鈕 \r\n vm.view.moblieIsVerify = data.data.moblieIsVerify;\r\n\r\n enableperTel(data.data.tel);\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function submit() {\r\n loginService.editUserProfile(vm.data);\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function openEditPwd() {\r\n modalService.editPwd().result.then(function() {\r\n $uibModalInstance.dismiss('cancel');\r\n });\r\n }\r\n\r\n function openPhoneNumber() {\r\n modalService.phoneNumber();\r\n }\r\n\r\n function setFontSize(item) {\r\n headerService.setFontSize(item.sizeCode).then(function() {\r\n _.each(vm.settings.fontSizes, function(x) {\r\n x.isSelected = false;\r\n });\r\n $rootScope.fontSize = item.sizeCode;\r\n item.isSelected = true;\r\n });\r\n }\r\n\r\n function enableperTel(tel) {\r\n if (tel === null){\r\n vm.view.isperTel = false;\r\n }\r\n }\r\n }\r\n})();\r\n","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('tsunBulletinMoreController', tsunBulletinMoreController);\r\n\r\n function tsunBulletinMoreController(viewModel, $location, bulletinService) {\r\n var vm = this;\r\n vm.redirect = redirect;\r\n vm.getNoticeMoreList = getNoticeMoreList;\r\n\r\n let bulletinGetByPaggerDto = {\r\n menuSerilNo: '',\r\n bulletinTypeSerilNo: '',\r\n PaggerChoice: 1,\r\n noticePage: 1\r\n };\r\n\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = viewModel.data;\r\n }\r\n\r\n function redirect(bulletinSerilNo) {\r\n $location.path(`/tsu/bulletin/noticeDetail/${bulletinSerilNo}`).search('menu', getMenuQueryString());\r\n }\r\n\r\n function getNoticeMoreList() {\r\n bulletinGetByPaggerDto.noticePage++;\r\n //2為通知中心的意思\r\n bulletinGetByPaggerDto.dataType = 2;\r\n setSiteCode(bulletinGetByPaggerDto);\r\n bulletinService.getTsunMoreList(bulletinGetByPaggerDto).then(function (data) {\r\n vm.data.notices.bulletins = _.concat(vm.data.notices.bulletins, data.data.notices.bulletins);\r\n vm.data.hasNoticeMore = data.data.hasNoticeMore;\r\n });\r\n }\r\n\r\n function setSiteCode(bulletinParam) {\r\n switch (vm.type) {\r\n case 'bulletin':\r\n bulletinParam.siteCode = enumService.siteCode.hrOutside;\r\n break;\r\n case 'notice':\r\n bulletinParam.siteCode = enumService.siteCode.tsunOut;\r\n break;\r\n }\r\n }\r\n }\r\n})();","(function() {\r\n'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('tsunBulletinNoticeDetailController', tsunBulletinNoticeDetailController);\r\n\r\n function tsunBulletinNoticeDetailController(viewModel) {\r\n var vm = this;\r\n vm.data=viewModel.data;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n angular.module('app')\r\n .controller('tsunHomeController', tsunHomeController);\r\n\r\n function tsunHomeController(viewModel) {\r\n var vm = this;\r\n\r\n init();\r\n\r\n function init() {\r\n vm.data=viewModel.data;\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('trainingInnerService', trainingInnerService);\r\n\r\n\r\n function trainingInnerService(headerService,sysCode, enumService, $http, apiUrl, isTestMode, testData, $q, $rootScope, ctmsService, commonService, translateService) {\r\n var enumCourseType = enumService.courseType;\r\n var service = {\r\n getCourseLog: getCourseLog,\r\n getFinancial: getFinancial,\r\n getBankBook: getBankBook,\r\n getExterior: getExterior,\r\n getYears: getYears,\r\n getEffectives: getEffectives,\r\n postExterior: postExterior,\r\n getConfigSetting: getConfigSetting,\r\n getCourseItems: getCourseItems,\r\n getSelectActive: getSelectActive,\r\n getExternaltype: getExternaltype,\r\n getCurrency: getCurrency,\r\n getUnfinishedActivities: getUnfinishedActivities,\r\n getCertificateType: getCertificateType,\r\n getLicensesNames: getLicensesNames,\r\n postFinancial: postFinancial,\r\n getAuthorizedHours: getAuthorizedHours,\r\n postLearningRecord: postLearningRecord,\r\n postExamSurveyContent: postExamSurveyContent,\r\n getExamSurveyContent: getExamSurveyContent,\r\n getCourseDetail: getCourseDetail,\r\n getAuthorizedHoursCourse: getAuthorizedHoursCourse,\r\n postSessionAction: postSessionAction,\r\n getCourseListAll: getCourseListAll,\r\n getCourseList: getCourseList,\r\n getMenu: getMenu,\r\n getCollectionList: getCollectionList,\r\n addCollection: addCollection,\r\n delCollection: delCollection,\r\n hasEnrollQuestion: hasEnrollQuestion,\r\n loadLangs: loadLangs,\r\n getCarousel: getCarousel,\r\n checkCourseWithMenu: checkCourseWithMenu,\r\n checkItem: checkItem,\r\n };\r\n return service;\r\n\r\n function getConfigSetting() {\r\n let newApiURL = apiUrl.tsApi + 'checkConfig';\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n\r\n //2023-07-18 Johnson 資安2023\r\n return eval(function (p, a, c, k, e, r) { e = String; if (!''.replace(/^/, String)) { while (c--) r[c] = k[c] || c; k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}))\r\n }\r\n\r\n function getCourseLog(lang) {\r\n var params = {\r\n LanguageCode: lang,\r\n UserId: $rootScope.userInfo.userAccount,\r\n StartIndex: 1,\r\n EndIndex: 99999,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call MyFinishedActivities,params:\", params);\r\n return ctmsService.MyFinishedActivities(params).then(function(data) {\r\n if (!data) { return null; }\r\n _.forEach(data, function(item) {\r\n item.LanguageCode = params.LanguageCode;\r\n });\r\n return data;\r\n });\r\n }\r\n\r\n // 取得待修項目資料\r\n function getUnfinishedActivities(lang) {\r\n var params = {\r\n LanguageCode: lang,\r\n UserId: $rootScope.userInfo.userAccount,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n //console.log(\"call MyUnfinishedActivities,params:\", params);\r\n return ctmsService.MyUnfinishedActivities(params).then(function(data) {\r\n if (!data) { return null; }\r\n _.forEach(data, function(item) { item.LanguageCode = params.LanguageCode; });\r\n //console.log(\"MyUnfinishedActivities,data:\", data);\r\n return data;\r\n });\r\n }\r\n\r\n\r\n // 取得課程詳細資訊\r\n function getCourseDetail(item) {\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n CourseType: item.courseType,\r\n SessionId: item.sessionId,\r\n IsProgram: item.courseType === enumCourseType.courage ? 1 : 0,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n //console.log(\"call CourseSession,params:\", params);\r\n return ctmsService.CourseSession(params).then(function(data) {\r\n if (!data) { return null; }\r\n data.LanguageCode = params.LanguageCode;\r\n if (data.courses) {\r\n _.forEach(data.courses, function(item) {\r\n item.LanguageCode = params.LanguageCode;\r\n });\r\n }\r\n return data;\r\n });\r\n }\r\n\r\n //取得課程行為清單\r\n function getSelectActive(item) {\r\n //console.log('active item:',item);\r\n var params = {\r\n LanguageCode: item.LanguageCode,\r\n UserId: $rootScope.userInfo.userAccount,\r\n SessionId: item.sessionId,\r\n IsProgram: item.courseType === enumCourseType.courage ? 1 : 0,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n if (isTestMode) {\r\n //為了要實踐簡單互動\r\n params.courseType = item.courseType;\r\n }\r\n // console.log(\"call EnrollmentAvailableAction,params:\", params);\r\n return ctmsService.EnrollmentAvailableAction(params).then(function(data) {\r\n // console.log(\"EnrollmentAvailableAction result:\", data);\r\n if (!data) { return null; }\r\n data.LanguageCode = params.LanguageCode;\r\n _.forEach(data.lmsItems, function(item) {\r\n item.LanguageCode = params.LanguageCode;\r\n });\r\n console.log('WS14 : EnrollmentAvailableAction result: ',data);\r\n return data;\r\n });\r\n }\r\n\r\n // 取得金融證照記錄\r\n function getFinancial(status) {\r\n var params = {\r\n UserId: $rootScope.userInfo.userAccount,\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n Status: status,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call FCCertificatedLicenseList,params:\", params);\r\n // console.log(\"result :\",ctmsService.FCCertificatedLicenseList(params));\r\n return ctmsService.FCCertificatedLicenseList(params);\r\n }\r\n\r\n\r\n // 取得證書認列時數\r\n function getAuthorizedHours() {\r\n var params = {\r\n UserId: $rootScope.userInfo.userAccount,\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n LicenseId: '-1',\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call FCAuthorizedHoursList,params:\", params);\r\n return ctmsService.FCAuthorizedHoursList(params);\r\n }\r\n\r\n function getCourseItems(activityItem) {\r\n //取得課程教材\r\n var params = {\r\n ItemId: activityItem.itemId,\r\n UserId: $rootScope.userInfo.userAccount,\r\n LanguageCode: activityItem.LanguageCode,\r\n tkn: sessionStorage.getItem('token'),\r\n };\r\n console.log(\"call CourseItem,params:\", params);\r\n return ctmsService.CourseItem(params).then(function(data) {\r\n if (!data) { return null; }\r\n data.LanguageCode = params.LanguageCode;\r\n data.AttachmentSerilNo = params.ItemId;\r\n console.log(\"getCourseItems :\", data);\r\n return data;\r\n });\r\n }\r\n\r\n function getBankBook(year, lang) {\r\n var params = {\r\n UserId: $rootScope.userInfo.userAccount,\r\n Annual: year,\r\n LanguageCode: lang,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call MyTrainingPoint,params:\", params);\r\n return ctmsService.MyTrainingPoint(params).then(function(data) {\r\n if (!data) { return null; }\r\n var returnResult = {\r\n bankBook: data.trainingPoints,\r\n remainPoint: data.remainPoint,\r\n LanguageCode: params.LanguageCode,\r\n };\r\n if (new Date().getFullYear() + '' !== year + '') {\r\n // 選擇的年份如果不是當前年份,則剩餘點數為0\r\n returnResult.remainPoint = '0';\r\n }\r\n return returnResult;\r\n });\r\n }\r\n\r\n // 取得主辦單位\r\n function getExterior() {\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n Type: 5, // 主辦單位\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call SysTypesList,params:\", params);\r\n return ctmsService.SysTypesList(params);\r\n }\r\n\r\n // 取得證照有效狀態\r\n function getEffectives() {\r\n /*--(2016-09-29)\r\n 如今日電話說明因 有效證照 為固定值\r\n 由旭聯提供定義值即可 (無須透過API取得)\r\n 已更新規格請見附件,謝謝!\r\n 若有問題再麻煩與我聯繫喔,謝謝~\r\n Raina\r\n */\r\n var stateList = [{\r\n id: -1, // 數值無法為空,所以使用 -1\r\n name: $rootScope.translate.tsunFinacialCertificationStatusAll\r\n }, {\r\n id: 0,\r\n name: $rootScope.translate.tsunFinacialCertificationStatusInactive\r\n }, {\r\n id: 1,\r\n name: $rootScope.translate.tsunFinacialCertificationStatusActive\r\n }, {\r\n id: 2,\r\n name: $rootScope.translate.tsunFinacialCertificationStatusCancel\r\n }, {\r\n id: 3,\r\n name: $rootScope.translate.tsunFinacialCertificationStatusRemove\r\n }];\r\n return $q.when(stateList);\r\n }\r\n\r\n // 取得證照類別\r\n function getCertificateType() {\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n Type: 2, // 證照類別\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call SysTypesList,params:\", params);\r\n return ctmsService.SysTypesList(params);\r\n }\r\n\r\n // 依證照類別取得所有證照名稱\r\n function getLicensesNames(licenseCategoryId) {\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n LicenseCategoryId: licenseCategoryId,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call FCLicenseList,params:\", params);\r\n return ctmsService.FCLicenseList(params);\r\n }\r\n\r\n // 取得外訓種類\r\n function getExternaltype() {\r\n // var params = {\r\n // LanguageCode: sessionStorage.getItem('userLang'),\r\n // Type: 4, // 外訓種類\r\n // tkn: sessionStorage.getItem('token')\r\n // };\r\n // // console.log(\"call SysTypesList,params:\", params);\r\n // return ctmsService.SysTypesList(params);\r\n var result = [{\r\n //請選擇\r\n id: -1,\r\n name: $rootScope.translate.commonPleaseSelect,\r\n allowanceRate: 0,\r\n sortIndex: 0,\r\n }, {\r\n //一般外訓\r\n id: 1,\r\n name: $rootScope.translate.tsunExternalType1,\r\n allowanceRate: 0,\r\n sortIndex: 1,\r\n },\r\n {\r\n //外語進修補助\r\n id: 2,\r\n name: $rootScope.translate.tsunExternalType2,\r\n allowanceRate: 50,\r\n sortIndex: 2,\r\n },\r\n {\r\n //電腦進修補助\r\n id: 3,\r\n name: $rootScope.translate.tsunExternalType3,\r\n allowanceRate: 50,\r\n sortIndex: 3,\r\n },\r\n {\r\n //考試補助\r\n id: 4,\r\n name: $rootScope.translate.tsunExternalType4,\r\n allowanceRate: 100,\r\n sortIndex: 4,\r\n },\r\n {\r\n //國外外訓\r\n id: 0,\r\n name: $rootScope.translate.tsunExternalType0,\r\n allowanceRate: 0,\r\n sortIndex: 5,\r\n },\r\n ];\r\n return result;\r\n }\r\n\r\n // 取得繳費幣別\r\n function getCurrency() {\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n Type: 3, // 幣別\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call SysTypesList,params:\", params);\r\n return ctmsService.SysTypesList(params);\r\n }\r\n\r\n // 取得問卷或測驗題目\r\n function getExamSurveyContent(sessionId, activityItem) {\r\n var params = {\r\n LanguageCode: activityItem.LanguageCode,\r\n SessionId: sessionId,\r\n ItemId: activityItem.itemId,\r\n UserId: $rootScope.userInfo.userAccount,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n if (isTestMode) {\r\n //為了要實踐簡單互動\r\n params.type = activityItem.type;\r\n }\r\n // console.log(\"call ExamSurveyContent,params:\", params);\r\n return ctmsService.ExamSurveyContent(params).then(function(result) {\r\n // console.log(\"get ExamSurveyContent\");\r\n result.LanguageCode = params.LanguageCode;\r\n return result;\r\n });\r\n }\r\n //回傳問卷或測驗填答\r\n function postExamSurveyContent(sessionId, examContent) {\r\n var params = {\r\n LanguageCode: examContent.LanguageCode,\r\n UserId: $rootScope.userInfo.userAccount,\r\n SessionId: sessionId,\r\n ExamHistoryId: examContent.examHistoryId,\r\n UserResponse: examContent.answers,\r\n ItemId: examContent.itemId,\r\n Finish: examContent.finish,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n if (isTestMode) {\r\n //為了要實踐簡單互動\r\n // console.log(\"postExamSurveyContent:\", params);\r\n params.type = examContent.activeItemtype;\r\n }\r\n // console.log(\"call InteractionData,params:\", params);\r\n return ctmsService.InteractionData(params).then(function(result) {\r\n // console.log(\"send InteractionData\");\r\n return result;\r\n });\r\n }\r\n\r\n\r\n\r\n // 外訓申請 (POST\r\n function postExterior(item) {\r\n //console.log('postExterior item:',item);\r\n // var dateTimeString = getCourseDatesString(item);\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n UserId: $rootScope.userInfo.userAccount,\r\n CourseName: item.Name,\r\n OrganizationId: '',\r\n Type: item.type.id,\r\n Outline: item.Outline,\r\n CourseDate: '',\r\n CourseTime: '',\r\n Location: item.Place,\r\n Course_Cost_Currency_1: item.currency,\r\n Course_Cost_Amount_1: item.coursePrice,\r\n Transportation_Cost_Amount_1: item.travelPrice,\r\n Course_Converting_Amount_1: item.totalPrice,\r\n CourseRemark: item.Remark || ' ',\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // 把上課日期串成字串\r\n // ex \"2016/01/02,2016/01/04\"\r\n _.forEach(item.dateSettingList, function(perDateStr) {\r\n _.forEach(perDateStr.innerDataDate, function(dateValue) {\r\n if (params.CourseDate.length > 0) { params.CourseDate += ','; }\r\n params.CourseDate += dateValue;\r\n });\r\n _.forEach(perDateStr.innerDataTime, function(timeValue) {\r\n if (params.CourseTime.length > 0) { params.CourseTime += ','; }\r\n params.CourseTime += timeValue;\r\n });\r\n });\r\n\r\n // 把主辦單位的 id 串起來 \r\n // ex \"3,4,7,8\"\r\n _.forEach(item.organizer, function(perOrg) {\r\n params.OrganizationId += perOrg.id + ',';\r\n });\r\n if (params.OrganizationId.length > 0) { // 去掉最後一個逗號\r\n params.OrganizationId = params.OrganizationId.substring(0, params.OrganizationId.length - 1);\r\n }\r\n //console.log(\"call ExternalTrainingApplication,params:\", params);\r\n return ctmsService.ExternalTrainingApplication(params).then(function(result) {\r\n if (!result) { return null; }\r\n toastr.success($rootScope.translate.tsunSuccessExternalApplication);\r\n return result;\r\n });\r\n }\r\n\r\n // 證照申請 (POST\r\n function postFinancial(item) {\r\n var params = {\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n UserId: $rootScope.userInfo.userAccount,\r\n LicenseId: item.licenses.id,\r\n AcquireDate: item.getDay,\r\n LicenseCode: item.licensesNO || ' ',\r\n Comment: item.otherMark || ' ',\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n console.log(\"call FCCertificatedLicenseAdd,params:\", params);\r\n return ctmsService.FCCertificatedLicenseAdd(params);\r\n }\r\n\r\n // 學習記錄回傳 (POST\r\n function postLearningRecord(item, isAlert) {\r\n //console.log('WS 21 Learning Record item :', item);\r\n if (!item) { return; }\r\n var params = {\r\n ItemId: item.ItemId,\r\n SessionId: item.SessionId,\r\n Duration: item.Duration,\r\n UserId: $rootScope.userInfo.userAccount,\r\n LanguageCode: item.LanguageCode,\r\n tkn: sessionStorage.getItem('token'),\r\n };\r\n //console.log('item is not null');\r\n //測試關閉瀏覽器有無傳送資料\r\n // var str = 'return OK';\r\n // headerService.saveLearnLog(str);\r\n \r\n commonService.setCtmsParams(params);\r\n //console.log(\"call LearningRecordCommit,params:\", params);\r\n return ctmsService.LearningRecordCommit(params).then(function(data) {\r\n // console.log(\"send LearningRecordCommit\");\r\n if (!data) { return null; }\r\n if (isAlert) {\r\n toastr.success($rootScope.translate.tsunSendSuccess);\r\n }\r\n return true;\r\n }).catch((reason)=>{\r\n // chris: log for mobile\r\n //console.log('ctms-learning-record-error:',reason);\r\n postException(`ctms-learning-record-error: ${JSON.stringify(reason)}`, apiUrl)\r\n throw reason;\r\n });\r\n }\r\n\r\n\r\n\r\n function getYears(minYear) {\r\n var thisYear = new Date().getFullYear();\r\n minYear = minYear || thisYear - 10;\r\n // console.log(\"getYears , minYear:\", minYear);\r\n var years = [];\r\n for (var i = thisYear; i > thisYear - 10; i--) {\r\n if (i >= minYear) {\r\n years.push(i);\r\n }\r\n }\r\n return years;\r\n }\r\n\r\n function getAuthorizedHoursCourse(item, lang) {\r\n var params = {\r\n LanguageCode: lang,\r\n UserId: $rootScope.userInfo.userAccount,\r\n LicenseId: item.licenseId,\r\n tkn: sessionStorage.getItem('token')\r\n };\r\n // console.log(\"call FCEnrollableActivities,params:\", params);\r\n return ctmsService.FCEnrollableActivities(params).then(function(data) {\r\n if (!data) { return null; }\r\n _.forEach(data, function(item) {\r\n item.LanguageCode = params.LanguageCode;\r\n });\r\n return data;\r\n });\r\n }\r\n\r\n function postSessionAction(sessionItem, Action) {\r\n var params = {\r\n tkn: sessionStorage.getItem('token'),\r\n LanguageCode: sessionItem.LanguageCode,\r\n UserId: $rootScope.userInfo.userAccount,\r\n SessionId: sessionItem.sessionId,\r\n IsProgram: sessionItem.courseType === enumCourseType.courage ? 1 : 0,\r\n ActionType: Action,\r\n };\r\n // console.log(\"call EnrollmentAction,params:\", params);\r\n return ctmsService.EnrollmentAction(params).then(function(result) {\r\n if (!result) { return null; }\r\n toastr.success($rootScope.translate.tsunSendSuccess);\r\n return result;\r\n });\r\n }\r\n\r\n\r\n\r\n function getMenu(langCode) {\r\n langCode = langCode || sessionStorage.getItem('langCode');\r\n //console.log(\"send tsapi.CourseList langCode:\", langCode);\r\n let newApiURL = apiUrl.tsApi + 'ctms/CourseCategory?langSerilNo=' + langCode;\r\n newApiURL = commonService.URLCheck(newApiURL)\r\n \r\n //2023-07-18 Johnson 資安2023\r\n return eval(function (p, a, c, k, e, r) { e = String; if (!''.replace(/^/, String)) { while (c--) r[c] = k[c] || c; k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('$0.1(2);', 3, 3, 'http|get|newApiURL'.split('|'), 0, {}))\r\n\r\n //2023-07-17 Johnson 資安2023\r\n //var csrfToken = sessionStorage.getItem('token');\r\n //return $http.get(newApiURL, csrfToken).then(function (result) {\r\n // return result.data;\r\n //});\r\n }\r\n\r\n // 取得課程列表\r\n function getCourseList(classificationId, langCode) {\r\n //console.log(\"classificationId:\", classificationId);\r\n var params = {\r\n UserId: $rootScope.userInfo.userAccount,\r\n LanguageCode: langCode,\r\n ClassificationId: parseInt(classificationId)||-1,\r\n CourseType: -1,\r\n tkn: sessionStorage.getItem('token'),\r\n };\r\n //三個= 不會有作用,請保留2個就好\r\n if(classificationId==0){\r\n params.ClassificationId=0;\r\n }\r\n //console.log(\" params.ClassificationId:\", params.ClassificationId);\r\n\r\n //console.log(\"call PublishedActivity,params:\", params);\r\n return ctmsService.PublishedActivity(params).then(function(data) {\r\n _.forEach(data, function(item) {\r\n item.LanguageCode = params.LanguageCode;\r\n });\r\n return data;\r\n });\r\n }\r\n\r\n function getCourseListAll(catagoryId) {\r\n //取得不分語系的課程清單\r\n return loadLangs()\r\n .then(function(langs) {\r\n //console.log('langs:',langs);\r\n var coursePromist = [];\r\n _.forEach(langs, function(lang) {\r\n // console.log('lang:', lang.langCode)\r\n // console.log( getCourseList(catagoryId, lang.langCode))\r\n coursePromist.push(getCourseList(catagoryId, lang.langCode));\r\n });\r\n return $q.all(coursePromist).then(function(data) {\r\n var resultCourseList = []; //全部課程清單\r\n if (data) {\r\n _.forEach(data, function(courseList) {\r\n //console.log('courseList:', courseList)\r\n courseList = _.orderBy(courseList, [ 'courseTime'], ['desc'] );\r\n Array.prototype.push.apply(resultCourseList, courseList);\r\n });\r\n resultCourseList = _.uniqBy(resultCourseList, function(courseItem) {\r\n return courseItem.sessionId;\r\n });\r\n }\r\n return resultCourseList;\r\n });\r\n })\r\n .then(function(resultCourseList) {\r\n //final\r\n //console.log('resultCourseList:', resultCourseList);\r\n return resultCourseList;\r\n });\r\n }\r\n\r\n function checkCourseWithMenu(courseList/*, catagoryList*/) {\r\n var resultCourseList = courseList;\r\n\r\n //filter將排序打亂了,先將filter拿掉\r\n // console.log(\"courseList:\", courseList);\r\n // console.log(\"catagoryList:\", catagoryList);\r\n\r\n // _.forEach(catagoryList, function(catagoryItem) {\r\n\r\n // var courseIsValid = _.filter(courseList, function(courseItem) {\r\n // var checkResult;\r\n // //console.log(\"catagoryItem:\", catagoryItem);\r\n // //console.log(\"courseItem:\", courseItem);\r\n // checkResult = parseInt(courseItem.classificationId) === parseInt(catagoryItem.categoryId);\r\n // return checkResult;\r\n // });\r\n\r\n // //console.log(\"courseIsValid:\", courseIsValid);\r\n // Array.prototype.push.apply(resultCourseList, courseIsValid);\r\n // });\r\n \r\n //console.log(\"resultCourseList:\", resultCourseList);\r\n resultCourseList = _.uniqBy(resultCourseList, function(courseItem) {\r\n return courseItem.sessionId;\r\n });\r\n return $q.when(resultCourseList);\r\n }\r\n\r\n function getCollectionList(langCode) {\r\n var params = {\r\n sysCode: sysCode,\r\n tkn: sessionStorage.getItem('token'),\r\n sysLang: langCode || null,\r\n };\r\n return $http.post(apiUrl.tsApi + 'Collection/GetList', params).then(function(data) {\r\n //console.log('user course data:',data.data.collectionList);\r\n if (!data) { return null; }\r\n return data.data.collectionList;\r\n });\r\n }\r\n\r\n function addCollection(sessionItem) {\r\n var params = {\r\n sysCode: sysCode,\r\n tkn: sessionStorage.getItem('token'),\r\n collectionSessionId: sessionItem.sessionId,\r\n langSerilNo: sessionStorage.getItem('langCode'),\r\n sysLang: sessionStorage.getItem('langCode'),\r\n };\r\n return $http.post(apiUrl.tsApi + 'Collection/Save', params).then(function(result) {\r\n toastr.success(result.data);\r\n });\r\n }\r\n\r\n function delCollection(sessionItem, isAlert) {\r\n var params = {\r\n sysCode: sysCode,\r\n tkn: sessionStorage.getItem('token'),\r\n collectionSessionId: sessionItem.sessionId,\r\n sysLang: sessionStorage.getItem('langCode'),\r\n };\r\n return $http.post(apiUrl.tsApi + 'Collection/Del', params)\r\n .then(function(result) {\r\n if (isAlert) { toastr.success(result.data); }\r\n });\r\n }\r\n\r\n function hasEnrollQuestion(item) {\r\n return getSelectActive(item).then(function(data) {\r\n if (!data) { return null; }\r\n return data.preSurveyItemId > 0;\r\n });\r\n }\r\n\r\n function loadLangs() {\r\n return translateService.getLanguage().then(function(data) {\r\n if (!data) { return null; }\r\n return _.orderBy(data.data, ['selected', 'langSerilNo'], ['desc', 'asc']);\r\n });\r\n }\r\n\r\n function getCarousel(activeType) {\r\n var param = {};\r\n var postUrl = '';\r\n commonService.setParams(param);\r\n switch (activeType) {\r\n case 3:\r\n postUrl = apiUrl.tsApi + 'ActiveHotRecommend/PostSmallCourse';\r\n break;\r\n default:\r\n postUrl = apiUrl.tsApi + 'ActiveHotRecommend/postHotRecommend';\r\n break;\r\n }\r\n return $http.post(postUrl, param).then(function(data) {\r\n if (!data) { return null; }\r\n return data.data;\r\n });\r\n }\r\n\r\n function checkItem(item) {\r\n var params = {\r\n attachmentSerilNo: item.AttachmentSerilNo,\r\n fileUrl: item.fileUrl,\r\n tkn: sessionStorage.getItem('token'),\r\n };\r\n\r\n return $http.post(apiUrl.tsApi + 'ctms/ItemCheck', params);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('visualpageController', visualpageController);\r\n\r\n function visualpageController(viewModel, menuService, commonService, apiUrl, sysCode,\r\n bulletinService, headerService) {\r\n var vm = this;\r\n vm.showSelected = showSelected;\r\n vm.download = download;\r\n vm.menuAlterClick = menuAlterClick;\r\n init();\r\n\r\n function init() {\r\n vm.data = viewModel.data;\r\n vm.view = viewInit();\r\n vm.localValue = localValueInit();\r\n treeInit();\r\n menuAlterInit();\r\n $(document).trigger('visualPageInited', {});\r\n }\r\n\r\n function viewInit() {\r\n var result = {};\r\n\r\n return result;\r\n }\r\n\r\n function localValueInit() {\r\n var result = {\r\n menuAlterNodes: [],\r\n selectedMenuText: '',\r\n selectedMenuIndex: 0,\r\n };\r\n return result;\r\n }\r\n\r\n function showSelected(node) {\r\n if (node.url) {\r\n menuService.redirectUrl(node);\r\n }\r\n }\r\n\r\n function treeInit() {\r\n vm.treeOptions = {\r\n nodeChildren: \"children\",\r\n dirSelectable: false\r\n };\r\n }\r\n\r\n function menuAlterInit() {\r\n vm.localValue.menuAlterNodes = [];\r\n _.forEach(vm.data.treeView, function(treeNode) {\r\n treeNodeView(treeNode, '');\r\n });\r\n\r\n //以visualPage的ID來判斷選擇到的MenuLangName\r\n var menuNo = getMenuQueryString();\r\n //console.log(\"menuNo:\", menuNo);\r\n var menuSelectedIndex = 0;\r\n for (var i = 0; i <= vm.localValue.menuAlterNodes.length - 1; i++) {\r\n if (vm.localValue.menuAlterNodes[i].menuSerilNo === menuNo) {\r\n menuSelectedIndex = i;\r\n }\r\n }\r\n menuAlterClick(menuSelectedIndex, true);\r\n return;\r\n //======\r\n function treeNodeView(treeNode, preSymbol) {\r\n var _preSymbol = ' ' + (preSymbol || '');\r\n treeNode.isEmptyUrl = false;\r\n treeNode.url = treeNode.url || '';\r\n if (treeNode.url.length < 1) {\r\n treeNode.isEmptyUrl = true;\r\n }\r\n treeNode.menuAlterText = _preSymbol + treeNode.menuLangName;\r\n //======\r\n vm.localValue.menuAlterNodes.push(treeNode);\r\n if (!treeNode.children) {\r\n treeNode.children = [];\r\n }\r\n _.forEach(treeNode.children, function(treeNodeChild) {\r\n treeNodeView(treeNodeChild, _preSymbol);\r\n });\r\n }\r\n }\r\n\r\n function menuAlterClick(index, isInit) {\r\n var targetNode = vm.localValue.menuAlterNodes[index];\r\n //====\r\n var isError = (!targetNode);\r\n //====\r\n if (isError) {\r\n vm.localValue.selectedMenuText = \"\";\r\n vm.localValue.selectedMenuIndex = 0;\r\n } else if (targetNode.isEmptyUrl) {\r\n return;\r\n } else {\r\n vm.localValue.selectedMenuText = targetNode.menuLangName;\r\n vm.localValue.selectedMenuIndex = index;\r\n }\r\n if (!isInit) {\r\n menuService.redirectUrl(targetNode);\r\n }\r\n return;\r\n }\r\n\r\n function download(url, fileName) {\r\n console.log('url:', url);\r\n console.log('fileName:', fileName);\r\n if (url && fileName) {\r\n var params = {\r\n menuSerilNo: getMenuQueryString(),\r\n MenuClickAttachmentId: url,\r\n };\r\n commonService.setParams(params);\r\n headerService.saveMenuClickingAttachment(params);\r\n //先確認是否是把浮水印拿掉就不能下載(在PC上)\r\n // if (commonService.getFileType(url) !== 'pdf') {\r\n\r\n // } else {\r\n // var param = {\r\n // wholeUrl: url,\r\n // fileName: fileName,\r\n // };\r\n // bulletinService.donwloadStampForUrl(param);\r\n // }\r\n\r\n //因應ios無法打開可視化中的PDF,ios另行處理\r\n window.open(url,'_self');\r\n // if (DEVICE_TYPE !== null && DEVICE_TYPE.toLowerCase() === 'ios') {\r\n // window.open(url,'_self');\r\n // } else {\r\n // window.open(url);\r\n // }\r\n }\r\n }\r\n }\r\n})();","angular.module('ui.bootstrap.debounce', [])\r\n/**\r\n * A helper, internal service that debounces a function\r\n */\r\n .factory('$$debounce', ['$timeout', function($timeout) {\r\n return function(callback, debounceTime) {\r\n var timeoutPromise;\r\n\r\n return function() {\r\n var self = this;\r\n var args = Array.prototype.slice.call(arguments);\r\n if (timeoutPromise) {\r\n $timeout.cancel(timeoutPromise);\r\n }\r\n\r\n timeoutPromise = $timeout(function() {\r\n callback.apply(self, args);\r\n }, debounceTime);\r\n };\r\n };\r\n }]);\r\n","angular.module('ui.bootstrap.carousel', [])\r\n\r\n.controller('UibCarouselController', ['$scope', '$element', '$interval', '$timeout', '$animate', function($scope, $element, $interval, $timeout, $animate) {\r\n var self = this,\r\n slides = self.slides = $scope.slides = [],\r\n SLIDE_DIRECTION = 'uib-slideDirection',\r\n currentIndex = -1,\r\n currentInterval, isPlaying, bufferedTransitions = [];\r\n self.currentSlide = null;\r\n var destroyed = false;\r\n self.addSlide = function(slide, element) {\r\n slide.$element = element;\r\n slides.push(slide);\r\n //if this is the first slide or the slide is set to active, select it\r\n if (slides.length === 1 || slide.active) {\r\n if ($scope.$currentTransition) {\r\n $scope.$currentTransition = null;\r\n }\r\n\r\n self.select(slides[slides.length - 1]);\r\n if (slides.length === 1) {\r\n $scope.play();\r\n }\r\n } else {\r\n slide.active = false;\r\n }\r\n };\r\n\r\n self.getCurrentIndex = function() {\r\n if (self.currentSlide && angular.isDefined(self.currentSlide.index)) {\r\n return +self.currentSlide.index;\r\n }\r\n return currentIndex;\r\n };\r\n\r\n self.next = $scope.next = function() {\r\n var newIndex = (self.getCurrentIndex() + 1) % slides.length;\r\n\r\n if (newIndex === 0 && $scope.noWrap()) {\r\n $scope.pause();\r\n return;\r\n }\r\n\r\n return self.select(getSlideByIndex(newIndex), 'next');\r\n };\r\n\r\n self.prev = $scope.prev = function() {\r\n var newIndex = self.getCurrentIndex() - 1 < 0 ? slides.length - 1 : self.getCurrentIndex() - 1;\r\n\r\n if ($scope.noWrap() && newIndex === slides.length - 1) {\r\n $scope.pause();\r\n return;\r\n }\r\n\r\n return self.select(getSlideByIndex(newIndex), 'prev');\r\n };\r\n\r\n self.removeSlide = function(slide) {\r\n if (angular.isDefined(slide.index)) {\r\n slides.sort(function(a, b) {\r\n return +a.index > +b.index;\r\n });\r\n }\r\n\r\n var bufferedIndex = bufferedTransitions.indexOf(slide);\r\n if (bufferedIndex !== -1) {\r\n bufferedTransitions.splice(bufferedIndex, 1);\r\n }\r\n //get the index of the slide inside the carousel\r\n var index = slides.indexOf(slide);\r\n slides.splice(index, 1);\r\n $timeout(function() {\r\n if (slides.length > 0 && slide.active) {\r\n if (index >= slides.length) {\r\n self.select(slides[index - 1]);\r\n } else {\r\n self.select(slides[index]);\r\n }\r\n } else if (currentIndex > index) {\r\n currentIndex--;\r\n }\r\n });\r\n\r\n //clean the currentSlide when no more slide\r\n if (slides.length === 0) {\r\n self.currentSlide = null;\r\n clearBufferedTransitions();\r\n }\r\n };\r\n\r\n /* direction: \"prev\" or \"next\" */\r\n self.select = $scope.select = function(nextSlide, direction) {\r\n var nextIndex = $scope.indexOfSlide(nextSlide);\r\n //Decide direction if it's not given\r\n if (direction === undefined) {\r\n direction = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\r\n }\r\n //Prevent this user-triggered transition from occurring if there is already one in progress\r\n if (nextSlide && nextSlide !== self.currentSlide && !$scope.$currentTransition) {\r\n goNext(nextSlide, nextIndex, direction);\r\n } else if (nextSlide && nextSlide !== self.currentSlide && $scope.$currentTransition) {\r\n bufferedTransitions.push(nextSlide);\r\n nextSlide.active = false;\r\n }\r\n };\r\n\r\n /* Allow outside people to call indexOf on slides array */\r\n $scope.indexOfSlide = function(slide) {\r\n return angular.isDefined(slide.index) ? +slide.index : slides.indexOf(slide);\r\n };\r\n\r\n $scope.isActive = function(slide) {\r\n return self.currentSlide === slide;\r\n };\r\n\r\n $scope.pause = function() {\r\n if (!$scope.noPause) {\r\n isPlaying = false;\r\n resetTimer();\r\n }\r\n };\r\n\r\n $scope.play = function() {\r\n if (!isPlaying) {\r\n isPlaying = true;\r\n restartTimer();\r\n }\r\n };\r\n\r\n $scope.$on('$destroy', function() {\r\n destroyed = true;\r\n resetTimer();\r\n });\r\n\r\n $scope.$watch('noTransition', function(noTransition) {\r\n $animate.enabled($element, !noTransition);\r\n });\r\n\r\n $scope.$watch('interval', restartTimer);\r\n\r\n $scope.$watchCollection('slides', resetTransition);\r\n\r\n function clearBufferedTransitions() {\r\n while (bufferedTransitions.length) {\r\n bufferedTransitions.shift();\r\n }\r\n }\r\n\r\n function getSlideByIndex(index) {\r\n if (angular.isUndefined(slides[index].index)) {\r\n return slides[index];\r\n }\r\n for (var i = 0, l = slides.length; i < l; ++i) {\r\n if (slides[i].index === index) {\r\n return slides[i];\r\n }\r\n }\r\n }\r\n\r\n function goNext(slide, index, direction) {\r\n if (destroyed) { return; }\r\n\r\n angular.extend(slide, {direction: direction, active: true});\r\n angular.extend(self.currentSlide || {}, {direction: direction, active: false});\r\n if ($animate.enabled($element) && !$scope.$currentTransition &&\r\n slide.$element && self.slides.length > 1) {\r\n slide.$element.data(SLIDE_DIRECTION, slide.direction);\r\n if (self.currentSlide && self.currentSlide.$element) {\r\n self.currentSlide.$element.data(SLIDE_DIRECTION, slide.direction);\r\n }\r\n\r\n $scope.$currentTransition = true;\r\n $animate.on('addClass', slide.$element, function(element, phase) {\r\n if (phase === 'close') {\r\n $scope.$currentTransition = null;\r\n $animate.off('addClass', element);\r\n if (bufferedTransitions.length) {\r\n var nextSlide = bufferedTransitions.pop();\r\n var nextIndex = $scope.indexOfSlide(nextSlide);\r\n var nextDirection = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\r\n clearBufferedTransitions();\r\n\r\n goNext(nextSlide, nextIndex, nextDirection);\r\n }\r\n }\r\n });\r\n }\r\n\r\n self.currentSlide = slide;\r\n currentIndex = index;\r\n\r\n //every time you change slides, reset the timer\r\n restartTimer();\r\n }\r\n\r\n function resetTimer() {\r\n if (currentInterval) {\r\n $interval.cancel(currentInterval);\r\n currentInterval = null;\r\n }\r\n }\r\n\r\n function resetTransition(slides) {\r\n if (!slides.length) {\r\n $scope.$currentTransition = null;\r\n clearBufferedTransitions();\r\n }\r\n }\r\n\r\n function restartTimer() {\r\n resetTimer();\r\n var interval = +$scope.interval;\r\n if (!isNaN(interval) && interval > 0) {\r\n currentInterval = $interval(timerFn, interval);\r\n }\r\n }\r\n\r\n function timerFn() {\r\n var interval = +$scope.interval;\r\n if (isPlaying && !isNaN(interval) && interval > 0 && slides.length) {\r\n $scope.next();\r\n } else {\r\n $scope.pause();\r\n }\r\n }\r\n}])\r\n\r\n.directive('uibCarousel', function() {\r\n return {\r\n transclude: true,\r\n replace: true,\r\n controller: 'UibCarouselController',\r\n controllerAs: 'carousel',\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'directive/ui-bootstrap/carousel/carousel.html';\r\n },\r\n scope: {\r\n interval: '=',\r\n noTransition: '=',\r\n noPause: '=',\r\n noWrap: '&',\r\n showBar:'=',\r\n showArrow:'='\r\n }\r\n };\r\n})\r\n\r\n.directive('uibSlide', function() {\r\n return {\r\n require: '^uibCarousel',\r\n transclude: true,\r\n replace: true,\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'directive/ui-bootstrap/carousel/slide.html';\r\n },\r\n scope: {\r\n active: '=?',\r\n actual: '=?',\r\n index: '=?'\r\n },\r\n link: function (scope, element, attrs, carouselCtrl) {\r\n carouselCtrl.addSlide(scope, element);\r\n //when the scope is destroyed then remove the slide from the current slides array\r\n scope.$on('$destroy', function() {\r\n carouselCtrl.removeSlide(scope);\r\n });\r\n\r\n scope.$watch('active', function(active) {\r\n if (active) {\r\n carouselCtrl.select(scope);\r\n }\r\n });\r\n }\r\n };\r\n})\r\n\r\n.animation('.item', ['$animateCss',\r\nfunction($animateCss) {\r\n var SLIDE_DIRECTION = 'uib-slideDirection';\r\n\r\n function removeClass(element, className, callback) {\r\n element.removeClass(className);\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n\r\n return {\r\n beforeAddClass: function(element, className, done) {\r\n if (className === 'active') {\r\n var stopped = false;\r\n var direction = element.data(SLIDE_DIRECTION);\r\n var directionClass = direction === 'next' ? 'left' : 'right';\r\n var removeClassFn = removeClass.bind(this, element,\r\n directionClass + ' ' + direction, done);\r\n element.addClass(direction);\r\n\r\n $animateCss(element, {addClass: directionClass})\r\n .start()\r\n .done(removeClassFn);\r\n\r\n return function() {\r\n stopped = true;\r\n };\r\n }\r\n done();\r\n },\r\n beforeRemoveClass: function (element, className, done) {\r\n if (className === 'active') {\r\n var stopped = false;\r\n var direction = element.data(SLIDE_DIRECTION);\r\n var directionClass = direction === 'next' ? 'left' : 'right';\r\n var removeClassFn = removeClass.bind(this, element, directionClass, done);\r\n\r\n $animateCss(element, {addClass: directionClass})\r\n .start()\r\n .done(removeClassFn);\r\n\r\n return function() {\r\n stopped = true;\r\n };\r\n }\r\n done();\r\n }\r\n };\r\n}]);","angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.position'])\r\n\r\n/**\r\n * A helper, internal data structure that stores all references attached to key\r\n */\r\n .factory('$$multiMap', function () {\r\n return {\r\n createNew: function () {\r\n var map = {};\r\n\r\n return {\r\n entries: function () {\r\n return Object.keys(map).map(function (key) {\r\n return {\r\n key: key,\r\n value: map[key]\r\n };\r\n });\r\n },\r\n get: function (key) {\r\n return map[key];\r\n },\r\n hasKey: function (key) {\r\n return !!map[key];\r\n },\r\n keys: function () {\r\n return Object.keys(map);\r\n },\r\n put: function (key, value) {\r\n if (!map[key]) {\r\n map[key] = [];\r\n }\r\n\r\n map[key].push(value);\r\n },\r\n remove: function (key, value) {\r\n var values = map[key];\r\n\r\n if (!values) {\r\n return;\r\n }\r\n\r\n var idx = values.indexOf(value);\r\n\r\n if (idx !== -1) {\r\n values.splice(idx, 1);\r\n }\r\n\r\n if (!values.length) {\r\n delete map[key];\r\n }\r\n }\r\n };\r\n }\r\n };\r\n })\r\n\r\n/**\r\n * Pluggable resolve mechanism for the modal resolve resolution\r\n * Supports UI Router's $resolve service\r\n */\r\n .provider('$uibResolve', function () {\r\n var resolve = this;\r\n this.resolver = null;\r\n\r\n this.setResolver = function (resolver) {\r\n this.resolver = resolver;\r\n };\r\n\r\n this.$get = ['$injector', '$q', function ($injector, $q) {\r\n var resolver = resolve.resolver ? $injector.get(resolve.resolver) : null;\r\n return {\r\n resolve: function (invocables, locals, parent, self) {\r\n if (resolver) {\r\n return resolver.resolve(invocables, locals, parent, self);\r\n }\r\n\r\n var promises = [];\r\n\r\n angular.forEach(invocables, function (value) {\r\n if (angular.isFunction(value) || angular.isArray(value)) {\r\n promises.push($q.resolve($injector.invoke(value)));\r\n } else if (angular.isString(value)) {\r\n promises.push($q.resolve($injector.get(value)));\r\n } else {\r\n promises.push($q.resolve(value));\r\n }\r\n });\r\n\r\n return $q.all(promises).then(function (resolves) {\r\n var resolveObj = {};\r\n var resolveIter = 0;\r\n angular.forEach(invocables, function (value, key) {\r\n resolveObj[key] = resolves[resolveIter++];\r\n });\r\n\r\n return resolveObj;\r\n });\r\n }\r\n };\r\n }];\r\n })\r\n\r\n/**\r\n * A helper directive for the $modal service. It creates a backdrop element.\r\n */\r\n .directive('uibModalBackdrop', ['$animate', '$injector', '$uibModalStack',\r\n function ($animate, $injector, $modalStack) {\r\n return {\r\n replace: true,\r\n templateUrl: 'directive/ui-bootstrap/modal/backdrop.html',\r\n compile: function (tElement, tAttrs) {\r\n tElement.addClass(tAttrs.backdropClass);\r\n return linkFn;\r\n }\r\n };\r\n\r\n function linkFn(scope, element, attrs) {\r\n if (attrs.modalInClass) {\r\n $animate.addClass(element, attrs.modalInClass);\r\n\r\n scope.$on($modalStack.NOW_CLOSING_EVENT, function (e, setIsAsync) {\r\n var done = setIsAsync();\r\n if (scope.modalOptions.animation) {\r\n $animate.removeClass(element, attrs.modalInClass).then(done);\r\n } else {\r\n done();\r\n }\r\n });\r\n }\r\n }\r\n }])\r\n\r\n .directive('uibModalWindow', ['$uibModalStack', '$q', '$animateCss', '$document',\r\n function ($modalStack, $q, $animateCss, $document) {\r\n return {\r\n scope: {\r\n index: '@'\r\n },\r\n replace: true,\r\n transclude: true,\r\n templateUrl: function (tElement, tAttrs) {\r\n return tAttrs.templateUrl || 'directive/ui-bootstrap/modal/window.html';\r\n },\r\n link: function (scope, element, attrs) {\r\n element.addClass(attrs.windowClass || '');\r\n element.addClass(attrs.windowTopClass || '');\r\n scope.size = attrs.size;\r\n scope.taiClass = [];\r\n if (attrs.taiClass) {\r\n angular.forEach(attrs.taiClass.split(','), function (item) {\r\n scope.taiClass.push(item);\r\n });\r\n }\r\n \r\n scope.close = function (evt) {\r\n \r\n var modal = $modalStack.getTop();\r\n\r\n // 如果是手機且關閉最後一個 Modal 時候執行\r\n if (!modal && DEVICE_TYPE) {\r\n var param = { };\r\n var method = \"closepopup\";\r\n appCallback(method, param);\r\n } \r\n\r\n if (modal && modal.value.backdrop &&\r\n modal.value.backdrop !== 'static' &&\r\n evt.target === evt.currentTarget) { \r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n $modalStack.dismiss(modal.key, 'backdrop click');\r\n }\r\n };\r\n\r\n // moved from template to fix issue #2280\r\n element.on('click', scope.close);\r\n\r\n // This property is only added to the scope for the purpose of detecting when this directive is rendered.\r\n // We can detect that by using this property in the template associated with this directive and then use\r\n // {@link Attribute#$observe} on it. For more details please see {@link TableColumnResize}.\r\n scope.$isRendered = true;\r\n\r\n // Deferred object that will be resolved when this modal is render.\r\n var modalRenderDeferObj = $q.defer();\r\n // Observe function will be called on next digest cycle after compilation, ensuring that the DOM is ready.\r\n // In order to use this way of finding whether DOM is ready, we need to observe a scope property used in modal's template.\r\n attrs.$observe('modalRender', function (value) {\r\n if (value === 'true') {\r\n\r\n // 如果是手機且彈跳 Modal 時候執行\r\n if (DEVICE_TYPE) {\r\n var param = { };\r\n var method = \"popup\";\r\n appCallback(method, param);\r\n } \r\n \r\n \r\n modalRenderDeferObj.resolve();\r\n }\r\n });\r\n\r\n modalRenderDeferObj.promise.then(function () {\r\n var animationPromise = null;\r\n\r\n if (attrs.modalInClass) {\r\n animationPromise = $animateCss(element, {\r\n addClass: attrs.modalInClass\r\n }).start();\r\n\r\n scope.$on($modalStack.NOW_CLOSING_EVENT, function (e, setIsAsync) {\r\n var done = setIsAsync();\r\n $animateCss(element, {\r\n removeClass: attrs.modalInClass\r\n }).start().then(done);\r\n });\r\n }\r\n\r\n\r\n $q.when(animationPromise).then(function () {\r\n // Notify {@link $modalStack} that modal is rendered.\r\n var modal = $modalStack.getTop();\r\n if (modal) {\r\n $modalStack.modalRendered(modal.key);\r\n }\r\n\r\n /**\r\n * If something within the freshly-opened modal already has focus (perhaps via a\r\n * directive that causes focus). then no need to try and focus anything.\r\n */\r\n if (!($document[0].activeElement && element[0].contains($document[0].activeElement))) {\r\n var inputWithAutofocus = element[0].querySelector('[autofocus]');\r\n /**\r\n * Auto-focusing of a freshly-opened modal element causes any child elements\r\n * with the autofocus attribute to lose focus. This is an issue on touch\r\n * based devices which will show and then hide the onscreen keyboard.\r\n * Attempts to refocus the autofocus element via JavaScript will not reopen\r\n * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus\r\n * the modal element if the modal does not contain an autofocus element.\r\n */\r\n if (inputWithAutofocus) {\r\n inputWithAutofocus.focus();\r\n } else {\r\n element[0].focus();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n };\r\n }])\r\n\r\n .directive('uibModalAnimationClass', function () {\r\n return {\r\n compile: function (tElement, tAttrs) {\r\n if (tAttrs.modalAnimation) {\r\n tElement.addClass(tAttrs.uibModalAnimationClass);\r\n }\r\n }\r\n };\r\n })\r\n\r\n .directive('uibModalTransclude', function () {\r\n return {\r\n link: function (scope, element, attrs, controller, transclude) {\r\n transclude(scope.$parent, function (clone) {\r\n element.empty();\r\n element.append(clone);\r\n });\r\n }\r\n };\r\n })\r\n\r\n .factory('$uibModalStack', ['$animate', '$animateCss', '$document',\r\n '$compile', '$rootScope', '$q', '$$multiMap', '$$stackedMap', '$uibPosition',\r\n function ($animate, $animateCss, $document, $compile, $rootScope, $q, $$multiMap, $$stackedMap, $uibPosition) {\r\n var OPENED_MODAL_CLASS = 'modal-open';\r\n var backdropDomEl, backdropScope;\r\n var openedWindows = $$stackedMap.createNew();\r\n var openedClasses = $$multiMap.createNew();\r\n var $modalStack = {\r\n NOW_CLOSING_EVENT: 'modal.stack.now-closing'\r\n };\r\n var topModalIndex = 0;\r\n var previousTopOpenedModal = null;\r\n\r\n //Modal focus behavior\r\n var tabableSelector = 'a[href], area[href], input:not([disabled]), ' +\r\n 'button:not([disabled]),select:not([disabled]), textarea:not([disabled]), ' +\r\n 'iframe, object, embed, *[tabindex], *[contenteditable=true]';\r\n var scrollbarPadding;\r\n\r\n function isVisible(element) {\r\n return !!(element.offsetWidth ||\r\n element.offsetHeight ||\r\n element.getClientRects().length);\r\n }\r\n\r\n function backdropIndex() {\r\n var topBackdropIndex = -1;\r\n var opened = openedWindows.keys();\r\n for (var i = 0; i < opened.length; i++) {\r\n if (openedWindows.get(opened[i]).value.backdrop) {\r\n topBackdropIndex = i;\r\n }\r\n }\r\n\r\n // If any backdrop exist, ensure that it's index is always\r\n // right below the top modal\r\n if (topBackdropIndex > -1 && topBackdropIndex < topModalIndex) {\r\n topBackdropIndex = topModalIndex;\r\n }\r\n return topBackdropIndex;\r\n }\r\n\r\n $rootScope.$watch(backdropIndex, function (newBackdropIndex) {\r\n if (backdropScope) {\r\n backdropScope.index = newBackdropIndex;\r\n }\r\n });\r\n\r\n function removeModalWindow(modalInstance, elementToReceiveFocus) {\r\n var modalWindow = openedWindows.get(modalInstance).value;\r\n var appendToElement = modalWindow.appendTo;\r\n\r\n //clean up the stack\r\n openedWindows.remove(modalInstance);\r\n previousTopOpenedModal = openedWindows.top();\r\n if (previousTopOpenedModal) {\r\n topModalIndex = parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10);\r\n }\r\n\r\n removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function () {\r\n var modalBodyClass = modalWindow.openedClass || OPENED_MODAL_CLASS;\r\n openedClasses.remove(modalBodyClass, modalInstance);\r\n appendToElement.toggleClass(modalBodyClass, openedClasses.hasKey(modalBodyClass));\r\n if (scrollbarPadding && scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\r\n if (scrollbarPadding.originalRight) {\r\n appendToElement.css({ paddingRight: scrollbarPadding.originalRight + 'px' });\r\n } else {\r\n appendToElement.css({ paddingRight: '' });\r\n }\r\n scrollbarPadding = null;\r\n }\r\n toggleTopWindowClass(true);\r\n }, modalWindow.closedDeferred);\r\n checkRemoveBackdrop();\r\n\r\n //move focus to specified element if available, or else to body\r\n if (elementToReceiveFocus && elementToReceiveFocus.focus) {\r\n elementToReceiveFocus.focus();\r\n } else if (appendToElement.focus) {\r\n appendToElement.focus();\r\n }\r\n }\r\n\r\n // Add or remove \"windowTopClass\" from the top window in the stack\r\n function toggleTopWindowClass(toggleSwitch) {\r\n var modalWindow;\r\n\r\n if (openedWindows.length() > 0) {\r\n modalWindow = openedWindows.top().value;\r\n modalWindow.modalDomEl.toggleClass(modalWindow.windowTopClass || '', toggleSwitch);\r\n }\r\n }\r\n\r\n function checkRemoveBackdrop() {\r\n //remove backdrop if no longer needed\r\n if (backdropDomEl && backdropIndex() === -1) {\r\n var backdropScopeRef = backdropScope;\r\n removeAfterAnimate(backdropDomEl, backdropScope, function () {\r\n backdropScopeRef = null;\r\n });\r\n backdropDomEl = undefined;\r\n backdropScope = undefined;\r\n }\r\n }\r\n\r\n function removeAfterAnimate(domEl, scope, done, closedDeferred) {\r\n var asyncDeferred;\r\n var asyncPromise = null;\r\n var setIsAsync = function () {\r\n if (!asyncDeferred) {\r\n asyncDeferred = $q.defer();\r\n asyncPromise = asyncDeferred.promise;\r\n }\r\n\r\n return function asyncDone() {\r\n asyncDeferred.resolve();\r\n };\r\n };\r\n scope.$broadcast($modalStack.NOW_CLOSING_EVENT, setIsAsync);\r\n\r\n // Note that it's intentional that asyncPromise might be null.\r\n // That's when setIsAsync has not been called during the\r\n // NOW_CLOSING_EVENT broadcast.\r\n return $q.when(asyncPromise).then(afterAnimating);\r\n\r\n function afterAnimating() {\r\n if (afterAnimating.done) {\r\n return;\r\n }\r\n afterAnimating.done = true;\r\n\r\n $animate.leave(domEl).then(function () {\r\n domEl.remove();\r\n if (closedDeferred) {\r\n closedDeferred.resolve();\r\n }\r\n });\r\n\r\n scope.$destroy();\r\n if (done) {\r\n done();\r\n }\r\n }\r\n }\r\n\r\n $document.on('keydown', keydownListener);\r\n\r\n $rootScope.$on('$destroy', function () {\r\n $document.off('keydown', keydownListener);\r\n });\r\n\r\n function keydownListener(evt) {\r\n if (evt.isDefaultPrevented()) {\r\n return evt;\r\n }\r\n\r\n var modal = openedWindows.top();\r\n if (modal) {\r\n switch (evt.which) {\r\n case 27: {\r\n if (modal.value.keyboard) {\r\n evt.preventDefault();\r\n $rootScope.$apply(function () {\r\n $modalStack.dismiss(modal.key, 'escape key press');\r\n });\r\n }\r\n break;\r\n }\r\n case 9: {\r\n var list = $modalStack.loadFocusElementList(modal);\r\n var focusChanged = false;\r\n if (evt.shiftKey) {\r\n if ($modalStack.isFocusInFirstItem(evt, list) || $modalStack.isModalFocused(evt, modal)) {\r\n focusChanged = $modalStack.focusLastFocusableElement(list);\r\n }\r\n } else {\r\n if ($modalStack.isFocusInLastItem(evt, list)) {\r\n focusChanged = $modalStack.focusFirstFocusableElement(list);\r\n }\r\n }\r\n\r\n if (focusChanged) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n $modalStack.open = function (modalInstance, modal) {\r\n var modalOpener = $document[0].activeElement,\r\n modalBodyClass = modal.openedClass || OPENED_MODAL_CLASS;\r\n\r\n toggleTopWindowClass(false);\r\n\r\n // Store the current top first, to determine what index we ought to use\r\n // for the current top modal\r\n previousTopOpenedModal = openedWindows.top();\r\n openedWindows.add(modalInstance, {\r\n deferred: modal.deferred,\r\n renderDeferred: modal.renderDeferred,\r\n closedDeferred: modal.closedDeferred,\r\n modalScope: modal.scope,\r\n backdrop: modal.backdrop,\r\n keyboard: modal.keyboard,\r\n openedClass: modal.openedClass,\r\n windowTopClass: modal.windowTopClass,\r\n animation: modal.animation,\r\n appendTo: modal.appendTo\r\n });\r\n\r\n openedClasses.put(modalBodyClass, modalInstance);\r\n\r\n var appendToElement = modal.appendTo,\r\n currBackdropIndex = backdropIndex();\r\n\r\n if (!appendToElement.length) {\r\n throw new Error('appendTo element not found. Make sure that the element passed is in DOM.');\r\n }\r\n\r\n if (currBackdropIndex >= 0 && !backdropDomEl) {\r\n backdropScope = $rootScope.$new(true);\r\n backdropScope.modalOptions = modal;\r\n backdropScope.index = currBackdropIndex;\r\n backdropDomEl = angular.element('
      ');\r\n backdropDomEl.attr('backdrop-class', modal.backdropClass);\r\n if (modal.animation) {\r\n backdropDomEl.attr('modal-animation', 'true');\r\n }\r\n $compile(backdropDomEl)(backdropScope);\r\n $animate.enter(backdropDomEl, appendToElement);\r\n }\r\n\r\n // Set the top modal index based on the index of the previous top modal\r\n topModalIndex = previousTopOpenedModal ? parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10) + 1 : 0;\r\n var angularDomEl = angular.element('
      ');\r\n angularDomEl.attr({\r\n 'template-url': modal.windowTemplateUrl,\r\n 'window-class': modal.windowClass,\r\n 'window-top-class': modal.windowTopClass,\r\n 'size': modal.size,\r\n 'index': topModalIndex,\r\n 'animate': 'animate',\r\n 'tai-class': modal.taiClass\r\n }).html(modal.content);\r\n if (modal.animation) {\r\n angularDomEl.attr('modal-animation', 'true');\r\n }\r\n\r\n scrollbarPadding = $uibPosition.scrollbarPadding(appendToElement);\r\n if (scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\r\n appendToElement.css({ paddingRight: scrollbarPadding.right + 'px' });\r\n }\r\n appendToElement.addClass(modalBodyClass);\r\n $animate.enter($compile(angularDomEl)(modal.scope), appendToElement);\r\n\r\n openedWindows.top().value.modalDomEl = angularDomEl;\r\n openedWindows.top().value.modalOpener = modalOpener;\r\n\r\n // 解決表單有時在IE無法輸入問題\r\n fixIeNotAbleToInput('.modal');\r\n };\r\n\r\n function broadcastClosing(modalWindow, resultOrReason, closing) {\r\n return !modalWindow.value.modalScope.$broadcast('modal.closing', resultOrReason, closing).defaultPrevented;\r\n }\r\n\r\n $modalStack.close = function (modalInstance, result) {\r\n var modalWindow = openedWindows.get(modalInstance);\r\n if (modalWindow && broadcastClosing(modalWindow, result, true)) {\r\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\r\n modalWindow.value.deferred.resolve(result);\r\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\r\n return true;\r\n }\r\n return !modalWindow;\r\n };\r\n\r\n $modalStack.dismiss = function (modalInstance, reason) {\r\n var modalWindow = openedWindows.get(modalInstance);\r\n if (modalWindow && broadcastClosing(modalWindow, reason, false)) {\r\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\r\n modalWindow.value.deferred.reject(reason);\r\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\r\n return true;\r\n }\r\n return !modalWindow;\r\n };\r\n\r\n $modalStack.dismissAll = function (reason) {\r\n var topModal = this.getTop();\r\n while (topModal && this.dismiss(topModal.key, reason)) {\r\n topModal = this.getTop();\r\n }\r\n };\r\n\r\n $modalStack.getTop = function () {\r\n return openedWindows.top();\r\n };\r\n\r\n $modalStack.modalRendered = function (modalInstance) {\r\n var modalWindow = openedWindows.get(modalInstance);\r\n if (modalWindow) {\r\n modalWindow.value.renderDeferred.resolve();\r\n }\r\n };\r\n\r\n $modalStack.focusFirstFocusableElement = function (list) {\r\n if (list.length > 0) {\r\n list[0].focus();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $modalStack.focusLastFocusableElement = function (list) {\r\n if (list.length > 0) {\r\n list[list.length - 1].focus();\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $modalStack.isModalFocused = function (evt, modalWindow) {\r\n if (evt && modalWindow) {\r\n var modalDomEl = modalWindow.value.modalDomEl;\r\n if (modalDomEl && modalDomEl.length) {\r\n return (evt.target || evt.srcElement) === modalDomEl[0];\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n $modalStack.isFocusInFirstItem = function (evt, list) {\r\n if (list.length > 0) {\r\n return (evt.target || evt.srcElement) === list[0];\r\n }\r\n return false;\r\n };\r\n\r\n $modalStack.isFocusInLastItem = function (evt, list) {\r\n if (list.length > 0) {\r\n return (evt.target || evt.srcElement) === list[list.length - 1];\r\n }\r\n return false;\r\n };\r\n\r\n $modalStack.loadFocusElementList = function (modalWindow) {\r\n if (modalWindow) {\r\n var modalDomE1 = modalWindow.value.modalDomEl;\r\n if (modalDomE1 && modalDomE1.length) {\r\n var elements = modalDomE1[0].querySelectorAll(tabableSelector);\r\n return elements ?\r\n Array.prototype.filter.call(elements, function (element) {\r\n return isVisible(element);\r\n }) : elements;\r\n }\r\n }\r\n };\r\n\r\n return $modalStack;\r\n }])\r\n\r\n .provider('$uibModal', function () {\r\n var $modalProvider = {\r\n options: {\r\n animation: true,\r\n backdrop: true, //can also be false or 'static'\r\n keyboard: true\r\n },\r\n $get: ['$rootScope', '$q', '$document', '$templateRequest', '$controller', '$uibResolve', '$uibModalStack',\r\n function ($rootScope, $q, $document, $templateRequest, $controller, $uibResolve, $modalStack) {\r\n var $modal = {};\r\n\r\n function getTemplatePromise(options) {\r\n return options.template ? $q.when(options.template) :\r\n $templateRequest(angular.isFunction(options.templateUrl) ?\r\n options.templateUrl() : options.templateUrl);\r\n }\r\n\r\n var promiseChain = null;\r\n $modal.getPromiseChain = function () {\r\n return promiseChain;\r\n };\r\n\r\n $modal.open = function (modalOptions) {\r\n var modalResultDeferred = $q.defer();\r\n var modalOpenedDeferred = $q.defer();\r\n var modalClosedDeferred = $q.defer();\r\n var modalRenderDeferred = $q.defer();\r\n //prepare an instance of a modal to be injected into controllers and returned to a caller\r\n var modalInstance = {\r\n result: modalResultDeferred.promise,\r\n opened: modalOpenedDeferred.promise,\r\n closed: modalClosedDeferred.promise,\r\n rendered: modalRenderDeferred.promise,\r\n close: function (result) {\r\n return $modalStack.close(modalInstance, result);\r\n },\r\n dismiss: function (reason) {\r\n return $modalStack.dismiss(modalInstance, reason);\r\n }\r\n };\r\n\r\n //merge and clean up options\r\n modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\r\n modalOptions.resolve = modalOptions.resolve || {};\r\n modalOptions.appendTo = modalOptions.appendTo || $document.find('body').eq(0);\r\n\r\n //verify options\r\n if (!modalOptions.template && !modalOptions.templateUrl) {\r\n throw new Error('One of template or templateUrl options is required.');\r\n }\r\n\r\n var templateAndResolvePromise =\r\n $q.all([getTemplatePromise(modalOptions), $uibResolve.resolve(modalOptions.resolve, {}, null, null)]);\r\n\r\n function resolveWithTemplate() {\r\n return templateAndResolvePromise;\r\n }\r\n\r\n // Wait for the resolution of the existing promise chain.\r\n // Then switch to our own combined promise dependency (regardless of how the previous modal fared).\r\n // Then add to $modalStack and resolve opened.\r\n // Finally clean up the chain variable if no subsequent modal has overwritten it.\r\n var samePromise;\r\n samePromise = promiseChain = $q.all([promiseChain])\r\n .then(resolveWithTemplate, resolveWithTemplate)\r\n .then(function resolveSuccess(tplAndVars) {\r\n var providedScope = modalOptions.scope || $rootScope;\r\n\r\n var modalScope = providedScope.$new();\r\n modalScope.$close = modalInstance.close;\r\n modalScope.$dismiss = modalInstance.dismiss;\r\n\r\n modalScope.$on('$destroy', function () {\r\n if (!modalScope.$$uibDestructionScheduled) {\r\n modalScope.$dismiss('$uibUnscheduledDestruction');\r\n }\r\n });\r\n\r\n var ctrlInstance, ctrlInstantiate, ctrlLocals = {};\r\n\r\n //controllers\r\n if (modalOptions.controller) {\r\n ctrlLocals.$scope = modalScope;\r\n ctrlLocals.$uibModalInstance = modalInstance;\r\n angular.forEach(tplAndVars[1], function (value, key) {\r\n ctrlLocals[key] = value;\r\n });\r\n\r\n // the third param will make the controller instantiate later,private api\r\n // @see https://github.com/angular/angular.js/blob/master/src/ng/controller.js#L126\r\n ctrlInstantiate = $controller(modalOptions.controller, ctrlLocals, true);\r\n if (modalOptions.controllerAs) {\r\n ctrlInstance = ctrlInstantiate.instance;\r\n\r\n if (modalOptions.bindToController) {\r\n ctrlInstance.$close = modalScope.$close;\r\n ctrlInstance.$dismiss = modalScope.$dismiss;\r\n angular.extend(ctrlInstance, providedScope);\r\n }\r\n\r\n ctrlInstance = ctrlInstantiate();\r\n\r\n modalScope[modalOptions.controllerAs] = ctrlInstance;\r\n } else {\r\n ctrlInstance = ctrlInstantiate();\r\n }\r\n\r\n if (angular.isFunction(ctrlInstance.$onInit)) {\r\n ctrlInstance.$onInit();\r\n }\r\n }\r\n\r\n $modalStack.open(modalInstance, {\r\n scope: modalScope,\r\n deferred: modalResultDeferred,\r\n renderDeferred: modalRenderDeferred,\r\n closedDeferred: modalClosedDeferred,\r\n content: tplAndVars[0],\r\n animation: modalOptions.animation,\r\n backdrop: modalOptions.backdrop,\r\n keyboard: modalOptions.keyboard,\r\n backdropClass: modalOptions.backdropClass,\r\n windowTopClass: modalOptions.windowTopClass,\r\n windowClass: modalOptions.windowClass,\r\n windowTemplateUrl: modalOptions.windowTemplateUrl,\r\n size: modalOptions.size,\r\n openedClass: modalOptions.openedClass,\r\n appendTo: modalOptions.appendTo,\r\n taiClass: modalOptions.taiClass\r\n });\r\n modalOpenedDeferred.resolve(true);\r\n\r\n }, function resolveError(reason) {\r\n modalOpenedDeferred.reject(reason);\r\n modalResultDeferred.reject(reason);\r\n })['finally'](function () {\r\n if (promiseChain === samePromise) {\r\n promiseChain = null;\r\n }\r\n });\r\n\r\n return modalInstance;\r\n };\r\n\r\n return $modal;\r\n }\r\n ]\r\n };\r\n\r\n return $modalProvider;\r\n });\r\n","angular.module('ui.bootstrap.pagination', ['ui.bootstrap.paging'])\r\n.controller('UibPaginationController', ['$scope', '$attrs', '$parse', 'uibPaging', 'uibPaginationConfig', function($scope, $attrs, $parse, uibPaging, uibPaginationConfig) {\r\n var ctrl = this;\r\n // Setup configuration parameters\r\n var maxSize = angular.isDefined($attrs.maxSize) ? $scope.$parent.$eval($attrs.maxSize) : uibPaginationConfig.maxSize,\r\n rotate = angular.isDefined($attrs.rotate) ? $scope.$parent.$eval($attrs.rotate) : uibPaginationConfig.rotate,\r\n forceEllipses = angular.isDefined($attrs.forceEllipses) ? $scope.$parent.$eval($attrs.forceEllipses) : uibPaginationConfig.forceEllipses,\r\n boundaryLinkNumbers = angular.isDefined($attrs.boundaryLinkNumbers) ? $scope.$parent.$eval($attrs.boundaryLinkNumbers) : uibPaginationConfig.boundaryLinkNumbers,\r\n pageLabel = angular.isDefined($attrs.pageLabel) ? function(idx) { return $scope.$parent.$eval($attrs.pageLabel, {$page: idx}); } : angular.identity;\r\n $scope.boundaryLinks = angular.isDefined($attrs.boundaryLinks) ? $scope.$parent.$eval($attrs.boundaryLinks) : uibPaginationConfig.boundaryLinks;\r\n $scope.directionLinks = angular.isDefined($attrs.directionLinks) ? $scope.$parent.$eval($attrs.directionLinks) : uibPaginationConfig.directionLinks;\r\n\r\n uibPaging.create(this, $scope, $attrs);\r\n\r\n if ($attrs.maxSize) {\r\n ctrl._watchers.push($scope.$parent.$watch($parse($attrs.maxSize), function(value) {\r\n maxSize = parseInt(value, 10);\r\n ctrl.render();\r\n }));\r\n }\r\n\r\n // Create page object used in template\r\n function makePage(number, text, isActive) {\r\n return {\r\n number: number,\r\n text: text,\r\n active: isActive\r\n };\r\n }\r\n\r\n function getPages(currentPage, totalPages) {\r\n var pages = [];\r\n\r\n // Default page limits\r\n var startPage = 1, endPage = totalPages;\r\n var isMaxSized = angular.isDefined(maxSize) && maxSize < totalPages;\r\n\r\n // recompute if maxSize\r\n if (isMaxSized) {\r\n if (rotate) {\r\n // Current page is displayed in the middle of the visible ones\r\n startPage = Math.max(currentPage - Math.floor(maxSize / 2), 1);\r\n endPage = startPage + maxSize - 1;\r\n\r\n // Adjust if limit is exceeded\r\n if (endPage > totalPages) {\r\n endPage = totalPages;\r\n startPage = endPage - maxSize + 1;\r\n }\r\n } else {\r\n // Visible pages are paginated with maxSize\r\n startPage = (Math.ceil(currentPage / maxSize) - 1) * maxSize + 1;\r\n\r\n // Adjust last page if limit is exceeded\r\n endPage = Math.min(startPage + maxSize - 1, totalPages);\r\n }\r\n }\r\n\r\n // Add page number links\r\n for (var number = startPage; number <= endPage; number++) {\r\n var page = makePage(number, pageLabel(number), number === currentPage);\r\n pages.push(page);\r\n }\r\n\r\n // Add links to move between page sets\r\n if (isMaxSized && maxSize > 0 && (!rotate || forceEllipses || boundaryLinkNumbers)) {\r\n if (startPage > 1) {\r\n if (!boundaryLinkNumbers || startPage > 3) { //need ellipsis for all options unless range is too close to beginning\r\n var previousPageSet = makePage(startPage - 1, '...', false);\r\n pages.unshift(previousPageSet);\r\n }\r\n if (boundaryLinkNumbers) {\r\n if (startPage === 3) { //need to replace ellipsis when the buttons would be sequential\r\n var secondPageLink = makePage(2, '2', false);\r\n pages.unshift(secondPageLink);\r\n }\r\n //add the first page\r\n var firstPageLink = makePage(1, '1', false);\r\n pages.unshift(firstPageLink);\r\n }\r\n }\r\n\r\n if (endPage < totalPages) {\r\n if (!boundaryLinkNumbers || endPage < totalPages - 2) { //need ellipsis for all options unless range is too close to end\r\n var nextPageSet = makePage(endPage + 1, '...', false);\r\n pages.push(nextPageSet);\r\n }\r\n if (boundaryLinkNumbers) {\r\n if (endPage === totalPages - 2) { //need to replace ellipsis when the buttons would be sequential\r\n var secondToLastPageLink = makePage(totalPages - 1, totalPages - 1, false);\r\n pages.push(secondToLastPageLink);\r\n }\r\n //add the last page\r\n var lastPageLink = makePage(totalPages, totalPages, false);\r\n pages.push(lastPageLink);\r\n }\r\n }\r\n }\r\n return pages;\r\n }\r\n\r\n var originalRender = this.render;\r\n this.render = function() {\r\n originalRender();\r\n if ($scope.page > 0 && $scope.page <= $scope.totalPages) {\r\n $scope.pages = getPages($scope.page, $scope.totalPages);\r\n }\r\n };\r\n}])\r\n\r\n.constant('uibPaginationConfig', {\r\n itemsPerPage: 10,\r\n boundaryLinks: false,\r\n boundaryLinkNumbers: false,\r\n directionLinks: true,\r\n firstText: '<<',\r\n previousText: '<',\r\n nextText: '>',\r\n lastText: '>>',\r\n rotate: true,\r\n forceEllipses: false\r\n})\r\n\r\n.directive('uibPagination', ['$parse', 'uibPaginationConfig', function($parse, uibPaginationConfig) {\r\n return {\r\n scope: {\r\n totalItems: '=',\r\n firstText: '@',\r\n previousText: '@',\r\n nextText: '@',\r\n lastText: '@',\r\n ngDisabled:'='\r\n },\r\n require: ['uibPagination', '?ngModel'],\r\n controller: 'UibPaginationController',\r\n controllerAs: 'pagination',\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'directive/ui-bootstrap/pagination/pagination.html';\r\n },\r\n replace: true,\r\n link: function(scope, element, attrs, ctrls) {\r\n var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\r\n\r\n if (!ngModelCtrl) {\r\n return; // do nothing if no ng-model\r\n }\r\n\r\n paginationCtrl.init(ngModelCtrl, uibPaginationConfig);\r\n }\r\n };\r\n}]);\r\n","angular.module('ui.bootstrap.paging', [])\r\n/**\r\n * Helper internal service for generating common controller code between the\r\n * pager and pagination components\r\n */\r\n.factory('uibPaging', ['$parse', function($parse) {\r\n return {\r\n create: function(ctrl, $scope, $attrs) {\r\n ctrl.setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\r\n ctrl.ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl\r\n ctrl._watchers = [];\r\n\r\n ctrl.init = function(ngModelCtrl, config) {\r\n ctrl.ngModelCtrl = ngModelCtrl;\r\n ctrl.config = config;\r\n\r\n ngModelCtrl.$render = function() {\r\n ctrl.render();\r\n };\r\n\r\n if ($attrs.itemsPerPage) {\r\n ctrl._watchers.push($scope.$parent.$watch($attrs.itemsPerPage, function(value) {\r\n ctrl.itemsPerPage = parseInt(value, 10);\r\n $scope.totalPages = ctrl.calculateTotalPages();\r\n ctrl.updatePage();\r\n }));\r\n } else {\r\n ctrl.itemsPerPage = config.itemsPerPage;\r\n }\r\n\r\n $scope.$watch('totalItems', function(newTotal, oldTotal) {\r\n if (angular.isDefined(newTotal) || newTotal !== oldTotal) {\r\n $scope.totalPages = ctrl.calculateTotalPages();\r\n ctrl.updatePage();\r\n }\r\n });\r\n };\r\n\r\n ctrl.calculateTotalPages = function() {\r\n var totalPages = ctrl.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / ctrl.itemsPerPage);\r\n return Math.max(totalPages || 0, 1);\r\n };\r\n\r\n ctrl.render = function() {\r\n $scope.page = parseInt(ctrl.ngModelCtrl.$viewValue, 10) || 1;\r\n };\r\n\r\n $scope.selectPage = function(page, evt) {\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n var clickAllowed = !$scope.ngDisabled || !evt;\r\n if (clickAllowed && $scope.page !== page && page > 0 && page <= $scope.totalPages) {\r\n if (evt && evt.target) {\r\n evt.target.blur();\r\n }\r\n ctrl.ngModelCtrl.$setViewValue(page);\r\n ctrl.ngModelCtrl.$render();\r\n }\r\n };\r\n\r\n $scope.getText = function(key) {\r\n return $scope[key + 'Text'] || ctrl.config[key + 'Text'];\r\n };\r\n\r\n $scope.noPrevious = function() {\r\n return $scope.page === 1;\r\n };\r\n\r\n $scope.noNext = function() {\r\n return $scope.page === $scope.totalPages;\r\n };\r\n\r\n ctrl.updatePage = function() {\r\n ctrl.setNumPages($scope.$parent, $scope.totalPages); // Readonly variable\r\n\r\n if ($scope.page > $scope.totalPages) {\r\n $scope.selectPage($scope.totalPages);\r\n } else {\r\n ctrl.ngModelCtrl.$render();\r\n }\r\n };\r\n\r\n $scope.$on('$destroy', function() {\r\n while (ctrl._watchers.length) {\r\n ctrl._watchers.shift()();\r\n }\r\n });\r\n }\r\n };\r\n}]);\r\n","angular.module('ui.bootstrap.tabs', [])\r\n\r\n.controller('UibTabsetController', ['$scope', function ($scope) {\r\n var ctrl = this,\r\n oldIndex;\r\n ctrl.tabs = [];\r\n ctrl.select = function(index, evt) {\r\n if (!destroyed) {\r\n var previousIndex = findTabIndex(oldIndex);\r\n var previousSelected = ctrl.tabs[previousIndex];\r\n if (previousSelected) {\r\n previousSelected.tab.onDeselect({\r\n $event: evt\r\n });\r\n if (evt && evt.isDefaultPrevented()) {\r\n return;\r\n }\r\n previousSelected.tab.active = false;\r\n }\r\n\r\n var selected = ctrl.tabs[index];\r\n if (selected) {\r\n selected.tab.onSelect({\r\n $event: evt\r\n });\r\n selected.tab.active = true;\r\n ctrl.active = selected.index;\r\n oldIndex = selected.index;\r\n } else if (!selected && angular.isNumber(oldIndex)) {\r\n ctrl.active = null;\r\n oldIndex = null;\r\n }\r\n }\r\n };\r\n\r\n ctrl.addTab = function addTab(tab) {\r\n ctrl.tabs.push({\r\n tab: tab,\r\n index: tab.index\r\n });\r\n ctrl.tabs.sort(function(t1, t2) {\r\n if (t1.index > t2.index) {\r\n return 1;\r\n }\r\n\r\n if (t1.index < t2.index) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n if (tab.index === ctrl.active || !angular.isNumber(ctrl.active) && ctrl.tabs.length === 1) {\r\n var newActiveIndex = findTabIndex(tab.index);\r\n ctrl.select(newActiveIndex);\r\n }\r\n };\r\n\r\n ctrl.removeTab = function removeTab(tab) {\r\n var index;\r\n for (var i = 0; i < ctrl.tabs.length; i++) {\r\n if (ctrl.tabs[i].tab === tab) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n if (ctrl.tabs[index].index === ctrl.active) {\r\n var newActiveTabIndex = index === ctrl.tabs.length - 1 ?\r\n index - 1 : index + 1 % ctrl.tabs.length;\r\n ctrl.select(newActiveTabIndex);\r\n }\r\n\r\n ctrl.tabs.splice(index, 1);\r\n };\r\n\r\n $scope.$watch('tabset.active', function(val) {\r\n if (angular.isNumber(val) && val !== oldIndex) {\r\n ctrl.select(findTabIndex(val));\r\n }\r\n });\r\n\r\n var destroyed;\r\n $scope.$on('$destroy', function() {\r\n destroyed = true;\r\n });\r\n\r\n function findTabIndex(index) {\r\n for (var i = 0; i < ctrl.tabs.length; i++) {\r\n if (ctrl.tabs[i].index === index) {\r\n return i;\r\n }\r\n }\r\n }\r\n}])\r\n\r\n.directive('uibTabset', function() {\r\n return {\r\n transclude: true,\r\n replace: true,\r\n scope: {\r\n isNohover:'@'\r\n },\r\n bindToController: {\r\n active: '=?',\r\n type: '@'\r\n },\r\n controller: 'UibTabsetController',\r\n controllerAs: 'tabset',\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'directive/ui-bootstrap/tabs/tabset.html';\r\n },\r\n link: function(scope, element, attrs) {\r\n scope.vertical = angular.isDefined(attrs.vertical) ?\r\n scope.$parent.$eval(attrs.vertical) : false;\r\n scope.justified = angular.isDefined(attrs.justified) ?\r\n scope.$parent.$eval(attrs.justified) : false;\r\n if (angular.isUndefined(attrs.active)) {\r\n scope.active = 0;\r\n }\r\n }\r\n };\r\n})\r\n\r\n.directive('uibTab', ['$parse', function($parse) {\r\n return {\r\n require: '^uibTabset',\r\n replace: true,\r\n templateUrl: function(element, attrs) {\r\n return attrs.templateUrl || 'directive/ui-bootstrap/tabs/tab.html';\r\n },\r\n transclude: true,\r\n scope: {\r\n heading: '@',\r\n index: '=?',\r\n classes: '@?',\r\n onSelect: '&select', //This callback is called in contentHeadingTransclude\r\n //once it inserts the tab's content into the dom\r\n onDeselect: '&deselect'\r\n },\r\n controller: function() {\r\n //Empty controller so other directives can require being 'under' a tab\r\n },\r\n controllerAs: 'tab',\r\n link: function(scope, elm, attrs, tabsetCtrl, transclude) {\r\n scope.disabled = false;\r\n if (attrs.disable) {\r\n scope.$parent.$watch($parse(attrs.disable), function(value) {\r\n scope.disabled = !! value;\r\n });\r\n }\r\n\r\n if (angular.isUndefined(attrs.index)) {\r\n if (tabsetCtrl.tabs && tabsetCtrl.tabs.length) {\r\n scope.index = Math.max.apply(null, tabsetCtrl.tabs.map(function(t) { return t.index; })) + 1;\r\n } else {\r\n scope.index = 0;\r\n }\r\n }\r\n\r\n if (angular.isUndefined(attrs.classes)) {\r\n scope.classes = '';\r\n }\r\n\r\n scope.select = function(evt) {\r\n if (!scope.disabled) {\r\n var index;\r\n for (var i = 0; i < tabsetCtrl.tabs.length; i++) {\r\n if (tabsetCtrl.tabs[i].tab === scope) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n tabsetCtrl.select(index, evt);\r\n }\r\n };\r\n\r\n tabsetCtrl.addTab(scope);\r\n scope.$on('$destroy', function() {\r\n tabsetCtrl.removeTab(scope);\r\n });\r\n\r\n //We need to transclude later, once the content container is ready.\r\n //when this link happens, we're inside a tab heading.\r\n scope.$transcludeFn = transclude;\r\n }\r\n };\r\n}])\r\n\r\n.directive('uibTabHeadingTransclude', function() {\r\n return {\r\n restrict: 'A',\r\n require: '^uibTab',\r\n link: function(scope, elm) {\r\n scope.$watch('headingElement', function updateHeadingElement(heading) {\r\n if (heading) {\r\n elm.html('');\r\n elm.append(heading);\r\n }\r\n });\r\n }\r\n };\r\n})\r\n\r\n.directive('uibTabContentTransclude', function() {\r\n return {\r\n restrict: 'A',\r\n require: '^uibTabset',\r\n link: function(scope, elm, attrs) {\r\n var tab = scope.$eval(attrs.uibTabContentTransclude).tab;\r\n\r\n //Now our tab is ready to be transcluded: both the tab heading area\r\n //and the tab content area are loaded. Transclude 'em both.\r\n tab.$transcludeFn(tab.$parent, function(contents) {\r\n angular.forEach(contents, function(node) {\r\n if (isTabHeading(node)) {\r\n //Let tabHeadingTransclude know.\r\n tab.headingElement = node;\r\n } else {\r\n elm.append(node);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n function isTabHeading(node) {\r\n return node.tagName && (\r\n node.hasAttribute('uib-tab-heading') ||\r\n node.hasAttribute('data-uib-tab-heading') ||\r\n node.hasAttribute('x-uib-tab-heading') ||\r\n node.tagName.toLowerCase() === 'uib-tab-heading' ||\r\n node.tagName.toLowerCase() === 'data-uib-tab-heading' ||\r\n node.tagName.toLowerCase() === 'x-uib-tab-heading' ||\r\n node.tagName.toLowerCase() === 'uib:tab-heading'\r\n );\r\n }\r\n});\r\n","angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.debounce', 'ui.bootstrap.position'])\r\n\r\n/**\r\n * A helper service that can parse typeahead's syntax (string provided by users)\r\n * Extracted to a separate service for ease of unit testing\r\n */\r\n .factory('uibTypeaheadParser', ['$parse', function($parse) {\r\n // 00000111000000000000022200000000000000003333333333333330000000000044000\r\n var TYPEAHEAD_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+([\\s\\S]+?)$/;\r\n return {\r\n parse: function(input) {\r\n var match = input.match(TYPEAHEAD_REGEXP);\r\n if (!match) {\r\n throw new Error(\r\n 'Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' +\r\n ' but got \"' + input + '\".');\r\n }\r\n\r\n return {\r\n itemName: match[3],\r\n source: $parse(match[4]),\r\n viewMapper: $parse(match[2] || match[1]),\r\n modelMapper: $parse(match[1])\r\n };\r\n }\r\n };\r\n }])\r\n\r\n .controller('UibTypeaheadController', ['$scope', '$element', '$attrs', '$compile', '$parse', '$q', '$timeout', '$document', '$window', '$rootScope', '$$debounce', '$uibPosition', 'uibTypeaheadParser',\r\n function(originalScope, element, attrs, $compile, $parse, $q, $timeout, $document, $window, $rootScope, $$debounce, $position, typeaheadParser) {\r\n var HOT_KEYS = [9, 13, 27, 38, 40];\r\n var eventDebounceTime = 200;\r\n var modelCtrl, ngModelOptions;\r\n //SUPPORTED ATTRIBUTES (OPTIONS)\r\n\r\n //minimal no of characters that needs to be entered before typeahead kicks-in\r\n var minLength = originalScope.$eval(attrs.typeaheadMinLength);\r\n if (!minLength && minLength !== 0) {\r\n minLength = 1;\r\n }\r\n\r\n originalScope.$watch(attrs.typeaheadMinLength, function (newVal) {\r\n minLength = !newVal && newVal !== 0 ? 1 : newVal;\r\n });\r\n \r\n //minimal wait time after last character typed before typeahead kicks-in\r\n var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\r\n\r\n //should it restrict model values to the ones selected from the popup only?\r\n var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\r\n originalScope.$watch(attrs.typeaheadEditable, function (newVal) {\r\n isEditable = newVal !== false;\r\n });\r\n\r\n //binding to a variable that indicates if matches are being retrieved asynchronously\r\n var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\r\n\r\n //a callback executed when a match is selected\r\n var onSelectCallback = $parse(attrs.typeaheadOnSelect);\r\n\r\n //should it select highlighted popup value when losing focus?\r\n var isSelectOnBlur = angular.isDefined(attrs.typeaheadSelectOnBlur) ? originalScope.$eval(attrs.typeaheadSelectOnBlur) : false;\r\n\r\n //binding to a variable that indicates if there were no results after the query is completed\r\n var isNoResultsSetter = $parse(attrs.typeaheadNoResults).assign || angular.noop;\r\n\r\n var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\r\n\r\n var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\r\n\r\n var appendTo = attrs.typeaheadAppendTo ?\r\n originalScope.$eval(attrs.typeaheadAppendTo) : null;\r\n\r\n var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false;\r\n\r\n //If input matches an item of the list exactly, select it automatically\r\n var selectOnExact = attrs.typeaheadSelectOnExact ? originalScope.$eval(attrs.typeaheadSelectOnExact) : false;\r\n\r\n //binding to a variable that indicates if dropdown is open\r\n var isOpenSetter = $parse(attrs.typeaheadIsOpen).assign || angular.noop;\r\n\r\n var showHint = originalScope.$eval(attrs.typeaheadShowHint) || false;\r\n\r\n //INTERNAL VARIABLES\r\n\r\n //model setter executed upon match selection\r\n var parsedModel = $parse(attrs.ngModel);\r\n var invokeModelSetter = $parse(attrs.ngModel + '($$$p)');\r\n var $setModelValue = function(scope, newValue) {\r\n if (angular.isFunction(parsedModel(originalScope)) &&\r\n ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) {\r\n return invokeModelSetter(scope, {$$$p: newValue});\r\n }\r\n\r\n return parsedModel.assign(scope, newValue);\r\n };\r\n\r\n //expressions used by typeahead\r\n var parserResult = typeaheadParser.parse(attrs.uibTypeahead);\r\n\r\n var hasFocus;\r\n\r\n //Used to avoid bug in iOS webview where iOS keyboard does not fire\r\n //mousedown & mouseup events\r\n //Issue #3699\r\n var selected;\r\n\r\n //create a child scope for the typeahead directive so we are not polluting original scope\r\n //with typeahead-specific data (matches, query etc.)\r\n var scope = originalScope.$new();\r\n var offDestroy = originalScope.$on('$destroy', function() {\r\n scope.$destroy();\r\n });\r\n scope.$on('$destroy', offDestroy);\r\n\r\n // WAI-ARIA\r\n var popupId = 'typeahead-' + scope.$id + '-' + Math.floor((new Date()).getTime() * 10000);\r\n element.attr({\r\n 'aria-autocomplete': 'list',\r\n 'aria-expanded': false,\r\n 'aria-owns': popupId\r\n });\r\n\r\n var inputsContainer, hintInputElem;\r\n //add read-only input to show hint\r\n if (showHint) {\r\n inputsContainer = angular.element('
      ');\r\n inputsContainer.css('position', 'relative');\r\n element.after(inputsContainer);\r\n hintInputElem = element.clone();\r\n hintInputElem.attr('placeholder', '');\r\n hintInputElem.attr('tabindex', '-1');\r\n hintInputElem.val('');\r\n hintInputElem.css({\r\n 'position': 'absolute',\r\n 'top': '0px',\r\n 'left': '0px',\r\n 'border-color': 'transparent',\r\n 'box-shadow': 'none',\r\n 'opacity': 1,\r\n 'background': 'none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)',\r\n 'color': '#999'\r\n });\r\n element.css({\r\n 'position': 'relative',\r\n 'vertical-align': 'top',\r\n 'background-color': 'transparent'\r\n });\r\n inputsContainer.append(hintInputElem);\r\n hintInputElem.after(element);\r\n }\r\n\r\n //pop-up element used to display matches\r\n var popUpEl = angular.element('
      ');\r\n popUpEl.attr({\r\n id: popupId,\r\n matches: 'matches',\r\n active: 'activeIdx',\r\n select: 'select(activeIdx, evt)',\r\n 'move-in-progress': 'moveInProgress',\r\n query: 'query',\r\n position: 'position',\r\n 'assign-is-open': 'assignIsOpen(isOpen)',\r\n debounce: 'debounceUpdate'\r\n });\r\n //custom item template\r\n if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\r\n popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\r\n }\r\n\r\n if (angular.isDefined(attrs.typeaheadPopupTemplateUrl)) {\r\n popUpEl.attr('popup-template-url', attrs.typeaheadPopupTemplateUrl);\r\n }\r\n\r\n var resetHint = function() {\r\n if (showHint) {\r\n hintInputElem.val('');\r\n }\r\n };\r\n\r\n var resetMatches = function() {\r\n scope.matches = [];\r\n scope.activeIdx = -1;\r\n element.attr('aria-expanded', false);\r\n resetHint();\r\n };\r\n\r\n var getMatchId = function(index) {\r\n return popupId + '-option-' + index;\r\n };\r\n\r\n // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\r\n // This attribute is added or removed automatically when the `activeIdx` changes.\r\n scope.$watch('activeIdx', function(index) {\r\n if (index < 0) {\r\n element.removeAttr('aria-activedescendant');\r\n } else {\r\n element.attr('aria-activedescendant', getMatchId(index));\r\n }\r\n });\r\n\r\n var inputIsExactMatch = function(inputValue, index) {\r\n if (scope.matches.length > index && inputValue) {\r\n return inputValue.toUpperCase() === scope.matches[index].label.toUpperCase();\r\n }\r\n\r\n return false;\r\n };\r\n\r\n var getMatchesAsync = function(inputValue, evt) {\r\n var locals = {$viewValue: inputValue};\r\n isLoadingSetter(originalScope, true);\r\n isNoResultsSetter(originalScope, false);\r\n $q.when(parserResult.source(originalScope, locals)).then(function(matches) {\r\n //it might happen that several async queries were in progress if a user were typing fast\r\n //but we are interested only in responses that correspond to the current view value\r\n var onCurrentRequest = inputValue === modelCtrl.$viewValue;\r\n if (onCurrentRequest && hasFocus) {\r\n if (matches && matches.length > 0) {\r\n scope.activeIdx = focusFirst ? 0 : -1;\r\n isNoResultsSetter(originalScope, false);\r\n scope.matches.length = 0;\r\n\r\n //transform labels\r\n for (var i = 0; i < matches.length; i++) {\r\n locals[parserResult.itemName] = matches[i];\r\n scope.matches.push({\r\n id: getMatchId(i),\r\n label: parserResult.viewMapper(scope, locals),\r\n model: matches[i]\r\n });\r\n }\r\n\r\n scope.query = inputValue;\r\n //position pop-up with matches - we need to re-calculate its position each time we are opening a window\r\n //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\r\n //due to other elements being rendered\r\n recalculatePosition();\r\n\r\n element.attr('aria-expanded', true);\r\n\r\n //Select the single remaining option if user input matches\r\n if (selectOnExact && scope.matches.length === 1 && inputIsExactMatch(inputValue, 0)) {\r\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\r\n $$debounce(function() {\r\n scope.select(0, evt);\r\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\r\n } else {\r\n scope.select(0, evt);\r\n }\r\n }\r\n\r\n if (showHint) {\r\n var firstLabel = scope.matches[0].label;\r\n if (angular.isString(inputValue) &&\r\n inputValue.length > 0 &&\r\n firstLabel.slice(0, inputValue.length).toUpperCase() === inputValue.toUpperCase()) {\r\n hintInputElem.val(inputValue + firstLabel.slice(inputValue.length));\r\n } else {\r\n hintInputElem.val('');\r\n }\r\n }\r\n } else {\r\n resetMatches();\r\n isNoResultsSetter(originalScope, true);\r\n }\r\n }\r\n if (onCurrentRequest) {\r\n isLoadingSetter(originalScope, false);\r\n }\r\n }, function() {\r\n resetMatches();\r\n isLoadingSetter(originalScope, false);\r\n isNoResultsSetter(originalScope, true);\r\n });\r\n };\r\n\r\n // bind events only if appendToBody params exist - performance feature\r\n if (appendToBody) {\r\n angular.element($window).on('resize', fireRecalculating);\r\n $document.find('body').on('scroll', fireRecalculating);\r\n }\r\n\r\n // Declare the debounced function outside recalculating for\r\n // proper debouncing\r\n var debouncedRecalculate = $$debounce(function() {\r\n // if popup is visible\r\n if (scope.matches.length) {\r\n recalculatePosition();\r\n }\r\n\r\n scope.moveInProgress = false;\r\n }, eventDebounceTime);\r\n\r\n // Default progress type\r\n scope.moveInProgress = false;\r\n\r\n function fireRecalculating() {\r\n if (!scope.moveInProgress) {\r\n scope.moveInProgress = true;\r\n scope.$digest();\r\n }\r\n\r\n debouncedRecalculate();\r\n }\r\n\r\n // recalculate actual position and set new values to scope\r\n // after digest loop is popup in right position\r\n function recalculatePosition() {\r\n scope.position = appendToBody ? $position.offset(element) : $position.position(element);\r\n scope.position.top += element.prop('offsetHeight');\r\n }\r\n\r\n //we need to propagate user's query so we can higlight matches\r\n scope.query = undefined;\r\n\r\n //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later\r\n var timeoutPromise;\r\n\r\n var scheduleSearchWithTimeout = function(inputValue) {\r\n timeoutPromise = $timeout(function() {\r\n getMatchesAsync(inputValue);\r\n }, waitTime);\r\n };\r\n\r\n var cancelPreviousTimeout = function() {\r\n if (timeoutPromise) {\r\n $timeout.cancel(timeoutPromise);\r\n }\r\n };\r\n\r\n resetMatches();\r\n\r\n scope.assignIsOpen = function (isOpen) {\r\n isOpenSetter(originalScope, isOpen);\r\n };\r\n\r\n scope.select = function(activeIdx, evt) {\r\n //called from within the $digest() cycle\r\n var locals = {};\r\n var model, item;\r\n\r\n selected = true;\r\n locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\r\n model = parserResult.modelMapper(originalScope, locals);\r\n $setModelValue(originalScope, model);\r\n modelCtrl.$setValidity('editable', true);\r\n modelCtrl.$setValidity('parse', true);\r\n\r\n onSelectCallback(originalScope, {\r\n $item: item,\r\n $model: model,\r\n $label: parserResult.viewMapper(originalScope, locals),\r\n $event: evt\r\n });\r\n\r\n resetMatches();\r\n\r\n //return focus to the input element if a match was selected via a mouse click event\r\n // use timeout to avoid $rootScope:inprog error\r\n if (scope.$eval(attrs.typeaheadFocusOnSelect) !== false) {\r\n $timeout(function() { element[0].focus(); }, 0, false);\r\n }\r\n };\r\n\r\n //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\r\n element.on('keydown', function(evt) {\r\n //typeahead is open and an \"interesting\" key was pressed\r\n if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\r\n return;\r\n }\r\n\r\n /**\r\n * if there's nothing selected (i.e. focusFirst) and enter or tab is hit\r\n * or\r\n * shift + tab is pressed to bring focus to the previous element\r\n * then clear the results\r\n */\r\n if (scope.activeIdx === -1 && (evt.which === 9 || evt.which === 13) || evt.which === 9 && !!evt.shiftKey) {\r\n resetMatches();\r\n scope.$digest();\r\n return;\r\n }\r\n\r\n evt.preventDefault();\r\n var target;\r\n switch (evt.which) {\r\n case 9:\r\n case 13:\r\n scope.$apply(function () {\r\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\r\n $$debounce(function() {\r\n scope.select(scope.activeIdx, evt);\r\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\r\n } else {\r\n scope.select(scope.activeIdx, evt);\r\n }\r\n });\r\n break;\r\n case 27:\r\n evt.stopPropagation();\r\n\r\n resetMatches();\r\n originalScope.$digest();\r\n break;\r\n case 38:\r\n scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1;\r\n scope.$digest();\r\n target = popUpEl.find('li')[scope.activeIdx];\r\n target.parentNode.scrollTop = target.offsetTop;\r\n break;\r\n case 40:\r\n scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\r\n scope.$digest();\r\n target = popUpEl.find('li')[scope.activeIdx];\r\n target.parentNode.scrollTop = target.offsetTop;\r\n break;\r\n }\r\n });\r\n\r\n element.bind('focus', function (evt) {\r\n hasFocus = true;\r\n if (minLength === 0 && !modelCtrl.$viewValue) {\r\n $timeout(function() {\r\n getMatchesAsync(modelCtrl.$viewValue, evt);\r\n }, 0);\r\n }\r\n });\r\n\r\n element.bind('blur', function(evt) {\r\n if (isSelectOnBlur && scope.matches.length && scope.activeIdx !== -1 && !selected) {\r\n selected = true;\r\n scope.$apply(function() {\r\n if (angular.isObject(scope.debounceUpdate) && angular.isNumber(scope.debounceUpdate.blur)) {\r\n $$debounce(function() {\r\n scope.select(scope.activeIdx, evt);\r\n }, scope.debounceUpdate.blur);\r\n } else {\r\n scope.select(scope.activeIdx, evt);\r\n }\r\n });\r\n }\r\n if (!isEditable && modelCtrl.$error.editable) {\r\n modelCtrl.$setViewValue();\r\n // Reset validity as we are clearing\r\n modelCtrl.$setValidity('editable', true);\r\n modelCtrl.$setValidity('parse', true);\r\n element.val('');\r\n }\r\n hasFocus = false;\r\n selected = false;\r\n });\r\n\r\n // Keep reference to click handler to unbind it.\r\n var dismissClickHandler = function(evt) {\r\n // Issue #3973\r\n // Firefox treats right click as a click on document\r\n if (element[0] !== evt.target && evt.which !== 3 && scope.matches.length !== 0) {\r\n resetMatches();\r\n if (!$rootScope.$$phase) {\r\n originalScope.$digest();\r\n }\r\n }\r\n };\r\n\r\n $document.on('click', dismissClickHandler);\r\n\r\n originalScope.$on('$destroy', function() {\r\n $document.off('click', dismissClickHandler);\r\n if (appendToBody || appendTo) {\r\n $popup.remove();\r\n }\r\n\r\n if (appendToBody) {\r\n angular.element($window).off('resize', fireRecalculating);\r\n $document.find('body').off('scroll', fireRecalculating);\r\n }\r\n // Prevent jQuery cache memory leak\r\n popUpEl.remove();\r\n\r\n if (showHint) {\r\n inputsContainer.remove();\r\n }\r\n });\r\n\r\n var $popup = $compile(popUpEl)(scope);\r\n\r\n if (appendToBody) {\r\n $document.find('body').append($popup);\r\n } else if (appendTo) {\r\n angular.element(appendTo).eq(0).append($popup);\r\n } else {\r\n element.after($popup);\r\n }\r\n\r\n this.init = function(_modelCtrl, _ngModelOptions) {\r\n modelCtrl = _modelCtrl;\r\n ngModelOptions = _ngModelOptions;\r\n\r\n scope.debounceUpdate = modelCtrl.$options && $parse(modelCtrl.$options.debounce)(originalScope);\r\n\r\n //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\r\n //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\r\n modelCtrl.$parsers.unshift(function(inputValue) {\r\n hasFocus = true;\r\n\r\n if (minLength === 0 || inputValue && inputValue.length >= minLength) {\r\n if (waitTime > 0) {\r\n cancelPreviousTimeout();\r\n scheduleSearchWithTimeout(inputValue);\r\n } else {\r\n getMatchesAsync(inputValue);\r\n }\r\n } else {\r\n isLoadingSetter(originalScope, false);\r\n cancelPreviousTimeout();\r\n resetMatches();\r\n }\r\n\r\n if (isEditable) {\r\n return inputValue;\r\n }\r\n\r\n if (!inputValue) {\r\n // Reset in case user had typed something previously.\r\n modelCtrl.$setValidity('editable', true);\r\n return null;\r\n }\r\n\r\n modelCtrl.$setValidity('editable', false);\r\n return undefined;\r\n });\r\n\r\n modelCtrl.$formatters.push(function(modelValue) {\r\n var candidateViewValue, emptyViewValue;\r\n var locals = {};\r\n\r\n // The validity may be set to false via $parsers (see above) if\r\n // the model is restricted to selected values. If the model\r\n // is set manually it is considered to be valid.\r\n if (!isEditable) {\r\n modelCtrl.$setValidity('editable', true);\r\n }\r\n\r\n if (inputFormatter) {\r\n locals.$model = modelValue;\r\n return inputFormatter(originalScope, locals);\r\n }\r\n\r\n //it might happen that we don't have enough info to properly render input value\r\n //we need to check for this situation and simply return model value if we can't apply custom formatting\r\n locals[parserResult.itemName] = modelValue;\r\n candidateViewValue = parserResult.viewMapper(originalScope, locals);\r\n locals[parserResult.itemName] = undefined;\r\n emptyViewValue = parserResult.viewMapper(originalScope, locals);\r\n\r\n return candidateViewValue !== emptyViewValue ? candidateViewValue : modelValue;\r\n });\r\n };\r\n }])\r\n\r\n .directive('uibTypeahead', function() {\r\n return {\r\n controller: 'UibTypeaheadController',\r\n require: ['ngModel', '^?ngModelOptions', 'uibTypeahead'],\r\n link: function(originalScope, element, attrs, ctrls) {\r\n ctrls[2].init(ctrls[0], ctrls[1]);\r\n }\r\n };\r\n })\r\n\r\n .directive('uibTypeaheadPopup', ['$$debounce', function ($$debounce) {\r\n return {\r\n scope: {\r\n matches: '=',\r\n query: '=',\r\n active: '=',\r\n position: '&',\r\n moveInProgress: '=',\r\n select: '&',\r\n assignIsOpen: '&',\r\n debounce: '&'\r\n },\r\n replace: true,\r\n templateUrl: function (element, attrs) {\r\n return attrs.popupTemplateUrl || 'directive/ui-bootstrap/typeahead/typeahead-popup.html';\r\n },\r\n link: function(scope, element, attrs) {\r\n scope.templateUrl = attrs.templateUrl;\r\n\r\n scope.isOpen = function() {\r\n var isDropdownOpen = scope.matches.length > 0;\r\n scope.assignIsOpen({ isOpen: isDropdownOpen });\r\n return isDropdownOpen;\r\n };\r\n\r\n scope.isActive = function(matchIdx) {\r\n return scope.active === matchIdx;\r\n };\r\n\r\n scope.selectActive = function(matchIdx) {\r\n scope.active = matchIdx;\r\n };\r\n\r\n scope.selectMatch = function(activeIdx, evt) {\r\n var debounce = scope.debounce();\r\n if (angular.isNumber(debounce) || angular.isObject(debounce)) {\r\n $$debounce(function() {\r\n scope.select({activeIdx: activeIdx, evt: evt});\r\n }, angular.isNumber(debounce) ? debounce : debounce['default']);\r\n } else {\r\n scope.select({activeIdx: activeIdx, evt: evt});\r\n }\r\n };\r\n }\r\n };\r\n }])\r\n\r\n .directive('uibTypeaheadMatch', ['$templateRequest', '$compile', '$parse', function($templateRequest, $compile, $parse) {\r\n return {\r\n scope: {\r\n index: '=',\r\n match: '=',\r\n query: '='\r\n },\r\n link: function(scope, element, attrs) {\r\n var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'directive/ui-bootstrap/typeahead/typeahead-match.html';\r\n $templateRequest(tplUrl).then(function(tplContent) {\r\n var tplEl = angular.element(tplContent.trim());\r\n element.replaceWith(tplEl);\r\n $compile(tplEl)(scope);\r\n });\r\n }\r\n };\r\n }])\r\n\r\n .filter('uibTypeaheadHighlight', ['$sce', '$injector', '$log', function($sce, $injector, $log) {\r\n var isSanitizePresent;\r\n isSanitizePresent = $injector.has('$sanitize');\r\n\r\n function escapeRegexp(queryToEscape) {\r\n // Regex: capture the whole query string and replace it with the string that will be used to match\r\n // the results, for example if the capture is \"a\" the result will be \\a\r\n return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\r\n }\r\n\r\n function containsHtml(matchItem) {\r\n return /<.*>/g.test(matchItem);\r\n }\r\n\r\n return function(matchItem, query) {\r\n if (!isSanitizePresent && containsHtml(matchItem)) {\r\n $log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger\r\n }\r\n matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; // Replaces the capture string with a the same string inside of a \"strong\" tag\r\n if (!isSanitizePresent) {\r\n matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive\r\n }\r\n return matchItem;\r\n };\r\n }]);\r\n","(function () {\r\n 'use strict';\r\n angular\r\n .module('app')\r\n .controller('confirmDialogController', confirmDialogController);\r\n\r\n function confirmDialogController($uibModal, $uibModalInstance, config, $rootScope, blockUI) {\r\n var vm = this;\r\n //==Main==\r\n onInit();\r\n //========\r\n\r\n function onInit() {\r\n vm.data = dataInit();\r\n vm.view = viewInit();\r\n vm.event = eventInit();\r\n vm.style = styleInit();\r\n //=========\r\n vm.view.hasTitle = (!!vm.data.confirmTitle);\r\n vm.view.hasContent = (!!vm.data.confirmContent);\r\n vm.style.titleStyle = { padding: '10px', 'word-break': 'break-word' };\r\n vm.style.contentStyle = { padding: '10px', 'word-break': 'break-word' };\r\n vm.style.footerStyle = { padding: '10px', 'word-break': 'break-word' };\r\n vm.isBusy = false;\r\n }\r\n function dataInit() {\r\n config = config || {};\r\n //=====\r\n var result = {\r\n confirmTitle: config.confirmTitle || '',//..........................................詢問標題\r\n confirmContent: config.confirmContent || '',//......................................詢問內容\r\n textButtonOk: config.textButtonOk || $rootScope.translate.tsunButtonConfirmOk,//....確認按鈕文字\r\n textButtonCancel: config.textButtonCancel || $rootScope.translate.commonCancel,//...取消按鈕文字\r\n promiseAction: config.promiseAction //...動作\r\n };\r\n return result;\r\n }\r\n function viewInit() {\r\n var result = {\r\n hasTitle: false,//......是否有標題\r\n hasContent: false,//....是否有內容\r\n };\r\n return result;\r\n }\r\n function eventInit() {\r\n var result = {\r\n ok: ok,//.........確認詢問事件,回傳true\r\n cancel: cancel,//.拒絕詢問事件,回傳false\r\n };\r\n return result;\r\n }\r\n function styleInit() {\r\n var result = {\r\n bodyStyle: {},//.........整個畫面的風格\r\n titleStyle: {},//........標題的風格\r\n contentStyle: {},//......內容的風格\r\n footerStyle: {},//.......尾段的風格\r\n };\r\n return result;\r\n }\r\n //=========\r\n function ok() {\r\n\r\n if (vm.data.promiseAction) {\r\n vm.isBusy = true;\r\n vm.data.promiseAction().then(() => {\r\n $uibModalInstance.close(true);\r\n })\r\n } else {\r\n $uibModalInstance.close(true);\r\n }\r\n\r\n }\r\n function cancel() {\r\n $uibModalInstance.close(false);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('tsunShoppingCartController', tsunShoppingCartController);\r\n\r\n function tsunShoppingCartController($q, trainingInnerService, $uibModal, modalService, $rootScope) {\r\n var vm = this;\r\n vm.setTypeClass = setTypeClass;\r\n vm.openCourseModal = openCourseModal;\r\n vm.delCollection = delCollection;\r\n vm.enroll = enroll;\r\n //===Main===\r\n onInit();\r\n //==========\r\n function dataInit() {\r\n vm.data = {\r\n items: [],\r\n };\r\n vm.view = {\r\n isMobile: modalService.isMobile(), //.是否為行動裝置\r\n collectionEmpty: false, //............查無資料判定\r\n pageLoading: false, //................頁面讀取中\r\n pageLoaded: false, //.................頁面讀取完畢\r\n };\r\n }\r\n\r\n function logicInit() {\r\n //邏輯初始化。\r\n vm.view.pageLoading = true;\r\n return loadCollections()\r\n .then(function(collectionList) {\r\n vm.data.items = collectionList || [];\r\n })\r\n .then(function() {\r\n //finally\r\n checkIsEmpty();\r\n vm.view.pageLoading = false;\r\n vm.view.pageLoaded = true;\r\n });\r\n }\r\n\r\n function onInit() {\r\n dataInit();\r\n logicInit();\r\n }\r\n\r\n function loadCollections() {\r\n //驗證課程收藏資料\r\n var courseCollection = trainingInnerService.getCollectionList();\r\n //取得所有課程資料\r\n var courseList = trainingInnerService.getCourseListAll();\r\n var resultSessionItems = [];\r\n return $q.all([courseCollection, courseList]).then(function(data) {\r\n //驗證課程收藏\r\n var dataCourseCollection = data[0];\r\n var dataCourseList = data[1];\r\n console.log(\"dataCourseList:\", dataCourseList);\r\n _.forEach(dataCourseList, function(data) {\r\n data.courseTime = data.courseTime.replace(/\\/ig, ' ');\r\n });\r\n\r\n\r\n //console.log(\"courseColletion Raw:\",dataCourseCollection);\r\n console.log(\"dataCourseList:\", dataCourseList);\r\n _.forEach(dataCourseCollection, function(collectionItem) {\r\n console.log(\"collectionItem:\", collectionItem);\r\n var findIndex = _.findIndex(dataCourseList, { sessionId: collectionItem.collectionSessionId });\r\n if (findIndex >= 0) {\r\n resultSessionItems.push(dataCourseList[findIndex]);\r\n }\r\n // return (findIndex >= 0);\r\n });\r\n // console.log(\"courseColletion result:\",resultSessionItems);\r\n return resultSessionItems;\r\n });\r\n }\r\n\r\n function setTypeClass(type) {\r\n if (type === 'inClass') {\r\n return 'fa-book';\r\n }\r\n return 'fa-desktop';\r\n }\r\n\r\n function openCourseModal(item) {\r\n var modal = modalService.courseDetail(item);\r\n modal.result.then(function(data) {\r\n if (data) { enrollSuccess(item); }\r\n });\r\n }\r\n\r\n function delCollection(item) {\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: format(\"{0}\\r\\n{1}\", $rootScope.translate.tsunConfirmRemove, item.sessionName),\r\n });\r\n confirmDialog.result.then(function(result) {\r\n result = !!result;\r\n if (result !== true) {\r\n return;\r\n }\r\n trainingInnerService.delCollection(item, true).then(function() {\r\n remove(item);\r\n });\r\n });\r\n }\r\n\r\n function checkIsEmpty() {\r\n if (vm.data.items.length < 1) {\r\n vm.view.collectionEmpty = true;\r\n } else {\r\n vm.view.collectionEmpty = false;\r\n }\r\n }\r\n\r\n function remove(item) {\r\n var itemIndex = _.findIndex(vm.data.items, { sessionId: item.sessionId });\r\n if (itemIndex > -1) {\r\n vm.data.items.splice(itemIndex, 1);\r\n }\r\n checkIsEmpty();\r\n }\r\n\r\n function enrollSuccess(item) {\r\n trainingInnerService.delCollection(item, false).then(function() {\r\n remove(item);\r\n });\r\n }\r\n\r\n function enroll(item) {\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: $rootScope.translate.tsunEnrollInfoNoQuestion,\r\n });\r\n confirmDialog.result.then(function(result) {\r\n result = !!result;\r\n if (result !== true) {\r\n return;\r\n }\r\n trainingInnerService.hasEnrollQuestion(item).then(function(result) {\r\n if (!result) {\r\n trainingInnerService.postSessionAction(item, 'Enroll')\r\n .then(function(result) {\r\n if (!result) { return; }\r\n enrollSuccess(item);\r\n });\r\n } else {\r\n var settingModel = {\r\n isEnroll: true\r\n };\r\n var modal = modalService.courseDetail(item, settingModel);\r\n modal.result.then(function(data) {\r\n if (data) { enrollSuccess(item); }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('shoppingCartService', shoppingCartService);\r\n\r\n function shoppingCartService() {\r\n var service = {\r\n };\r\n //==Main==\r\n return service;\r\n //========\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n angular.module('app')\r\n .controller('tsunCourseController', tsunCourseController);\r\n\r\n function tsunCourseController(modalService, trainingInnerService, userInfo, urlParam, $q, $rootScope, $scope, $uibModal) {\r\n var vm = this;\r\n //vm.selectedMenu = selectedMenu;\r\n vm.openCourseDetail = openCourseDetail;\r\n vm.addToShoppingCar = addToShoppingCar;\r\n vm.enroll = enroll;\r\n vm.openCourseCategorySelector = openCourseCategorySelector;\r\n vm.isMobile = modalService.isMobile();\r\n //==Main==\r\n onInit();\r\n //========\r\n function onInit() {\r\n menuInit();\r\n dataInit();\r\n logicInit();\r\n\r\n $scope.$watch('isSmallView', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n menuSlide();\r\n });\r\n $scope.$watch('vm.data.courseListFilter.length', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n if (!newValue) { newValue = 0; }\r\n vm.view.courseEmpty = newValue < 1;\r\n });\r\n }\r\n\r\n function menuInit() {\r\n if (location.href.indexOf('sessionId') > 0 || location.href.indexOf('courseId') > 0) {\r\n console.log('sessionId:', queryString('sessionId'));\r\n console.log('courseId:', queryString('courseId'));\r\n var sessionId = queryString('sessionId');\r\n var courseId = queryString('courseId');\r\n\r\n if (!sessionId || !courseId) {\r\n sessionStorage.setItem('menuSerilNo', '');\r\n sessionStorage.setItem('menuSerilNo', -9903);\r\n }\r\n }\r\n }\r\n\r\n function dataInit() {\r\n vm.data = {\r\n urlParam: urlParamFormat(urlParam) || {}, //.........網頁傳入的參數\r\n collectionList: null,\r\n courseList: [], //...................................課程資料清單\r\n courseListFilter: [], //.............................課程資料清單於Filter處理後結果\r\n courseCatagories: [],\r\n courseCatagoriesSelectedItemName: $rootScope.translate.commonAll,\r\n };\r\n vm.viewShow = {\r\n slides: []\r\n };\r\n vm.view = {\r\n isMobile: modalService.isMobile(),\r\n courseEmpty: false, //.........查無資料判定\r\n pageLoading: false, //.........頁面讀取中\r\n pageLoaded: false, //..........頁面讀取完畢\r\n };\r\n vm.menuIndex = -1;\r\n vm.menuChildIndex = -1;\r\n }\r\n\r\n function logicInit() {\r\n vm.view.pageLoading = true;\r\n loadMenu()\r\n .then(function(catagoryId) {\r\n menuSlide();\r\n if (!catagoryId) { return; }\r\n return loadCourseList(-1, true);\r\n }).then(function() {\r\n vm.data.courseList = _.filter(vm.data.courseList, function(courseItem) {\r\n var checkCourseID = vm.data.urlParam.courseid || courseItem.courseId;\r\n var checkSessionID = vm.data.urlParam.sessionid || courseItem.sessionId;\r\n // console.log(\"courseItem\", courseItem);\r\n // console.log(\"checkCourseID\", checkCourseID);\r\n // console.log(\"checkSessionID\", checkSessionID);\r\n return (courseItem.courseId === checkCourseID && courseItem.sessionId === checkSessionID);\r\n });\r\n }).then(function() {\r\n vm.view.courseEmpty = vm.data.courseList.length < 1;\r\n vm.view.pageLoading = false;\r\n vm.view.pageLoaded = true;\r\n });\r\n }\r\n\r\n function urlParamFormat(sourceData) {\r\n if (!sourceData) { return null; }\r\n var params = {};\r\n _.forEach(sourceData, function(value, key) {\r\n var keyString = (key + '').toLowerCase();\r\n switch (keyString) {\r\n case 'courseid':\r\n params[keyString] = parseInt(value);\r\n break;\r\n case 'sessionid':\r\n params[keyString] = parseInt(value);\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n return params;\r\n }\r\n\r\n function menuSlide() {\r\n var slideNum = 4;\r\n if ($rootScope.isSmallView) {\r\n slideNum = 4;\r\n }\r\n vm.viewShow.slides = _.chunk(vm.data.courseCatagories, slideNum);\r\n _.forEach(vm.viewShow.slides, function(slideItem) {\r\n for (var index = slideItem.length; index < slideNum; index++) {\r\n slideItem.push({\r\n categoryId: null,\r\n });\r\n }\r\n });\r\n //console.logconsole.log('menuSlide:', vm.viewShow.slides);\r\n }\r\n\r\n function loadMenu(langItem) {\r\n //console.log('langItem:',langItem);\r\n return trainingInnerService.getMenu(langItem).then(function(data) {\r\n // console.log(\"loadMenu data:\", data);\r\n // data.unshift({ categoryId: \"-1\", categoryName: $rootScope.translate.commonAll });\r\n // console.log(\"loadMenu data:\", data);\r\n vm.data.courseCatagories = data;\r\n if (data.length < 1) { return null; }\r\n vm.menuIndex = -1;\r\n vm.menuChildIndex = -1;\r\n return -1;\r\n //return data.data[0].categoryId;\r\n });\r\n }\r\n\r\n function loadCourseList(courseCategory, loadCollection) {\r\n // var courseList = trainingInnerService.getCourseList(courseCategory);\r\n //console.log('courseCategory:',courseCategory);\r\n return trainingInnerService.getCourseListAll(courseCategory)\r\n .then(function(courseList) {\r\n console.log(\"getCourseListAll:\", courseList);\r\n var promisList = [\r\n trainingInnerService.checkCourseWithMenu(courseList, vm.data.courseCatagories)\r\n ];\r\n\r\n if (loadCollection) {\r\n promisList.push(loadUserCollection());\r\n }\r\n return $q.all(promisList).then(function(data) {\r\n //console.log(\"getCourseListAll:\", data[0]);\r\n return data[0]; //courseList\r\n });\r\n })\r\n .then(function(courseListChecked) {\r\n //console.log('vm.data.courseList:',courseListChecked);\r\n _.forEach(courseListChecked, function(data) {\r\n //console.log('sTime:',data.courseTime);\r\n data.courseTime = data.courseTime.replace(/\\/ig, ' ');\r\n //console.log('data:',data.courseTime);\r\n });\r\n vm.data.courseList = courseListChecked;\r\n collectionCheck();\r\n return courseListChecked;\r\n });\r\n }\r\n\r\n function loadUserCollection() {\r\n var collectionList = trainingInnerService.getCollectionList();\r\n return collectionList.then(function(data) {\r\n vm.data.collectionList = data;\r\n return data;\r\n });\r\n }\r\n // select menu\r\n // function selectedMenu(categoryId) {\r\n // // var isSameCourse =\r\n // // (vm.menuIndex === index) &&\r\n // // (vm.menuChildIndex = menuChildIndex);\r\n // // if (isSameCourse) {\r\n // // //如果再度點選篩選中的類別,就取消選取,呈現所有資料。\r\n // // vm.menuIndex = -1;\r\n // // vm.menuChildIndex = -1;\r\n // // loadCourseList(-1);\r\n // // return;\r\n // // }\r\n // // vm.menuIndex = index;\r\n // // vm.menuChildIndex = menuChildIndex;\r\n // //loadCourseList(categoryId);\r\n // }\r\n\r\n // select enroll\r\n function enroll(item) {\r\n console.log('enroll');\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: $rootScope.translate.tsunEnrollInfoNoQuestion,\r\n promiseAction: () => {\r\n return trainingInnerService.hasEnrollQuestion(item).then(function(result) {\r\n if (!result) {\r\n return trainingInnerService.postSessionAction(item, 'Enroll')\r\n .then(function(result) {\r\n if (!result) { return; }\r\n enrollSuccess(item);\r\n })\r\n .then(function() {\r\n //clear url param\r\n console.log('enrollSuccess');\r\n if(location.href.toLowerCase().indexOf('sessionid') > 0 \r\n || location.href.toLowerCase().indexOf('courseid') > 0){\r\n console.log(\"current url:\", location.href);\r\n //2023-07-24 Johnson 資安2023\r\n location.href = eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('`${2.3.4(\\'/#\\')[0]+\\'/#/5/6?7=\\'+8.9(\\'a\\')}`.1(//g,\\'&c\\').1(/\"/g,\\'&d\\').1(/\\'/g,\\'&#e\\').1(/[<>!]|(\\\\(\\\\))|((f|h|i)\\\\j*\\\\(.*\\\\))/g,\\'\\');',20,20,'|replace|location|href|split|tsu|course|menu|sessionStorage|getItem|menuSerilNo|lt|gt|quot|x27|for||while|if|s'.split('|'),0,{}))\r\n }\r\n });\r\n } else {\r\n var settingModel = {\r\n isEnroll: true\r\n };\r\n var modal = modalService.courseDetail(item, settingModel);\r\n modal.result.then(function(result) {\r\n if (!result) { return; }\r\n enrollSuccess(item);\r\n })\r\n .then(function() {\r\n //clear url param\r\n console.log('enrollSuccess');\r\n if(location.href.toLowerCase().indexOf('sessionid') > 0 \r\n || location.href.toLowerCase().indexOf('courseid') > 0){\r\n console.log(\"current url:\", location.href);\r\n //2023-07-24 Johnson 資安2023\r\n location.href = eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('`${2.3.4(\\'/#\\')[0]+\\'/#/5/6?7=\\'+8.9(\\'a\\')}`.1(//g,\\'&c\\').1(/\"/g,\\'&d\\').1(/\\'/g,\\'&#e\\').1(/[<>!]|(\\\\(\\\\))|((f|h|i)\\\\j*\\\\(.*\\\\))/g,\\'\\');',20,20,'|replace|location|href|split|tsu|course|menu|sessionStorage|getItem|menuSerilNo|lt|gt|quot|x27|for||while|if|s'.split('|'),0,{}))\r\n }\r\n });\r\n }\r\n });\r\n }\r\n });\r\n\r\n\r\n\r\n // confirmDialog.result.then(function(result) {\r\n // result = !!result;\r\n // if (result !== true) {\r\n // return;\r\n // }\r\n // trainingInnerService.hasEnrollQuestion(item).then(function(result) {\r\n // if (!result) {\r\n // trainingInnerService.postSessionAction(item, 'Enroll')\r\n // .then(function(result) {\r\n // if (!result) { return; }\r\n // enrollSuccess(item);\r\n // });\r\n // } else {\r\n // var settingModel = {\r\n // isEnroll: true\r\n // };\r\n // var modal = modalService.courseDetail(item, settingModel);\r\n // modal.result.then(function(result) {\r\n // if (!result) { return; }\r\n // enrollSuccess(item);\r\n // });\r\n // }\r\n // });\r\n // });\r\n\r\n }\r\n\r\n function openCourseDetail(item) {\r\n var modal = modalService.courseDetail(item);\r\n modal.result.then(function(data) {\r\n if (data) { enrollSuccess(item); }\r\n });\r\n }\r\n\r\n function enrollSuccess(item) {\r\n trainingInnerService.delCollection(item, false).then(function() {\r\n var itemIndex = _.findIndex(vm.data.courseList, { sessionId: item.sessionId });\r\n if (itemIndex > -1) {\r\n vm.data.courseList.splice(itemIndex, 1);\r\n }\r\n\r\n });\r\n }\r\n\r\n function addToShoppingCar(item) {\r\n trainingInnerService.addCollection(item)\r\n .then(function() {\r\n // console.log(\"vm.data.collectionList\",vm.data.collectionList);\r\n if (!vm.data.collectionList) {\r\n vm.data.collectionList = [];\r\n }\r\n vm.data.collectionList.push({ collectionSessionId: item.sessionId });\r\n item.isAdd = true;\r\n });\r\n //trainingInnerService.addToShoppingCar(item);\r\n }\r\n\r\n function collectionCheck() {\r\n //console.log(\"vm.data.collectionList\", vm.data.collectionList);\r\n _.forEach(vm.data.courseList, function(courseItem) {\r\n var indexFind = _.findIndex(vm.data.collectionList, {\r\n collectionSessionId: courseItem.sessionId\r\n });\r\n courseItem.isAdd = (indexFind >= 0);\r\n });\r\n return vm.data.courseList;\r\n }\r\n\r\n function openCourseCategorySelector() {\r\n var item = vm.data.courseCatagories;\r\n var result = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/courseCategorySelector.html',\r\n controller: 'courseCategorySelectorController as vm',\r\n size: 'sm',\r\n backdrop: 'static',\r\n taiClass: modalService.getTaiClass(),\r\n resolve: {\r\n categoryItem: function() {\r\n return item;\r\n },\r\n }\r\n });\r\n //這個則是接收傳回來的值\r\n result.result.then(function(result) {\r\n vm.data.courseCatagoriesSelectedItemName = result[0].categoryName;\r\n loadCourseList(result[0].categoryId);\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('courseService', courseService);\r\n\r\n function courseService() {\r\n var service = {\r\n };\r\n return service;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('tsunMyTrainingController', tsunMyTrainingController);\r\n\r\n function tsunMyTrainingController($q, ssoInfo, $rootScope, $timeout, $scope, modalService) {\r\n var vm = this;\r\n //==Main==\r\n onInit();\r\n //========\r\n function onInit() {\r\n vm.method = methodList();\r\n vm.view = viewInit();\r\n vm.data = dataInit();\r\n logicInit();\r\n }\r\n\r\n function dataInit() {\r\n var result = {\r\n ssoInfo: null,\r\n translate: $rootScope.translate\r\n };\r\n return result;\r\n }\r\n\r\n function viewInit() {\r\n var result = {\r\n pageLoading: false, //.........頁面讀取中\r\n pageLoaded: false, //..........頁面讀取完畢\r\n menuType: 1, //................選單顯示樣式(磚塊[1]或是下拉[2])\r\n isMobile: modalService.isMobile(),\r\n };\r\n return result;\r\n }\r\n\r\n function methodList() {\r\n var result = {\r\n menuClick: menuClick,\r\n };\r\n return result;\r\n }\r\n\r\n function logicInit() {\r\n // console.log(\"ssoInfo:\", ssoInfo);\r\n vm.menuIndex = 0;\r\n vm.menuList = [];\r\n vm.view.pageLoading = true;\r\n return $q.when(menuLoad()).then(function() {\r\n vm.view.pageLoading = false;\r\n vm.view.pageLoaded = true;\r\n vm.menuSeletedText = vm.menuList[0].name;\r\n if (ssoInfo) {\r\n vm.data.ssoInfo = ssoInfo;\r\n } else {\r\n //另外取得使用者資訊。\r\n }\r\n $scope.$watch('isSmallView', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n menuNameEdit();\r\n });\r\n });\r\n }\r\n\r\n function menuLoad() {\r\n vm.menuList = [\r\n { id: 1, name: '', nameValue: $rootScope.translate.tsunRepairProject },\r\n { id: 2, name: '', nameValue: $rootScope.translate.tsunCourseLog },\r\n { id: 3, name: '', nameValue: $rootScope.translate.tsunFinancial },\r\n { id: 4, name: '', nameValue: $rootScope.translate.tsunExterior },\r\n { id: 5, name: '', nameValue: $rootScope.translate.tsunBankBook }\r\n ];\r\n menuStyleChange();\r\n menuNameEdit();\r\n }\r\n\r\n function menuStyleChange() {\r\n var langSelected = sessionStorage.getItem('langCode');\r\n switch (langSelected) {\r\n case '1':\r\n case '2':\r\n vm.view.menuType = 1;\r\n break;\r\n default:\r\n vm.view.menuType = 2;\r\n break;\r\n }\r\n\r\n }\r\n\r\n function menuClick(index) {\r\n vm.menuIndex = index;\r\n //console.log('menuIndex:', vm.menuIndex);\r\n }\r\n\r\n\r\n function menuNameEdit() {\r\n if (vm.menuList.length < 1) { return; }\r\n var langSelected = sessionStorage.getItem('langCode');\r\n _.forEach(vm.menuList, function(menuItem) {\r\n var nameLength = menuItem.nameValue.length;\r\n var position = 0;\r\n if (!$rootScope.isSmallView) {\r\n menuItem.name = menuItem.nameValue;\r\n return;\r\n }\r\n switch (langSelected) {\r\n case '1':\r\n case '2':\r\n //中文處理\r\n var numLineChange = 2;\r\n menuItem.name = '';\r\n do {\r\n if ((nameLength - position) > numLineChange) {\r\n menuItem.name += menuItem.nameValue.substr(position, numLineChange);\r\n menuItem.name += '
      ';\r\n } else {\r\n menuItem.name += menuItem.nameValue.substr(position, (nameLength - position));\r\n }\r\n position += numLineChange;\r\n } while ((nameLength - position) > 0);\r\n break;\r\n default:\r\n menuItem.name = menuItem.nameValue;\r\n //外語處理\r\n break;\r\n }\r\n });\r\n\r\n }\r\n\r\n /* 漢堡選單click事件 */\r\n var menuSerilNo = parseInt(getMenuQueryString());\r\n //console.log('train index menu:', menuSerilNo);\r\n //待修\r\n if (menuSerilNo === -9901) {\r\n menuClick(0);\r\n }\r\n //修課紀錄\r\n if (menuSerilNo === -9906) {\r\n menuClick(1);\r\n }\r\n //金融 先跳過\r\n if (menuSerilNo === -9991 || menuSerilNo === -9992 || menuSerilNo === -9993) {\r\n menuClick(2);\r\n }\r\n //外訓\r\n if (menuSerilNo === -9904) {\r\n menuClick(3);\r\n }\r\n //存摺\r\n if (menuSerilNo === -9907) {\r\n menuClick(4);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMyTrainingBankBook', taiMyTrainingBankBook);\r\n\r\n function taiMyTrainingBankBook() {\r\n var directive = {\r\n bindToController: true,\r\n controller: taiMyTrainingBankBookController,\r\n controllerAs: 'vm',\r\n restrict: 'E',\r\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.bankBook.html',\r\n scope: {\r\n isFocus: '='\r\n }\r\n };\r\n return directive;\r\n }\r\n /* @ngInject */\r\n function taiMyTrainingBankBookController($q, trainingInnerService, $scope, $uibModal, modalService) {\r\n var vm = this;\r\n vm.yearChanged = yearChanged;\r\n vm.openYearSelector = openYearSelector;\r\n vm.isMobile = modalService.isMobile();\r\n onInit();\r\n\r\n function onInit() {\r\n vm.data = dataInit();\r\n vm.view = viewInit();\r\n $scope.$watch('vm.isFocus', function(newValue) {\r\n if (newValue === true) {\r\n logicInit();\r\n }\r\n });\r\n }\r\n\r\n function dataInit() {\r\n var result = {\r\n years: [], //........年度下拉清單的矩陣\r\n year: 1970, //.......選取的年度\r\n remainPoint: 0, //...剩餘存摺點數\r\n bankBook: [], //.....當年度花費點數的課程\r\n };\r\n return result;\r\n }\r\n\r\n function viewInit() {\r\n var result = {\r\n bankBookEmpty: false, //.......訓練存摺點數為空\r\n isInited: false, //............是否被初始化過\r\n pageLoaded: false, //..........頁面讀取完畢\r\n pageLoading: false, //.........頁面讀取中\r\n };\r\n return result;\r\n }\r\n\r\n function logicInit() {\r\n vm.view.pageLoaded = false;\r\n vm.view.pageLoading = true;\r\n //=====\r\n var promiseEvt = function() {\r\n vm.view.isInited = true;\r\n vm.data.years = trainingInnerService.getYears(2011);\r\n vm.data.year = vm.data.years[0];\r\n }();\r\n $q.when(promiseEvt)\r\n .then(function() {\r\n return yearChanged();\r\n })\r\n .then(function() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n });\r\n }\r\n\r\n function loadBankBook(year) {\r\n // return trainingInnerService.loadLangs()\r\n // .then(function (langs) {\r\n // var bankBookItem = {\r\n // remainPoint: null,\r\n // bankBook: []\r\n // };\r\n // var promiseList = [];\r\n // _.forEach(langs, function (lang) {\r\n // promiseList.push(trainingInnerService.getBankBook(year, lang.langCode));\r\n // });\r\n // return $q.all(promiseList).then(function (data) {\r\n // _.forEach(data, function (perReceiveData) {\r\n // if (!bankBookItem.remainPoint) {\r\n // bankBookItem.remainPoint = perReceiveData.remainPoint;\r\n // }\r\n // Array.prototype.push.apply(bankBookItem.bankBook, perReceiveData.bankBook);\r\n // });\r\n // return bankBookItem;\r\n // });\r\n // });\r\n return trainingInnerService.getBankBook(year, sessionStorage.getItem(\"userLang\"));\r\n }\r\n\r\n function yearChanged() {\r\n vm.view.pageLoaded = false;\r\n vm.view.pageLoading = true;\r\n //======\r\n var result =\r\n loadBankBook(vm.data.year)\r\n .then(function(bankBookItem) {\r\n if (!bankBookItem) {\r\n vm.data.remainPoint = 0;\r\n vm.data.bankBook = {};\r\n vm.view.bankBookEmpty = true;\r\n return;\r\n }\r\n //取代sessionTime中的
      \r\n // _.forEach(bankBookItem, function(data) {\r\n // console.log('sTime:',data);\r\n // // data.courseTime = data.courseTime.replace(/\\/ig, ' ');\r\n // // console.log('data:',data.courseTime);\r\n // });\r\n vm.data.remainPoint = bankBookItem.remainPoint;\r\n vm.data.bankBook = bankBookItem.bankBook;\r\n vm.view.bankBookEmpty = bankBookItem.bankBook.length < 1;\r\n return true;\r\n }).then(function() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n });\r\n return result;\r\n }\r\n\r\n function openYearSelector() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n\r\n var result = modalService.openOptionSelector(vm.data.years, 'yrSelect',false);\r\n\r\n //這個則是接收傳回來的值\r\n result.result.then(function(data) {\r\n vm.data.year = data;\r\n loadBankBook(vm.data.year)\r\n .then(function(bankBookItem) {\r\n if (!bankBookItem) {\r\n vm.data.remainPoint = 0;\r\n vm.data.bankBook = {};\r\n vm.view.bankBookEmpty = true;\r\n return;\r\n }\r\n vm.data.remainPoint = bankBookItem.remainPoint;\r\n vm.data.bankBook = bankBookItem.bankBook;\r\n vm.view.bankBookEmpty = bankBookItem.bankBook.length < 1;\r\n return true;\r\n }).then(function() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n });\r\n });\r\n return result;\r\n }\r\n }\r\n\r\n\r\n\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMyTrainingCourseLog', taiMyTrainingCourseLog);\r\n\r\n function taiMyTrainingCourseLog() {\r\n var directive = {\r\n bindToController: true,\r\n controller: taiMyTrainingCourseLogController,\r\n controllerAs: 'vm',\r\n restrict: 'E',\r\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.courseLog.html',\r\n scope: {\r\n isFocus: '=',\r\n translatePool: '=',\r\n }\r\n };\r\n return directive;\r\n }\r\n /* @ngInject */\r\n function taiMyTrainingCourseLogController(trainingInnerService, $q, $scope, modalService) {\r\n var vm = this;\r\n // 1.8.2 父層參數 data 無法直接從 scope 引入\r\n vm.translatePool = $scope.$parent.vm.data.translatePool;\r\n onInit();\r\n function onInit() {\r\n vm.isMobile=modalService.isMobile();\r\n vm.openYearSelector = openYearSelector;\r\n //vm.openTime = openTime;\r\n vm.yearChange = yearChange;\r\n vm.statusConvert = statusConvert;\r\n vm.method = methodList(); //找機會要把上面的設定移到這裡\r\n //======\r\n vm.data = dataInit();\r\n vm.view = viewInit();\r\n //======\r\n $scope.$watch('vm.data.courseLogFilter.length', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n if (!newValue) { newValue = 0; }\r\n vm.view.courseLogEmpty = newValue < 1;\r\n });\r\n $scope.$watch('vm.isFocus', function(newValue) {\r\n if (newValue === true) {\r\n logicInit();\r\n }\r\n });\r\n }\r\n\r\n function dataInit() {\r\n var result = {\r\n courseLogSource: [],\r\n courseLog: [],\r\n courseLogFilter: []\r\n };\r\n\r\n return result;\r\n }\r\n\r\n function viewInit() {\r\n var result = {\r\n courseLogEmpty: false, //.........查無資料判定\r\n isInited: false, //............是否被初始化過\r\n pageLoaded: false, //..........頁面讀取完畢\r\n pageLoading: false, //.........頁面讀取中\r\n };\r\n return result;\r\n }\r\n\r\n function methodList() {\r\n var result = {\r\n filterSessionTimeByYear: filterSessionTimeByYear,\r\n };\r\n return result;\r\n }\r\n\r\n function logicInit() {\r\n vm.view.isInited = true;\r\n vm.view.pageLoaded = false;\r\n vm.view.pageLoading = true;\r\n //======\r\n return trainingInnerService.getCourseLog(sessionStorage.getItem(\"userLang\"))\r\n .then(function(courseLog) {\r\n //取代
      \r\n _.forEach(courseLog,function(data){\r\n //console.log('sTime:',data.sessionTime);\r\n data.sessionTime=data.sessionTime.replace(/\\/ig,' ');\r\n //console.log('data:',data.sessionTime);\r\n });\r\n //console.log('courseLog:', courseLog);\r\n vm.data.courseLogSource = courseLog;\r\n vm.years = trainingInnerService.getYears(2011);\r\n vm.year = vm.years[0];\r\n getCourseLog();\r\n return true;\r\n })\r\n .then(function() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n });\r\n }\r\n\r\n\r\n function filterSessionTimeByYear(year) {\r\n return _.filter(vm.data.courseLogSource, function(o) {\r\n return o.sessionTime.indexOf(year) !== -1;\r\n });\r\n }\r\n\r\n function getCourseLog() {\r\n vm.data.courseLog = vm.method.filterSessionTimeByYear(vm.year);\r\n vm.view.courseLogEmpty = vm.data.courseLog.length < 1;\r\n }\r\n\r\n function yearChange(year) {\r\n vm.year = year;\r\n getCourseLog();\r\n }\r\n\r\n function statusConvert(statusCode) {\r\n if (!statusCode && statusCode !== 0) { return ''; }\r\n switch (statusCode + '') {\r\n case '-1':\r\n return vm.translatePool.tsunPassStatusValueNotCourage;\r\n case '0':\r\n return vm.translatePool.tsunPassStatusValueNA;\r\n case '1':\r\n return vm.translatePool.tsunPassStatusValueExemption;\r\n case '2':\r\n return vm.translatePool.tsunPassStatusValueOK;\r\n case '3':\r\n return vm.translatePool.tsunPassStatusValueNotOK;\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n function openYearSelector() {\r\n var result = modalService.openOptionSelector(vm.years, 'yrSelect',false);\r\n //這個則是接收傳回來的值\r\n result.result.then(function(data) {\r\n vm.year = data;\r\n getCourseLog();\r\n });\r\n\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMyTrainingExterior', taiMyTrainingExterior);\r\n\r\n function taiMyTrainingExterior() {\r\n var directive = {\r\n bindToController: true,\r\n controller: taiMyTrainingExteriorController,\r\n controllerAs: 'vm',\r\n restrict: 'E',\r\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.exterior.html',\r\n scope: {\r\n isFocus: '=',\r\n translatePool: '=',\r\n }\r\n };\r\n return directive;\r\n }\r\n /* @ngInject */\r\n function taiMyTrainingExteriorController(trainingInnerService, $uibModal, $q,\r\n modalService, $rootScope, $scope) {\r\n var vm = this;\r\n // 1.8.2 父層參數 data 無法直接從 scope 引入\r\n vm.translatePool = $scope.$parent.vm.data.translatePool;\r\n //===Main===\r\n onInit();\r\n //==========\r\n function onInit() {\r\n //===\r\n vm.mustRemark = false;\r\n vm.submit = submit;\r\n vm.openOrganizer = openOrganizer;\r\n vm.removeOrganizer = removeOrganizer;\r\n vm.removeTime = removeTime;\r\n vm.openTime = openTime;\r\n vm.plusTotalPricer = plusTotalPricer;\r\n vm.openApplicationFormTypeSelector = openApplicationFormTypeSelector;\r\n vm.method = methodList(); //有一天要把上面這些設定移到這裡\r\n vm.isMobile=modalService.isMobile();\r\n //===\r\n vm.applicationForm = applicationFormInit();\r\n vm.data = dataInit();\r\n vm.view = viewInit();\r\n vm.UserAccount = $rootScope.userInfo.userAccount;\r\n //===\r\n $scope.$watch('vm.isFocus', function(newValue) {\r\n if (newValue === true && vm.view.isInited === false) {\r\n logicInit();\r\n }\r\n });\r\n\r\n }\r\n\r\n function logicInit() {\r\n vm.view.isInited = true;\r\n vm.view.pageLoaded = false;\r\n vm.view.pageLoading = true;\r\n //=====\r\n var exteriorData = trainingInnerService.getExterior();\r\n var Externaltype = trainingInnerService.getExternaltype();\r\n //console.log('Externaltype:',Externaltype);\r\n var currency = trainingInnerService.getCurrency();\r\n $q.all([exteriorData, Externaltype, currency])\r\n .then(function(data) {\r\n // 皆需排除掉第一筆資料: ALL - 1\r\n\r\n vm.data.exteriorData = _.filter(data[0], function(o) {\r\n return o.id !== -1;\r\n });\r\n // vm.data.type = _.filter(data[1], function(o) {\r\n // return o.id !== -1;\r\n // });\r\n vm.data.type = data[1][0];\r\n vm.data.currency = _.filter(data[2], function(o) {\r\n return o.id !== -1;\r\n });\r\n\r\n // 設置預設選取第一個 radio btn\r\n vm.applicationForm.currency = _.head(vm.data.currency).id;\r\n })\r\n .then(function() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n });\r\n }\r\n\r\n function methodList() {\r\n var result = {\r\n\r\n };\r\n return result;\r\n }\r\n\r\n function viewInit() {\r\n var result = {\r\n isInited: false, //............是否被初始化過\r\n pageLoaded: false, //..........頁面讀取完畢\r\n pageLoading: false, //.........頁面讀取中\r\n };\r\n return result;\r\n }\r\n\r\n function dataInit() {\r\n var result = {\r\n organizer: [],\r\n exteriorData: null,\r\n type: null,\r\n currency: null,\r\n dateSettingList: [],\r\n organizerOther: 413,\r\n };\r\n return result;\r\n }\r\n\r\n function applicationFormInit() {\r\n var result = {\r\n Name: null,\r\n type: null,\r\n Outline: null,\r\n Place: null,\r\n currency: null,\r\n organizer: [],\r\n times: null,\r\n dateSettingList: [],\r\n Remark: '',\r\n coursePrice: 0,\r\n travelPrice: 0,\r\n totalPrice: 0,\r\n allowance: 0,\r\n };\r\n return result;\r\n }\r\n\r\n function submit() {\r\n if (vm.mustRemark && !vm.applicationForm.Remark) {\r\n vm.form1.$valid = false;\r\n }\r\n if (vm.form1.$valid === false) {\r\n toastr.warning(vm.translatePool.tsunFormMsgRequiredEmpty);\r\n return;\r\n }\r\n\r\n if (vm.data.organizer !== null) {\r\n vm.applicationForm.organizer = vm.data.organizer;\r\n }\r\n vm.applicationForm.dateSettingList = angular.copy(vm.data.dateSettingList);\r\n //======\r\n var exteriorType = angular.copy(vm.applicationForm.type) || {};\r\n var isAllowance = (exteriorType.allowanceRate > 0);\r\n var isFeeEmpty = vm.applicationForm.totalPrice < 1;\r\n //=====\r\n if (isAllowance && isFeeEmpty) {\r\n //TODO:多國語系(英文)\r\n var errorMsgEmptyFee = format(\r\n vm.translatePool.tsunErrorExternalApplicateEmptyFee);\r\n toastr.warning(errorMsgEmptyFee);\r\n return;\r\n }\r\n var thisYear = new Date().getFullYear();\r\n trainingInnerService.getBankBook(thisYear, sessionStorage.getItem(\"userLang\"))\r\n .then(function(bankBookData) {\r\n if (bankBookData) {\r\n var recentPoint = parseInt(bankBookData.remainPoint) || 0;\r\n var allowance = vm.applicationForm.allowance || 0;\r\n //=====\r\n var isPointEmpty = (recentPoint < 1);\r\n if (isAllowance && isPointEmpty) {\r\n //TODO:多國語系(英文)\r\n var errorMsgEmptyPoint = format(\r\n vm.translatePool.tsunErrorExternalApplicateAllowance,\r\n (allowance + ''));\r\n toastr.warning(errorMsgEmptyPoint);\r\n return;\r\n }\r\n //=====\r\n if (isAllowance) {\r\n var confirmText = format(\r\n vm.translatePool.tsunConfirmExternalApplicate,\r\n (recentPoint + ''),\r\n (allowance + ''));\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: confirmText.replace(/,/g, \"
      \"),\r\n });\r\n confirmDialog.result.then(function(result) {\r\n result = !!result;\r\n if (result !== true) {\r\n return;\r\n }\r\n postFormData();\r\n });\r\n } else {\r\n postFormData();\r\n }\r\n }\r\n });\r\n }\r\n\r\n function postFormData() {\r\n var data = angular.copy(vm.applicationForm.dateSettingList);\r\n console.log('vm.applicationForm:',data);\r\n trainingInnerService.postExterior(vm.applicationForm).then(function(result) {\r\n if (result) {\r\n postExteriorSuccess();\r\n }\r\n });\r\n }\r\n\r\n function postExteriorSuccess() {\r\n var Externaltype = trainingInnerService.getExternaltype();\r\n vm.form1.$submitted = false;\r\n vm.data.organizer = [];\r\n vm.data.dateSettingList = [];\r\n vm.applicationForm.Name = '';\r\n \r\n //修正送出第二張申請單時,type選擇錯誤\r\n vm.data.type=Externaltype[0];\r\n vm.applicationForm.type = Externaltype[0];\r\n \r\n vm.applicationForm.Outline = '';\r\n vm.applicationForm.Place = '';\r\n vm.applicationForm.coursePrice = 0;\r\n vm.applicationForm.travelPrice = 0;\r\n vm.applicationForm.totalPrice = 0;\r\n vm.applicationForm.allowance = 0;\r\n vm.applicationForm.Remark = '';\r\n //vm.applicationForm.currency = vm.data.currency[0];\r\n vm.applicationForm.organizer = [];\r\n vm.applicationForm.times = null;\r\n vm.applicationForm.dateSettingList = [];\r\n }\r\n\r\n function openOrganizer() {\r\n var organizerResult = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingOrganizerModal.html',\r\n controller: 'myTrainingOrganizerModalController as vm',\r\n size: 'lg',\r\n taiClass: modalService.getTaiClass(),\r\n resolve: {\r\n params: function() {\r\n return vm.data.exteriorData;\r\n },\r\n choiceList: function() {\r\n return vm.data.organizer;\r\n }\r\n }\r\n });\r\n organizerResult.rendered.then(function() {\r\n var modalBootstrap = $(\".modal-open > .modal\");\r\n var modalBootstrapContent = modalBootstrap.find(\"> .modal-dialog > .modal-content \");\r\n if (!modalBootstrap) { return; }\r\n var footerDiv = modalBootstrap.find(\".footer\");\r\n var showDiv = modalBootstrap.find(\"#content\");\r\n var buttonShowTrigger = false;\r\n //====\r\n renderInit();\r\n //====\r\n function renderInit() {\r\n buttonHide();\r\n adjustOrgNameWidth();\r\n $(document)\r\n .off('submitSearchEnd')\r\n .on('submitSearchEnd', function() {\r\n adjustOrgNameWidth();\r\n });\r\n $(document)\r\n .off('submitSearchStart')\r\n .on('submitSearchStart', function() {\r\n buttonShowTrigger = false;\r\n buttonHide();\r\n });\r\n $(document)\r\n .off('checkboxClick')\r\n .on('checkboxClick', function(event, triggerResult) {\r\n // console.log(\"listen checkboxClick ,trigger:\", triggerResult);\r\n buttonShowTrigger = !!triggerResult;\r\n checkboxEvent();\r\n });\r\n modalBootstrap.scroll(function() { scrollEvent(); });\r\n }\r\n\r\n function adjustOrgNameWidth() {\r\n var allShowArea = modalBootstrapContent.find('.organizerNameShowArea');\r\n allShowArea.css(\"max-width\", (modalBootstrapContent.width() - 70) + \"px\");\r\n }\r\n\r\n function scrollEvent() {\r\n checkButtonCanShow();\r\n }\r\n\r\n function checkboxEvent() {\r\n checkButtonCanShow();\r\n }\r\n\r\n function buttonHide() {\r\n if (!footerDiv) { return; }\r\n footerDiv.css({ \"display\": \"none\" });\r\n footerDiv.find('a,button').css({ \"display\": \"none\" });\r\n $(document).trigger('floatButtonDisplay', [false]);\r\n }\r\n\r\n function checkButtonCanShow() {\r\n // 改變Footer樣式,使其保持在最下面。\r\n var paddingHeight = 30;\r\n var checkHeight = showDiv.height() - modalBootstrap.height() - paddingHeight;\r\n var buttonInContent = (checkHeight > modalBootstrap.scrollTop());\r\n // console.log(\"showDiv:\",showDiv);\r\n // console.log(\"modalBootstrap.scrollTop()\", modalBootstrap.scrollTop());\r\n // console.log(\"checkHeight\", checkHeight);\r\n // console.log(\"buttonShowTrigger\", buttonShowTrigger);\r\n // console.log(\"buttonShowTrigger\", buttonInContent);\r\n if (buttonInContent && buttonShowTrigger) {\r\n buttonShow();\r\n } else {\r\n buttonHide();\r\n }\r\n }\r\n\r\n function buttonShow() {\r\n if (!footerDiv) { return; }\r\n footerDiv.find('a,button').css({\r\n \"position\": \"relative\",\r\n \"display\": \"inline-block\",\r\n \"left\": \"-50%\",\r\n });\r\n var topLocation =\r\n (modalBootstrap.height() + modalBootstrap.scrollTop()) - (footerDiv.outerHeight() * 2);\r\n footerDiv.css({\r\n \"display\": \"inline-block\",\r\n \"position\": \"absolute\",\r\n \"top\": topLocation,\r\n \"left\": \"50%\",\r\n // \"right\": \"0px\",\r\n \"margin-left\": \"auto\",\r\n \"margin-right\": \"auto\"\r\n });\r\n $(document).trigger('floatButtonDisplay', [true]);\r\n }\r\n });\r\n //這個則是接收傳回來的值\r\n organizerResult.result.then(function(data) {\r\n _.forEach(data, function(item) {\r\n if (_.findIndex(vm.data.organizer, { \"id\": item.id }) < 0) {\r\n vm.data.organizer.push(angular.copy(item));\r\n }\r\n });\r\n vm.mustRemark = (_.findIndex(vm.data.organizer, { \"id\": vm.data.organizerOther }) > -1);\r\n });\r\n }\r\n\r\n function removeOrganizer(item) {\r\n var index = _.findIndex(vm.data.organizer, { \"id\": item.id });\r\n if (index < 0) { return; }\r\n\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: format(\"{0}\\r\\n{1}\", vm.translatePool.tsunConfirmRemove, item.name),\r\n });\r\n confirmDialog.result.then(function(result) {\r\n result = !!result;\r\n if (result !== true) {\r\n return;\r\n }\r\n vm.data.organizer.splice(index, 1);\r\n });\r\n }\r\n\r\n function openTime() {\r\n console.log(\"beforeSelect vm.data.dateSettingList\", vm.data.dateSettingList);\r\n var result = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/myTrainingExteriorTimeModal.html',\r\n controller: 'myTrainingExteriorTimeModalController as vm',\r\n size: 'lg',\r\n backdrop: 'static',\r\n taiClass: modalService.getTaiClass(),\r\n resolve: {\r\n saveList: function() {\r\n return vm.data.dateSettingList;\r\n }\r\n }\r\n });\r\n\r\n //這個則是接收傳回來的值\r\n result.result.then(function(data) {\r\n vm.data.dateSettingList = data;\r\n console.log(\"vm.data.dateSettingList\", vm.data.dateSettingList);\r\n });\r\n\r\n }\r\n\r\n // function caculateDuringTime(lisTime) {\r\n // var duringTimes = 0;\r\n // if (lisTime) {\r\n // _.forEach(lisTime, function (item) {\r\n // duringTimes += item.duringTimes;\r\n // });\r\n // }\r\n // if (!duringTimes) {\r\n // duringTimes = 0;\r\n // }\r\n // // 將時間格式化產出\r\n // return parseInt(duringTimes / 1000 / 60 / 60) + '.' + parseInt((duringTimes / 1000 / 60 % 60) * 100 / 60);\r\n // }\r\n\r\n function removeTime() {\r\n // var removeConfirm = confirm('確定要刪除?');\r\n // if (removeConfirm) {\r\n // _.forEach(vm.times.selected, function (item) {\r\n // var index = _.findIndex(vm.times, function (x) {\r\n // return x === item;\r\n // });\r\n // vm.times.splice(index, 1);\r\n // });\r\n // }\r\n // vm.timesCountString = caculateDuringTime(data);\r\n }\r\n\r\n function plusTotalPricer() {\r\n vm.applicationForm.totalPrice = vm.applicationForm.coursePrice + vm.applicationForm.travelPrice;\r\n if (vm.applicationForm.type) {\r\n var allowanceRate = vm.applicationForm.type.allowanceRate || 0;\r\n allowanceRate = (allowanceRate);\r\n vm.applicationForm.allowance = Math.round((vm.applicationForm.totalPrice * allowanceRate) / 100);\r\n }\r\n\r\n }\r\n\r\n function openApplicationFormTypeSelector() {\r\n var result = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/applicationFormTypeSelector.html',\r\n controller: 'applicationFormTypeSelectorController as vm',\r\n size: 'sm',\r\n backdrop: 'static',\r\n taiClass: modalService.getTaiClass()\r\n });\r\n //這個則是接收傳回來的值\r\n result.result.then(function(result) {\r\n vm.data.type = result;\r\n vm.applicationForm.type = result;\r\n plusTotalPricer();\r\n });\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMyTrainingFinancial', taiMyTrainingFinancial);\r\n\r\n Module.filter('licensesFlter', function() {\r\n //處理結果的格式化.\r\n return function(dataList, keyValue) {\r\n //==\r\n keyValue = keyValue || '';\r\n keyValue = (keyValue + '').toLowerCase();\r\n //==\r\n var result = [];\r\n var regExpCompare = new RegExp(keyValue, \"g\");\r\n _.forEach(dataList, function(perItem) {\r\n var compareString = perItem.name || '';\r\n if (compareString.toLowerCase().match(regExpCompare)) {\r\n result.push(angular.copy(perItem));\r\n }\r\n });\r\n if (result.length < 1) {\r\n result.push({\r\n name: '查無此證照名稱',\r\n id: -1\r\n });\r\n }\r\n return result;\r\n };\r\n });\r\n\r\n function taiMyTrainingFinancial() {\r\n var directive = {\r\n bindToController: true,\r\n controller: taiMyTrainingFinancialController,\r\n controllerAs: 'vm',\r\n restrict: 'E',\r\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.financial.html',\r\n scope: {\r\n translatePool: '=',\r\n isFocus: '=',\r\n ssoInfo: '='\r\n }\r\n };\r\n return directive;\r\n }\r\n /* @ngInject */\r\n function taiMyTrainingFinancialController($uibModal, $scope, modalService, trainingInnerService,\r\n $rootScope, $q, finacialLicicense, $timeout) {\r\n var vm = this;\r\n // 1.8.2 父層參數 data 無法直接從 scope 引入\r\n vm.translatePool = $scope.$parent.vm.data.translatePool;\r\n vm.ssoInfo = $scope.$parent.vm.data.ssoInfo;\r\n //===Main===\r\n onInit();\r\n //==========\r\n function onInit() {\r\n //console.log('onInit');\r\n vm.finacialLicicense = finacialLicicense;\r\n vm.submit = submit;\r\n vm.effectiveChange = effectiveChange;\r\n vm.openCertificateStatusSelector = openCertificateStatusSelector;\r\n vm.openCertificateTypeSelector = openCertificateTypeSelector;\r\n vm.openCourseListSelector = openCourseListSelector;\r\n vm.licenseKeyUp = licenseKeyUp;\r\n vm.certificateChange = certificateChange;\r\n vm.courseListSelectChange = courseListSelectChange;\r\n vm.getcourseList = getcourseList;\r\n vm.licenseBlur = licenseBlur;\r\n //vm.method = methodList(); //找機會要把上面的設定移到這裡\r\n //=======\r\n vm.financial = {};\r\n // console.log(\"taiMyTrainingFinancial onInit()\");\r\n vm.isMobile = modalService.isMobile();\r\n //vm.isMobile=true;\r\n vm.menuNo = parseInt(getMenuQueryString());\r\n vm.data = dataInit();\r\n vm.view = viewInit();\r\n\r\n vm.UserInfo = vm.ssoInfo.cName + \"(\" + vm.ssoInfo.empId + \")\";\r\n vm.UserDept = vm.ssoInfo.depName;\r\n vm.tabChange = tabChange;\r\n //console.log(\"82===>\");\r\n\r\n\r\n $scope.$watch('vm.data.financialFilter.length', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n if (!newValue) { newValue = 0; }\r\n vm.view.recordEmpty = newValue < 1;\r\n //console.log(\"89===>\");\r\n });\r\n $scope.$watch('vm.data.authorizedHoursFilter.length', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n if (!newValue) { newValue = 0; }\r\n vm.view.licienceEmpty = newValue < 1;\r\n //console.log(\"95===>\");\r\n });\r\n $scope.$watch('vm.isFocus', function(newValue) {\r\n //console.log(\"98===>\" + newValue);\r\n if (newValue === true) {\r\n logicInit();\r\n }\r\n });\r\n }\r\n\r\n function dataInit() {\r\n //console.log('dataInit');\r\n var result = {\r\n //tabIndex: 0, //................選單序號\r\n financial: [], //..............證照紀錄API回傳清單\r\n financialFilter: [], //........證照紀錄於Filter處理後結果\r\n authorizedHours: [], //........證照認列時數API回傳清單\r\n authorizedHoursFilter: [], //..證照認列時數於Filter處理後結果\r\n };\r\n return result;\r\n }\r\n\r\n function viewInit() {\r\n //console.log('viewInit');\r\n var result = {\r\n recordEmpty: false, //..............證照紀錄資料為空\r\n licienceEmpty: false, //.............證照認列時數為空\r\n isInited_Page1: false, //............是否被初始化過(Page1)\r\n pageLoaded_Page1: false, //..........頁面讀取完畢(Page1)\r\n pageLoading_Page1: false, //.........頁面讀取中(Page1)\r\n isInited_Page2: false, //............是否被初始化過(Page2)\r\n pageLoaded_Page2: false, //..........頁面讀取完畢(Page2)\r\n pageLoading_Page2: false, //.........頁面讀取中(Page2)\r\n isInited_Page3: false, //............是否被初始化過(Page3)\r\n pageLoaded_Page3: false, //..........頁面讀取完畢(Page3)\r\n pageLoading_Page3: false, //.........頁面讀取中(Page3)\r\n };\r\n return result;\r\n }\r\n\r\n\r\n function logicInit() {\r\n // /* 漢堡選單click事件 */\r\n //console.log('logicInit ', vm.menuNo);\r\n\r\n if (vm.menuNo === -9991) {\r\n vm.data.tabIndex = 0;\r\n }\r\n if (vm.menuNo === -9992) {\r\n vm.data.tabIndex = 1;\r\n }\r\n if (vm.menuNo === -9993) {\r\n vm.data.tabIndex = 2;\r\n }\r\n\r\n\r\n switch (vm.data.tabIndex) {\r\n case 0:\r\n return logicInit_Page1();\r\n case 1:\r\n return logicInit_Page2();\r\n case 2:\r\n return logicInit_Page3();\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function logicInit_Page1() {\r\n //console.log('logicInit_Page1');\r\n // if (vm.view.isInited_Page1 === true) {\r\n // return;\r\n // }\r\n vm.view.isInited_Page1 = true;\r\n vm.view.pageLoaded_Page1 = false;\r\n vm.view.pageLoading_Page1 = true;\r\n //========\r\n var promiseList = [\r\n trainingInnerService.getFinancial(-1), // 證書記錄(資料)\r\n trainingInnerService.getEffectives(), // 證照狀態\r\n ];\r\n return $q.all(promiseList)\r\n .then(function(receiveData) {\r\n vm.data.financial = receiveData[0];\r\n vm.data.effectives = receiveData[1];\r\n })\r\n .then(function() {\r\n _.forEach(vm.data.financial, function(item) {\r\n item.workflow = workflowFormat(item);\r\n });\r\n\r\n vm.view.recordEmpty = vm.data.financial.length < 1;\r\n vm.effective = vm.data.effectives[0]; // 預設為全部\r\n })\r\n .then(function() {\r\n //===\r\n vm.view.pageLoaded_Page1 = true;\r\n vm.view.pageLoading_Page1 = false;\r\n //以menu來選定tab\r\n $timeout(function() {\r\n $scope.activeTabIndex = 0;\r\n });\r\n });\r\n }\r\n\r\n function logicInit_Page2() {\r\n //console.log('logicInit_Page2');\r\n if (vm.view.isInited_Page2 === true) {\r\n return;\r\n }\r\n vm.view.isInited_Page2 = true;\r\n vm.view.pageLoaded_Page2 = false;\r\n vm.view.pageLoading_Page2 = true;\r\n //========\r\n var promiseList = [\r\n trainingInnerService.getCertificateType(), // 證照類別(下拉單)\r\n ];\r\n //console.log('promiseList :', promiseList);\r\n return $q.all(promiseList)\r\n .then(function(receiveData) {\r\n vm.data.certificateType = receiveData[0];\r\n })\r\n .then(function() {\r\n vm.certificate = vm.data.certificateType[0];\r\n //console.log('init vm.certificate :', vm.certificate);\r\n certificateChange();\r\n //以menu來選定tab\r\n $timeout(function() {\r\n $scope.activeTabIndex = 1;\r\n });\r\n vm.view.pageLoaded_Page2 = true;\r\n vm.view.pageLoading_Page2 = false;\r\n });\r\n }\r\n\r\n function logicInit_Page3() {\r\n //console.log('logicInit_Page3');\r\n // if (vm.view.isInited_Page3 === true) {\r\n // return;\r\n // }\r\n vm.view.isInited_Page3 = true;\r\n vm.view.pageLoaded_Page3 = false;\r\n vm.view.pageLoading_Page3 = true;\r\n //========\r\n var promiseList = [\r\n trainingInnerService.getAuthorizedHours(), // 證書認列時數(資料)\r\n ];\r\n return $q.all(promiseList)\r\n .then(function(receiveData) {\r\n vm.data.authorizedHours = receiveData[0];\r\n //console.log(receiveData);\r\n })\r\n .then(function() {\r\n //內訓課程類別名稱\r\n var courseTypeInternal = vm.translatePool.tsunInternalCourse;\r\n //外訓課程類別名稱\r\n var courseTypeExternal = vm.translatePool.tsunExternalCourse;\r\n _.forEach(vm.data.authorizedHours, function(item) {\r\n //console.log(item);\r\n //證照時數可修課程清單\r\n // var regExFormat1 = /(\\([^\\(^\\)]*\\))/g;//.....去除括弧內資料\r\n // var regExFormat2 = /([\\d]*-?[\\d]*)/g;//......去除開始時間設定\r\n getcourseList(item).then(function(data) {\r\n item.courseList = _.filter(data, function(courseItem) {\r\n //外訓資料要回公司找經辦人員申請\r\n return (courseItem.courseType !== 3);\r\n });\r\n //console.log('Init courseItem:', item.courseList);\r\n item.courseListGroup = _.chain(item.courseList)\r\n .groupBy(\"courseId\")\r\n .map(function(courseList) {\r\n _.forEach(courseList, function(courseItem, index) {\r\n courseItem.groupByIndex = (index + 1);\r\n courseItem.showName = courseItem.sessionName || '';\r\n });\r\n }).value();\r\n if (item.courseList.length < 1) {\r\n item.courseList.unshift({\r\n //空的內訓資料,查無資料時補上\r\n courseId:-1,\r\n courseType: 1,\r\n showName: vm.translatePool.tsunEmptyCourse,\r\n });\r\n }\r\n item.courseList.unshift({\r\n //空的外訓資料,用來顯示台新罐頭文字\r\n courseId:-3,\r\n courseType: 3,\r\n showName: vm.translatePool.tsunExternalCourseNotAllowForWeb,\r\n });\r\n // tsunEmptyCourse\r\n _.forEach(item.courseList, function(courseItem) {\r\n if (courseItem.courseType !== 3) {\r\n courseItem.groupName = courseTypeInternal;\r\n if (courseItem.fcAuthHours) {\r\n courseItem.showName = courseItem.showName || '';\r\n courseItem.showName = courseItem.showName + \"(\" + courseItem.fcAuthHours + \"小時)\";\r\n }\r\n\r\n } else {\r\n courseItem.groupName = courseTypeExternal;\r\n }\r\n });\r\n });\r\n });\r\n })\r\n .then(function() {\r\n //取代時數為空的資料\r\n _.forEach(vm.data.authorizedHours, function(data) {\r\n if (data.trainingEndDate.length < 1) {\r\n data.trainingEndDate = data.trainingEndDate.replace('', '~');\r\n }\r\n });\r\n //以menu來選定tab\r\n $timeout(function() {\r\n $scope.activeTabIndex = 2;\r\n });\r\n vm.view.licienceEmpty = vm.data.authorizedHours.length < 1;\r\n vm.view.pageLoaded_Page3 = true;\r\n vm.view.pageLoading_Page3 = false;\r\n });\r\n\r\n }\r\n\r\n function workflowFormat(financialItem) {\r\n //console.log('workflowFormat');\r\n // workflow 整理\r\n var result = '';\r\n var checkList = ['workflowItem', 'workflowReason'];\r\n if (!financialItem) { return ''; }\r\n _.forEach(checkList, function(propName) {\r\n if (!financialItem[propName]) {\r\n financialItem[propName] = '';\r\n }\r\n });\r\n\r\n if (financialItem.workflowItem !== '') {\r\n result += format(\"
    • {0}
    • \", financialItem.workflowItem);\r\n }\r\n if (financialItem.workflowReason !== '') {\r\n result += format(\"
    • {0}
    • \", financialItem.workflowReason);\r\n }\r\n if (result.length > 0) {\r\n result = format(\"
        {0}
      \", result);\r\n }\r\n return result;\r\n }\r\n\r\n function getcourseList(licensesItem) {\r\n console.log('getcourseList');\r\n return trainingInnerService.getAuthorizedHoursCourse(licensesItem, sessionStorage.getItem(\"userLang\"));\r\n }\r\n\r\n function submit() {\r\n // console.log(\"vm.financial.getDay\", vm.financial.getDay);\r\n // console.log('vm.form1.$valid:',vm.form1.$valid);\r\n if (vm.form1.$valid) {\r\n trainingInnerService.postFinancial(vm.financial)\r\n .then(function(result) {\r\n if (!result) { return; }\r\n postFinancialSucess();\r\n toastr.success(vm.translatePool.tsunSendSuccess);\r\n });\r\n } else {\r\n toastr.warning(vm.translatePool.tsunFormMsgRequiredEmpty);\r\n }\r\n }\r\n\r\n function postFinancialSucess() {\r\n //console.log('postFinancialSucess');\r\n vm.form1.$submitted = false;\r\n vm.financial.licenses = null;\r\n vm.financial.licensesNO = null;\r\n vm.financial.getDay = '';\r\n vm.financial.otherMark = null;\r\n }\r\n // 證照狀態 change 事件\r\n function effectiveChange(result) {\r\n //console.log('effectiveChange');\r\n var status = result.id;\r\n //var status = vm.effective.id;\r\n trainingInnerService.getFinancial(status).then(function(data) {\r\n vm.data.financial = data;\r\n _.forEach(vm.data.financial, function(item) {\r\n item.workflow = workflowFormat(item);\r\n });\r\n });\r\n }\r\n\r\n // 證照名稱欄位 key up 事件\r\n function licenseKeyUp() {\r\n // 因為找不到popup的display來源,所以手動show\r\n //console.log('licenseKeyUp');\r\n $('[uib-typeahead-popup].dropdown-menu').show();\r\n }\r\n\r\n // 證照類別 change 事件\r\n function certificateChange() {\r\n // console.log('certificateChange');\r\n // console.log(\"vm.certificate\", vm.certificate);\r\n trainingInnerService.getLicensesNames(vm.certificate.id).then(function(data) {\r\n //console.log('certificateChange',data);\r\n vm.data.licensesNames = data;\r\n });\r\n vm.financial.licenses = [];\r\n }\r\n\r\n // 認列時數,可參與之課程清單 change 事件\r\n function courseListSelectChange(List, item) {\r\n //console.log('courseListSelectChange');\r\n // console.log('before change List:', List);\r\n // console.log('before change item:', item);\r\n if (!item) { return; }\r\n if (!item.sessionId) { return; }\r\n var modal = modalService.courseDetail(item, null, 2);\r\n modal.result.then(function(data) {\r\n if (data) { enrollSuccess(List, item); }\r\n });\r\n //console.log('after change:', item);\r\n }\r\n\r\n function enrollSuccess(List, item) {\r\n //console.log('enrollSuccess');\r\n var itemIndex = _.findIndex(List, { sessionId: item.sessionId });\r\n if (itemIndex > -1) {\r\n List.splice(itemIndex, 1);\r\n }\r\n }\r\n\r\n function tabChange(index) {\r\n //console.log('tabChange');\r\n if (vm.menuNo === -9991 || vm.menuNo === -9992 || vm.menuNo === -9993)\r\n return;\r\n vm.data.tabIndex = index;\r\n switch (vm.data.tabIndex) {\r\n case 0:\r\n logicInit_Page1();\r\n break;\r\n case 1:\r\n logicInit_Page2();\r\n break;\r\n case 2:\r\n logicInit_Page3();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function licenseBlur() {\r\n //console.log('licenseBlur');\r\n if ((typeof vm.financial.licenses).toLowerCase() !== 'object') {\r\n vm.financial.licenses = \"\";\r\n }\r\n if (!vm.financial.licenses.id) { return; }\r\n if (vm.financial.licenses.id < 1) {\r\n vm.financial.licenses = null;\r\n }\r\n }\r\n\r\n function openCertificateStatusSelector() {\r\n //console.log('openCertificateStatusSelector');\r\n var result = modalService.openOptionSelector(trainingInnerService.getEffectives(), 'tsunCertificateStatus',false);\r\n //這個則是接收傳回來的值\r\n result.result.then(function(result) {\r\n vm.effective = result;\r\n //console.log('result :', result);\r\n effectiveChange(result);\r\n });\r\n }\r\n\r\n function openCertificateTypeSelector() {\r\n //console.log('openCertificateTypeSelector');\r\n var result = modalService.openOptionSelector(trainingInnerService.getCertificateType(), 'tsunCretificateClass',false);\r\n //這個則是接收傳回來的值\r\n result.result.then(function(result) {\r\n vm.certificate = result;\r\n //console.log('result :', vm.certificate);\r\n certificateChange();\r\n });\r\n }\r\n\r\n function openCourseListSelector(item) {\r\n //console.log('openCourseListSelector',item);\r\n var result = $uibModal.open({\r\n templateUrl: 'controller/tsun/training/myTraining/modal/courseListSelector.html',\r\n controller: 'courseListSelectorController as vm',\r\n size: 'sm',\r\n backdrop: 'static',\r\n taiClass: modalService.getTaiClass(),\r\n resolve: {\r\n courseItem: function() {\r\n return item;\r\n },\r\n }\r\n });\r\n //這個則是接收傳回來的值\r\n result.result.then(function(result) {\r\n courseListSelectChange(result[0], result[1]);\r\n });\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiMyTrainingRepairProject', taiMyTrainingRepairProject);\r\n\r\n function taiMyTrainingRepairProject() {\r\n var directive = {\r\n bindToController: true,\r\n controller: taiMyTrainingRepairProjectController,\r\n controllerAs: 'vm',\r\n restrict: 'E',\r\n templateUrl: 'controller/tsun/training/myTraining/taiMyTraining.repairProject.html',\r\n scope: {\r\n isFocus: '=',\r\n }\r\n };\r\n return directive;\r\n }\r\n\r\n /* @ngInject */\r\n function taiMyTrainingRepairProjectController(trainingInnerService, modalService, $q, $scope) {\r\n var vm = this;\r\n vm.directToCourse = directToCourse;\r\n //==Main==\r\n init();\r\n //========\r\n function init() {\r\n vm.isMobile = modalService.isMobile();\r\n vm.openDetail = openDetail;\r\n vm.setPercentStyle = setPercentStyle;\r\n vm.method = methodList(); //找機會要把上面的設定移到這裡\r\n //\r\n //=====\r\n vm.data = dataInit();\r\n vm.view = viewInit();\r\n //======\r\n $scope.$watch('vm.isFocus', function(newValue) {\r\n if (newValue === true) {\r\n logicInit();\r\n }\r\n });\r\n $scope.$watch('vm.data.repairProjectInFilter.length', function(newValue, oldValue) {\r\n if (newValue === oldValue) { return; }\r\n if (!newValue) { newValue = 0; }\r\n vm.view.courseEmpty = newValue < 1;\r\n });\r\n }\r\n\r\n function methodList() {\r\n var result = {};\r\n return result;\r\n }\r\n\r\n function dataInit() {\r\n var result = {\r\n timeConfig: {},\r\n sessionSelected: null,\r\n repairProject: [], //..........待修項目資料\r\n repairProjectInFilter: [], //..待修項目資料(查詢結果)\r\n };\r\n return result;\r\n }\r\n\r\n function viewInit() {\r\n var result = {\r\n courseEmpty: false, //.........查無資料判定\r\n isInited: false, //............是否被初始化過\r\n pageLoaded: false, //..........頁面讀取完畢\r\n pageLoading: false, //.........頁面讀取中\r\n };\r\n return result;\r\n }\r\n\r\n function logicInit() {\r\n vm.view.isInited = true;\r\n vm.view.pageLoaded = false;\r\n vm.view.pageLoading = true;\r\n //=====\r\n var promiseList = [\r\n loadConfig(),\r\n loadItemList()\r\n ];\r\n $q.all(promiseList)\r\n .then(function() {\r\n vm.view.pageLoaded = true;\r\n vm.view.pageLoading = false;\r\n });\r\n\r\n }\r\n\r\n function loadConfig() {\r\n return trainingInnerService.getConfigSetting()\r\n .then(function(configData) {\r\n vm.data.timeConfig = configData.data;\r\n });\r\n }\r\n\r\n function loadItemList() {\r\n // console.log(\"repairProjec loadItemList\");\r\n return trainingInnerService.loadLangs()\r\n .then(function(langs) {\r\n var repairProject = [];\r\n var promiseList = [];\r\n //console.log('langs:', langs);\r\n _.forEach(langs, function(lang) {\r\n // console.log('lang:', lang.langCode)\r\n // console.log( trainingInnerService.getUnfinishedActivities(lang.langCode))\r\n promiseList.push(trainingInnerService.getUnfinishedActivities(lang.langCode));\r\n });\r\n return $q.all(promiseList).then(function(data) {\r\n _.forEach(data, function(perReceiveData) {\r\n // console.log('perReceiveData:',perReceiveData);\r\n perReceiveData = _.orderBy(perReceiveData,   [ 'sessionTime'],   ['desc']);\r\n Array.prototype.push.apply(repairProject, perReceiveData);\r\n });\r\n repairProject = _.uniqBy(repairProject, function(courseItem) {\r\n //設定唯一鍵\r\n return courseItem.sessionId;\r\n });\r\n //console.log('repairProject:',repairProject);\r\n return repairProject;\r\n });\r\n })\r\n .then(function(repairProject) {\r\n //取代sessionTime中的
      \r\n _.forEach(repairProject, function(data) {\r\n //console.log('sTime:',data.sessionTime);\r\n data.sessionTime = data.sessionTime.replace(/\\/ig, ' ');\r\n //console.log('data:',data.sessionTime);\r\n });\r\n vm.data.repairProject = repairProject;\r\n vm.view.courseEmpty = (repairProject.length < 1);\r\n return true;\r\n });\r\n }\r\n\r\n function openDetail(item) {\r\n vm.data.sessionSelected = item.sessionId;\r\n //==========\r\n var param = {\r\n item: item,\r\n timeConfig: vm.data.timeConfig\r\n };\r\n var openModal = modalService.trainingSelectAction(param);\r\n\r\n openModal.result.then(function() {\r\n //關閉視窗時要重整頁面\r\n loadItemList();\r\n });\r\n }\r\n\r\n\r\n function setPercentStyle(item) {\r\n var progress;\r\n var percentage;\r\n var style = {};\r\n if (item.progress && item.progress.length > 0) {\r\n progress = item.progress.split('/');\r\n if (progress.length < 2) {\r\n item.progress = null;\r\n progress = ['0', '1'];\r\n }\r\n } else {\r\n item.progress = null;\r\n progress = ['0', '1'];\r\n }\r\n percentage = 100 * (parseFloat(progress[0]) / parseFloat(progress[1]));\r\n percentage = parseInt(percentage) + '';\r\n if (percentage === '0') {\r\n style = { 'display': 'none' };\r\n } else {\r\n style = { 'width': percentage + '%' };\r\n }\r\n return style;\r\n }\r\n\r\n function directToCourse() {\r\n //console.log(\"current url:\", location.href);\r\n var menuNo = location.href.split('menu=')[1];\r\n //2023-07-10 Johnson 資安2023\r\n location.href = eval(function (p, a, c, k, e, r) { e = function (c) { return c.toString(a) }; if (!''.replace(/^/, String)) { while (c--) r[e(c)] = k[c] || e(c); k = [function (e) { return r[e] }]; e = function () { return '\\\\w+' }; c = 1 }; while (c--) if (k[c]) p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); return p }('2.3.4(\\'/#\\')[0]+\\'/#/5/6?7=\\'+8.1(//g,\\'&a\\').1(/\"/g,\\'&b\\').1(/\\'/g,\\'&#c\\').1(/[<>!]|(\\\\(\\\\))|((d|e|f)\\\\h*\\\\(.*\\\\))/g,\\'\\')', 18, 18, '|replace|location|href|split|tsu|course|menu|menuNo|lt|gt|quot|x27|for|while|if||s'.split('|'), 0, {}))\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('tsunRecommendDocController', tsunRecommendDocController);\r\n\r\n function tsunRecommendDocController(trainingInnerService,$location,$q) {\r\n var vm = this;\r\n //==Main==\r\n init();\r\n //========\r\n function init() {\r\n dataInit();\r\n logicInit();\r\n }\r\n function dataInit() {\r\n vm.data = {\r\n innerHtml : '',//........內容顯示的HTML\r\n };\r\n vm.view = {\r\n \r\n };\r\n }\r\n function logicInit() {\r\n return loadData().then(function () {\r\n });\r\n }\r\n\r\n function loadData() {\r\n var recommendHtml = sessionStorage.getItem(\"recommendHTML\");\r\n return $q.when(recommendHtml).then(function(data){\r\n vm.data.innerHtml = data;\r\n });\r\n }\r\n \r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('tsunRecommendController', tsunRecommendController);\r\n\r\n function tsunRecommendController(trainingInnerService, $location, modalService, commonService, activeType) {\r\n var vm = this;\r\n vm.carouselClick = carouselClick;\r\n vm.showImg = showImg;\r\n vm.showVedio = showVedio;\r\n vm.backList = backList;\r\n //==Main==\r\n init();\r\n //========\r\n function init() {\r\n dataInit();\r\n logicInit();\r\n }\r\n\r\n function dataInit() {\r\n vm.data = {\r\n carousel: [], //.......................熱門推薦取得原始資料\r\n carouselSelected: {}, //...............點選的熱門推薦\r\n };\r\n vm.view = {\r\n isMobile: modalService.isMobile(), //..是否為行動裝置\r\n pageLoading: false, //.................頁面讀取中\r\n pageLoaded: false, //..................頁面讀取完畢\r\n showCarousel: true, //.................顯示熱門推薦清單\r\n showEmbed: false, //...................顯示嵌入式內容\r\n recommendEmpty: false, //..............內容是否為空\r\n recommendEmptyType2: false, //.........內容為空時顯示熱門推薦訊息\r\n recommendEmptyType3: false, //.........內容為空時顯示微課程訊息\r\n isMulitiData: true, //.................是否有多筆資料(使用輪播樣式)\r\n };\r\n }\r\n\r\n function logicInit() {\r\n vm.view.pageLoading = true;\r\n return loadData().then(function() {\r\n if (vm.data.carousel.length < 1) {\r\n vm.view.recommendEmpty = true;\r\n vm.view.recommendEmptyType2 = (activeType === 2);\r\n vm.view.recommendEmptyType3 = (activeType === 3);\r\n if (!vm.view.recommendEmptyType2) {\r\n //預設錯誤訊息為\"熱門推薦類型\"\r\n vm.view.recommendEmptyType2 = (!vm.view.recommendEmptyType2 && !vm.view.recommendEmptyType3);\r\n }\r\n }\r\n \r\n vm.view.pageLoading = false;\r\n vm.view.pageLoaded = true;\r\n\r\n // 不知道為什麼不會自動跑動,所以在觸發一次囉\r\n $('#myCarousel').carousel({\r\n interval: 5000\r\n });\r\n });\r\n }\r\n\r\n function loadData() {\r\n return trainingInnerService.getCarousel(activeType).then(function(result) {\r\n vm.data.carousel = result;\r\n //console.log(\"vm.data.carousel:\", vm.data.carousel);\r\n //console.log(\"carousel $index\",$index);\r\n vm.view.isMulitiData = (result.length > 1);\r\n });\r\n }\r\n\r\n function viewChange(showArea) {\r\n vm.view.showCarousel = false;\r\n vm.view.showEmbed = false;\r\n\r\n switch (showArea) {\r\n case 'carousel':\r\n vm.view.showCarousel = true;\r\n break;\r\n case 'embed':\r\n vm.view.showEmbed = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function showImg(attachmentType) {\r\n return commonService.showImg(attachmentType);\r\n }\r\n\r\n function showVedio(attachmentType) {\r\n return commonService.showVedio(attachmentType);\r\n }\r\n\r\n function backList() {\r\n viewChange('carousel');\r\n }\r\n\r\n function carouselClick(carouselItem) {\r\n var newWindow;\r\n vm.data.carouselSelected = angular.copy(carouselItem);\r\n vm.data.carouselSelected.isUrl = false;\r\n vm.data.carouselSelected.url = vm.data.carouselSelected.url || \"\";\r\n if (vm.data.carouselSelected.url.length > 0) {\r\n vm.data.carouselSelected.isUrl = true;\r\n }\r\n switch (carouselItem.target) {\r\n case 2:\r\n viewChange('embed');\r\n break;\r\n case 3:\r\n if (vm.data.carouselSelected.isUrl) {\r\n window.location = vm.data.carouselSelected.url;\r\n return;\r\n } else {\r\n sessionStorage.setItem('recommendHTML', vm.data.carouselSelected.activityContent);\r\n $location.path('/tsu/recommendHTML');\r\n }\r\n break;\r\n case 1:\r\n //開新視窗\r\n newWindow = window.open('', '_blank');\r\n\r\n if (vm.data.carouselSelected.isUrl) {\r\n newWindow.location = vm.data.carouselSelected.url;\r\n } else {\r\n newWindow.document.write(vm.data.carouselSelected.activityContent);\r\n }\r\n newWindow.document.title = vm.data.carouselSelected.activityTitle;\r\n commonService.setOneWindow(newWindow);\r\n break;\r\n default:\r\n newWindow = window.open('', '_blank');\r\n if (vm.data.carouselSelected.isUrl) {\r\n newWindow.location = vm.data.carouselSelected.url;\r\n } else {\r\n newWindow.document.write(vm.data.carouselSelected.activityContent);\r\n }\r\n newWindow.document.title = vm.data.carouselSelected.activityTitle;\r\n commonService.setOneWindow(newWindow);\r\n break;\r\n }\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.service')\r\n .factory('recommendInnerService', recommendInnerService);\r\n\r\n function recommendInnerService() {\r\n var service = {\r\n };\r\n return service;\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('applicationFormTypeSelectorController', applicationFormTypeSelectorController);\r\n\r\n function applicationFormTypeSelectorController($q, $rootScope, $scope, $uibModalInstance, trainingInnerService) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.TypeSelected = TypeSelected;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n var promiseList = [\r\n trainingInnerService.getExternaltype(), // 證照狀態\r\n ];\r\n return $q.all(promiseList)\r\n .then(function(receiveData) {\r\n //console.log(receiveData);\r\n //vm.type = receiveData[0];\r\n vm.type = _.filter(receiveData[0], function(o) {\r\n return o.id !== -1;\r\n });\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n\r\n\r\n function TypeSelected(data) {\r\n //console.log('TypeSelected:',data);\r\n $uibModalInstance.close(data);\r\n }\r\n\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('courseCategorySelectorController', courseCategorySelectorController);\r\n\r\n function courseCategorySelectorController($q, $rootScope, $scope, $uibModalInstance, trainingInnerService, categoryItem) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.itemSelected = itemSelected;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n console.log('categoryItem:', categoryItem);\r\n vm.courseCategory = categoryItem;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function itemSelected(item) {\r\n var result = [];\r\n //courseItem.selectedItemName = item.showName;\r\n result.push(item);\r\n $uibModalInstance.close(result);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('courseListSelectorController', courseListSelectorController);\r\n\r\n function courseListSelectorController($q, $rootScope, $scope, $uibModalInstance, trainingInnerService, courseItem) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.itemSelected = itemSelected;\r\n\r\n onInit();\r\n\r\n function onInit() {\r\n //console.log('courseItem:', courseItem);\r\n vm.courseList = courseItem.courseList;\r\n console.log('vm.courseList:', vm.courseList);\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function itemSelected(list, item) {\r\n var result = [];\r\n\r\n // courseItem.selectedItemName = item.showName;\r\n\r\n result.push(list);\r\n result.push(item);\r\n $uibModalInstance.close(result);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('myTrainingExteriorTimeModalController', myTrainingExteriorTimeModalController);\r\n\r\n function myTrainingExteriorTimeModalController($rootScope, $scope, $uibModalInstance, modalService, $q, saveList) {\r\n var vm = this;\r\n vm.ok = ok;\r\n vm.removeClassRange = removeClassRange;\r\n vm.saveAndNext = saveAndNext;\r\n vm.cancel = cancel;\r\n vm.tabDayOfMonth = tabDayOfMonth;\r\n vm.tabDayOfWeek = tabDayOfWeek;\r\n vm.openTimeSelector = openTimeSelector;\r\n //====Main====\r\n onInit();\r\n //============\r\n function dataInit() {\r\n //有空維護請將本頁面所使用到全部變數放置這裡視為宣告\r\n vm.checkView = {\r\n classDateValid: false,\r\n classTimeValid: false,\r\n LunchTimeValid: false,\r\n weekDayValid: false,\r\n formSubmited: false,\r\n };\r\n vm.data = {\r\n times: [],\r\n hours: [\r\n '06', '07', '08', '09', '10', '11', '12', '13', '14',\r\n '15', '16', '17', '18', '19', '20', '21', '22', '23',\r\n '00', '01', '02', '03', '04', '05',\r\n ],\r\n mins: [\r\n '00', '05', '10', '15', '20', '25',\r\n '30', '35', '40', '45', '50', '55'\r\n ],\r\n cycleTypeList: [{\r\n value: 'week',\r\n name: $rootScope.translate.tsunWeek || 'Week',\r\n },\r\n {\r\n value: 'month',\r\n name: $rootScope.translate.tsunMonth || 'Month',\r\n },\r\n {\r\n value: 'year',\r\n name: $rootScope.translate.tsunYear || 'Year',\r\n }\r\n ],\r\n weekdays: {\r\n '1': {\r\n name: $rootScope.translate.tsunWeekMonday || 'Monday',\r\n checked: false\r\n },\r\n '2': {\r\n name: $rootScope.translate.tsunWeekTuesday || 'Tuesday',\r\n checked: false\r\n },\r\n '3': {\r\n name: $rootScope.translate.tsunWeekWednesday || 'Wednesday',\r\n checked: false\r\n },\r\n '4': {\r\n name: $rootScope.translate.tsunWeekThusday || 'Thusday',\r\n checked: false\r\n },\r\n '5': {\r\n name: $rootScope.translate.tsunWeekFriday || 'Friday',\r\n checked: false\r\n },\r\n '6': {\r\n name: $rootScope.translate.tsunWeekSaturday || 'Saturday',\r\n checked: false\r\n },\r\n '0': {\r\n name: $rootScope.translate.tsunWeekSunday || 'Sunday',\r\n checked: false\r\n },\r\n },\r\n cycleList: [{\r\n value: 1,\r\n name: '1'\r\n // name: $rootScope.translate.tsunNumberOne || '一'\r\n }, {\r\n value: 2,\r\n name: '2'\r\n }, {\r\n value: 3,\r\n name: '3'\r\n }, {\r\n value: 4,\r\n name: '4'\r\n }, {\r\n value: 5,\r\n name: '5'\r\n }, {\r\n value: 6,\r\n name: '6'\r\n }, {\r\n value: 7,\r\n name: '7'\r\n }, {\r\n value: 8,\r\n name: '8'\r\n }, {\r\n value: 9,\r\n name: '9'\r\n }, {\r\n value: 10,\r\n name: '10'\r\n }],\r\n cycleValue: null,\r\n cycleType: null,\r\n hasRestTime: null,\r\n classDateStart: null,\r\n classDateEnd: null,\r\n sessionTimeStartHour: null,\r\n sessionTimeStartMin: null,\r\n sessionTimeEndHour: null,\r\n sessionTimeEndMin: null,\r\n restTimeStartHour: null,\r\n restTimeStartMin: null,\r\n restTimeEndHour: null,\r\n restTimeEndMin: null,\r\n saveList: saveList || [],\r\n };\r\n }\r\n\r\n function onInit() {\r\n //若要看手機環境請將此參數改成True\r\n vm.isMobile = modalService.isMobile();\r\n\r\n dataInit();\r\n clearPageData();\r\n }\r\n\r\n function tabDayOfMonth() {\r\n vm.data.week = undefined;\r\n vm.data.cycleWeek = undefined;\r\n }\r\n\r\n function tabDayOfWeek() {\r\n vm.data.day = undefined;\r\n }\r\n\r\n function ok() {\r\n vm.checkView.formSubmited = true;\r\n if (!vm.data.classDateStart && !vm.data.classDateEnd && vm.data.saveList.length > 0) {\r\n //若無日期設定視為空值\r\n $uibModalInstance.close(vm.data.saveList);\r\n return;\r\n }\r\n if (!checkFormData()) { return; }\r\n return $q.when(pushDataToStore()).then(function() {\r\n $uibModalInstance.close(vm.data.saveList);\r\n });\r\n }\r\n\r\n function saveAndNext() {\r\n vm.checkView.formSubmited = true;\r\n if (!checkFormData()) { return; }\r\n return $q.when(pushDataToStore()).then(function() {\r\n clearPageData();\r\n vm.checkView.formSubmited = false;\r\n // console.log(\"vm.data.saveList\", vm.data.saveList);\r\n });\r\n }\r\n\r\n function pushDataToStore() {\r\n // console.log(\"enter pushDataToStore\");\r\n var singleData = {\r\n cycleValue: null,\r\n cycleType: null,\r\n hasRestTime: null,\r\n classDateStart: null,\r\n classDateEnd: null,\r\n sessionTimeStartHour: null,\r\n sessionTimeStartMin: null,\r\n sessionTimeEndHour: null,\r\n sessionTimeEndMin: null,\r\n restTimeStartHour: null,\r\n restTimeStartMin: null,\r\n restTimeEndHour: null,\r\n restTimeEndMin: null,\r\n showText: \"\",\r\n selectWeekday: [],\r\n innerDataDate: [],\r\n innerDataTime: []\r\n };\r\n var selectedWeekDayText = '';\r\n var classDateStartDate;\r\n var classDateEndDate;\r\n var cycleTimes = 0;\r\n var classDateStart;\r\n var classDateEnd;\r\n var classTime = [];\r\n _.forEach(singleData, function(value, key) {\r\n // console.log(\"key:\", key, \"value:\", vm.data[key]);\r\n if (vm.data[key] === undefined) { return; }\r\n singleData[key] = angular.copy(vm.data[key]);\r\n });\r\n _.forEach(vm.data.weekdays, function(value, key) {\r\n if (!value.checked) { return; }\r\n singleData.selectWeekday.push(parseInt(key));\r\n });\r\n classDateStart = Date.parse(singleData.classDateStart);\r\n classDateEnd = Date.parse(singleData.classDateEnd);\r\n classDateStartDate = new Date(classDateStart);\r\n classDateEndDate = new Date(classDateEnd);\r\n if (!singleData.hasRestTime) {\r\n classTime = [\r\n format(\"{0}:{1}-{2}:{3}\", singleData.sessionTimeStartHour, singleData.sessionTimeStartMin, singleData.sessionTimeEndHour, singleData.sessionTimeEndMin)\r\n ];\r\n } else {\r\n classTime = [\r\n format(\"{0}:{1}-{2}:{3}\", singleData.sessionTimeStartHour, singleData.sessionTimeStartMin, singleData.restTimeStartHour, singleData.restTimeStartMin),\r\n format(\"{0}:{1}-{2}:{3}\", singleData.restTimeEndHour, singleData.restTimeEndMin, singleData.sessionTimeEndHour, singleData.sessionTimeEndMin),\r\n ];\r\n }\r\n for (var date = new Date(classDateStart); date <= classDateEnd; date.setDate(date.getDate() + 1)) {\r\n var cycleCompareValue;\r\n var cycleBaseValue;\r\n switch (singleData.cycleType.type) {\r\n case 'week':\r\n cycleBaseValue = Math.floor(classDateStartDate.getDate() / 7);\r\n cycleCompareValue = Math.floor(date.getDate() / 7);\r\n break;\r\n case 'month':\r\n cycleBaseValue = classDateStartDate.getMonth();\r\n cycleCompareValue = date.getMonth();\r\n break;\r\n case 'year':\r\n cycleBaseValue = classDateStartDate.getFullYear();\r\n cycleCompareValue = date.getFullYear();\r\n break;\r\n default:\r\n cycleBaseValue = 0;\r\n cycleCompareValue = 0;\r\n break;\r\n\r\n }\r\n // console.log(\"cycleCompareValue\", cycleCompareValue);\r\n // console.log(\"cycleBaseValue\", cycleBaseValue);\r\n // console.log(\"singleData.cycleValue.value\", singleData.cycleValue.value);\r\n cycleTimes = cycleCompareValue - cycleBaseValue;\r\n if (cycleTimes % singleData.cycleValue.value !== 0) { continue; }\r\n if (singleData.selectWeekday.indexOf(date.getDay()) < 0) { continue; }\r\n //==========\r\n var dateString = '';\r\n var dateYear = date.getFullYear() + '';\r\n var dateMonth = (date.getMonth() + 1) + '';\r\n var dateDay = date.getDate() + '';\r\n dateString += dateYear.length < 2 ? '0' : '' + dateYear;\r\n dateString += '/' + (dateMonth.length < 2 ? '0' : '') + dateMonth;\r\n dateString += '/' + (dateDay.length < 2 ? '0' : '') + dateDay;\r\n for (var classTimeIndex = 0; classTimeIndex < classTime.length; classTimeIndex++) {\r\n singleData.innerDataDate.push(dateString);\r\n singleData.innerDataTime.push(classTime[classTimeIndex]);\r\n }\r\n // _.forEach(classTime, function (value) {\r\n // });\r\n }\r\n\r\n // var classDateStartDate;\r\n // var classDateEndDate;\r\n singleData.showText += format(\"{0}/{1}{2}/{3}{4}\", classDateStartDate.getFullYear(), (classDateStartDate.getMonth() < 9 ? \"0\" : \"\"), (classDateStartDate.getMonth() + 1), (classDateStartDate.getDate() < 10 ? \"0\" : \"\"), classDateStartDate.getDate());\r\n singleData.showText += format(\"~{0}/{1}{2}/{3}{4}\", classDateEndDate.getFullYear(), (classDateEndDate.getMonth() < 9 ? \"0\" : \"\"), (classDateEndDate.getMonth() + 1), (classDateEndDate.getDate() < 10 ? \"0\" : \"\"), classDateEndDate.getDate());\r\n\r\n\r\n selectedWeekDayText = '';\r\n if (singleData.selectWeekday.length < 7) {\r\n _.forEach(singleData.selectWeekday, function(value) {\r\n if (selectedWeekDayText.length > 0) { selectedWeekDayText += ','; }\r\n selectedWeekDayText += vm.data.weekdays[value].name;\r\n });\r\n selectedWeekDayText = format(\"({0})\", selectedWeekDayText);\r\n }\r\n\r\n if (singleData.cycleValue.value > 1) {\r\n singleData.showText += \"
      \";\r\n singleData.showText += format(\"{0} {1} {2}:{3}\",\r\n $rootScope.translate.commonEvery,\r\n singleData.cycleValue.name,\r\n singleData.cycleType.name.toLowerCase(),\r\n selectedWeekDayText);\r\n } else if (selectedWeekDayText.length > 0) {\r\n singleData.showText += \"
      \";\r\n singleData.showText += selectedWeekDayText;\r\n }\r\n\r\n\r\n singleData.showText += format(\"
      {0}:{1}-{2}:{3}\", singleData.sessionTimeStartHour, singleData.sessionTimeStartMin, singleData.sessionTimeEndHour, singleData.sessionTimeEndMin);\r\n if (singleData.hasRestTime) {\r\n singleData.showText += format(\"
      {0}:{1}:{2}-{3}:{4}\", \"午休\", singleData.restTimeStartHour, singleData.restTimeStartMin, singleData.restTimeEndHour, singleData.restTimeEndMin);\r\n }\r\n\r\n // console.log(\"singleData\", singleData);\r\n vm.data.saveList.push(singleData);\r\n // console.log(\"end pushDataToStore\");\r\n }\r\n\r\n function clearPageData() {\r\n vm.data.cycleValue = vm.data.cycleValue = vm.data.cycleList[0];\r\n vm.data.cycleType = vm.data.cycleType = vm.data.cycleTypeList[0];\r\n vm.data.hasRestTime = false;\r\n vm.data.classDateStart = \"\";\r\n vm.data.classDateEnd = \"\";\r\n vm.data.sessionTimeStartHour = vm.data.hours[0];\r\n vm.data.sessionTimeStartMin = vm.data.mins[0];\r\n vm.data.sessionTimeEndHour = vm.data.hours[0];\r\n vm.data.sessionTimeEndMin = vm.data.mins[0];\r\n vm.data.restTimeStartHour = vm.data.hours[6];\r\n vm.data.restTimeStartMin = vm.data.mins[0];\r\n vm.data.restTimeEndHour = vm.data.hours[7];\r\n vm.data.restTimeEndMin = vm.data.mins[0];\r\n _.forEach(vm.data.weekdays, function(value) {\r\n value.checked = true;\r\n });\r\n // console.log(\"clearPageData , vm.data:\", vm.data);\r\n }\r\n\r\n function checkFormData() {\r\n // console.log(\"enter checkFormData , vm.data:\", vm.data);\r\n var result = false;\r\n var classDateStart = Date.parse(vm.data.classDateStart); // \r\n var classDateEnd = Date.parse(vm.data.classDateEnd);\r\n var calssTimeStart = new Date(\"2000\", \"01\", \"01\", vm.data.sessionTimeStartHour, vm.data.sessionTimeStartMin, \"00\");\r\n var calssTimeEnd = new Date(\"2000\", \"01\", \"01\", vm.data.sessionTimeEndHour, vm.data.sessionTimeEndMin, \"00\");\r\n var isClassLunchTime = vm.data.hasRestTime;\r\n var classLunchTimeStart = new Date(\"2000\", \"01\", \"01\", vm.data.restTimeStartHour, vm.data.restTimeStartMin, \"00\");\r\n var classLunchTimeEnd = new Date(\"2000\", \"01\", \"01\", vm.data.restTimeEndHour, vm.data.restTimeEndMin, \"00\");\r\n // var cycleType = vm.data.cycleType;\r\n // var cycleValue = vm.data.cycleValue;\r\n vm.checkView.classDateValid = false;\r\n vm.checkView.classTimeValid = false;\r\n vm.checkView.LunchTimeValid = false;\r\n vm.checkView.weekDayValid = false;\r\n if (classDateStart && classDateEnd) {\r\n //驗證上課日期\r\n vm.checkView.classDateValid = (classDateEnd >= classDateStart);\r\n }\r\n if (calssTimeStart && calssTimeEnd) {\r\n //驗證上課時間\r\n vm.checkView.classTimeValid = (calssTimeEnd > calssTimeStart);\r\n }\r\n if (!isClassLunchTime) {\r\n vm.checkView.LunchTimeValid = true;\r\n } else if (classLunchTimeStart && classLunchTimeEnd) {\r\n //驗證午休\r\n vm.checkView.LunchTimeValid = (classLunchTimeEnd > classLunchTimeStart) || !isClassLunchTime;\r\n }\r\n if (vm.checkView.LunchTimeValid && isClassLunchTime) {\r\n //驗證午休與上課時間\r\n vm.checkView.LunchTimeValid = (calssTimeEnd >= classLunchTimeEnd) && (classLunchTimeStart >= calssTimeStart);\r\n }\r\n //驗證上課日\r\n var selectWeekday = [];\r\n _.forEach(vm.data.weekdays, function(value, key) {\r\n if (value.checked) {\r\n selectWeekday.push(parseInt(key));\r\n }\r\n });\r\n for (var date = new Date(classDateStart); date <= classDateEnd; date.setDate(date.getDate() + 1)) {\r\n if (vm.checkView.weekDayValid) { break; }\r\n if (selectWeekday.indexOf(date.getDay()) >= 0) {\r\n vm.checkView.weekDayValid = true;\r\n }\r\n }\r\n\r\n result =\r\n vm.checkView.classDateValid &&\r\n vm.checkView.classTimeValid &&\r\n vm.checkView.LunchTimeValid &&\r\n vm.checkView.weekDayValid;\r\n\r\n if (result === false) {\r\n toastr.warning($rootScope.translate.tsunErrorExteriorTimeEmpty);\r\n }\r\n return result;\r\n }\r\n\r\n function removeClassRange(index) {\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: format(\"{0}\\r\\n{1}\", $rootScope.translate.tsunConfirmRemove, \"\"),\r\n });\r\n confirmDialog.result.then(function(result) {\r\n result = !!result;\r\n if (result !== true) {\r\n return;\r\n }\r\n vm.data.saveList.splice(index, 1);\r\n });\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function openTimeSelector(type, title) {\r\n var data = null;\r\n var isCycle=false;\r\n switch (type) {\r\n case 'sh': //小時\r\n case 'eh':\r\n case 'rsh':\r\n case 'reh':\r\n data = vm.data.hours;\r\n break;\r\n case 'sm': //分鐘\r\n case 'em':\r\n case 'rsm':\r\n case 'rem':\r\n data = vm.data.mins;\r\n break;\r\n case 'c': //循環週期\r\n data = vm.data.cycleList;\r\n isCycle = true;\r\n break;\r\n case 'u': //循環週期單位\r\n data = vm.data.cycleTypeList;\r\n isCycle = true;\r\n break;\r\n }\r\n \r\n var result = modalService.openOptionSelector(data, title,isCycle);\r\n console.log('openTimeSelector:',result);\r\n result.result.then(function(data) {\r\n switch (type) {\r\n case 'sh': //開始小時\r\n vm.data.sessionTimeStartHour = data;\r\n break;\r\n case 'eh': //結束小時\r\n vm.data.sessionTimeEndHour = data;\r\n break;\r\n case 'sm': //開始分鐘\r\n vm.data.sessionTimeStartMin = data;\r\n break;\r\n case 'em': //結束分鐘\r\n vm.data.sessionTimeEndMin = data;\r\n break;\r\n case 'rsh': //休息開始小時\r\n vm.data.restTimeStartHour = data;\r\n break;\r\n case 'reh': //休息結束小時\r\n vm.data.restTimeEndHour = data;\r\n break;\r\n case 'rsm': //休息開始分鐘\r\n vm.data.restTimeStartMin = data;\r\n break;\r\n case 'rem': //休息結束分鐘\r\n vm.data.restTimeEndMin = data;\r\n break;\r\n case 'c': //循環週期\r\n //vm.data.cycleValue.value = data.id;\r\n //vm.data.cycleValue.name = data.name;\r\n vm.data.cycleValue = data;\r\n break;\r\n case 'u': //循環週期單位\r\n //vm.data.cycleType.value = data.id;\r\n //vm.data.cycleType.name = data.name;\r\n vm.data.cycleType = data;\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('myTrainingOrganizerModalController', myTrainingOrganizerModalController);\r\n\r\n function myTrainingOrganizerModalController($scope, $rootScope, $uibModalInstance, params, choiceList, modalService) {\r\n var vm = this;\r\n vm.send = send;\r\n vm.checkboxClick = checkboxClick;\r\n vm.searchResultEnd = searchResultEnd;\r\n vm.searchData = searchData;\r\n vm.cancel = cancel;\r\n vm.isApp = false;\r\n onInit();\r\n\r\n function dataInit() {\r\n vm.data = {\r\n checkedList: choiceList || [],\r\n sourceData: params || [],\r\n listData: [], //.....................主辦單位清單\r\n };\r\n vm.view = {\r\n // showOther: false,\r\n emptyParams: false, //..........尚未輸入收尋條件\r\n buttonShow: false, //...........確定按鈕是否出現(包含浮動)\r\n staticButtonShow: false, //.....確定按鈕是否出現(固定按鈕)\r\n orgSearchEmpty: false, //.......主辦單位清單為空\r\n };\r\n }\r\n\r\n function logicInit() {\r\n vm.search = '';\r\n _.forEach(vm.data.sourceData, function(item) {\r\n item.checked = (_.findIndex(vm.data.checkedList, { \"id\": item.id }) > -1);\r\n item.CheckValue = item.checked;\r\n });\r\n // searchData();\r\n }\r\n\r\n function onInit() {\r\n if (DEVICE_TOKEN !== null || DEVICE_TYPE !== null) {\r\n //console.log('isApp:', vm.isApp);\r\n vm.isApp = true;\r\n }\r\n dataInit();\r\n logicInit();\r\n Jquery();\r\n }\r\n\r\n function send() {\r\n var result = [];\r\n _.forEach(vm.data.listData, function(item) {\r\n if (item.Check) { result.push(item); }\r\n });\r\n $uibModalInstance.close(result);\r\n }\r\n\r\n function searchData() {\r\n $(document).trigger('submitSearchStart', {});\r\n vm.view.buttonShow = false;\r\n vm.view.emptyParams = false;\r\n vm.data.listData = [];\r\n // =====\r\n vm.search = vm.search || '';\r\n if (vm.search.length < 1) {\r\n vm.view.emptyParams = true;\r\n toastr.warning($rootScope.translate.tsunFormMsgRequiredEmpty);\r\n return;\r\n }\r\n // =====\r\n if (vm.search) {\r\n var regExpCompare = new RegExp(vm.search, \"g\");\r\n _.forEach(vm.data.sourceData, function(item) {\r\n if (item.name.match(regExpCompare)) {\r\n vm.data.listData.push(angular.copy(item));\r\n }\r\n });\r\n vm.view.orgSearchEmpty = (vm.data.listData.length < 1);\r\n } else {\r\n vm.data.listData = angular.copy(vm.data.sourceData);\r\n }\r\n // vm.data.listData.push({ id: 0, name: $rootScope.translate.tsunOther });\r\n }\r\n\r\n function checkboxClick(item) {\r\n if (item.checked) { return; }\r\n var itemChecked = !item.Check;\r\n item.Check = itemChecked;\r\n item.CheckValue = itemChecked;\r\n checkHasClick();\r\n }\r\n\r\n function checkHasClick() {\r\n var checkedItemIndex = _.findIndex(vm.data.listData, { Check: true });\r\n vm.view.buttonShow = (checkedItemIndex > -1);\r\n // console.log(\"call checkboxClick , trigger:\", vm.view.buttonShow);\r\n $(document).trigger('checkboxClick', [vm.view.buttonShow]);\r\n }\r\n\r\n function searchResultEnd() {\r\n $(document).trigger('submitSearchEnd', {});\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n //======Jquery\r\n function Jquery() {\r\n $(document)\r\n .off('floatButtonDisplay')\r\n .on('floatButtonDisplay', function(event, triggerResult) {\r\n var staticButtonShow = (!triggerResult);\r\n if (vm.view.staticButtonShow !== staticButtonShow) {\r\n vm.view.staticButtonShow = staticButtonShow;\r\n if (!$scope.$$phase) {\r\n $scope.$digest();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n})();","(function () {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('myTrainingSelectActionConfirmModalController', myTrainingSelectActionConfirmModalController);\r\n\r\n function myTrainingSelectActionConfirmModalController($uibModalInstance, $interval, $scope,\r\n ctmsConfirmTime, loginService, $location, $rootScope, $uibModalStack) {\r\n var DEFUALT_CONFIRMTIME = 10;\r\n var vm = this;\r\n vm.containu = containu;\r\n //==========\r\n init();\r\n //==========\r\n\r\n function init() {\r\n // console.log(\"myTrainingSelectActionConfirmModalController,ctmsConfirmTime:\", ctmsConfirmTime);\r\n dataInit();\r\n logicInit();\r\n }\r\n function dataInit() {\r\n vm.data = {\r\n ctmsConfirmTime: ctmsConfirmTime || DEFUALT_CONFIRMTIME,//.......倒數計時\r\n };\r\n\r\n }\r\n function logicInit() {\r\n var promise = $interval(function () {\r\n // console.log(\"ctmsConfirmTime:\",ctmsConfirmTime);\r\n vm.data.ctmsConfirmTime--;\r\n if (vm.data.ctmsConfirmTime < 1) {\r\n // 移除目前所有 modal 視窗 \r\n $uibModalStack.dismissAll();\r\n $interval.cancel(promise);\r\n }\r\n }, 1000, vm.data.ctmsConfirmTime);\r\n\r\n\r\n $scope.$on('$destroy', function () {\r\n $interval.cancel(promise);\r\n });\r\n\r\n }\r\n\r\n function containu() {\r\n $uibModalInstance.close();\r\n }\r\n }\r\n})();\r\n","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('myTrainingSelectActionModalController', myTrainingSelectActionModalController);\r\n\r\n\r\n function myTrainingSelectActionModalController($uibModalInstance, $interval,\r\n $uibModal, $scope, $sce, $window, trainingInnerService, $timeout, courseService,\r\n modalService, $q, viewModel, ctmsService, enumService, $location, loginService,\r\n $rootScope, commonService, $anchorScroll, _sessionDecaySecs, $http, headerService, mobileService, apiUrl) {\r\n var DEFAULT_POPUPTIME = 600; //預設10分鐘\r\n var default_ctmsCourseTimeInterval = 300; //固定回傳時隔,預設5分鐘\r\n var vm = this;\r\n var timer, viewTimeInterval, sessionTimeInterval;\r\n vm.isMobile = modalService.isMobile();\r\n vm.setPathUrl = setPathUrl;\r\n vm.cancel = cancel;\r\n vm.vgPlayReady = vgPlayReady;\r\n vm.vgComplete = vgComplete;\r\n vm.actionSubmit = actionSubmit;\r\n vm.choiceSelectActive = choiceSelectActive;\r\n vm.returnActiveList = returnActiveList;\r\n vm.sessionChoice = sessionChoice;\r\n vm.tabChange = tabChange;\r\n vm.goTop = goTop;\r\n vm.setPercentStyle = setPercentStyle;\r\n vm.enum = {\r\n courseType: enumService.courseType\r\n };\r\n vm.pdfIsDone = false;\r\n vm.durationView = durationView;\r\n vm.postToIos = postToIos;\r\n vm.setSession = setSession;\r\n\r\n var mobile = {\r\n Android: function() {\r\n return navigator.userAgent.match(/Android/i);\r\n },\r\n BlackBerry: function() {\r\n return navigator.userAgent.match(/BlackBerry/i);\r\n },\r\n iOS: function() {\r\n return navigator.userAgent.match(/iPhone|iPad|iPod/i);\r\n },\r\n Opera: function() {\r\n return navigator.userAgent.match(/Opera Mini/i);\r\n },\r\n Windows: function() {\r\n return navigator.userAgent.match(/IEMobile/i);\r\n },\r\n any: function() {\r\n return (mobile.Android() || mobile.BlackBerry() || mobile.iOS() || mobile.Opera() || mobile.Windows());\r\n }\r\n };\r\n\r\n\r\n\r\n function durationView() {\r\n return intConvertTime(vm.view.viewTime);\r\n }\r\n\r\n\r\n //===Main==\r\n init();\r\n window.addEventListener(\"beforeunload\", function(event) {\r\n\r\n postLearningRecord(false, true);\r\n var confirmationMessage = \"\\o/\";\r\n (e || event).returnValue = confirmationMessage; //Gecko + IE\r\n return confirmationMessage; //Webkit, Safari, Chrome etc.\r\n });\r\n //=========\r\n function init() {\r\n dataInit();\r\n logicInit();\r\n\r\n $scope.$on('goTop', function() {\r\n goTop();\r\n });\r\n $scope.$on('emitExamSubmit', function() {\r\n postLearningRecord(false, true);\r\n });\r\n $scope.$on('$destroy', function() {\r\n $interval.cancel(viewTimeInterval);\r\n $interval.cancel(sessionTimeInterval);\r\n $timeout.cancel(timer);\r\n });\r\n // console.log(\"vm.view.sessionTime\", vm.view.sessionTime);\r\n // console.log(\"$rootScope.userInfo\",$rootScope.userInfo);\r\n sessionTimeInterval = $interval(function() {\r\n loginService.checkToken();\r\n // console.log(\"sessionTimeInterval checkToken\");\r\n }, vm.view.sessionTime);\r\n }\r\n\r\n function dataInit() {\r\n viewModel = viewModel || {};\r\n vm.timeConfig = viewModel.timeConfig || {};\r\n vm.data = {\r\n pdfUrl: \"\", //............................正在觀看的pdfUrl\r\n iframeUrl: \"\", //.........................正在觀看的IframeUrl\r\n courseItem: null, //......................正在執行的學習動作教材內容(WS3)\r\n studyActivity: null, //..................正在觀看的學習動作\r\n importCourse: viewModel.item || null, //.理論上是清單列傳入的班次課程\r\n courageItem: null, //.....................學程資料\r\n courageDetail: null, //...................學程詳細資料\r\n courageActive: null, //...................學程包含學習動作(WS14)\r\n courageAction: null, //...................學程包含動作(由courageActive抽出整理)\r\n sessionItem: null, //.....................班次資料\r\n sessionDetail: null, //...................班次詳細資料\r\n sessionActives: null, //..................班次包含學習動作(WS14)\r\n sessionLms: null, //......................班次包含學習項目(由sessionActives加工整理)\r\n sessionAction: null, //...................班次包含學習動作(由sessionActives抽出整理)\r\n ctmsTime: vm.timeConfig.ctmsTime /*8*/ || DEFAULT_POPUPTIME, //.........學習項目觀看時,確認繼續課程的顯示倒數計時(秒)\r\n ctmsCourseTimeInterval: vm.timeConfig.ctmsCourseTimeInterval || default_ctmsCourseTimeInterval, //.........學習項目觀看時,固定回傳時隔\r\n\r\n };\r\n vm.config = {\r\n sources: [],\r\n tracks: [{\r\n src: \"http://www.videogular.com/assets/subs/pale-blue-dot.vtt\",\r\n kind: \"subtitles\",\r\n srclang: \"en\",\r\n label: \"English\",\r\n default: \"\"\r\n }]\r\n };\r\n vm.view = {\r\n contentCourage: false,\r\n contentCourse: false,\r\n isDownload: false,\r\n isShowPdf: false,\r\n isShowVideo: false,\r\n isShowExam: false,\r\n isShowIframe: false,\r\n viewTime: 0,\r\n pageLoad: false,\r\n sessionTime: 0,\r\n activeContent: false,\r\n activeList: false,\r\n couragePage: false, //.............學程頁面\r\n sessionPage: false, //.............班次頁面\r\n };\r\n vm.vgApi = null;\r\n vm.tabSelected = 1;\r\n }\r\n\r\n function logicInit() {\r\n vm.view.sessionTime = ($rootScope.userInfo.sessionTime <= 3 ? 20 : $rootScope.userInfo.sessionTime) * 60000;\r\n vm.view.sessionTime -= (1000 * 120); //TODO 不懂為何要減掉。\r\n vm.view.sessionTime = vm.view.sessionTime || _sessionDecaySecs;\r\n switch (vm.data.importCourse.courseType) {\r\n case 7:\r\n //學程\r\n courageInit(vm.data.importCourse).then(function() {\r\n Accordion();\r\n vm.view.couragePage = true;\r\n });\r\n break;\r\n default:\r\n //非學程就直接處理課程資訊\r\n sessionInit(vm.data.importCourse).then(function() {\r\n Accordion();\r\n vm.view.sessionPage = true;\r\n });\r\n break;\r\n }\r\n }\r\n\r\n function courageInit(importItem) {\r\n\r\n vm.data.courageItem = null;\r\n vm.data.courageDetail = null;\r\n vm.data.courageActive = null;\r\n vm.data.courageAction = null;\r\n if (!importItem) { return; }\r\n vm.data.courageItem = angular.copy(importItem);\r\n var selectActive = trainingInnerService.getSelectActive(vm.data.courageItem);\r\n var courseDetail = trainingInnerService.getCourseDetail(vm.data.courageItem);\r\n // console.log(\"translate:\", $rootScope.translate);\r\n return $q.all([selectActive, courseDetail]).then(function(data) {\r\n var selectActiveResult = data[0];\r\n var courseDetailResult = data[1];\r\n vm.data.courageDetail = detailFormat(courseDetailResult);\r\n vm.data.courageActive = selectActiveResult;\r\n vm.data.courageAction = actionItemFormat(selectActiveResult.availableActions);\r\n _.forEach(vm.data.courageDetail.courses, function(courseItem) {\r\n if (courseItem.status && courseItem.progress) { return; }\r\n trainingInnerService.getSelectActive(courseItem).then(function(data) {\r\n courseItem.status = 'get status Error';\r\n courseItem.progress = null;\r\n if (!data) { return; }\r\n courseItem.status = '';\r\n courseItem.progress = '';\r\n if (data.status) {\r\n courseItem.status = statusConvert(data.status);\r\n }\r\n if (data.progress) {\r\n courseItem.progress = data.progress;\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n function statusConvert(statusCode) {\r\n //通過狀態的多國語系轉換\r\n if (!statusCode) { return ''; }\r\n switch (statusCode + '') {\r\n case '-1':\r\n // return $rootScope.translate.tsunPassStatusValueNotCourage;\r\n return '';\r\n case '0':\r\n return $rootScope.translate.tsunPassStatusValueNA;\r\n case '1':\r\n return $rootScope.translate.tsunPassStatusValueExemption;\r\n case '2':\r\n return $rootScope.translate.tsunPassStatusValueOK;\r\n case '3':\r\n return $rootScope.translate.tsunPassStatusValueNotOK;\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n function sessionInit(importItem) {\r\n vm.data.sessionItem = null;\r\n vm.data.sessionDetail = null;\r\n vm.data.sessionActives = null;\r\n vm.data.sessionAction = null;\r\n vm.data.sessionLms = null;\r\n if (!importItem) { return; }\r\n vm.data.sessionItem = angular.copy(importItem);\r\n var selectActive = trainingInnerService.getSelectActive(vm.data.sessionItem);\r\n var courseDetail = trainingInnerService.getCourseDetail(vm.data.sessionItem);\r\n return $q.all([selectActive, courseDetail]).then(function(data) {\r\n // console.log('selectActive:', selectActive);\r\n // console.log('courseDetail:', courseDetail);\r\n //console.log('data:', data);\r\n var selectActiveResult = data[0];\r\n var courseDetailResult = data[1];\r\n // console.log(\"selectActiveResult:\",selectActiveResult);\r\n vm.data.sessionDetail = detailFormat(courseDetailResult);\r\n vm.data.sessionActives = selectActiveResult;\r\n vm.data.sessionAction = actionItemFormat(selectActiveResult.availableActions);\r\n vm.data.sessionLms = lmsItemsFormat(vm.data.sessionItem);\r\n });\r\n }\r\n\r\n function detailFormat(sourceData) {\r\n var detailData = angular.copy(sourceData);\r\n if (!detailData) { return detailData; }\r\n //===========\r\n var brCheck = /(\\r?\\n)/g;\r\n _.forEach(detailData, function(value, key) {\r\n var isInt = (value === parseInt(value, 10));\r\n var isString = (typeof value === \"string\");\r\n if (isInt) {\r\n var isAsNull = (value < 0);\r\n\r\n if (isAsNull) {\r\n detailData[key] = null;\r\n } else {\r\n detailData[key] = value + '';\r\n }\r\n } else if (isString) {\r\n detailData[key] = value.replace(brCheck, \"
      \");\r\n }\r\n });\r\n //===========\r\n if (detailData.reference) {\r\n //檢查參考文件格式\r\n if (!angular.isArray(detailData.reference)) {\r\n //參考文件必須是陣列\r\n detailData.reference = null;\r\n }\r\n if (detailData.reference.length <= 0) {\r\n //參考文件必須有內容\r\n detailData.reference = null;\r\n }\r\n }\r\n return detailData;\r\n }\r\n\r\n function sessionChoice(sessionItem) {\r\n vm.view.couragePage = false;\r\n vm.view.sessionPage = true;\r\n if (!sessionItem.courseType) {\r\n sessionItem.courseType = 1;\r\n }\r\n sessionInit(sessionItem).then(function() {\r\n vm.tabSelected = 1;\r\n //console.log(\"typeof Accordion\", typeof Accordion);\r\n //如果有要製作等待頁面讀取中可以在此實作後續機制\r\n });\r\n }\r\n\r\n function setPathUrl(filePath) {\r\n var pathUrl = commonService.ctmsFilePath(filePath);\r\n return pathUrl;\r\n }\r\n\r\n function actionItemFormat(actionList) {\r\n //---處理Sunnet WS14 availableActions屬性\r\n var result = [];\r\n _.forEach(actionList, function(value) {\r\n var perItem = { name: '', action: '' };\r\n perItem.action = angular.copy(value);\r\n switch (value.toLowerCase()) {\r\n case \"enroll\":\r\n perItem.name = $rootScope.translate.tsunActionEnroll;\r\n break;\r\n case \"cancel\":\r\n perItem.name = $rootScope.translate.tsunActionCancel;\r\n break;\r\n case \"leave\":\r\n perItem.name = $rootScope.translate.tsunActionLeave;\r\n break;\r\n case \"exemption\":\r\n perItem.name = $rootScope.translate.tsunActionExemption;\r\n break;\r\n default:\r\n perItem.name = value;\r\n break;\r\n }\r\n result.push(perItem);\r\n });\r\n return result;\r\n }\r\n\r\n function lmsItemsFormat(sessionItem) {\r\n if (!vm.data.sessionActives) { return; }\r\n var activeItem = [];\r\n var perItem;\r\n //====加入出缺席狀況\r\n if (sessionItem.courseType === vm.enum.courseType.classCourse ||\r\n sessionItem.courseType === vm.enum.courseType.externalCourse) {\r\n perItem = {};\r\n perItem.isAction = false;\r\n perItem.itemName = format(\"【{0}】\", $rootScope.translate.tsunAttendanceRate);\r\n perItem.status = vm.data.sessionActives.attendanceRate + \"%\";\r\n perItem.extraInfo = \"\";\r\n activeItem.push(angular.copy(perItem));\r\n }\r\n //====加入報告繳納資訊\r\n if (vm.data.sessionActives.reportTotal > 0) {\r\n perItem = {};\r\n perItem.isAction = false;\r\n perItem.itemName = format(\"【{0}】{1}\",\r\n $rootScope.translate.tsunReportsInfo,\r\n $rootScope.translate.tsunClassReportNote);\r\n perItem.status = format(\"{0} / {1}\",\r\n vm.data.sessionActives.reportSubmitted,\r\n vm.data.sessionActives.reportTotal);\r\n perItem.extraInfo = \"\";\r\n activeItem.push(angular.copy(perItem));\r\n }\r\n //====加入學習動作\r\n if (vm.data.sessionActives.lmsItems) {\r\n _.forEach(vm.data.sessionActives.lmsItems, function(value) {\r\n if (value.action) {\r\n if (value.action.length < 1) {\r\n value.action = null;\r\n }\r\n }\r\n value.isAction = true;\r\n activeItem.push(value);\r\n });\r\n }\r\n\r\n return activeItem;\r\n }\r\n\r\n function refreshViewTime() {\r\n $q.when(viewTimeStop()).then(function() {\r\n viewTimeStart();\r\n });\r\n }\r\n\r\n function viewTimeStart() {\r\n vm.view.viewTime = 0;\r\n viewTimeInterval = $interval(function() {\r\n vm.view.viewTime++;\r\n }, 1000);\r\n // console.log(\"viewTimeInterval\", viewTimeInterval);\r\n }\r\n\r\n function viewTimeStop() {\r\n $interval.cancel(viewTimeInterval);\r\n $timeout.cancel(timer);\r\n }\r\n\r\n function countTimeStart() {\r\n appCallback('countDown-02_beforeTimer', null);\r\n timer = $timeout(function() {\r\n //console.log(\"timer time out\",timer);\r\n //先改成倒數前送出學習紀錄\r\n\r\n appCallback('countDown-02', null);\r\n\r\n postLearningRecord(false, false);\r\n confirmForDesktop();\r\n }, vm.data.ctmsTime * 1000);\r\n //console.log(\"timer\",timer);\r\n }\r\n\r\n function confirmForDesktop() {\r\n if (vm.view.isShowVideo && vm.vgApi) {\r\n vm.vgApi.pause();\r\n vm.vgApi.closeFullScreen();\r\n }\r\n //======\r\n var param = {\r\n SessionId: angular.copy(vm.data.sessionItem.sessionId),\r\n ItemId: angular.copy(vm.data.studyActivity.itemId),\r\n Duration: intConvertTime(vm.view.viewTime)\r\n };\r\n modalService.selectActionConfirm(vm.timeConfig.ctmsConfirmTime, param)\r\n .result.then(function(data) {\r\n // console.log('before postRecord :',data);\r\n // postLearningRecord(false, false);\r\n if (data === 'logout') {\r\n $uibModalInstance.dismiss('cancel');\r\n $location.path('/');\r\n return;\r\n }\r\n refreshViewTime();\r\n if (vm.view.isShowVideo) {\r\n vm.vgApi.play();\r\n }\r\n countTimeStart();\r\n });\r\n }\r\n\r\n function cancel() {\r\n if (vm.view.pageLoad) {\r\n postLearningRecord(false, true);\r\n }\r\n // $uibModalInstance.dismiss('cancel');\r\n $uibModalInstance.close();\r\n }\r\n\r\n function vgPlayReady(api) {\r\n vm.vgApi = api;\r\n }\r\n\r\n function vgComplete() {\r\n postLearningRecord(true, false);\r\n }\r\n\r\n function postLearningRecord(alert, reset) {\r\n\r\n //因內嵌網頁需要,多加一個sessionStorage 變數\r\n if (sessionStorage.getItem('IsLearningRecordCommit') == 'true') {\r\n if (!vm.data.studyActivity) { return null; }\r\n if (vm.data.studyActivity.type === '測驗' ||\r\n vm.data.studyActivity.type === '問卷') {\r\n //測驗與問卷不回傳時數。\r\n return;\r\n }\r\n\r\n var param = {\r\n SessionId: angular.copy(vm.data.sessionItem.sessionId),\r\n ItemId: angular.copy(vm.data.studyActivity.itemId),\r\n Duration: intConvertTime(vm.view.viewTime)\r\n };\r\n\r\n //console.log(\"enter postLearningRecord\");\r\n var result = trainingInnerService.postLearningRecord(param, alert);\r\n result.then((data) => {\r\n // toastr.success('ok oh');\r\n }).catch((reason) => {\r\n // chris: log for mobile\r\n // toastr.error(JSON.stringify(reason));\r\n toastr.error('發送學習記錄失敗');\r\n });\r\n if (reset) {\r\n vm.data.studyActivity = null;\r\n }\r\n // console.log(\"end postLearningRecord\");\r\n }\r\n }\r\n\r\n function actionSubmit(enrollTarget, action) {\r\n // 申請項目呼叫事件\r\n // 呼叫完畢要重讀頁面資訊\r\n\r\n trainingInnerService.postSessionAction(enrollTarget, action).then(function() {\r\n if (enrollTarget.courseType === 7) {\r\n courageInit(angular.copy(vm.data.courageItem));\r\n } else {\r\n sessionInit(angular.copy(vm.data.sessionItem));\r\n }\r\n });\r\n }\r\n\r\n\r\n function initViewState() {\r\n clearAll();\r\n if (vm.data.studyActivity) {\r\n switch (vm.data.studyActivity.type) {\r\n case '影片':\r\n trainingInnerService.getCourseItems(vm.data.studyActivity).then(function(data) {\r\n vm.data.courseItem = data;\r\n changeActivityType();\r\n });\r\n break;\r\n case '課程內容':\r\n trainingInnerService.getCourseItems(vm.data.studyActivity).then(function(data) {\r\n vm.data.courseItem = data;\r\n changeActivityType();\r\n });\r\n break;\r\n case '問卷':\r\n changeExam();\r\n break;\r\n case '測驗':\r\n changeExam();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n function changeActivityType() {\r\n var path = (vm.data.courseItem.path || '');\r\n if (vm.data.courseItem.href && path.length > 0) {\r\n path = path + '/' + (vm.data.courseItem.href);\r\n } else if (vm.data.courseItem.href) {\r\n path = (vm.data.courseItem.href || '');\r\n } else {\r\n // path = path;\r\n }\r\n path = path.replace(\"\\\\\", \"/\");\r\n var pathUrl = setPathUrl(path);\r\n vm.data.courseItem.fileUrl = path;\r\n // console.log(\"changeActivityType....courseItem:\", vm.data.courseItem, \"....pathGo:\", pathUrl);\r\n // $q.when(fileExist(pathUrl)).then(function (result) {\r\n\r\n\r\n // 取出已觀看時間 + 放於 session storage 中\r\n // 寫在這邊是因為不只 mp4 會用到,連 html 都會需要這個參數\r\n let itemId = vm.data.courseItem.id;\r\n let sessionLm = _.find(vm.data.sessionLms, o => o.itemId === itemId );\r\n if (sessionLm) {\r\n let seconds = moment.duration(sessionLm.viewedTime).asSeconds();\r\n sessionStorage.setItem('CtmsSeekTime', seconds);\r\n console.log('target sessionLm:', sessionLm);\r\n }\r\n \r\n\r\n setSession(vm.data.courseItem); //給內嵌網頁的SessionStorage\r\n fileExist(vm.data.courseItem).then(function(result) {\r\n var fileExtension = getFileExtension(pathUrl);\r\n switch (fileExtension) {\r\n //case 'mp4':\r\n // appCallback('countDown-01,' + DEVICE_TYPE, null);\r\n // //if (!(mobile.iOS() && window.webkit)) {\r\n // if (!(mobile.iOS() && window.webkit) || DEVICE_TYPE == 'Android') {\r\n // countTimeStart();\r\n // }\r\n // vm.view.isShowVideo = true;\r\n // vm.vgApi.clearMedia();\r\n // var videos = [];\r\n // vm.accessBegin = moment(new Date()).format('YYYY/MM/DD HH:mm:ss');\r\n // videos.push({\r\n // src: pathUrl,\r\n // type: 'video/mp4'\r\n // });\r\n // vm.config.sources = videos;\r\n // // ready for ios video player\r\n // if (mobile.iOS() && window.webkit) {\r\n // //if(true){\r\n // // pass param to ios and open player\r\n // postToIos(vm.data.courseItem, pathUrl);\r\n // returnActiveList();\r\n // } else {\r\n // $timeout(function() {\r\n\r\n // // 從 sessoin storage 取出已觀看時間 \r\n // let ctmsSeekTime = parseInt(sessionStorage.getItem('CtmsSeekTime'));\r\n // ctmsSeekTime = !!ctmsSeekTime ? ctmsSeekTime - 120 : 0; // 需往前兩分鐘\r\n // if (ctmsSeekTime && ctmsSeekTime > 0) {\r\n \r\n // // 詢問是否從上次結束觀看影片的地方開始撥放 \r\n // // 只有在 Android 裝置上才需要執行的功能\r\n // var seekTimeConfirm = modalService.confrimDialog({\r\n // confirmContent: $rootScope.translate.displayVideoFromLastView,\r\n // });\r\n\r\n // seekTimeConfirm.result.then(function(result) {\r\n // if (result) {\r\n // // 跳至特定時間開始看\r\n // vm.vgApi.seekTime(ctmsSeekTime, false /*byPercent*/);\r\n // } \r\n\r\n // // 撥放影片\r\n // vm.vgApi.play();\r\n // });\r\n // } else {\r\n // // 沒有觀看紀錄,直接撥放影片\r\n // vm.vgApi.play();\r\n // }\r\n\r\n \r\n // }, vm.vgApi.isReady);\r\n // }\r\n // break;\r\n case 'pdf':\r\n countTimeStart();\r\n //window.open(ctmsService.getStampFile(vm.data.courseItem.path, vm.data.courseItem.name), '_blank');\r\n //console.log(\"path:\", vm.data.courseitem.path);\r\n //console.log(\"name:\", vm.data.courseitem.name);\r\n vm.url = ctmsService.getStampFile(vm.data.courseItem.path, vm.data.courseItem.name);\r\n console.log(\"vm Url:\", vm.url);\r\n const a = document.createElement('a');\r\n const el = document.body.appendChild(a);\r\n el.setAttribute('style', 'display: none');\r\n el.href = vm.url;\r\n el.click();\r\n //console.log(\"pdf pathUrl:\", apiUrl.pafUrl);\r\n //vm.data.pdfUrl = pathUrl;\r\n /*\r\n Johnson 做法用於pdf專屬站台,客戶不接受資安解釋。(//10.20.30.155:11001/?pdf=)\r\n //vm.data.pathUrl = apiUrl.pafUrl+pathUrl;\r\n */\r\n //vm.view.isShowPdf = true;\r\n //vm.pdfIsDone = true;\r\n break;\r\n case 'mp4':\r\n case 'html':\r\n case 'htm': //內容不明\r\n //countTimeStart();\r\n vm.data.iframeUrl = pathUrl;\r\n vm.view.isShowIframe = true;\r\n //要把內嵌網頁觀看邏輯補上\r\n break;\r\n default:\r\n //TODO 下載檔案回報時數?太奇怪了,暫時先取消這邊邏輯\r\n vm.downloadItem = {\r\n path: pathUrl,\r\n name: vm.data.courseItem.name\r\n };\r\n vm.view.isDownload = true;\r\n break;\r\n }\r\n }, function errorEvent(result) {\r\n //顯示檔案不存在並結束\r\n // console.log(\"errorResult\", result);\r\n //ios不需要後續動作\r\n tabChange(1);\r\n return;\r\n });\r\n\r\n }\r\n\r\n // 問卷\r\n function changeExam() {\r\n countTimeStart();\r\n vm.view.isShowExam = true;\r\n }\r\n\r\n function clearAll() {\r\n if (vm.vgApi) {\r\n vm.vgApi.stop();\r\n }\r\n vm.view.isDownload = false;\r\n vm.view.isShowPdf = false;\r\n vm.view.isShowVideo = false;\r\n vm.view.isShowExam = false;\r\n vm.view.isShowIframe = false;\r\n }\r\n\r\n function tabChange(index) {\r\n postLearningRecord(false, true);\r\n viewTimeStop();\r\n clearActive();\r\n switch (index) {\r\n case 0:\r\n //case 2:\r\n vm.view.couragePage = true;\r\n vm.view.sessionPage = false;\r\n if (vm.data.courageItem) {\r\n courageInit(angular.copy(vm.data.courageItem)).then(function() {\r\n // if (typeof Accordion === 'function') {\r\n // Accordion();\r\n // }\r\n //如果有要製作等待頁面讀取中可以在此實作後續機制\r\n });\r\n }\r\n break;\r\n case 1:\r\n vm.view.activeList = true;\r\n if (vm.data.sessionItem) {\r\n sessionInit(angular.copy(vm.data.sessionItem)).then(function() {\r\n // if (typeof Accordion === 'function') {\r\n // Accordion();\r\n // }\r\n //如果有要製作等待頁面讀取中可以在此實作後續機制\r\n });\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function clearActive() {\r\n viewTimeStop();\r\n postLearningRecord(false, true);\r\n clearActiveView();\r\n clearAll();\r\n }\r\n\r\n function choiceSelectActive(item) {\r\n clearActive();\r\n vm.data.studyActivity = angular.copy(item);\r\n vm.view.pageLoad = true;\r\n vm.view.activeContent = true;\r\n initViewState();\r\n refreshViewTime();\r\n }\r\n\r\n function goTop() {\r\n $location.hash('PageTop');\r\n $anchorScroll();\r\n $location.hash('');\r\n }\r\n\r\n function returnActiveList() {\r\n //學習動作回清單列\r\n //console.log(\"returnActiveList\");\r\n clearActive();\r\n\r\n if (vm.data.sessionItem) {\r\n sessionInit(angular.copy(vm.data.sessionItem)).then(function() {\r\n vm.view.activeList = true;\r\n });\r\n }\r\n }\r\n\r\n function clearActiveView() {\r\n vm.view.activeContent = false;\r\n vm.view.activeList = false;\r\n }\r\n\r\n function setPercentStyle(item) {\r\n var progress;\r\n var percentage;\r\n var style = {};\r\n if (item.progress && item.progress.length > 0) {\r\n progress = item.progress.split('/');\r\n if (progress.length < 2) {\r\n item.progress = null;\r\n progress = ['0', '1'];\r\n }\r\n } else {\r\n item.progress = null;\r\n progress = ['0', '1'];\r\n }\r\n percentage = 100 * (parseFloat(progress[0]) / parseFloat(progress[1]));\r\n percentage = parseInt(percentage) + '';\r\n if (percentage === '0') {\r\n style = { 'display': 'none' };\r\n } else {\r\n style = { 'width': percentage + '%' };\r\n }\r\n return style;\r\n }\r\n // function fileExist(pathUrl) {\r\n // var request = new XMLHttpRequest();\r\n // request.open('HEAD', pathUrl, false);\r\n // request.send();\r\n // // console.log(\"path\", pathUrl);\r\n // // console.log(\"request.status\", request.status);\r\n // return (request.status === 200);\r\n // }\r\n\r\n function fileExist(item) {\r\n //console.log(\"fileExist,source:\", item);\r\n // return $q.when(true);\r\n return trainingInnerService.checkItem(item);\r\n }\r\n\r\n function getFileExtension(fileName) {\r\n var result = (/[.]/.exec(fileName)) ? /[^.]+$/.exec(fileName)[0] : undefined;\r\n if (result) {\r\n result = (result + '').toLowerCase();\r\n }\r\n // console.log(\"getFileExtension,result:\", result);\r\n return result;\r\n }\r\n //======Jquery====\r\n function Accordion() {\r\n $(document).off(\"click\", \".accordion .title\");\r\n\r\n $(document).on(\"click\", \".accordion .title\", function(j) {\r\n var dropDown = $(this).closest('.col-sm-12').find('p.acc-info');\r\n $(this).closest('.accordion').find('p.acc-info').not(dropDown).slideUp();\r\n\r\n if ($(this).hasClass('active')) {\r\n $(this).removeClass('active');\r\n } else {\r\n $(this).closest('.accordion').find('a.active').removeClass('active');\r\n $(this).addClass('active');\r\n }\r\n\r\n dropDown.stop(false, true).slideToggle();\r\n\r\n j.preventDefault();\r\n });\r\n }\r\n\r\n\r\n function postToIos(item, url) {\r\n\r\n let ctmsSeekTime = parseInt(sessionStorage.getItem('CtmsSeekTime'));\r\n\r\n var param = {\r\n Command: 'playVideo',\r\n SessionId: angular.copy(vm.data.sessionItem.sessionId),\r\n ItemId: angular.copy(vm.data.studyActivity.itemId),\r\n LanguageCode: sessionStorage.getItem('userLang'),\r\n UserId: $rootScope.userInfo.userAccount,\r\n Tkn: sessionStorage.getItem('token'),\r\n FileUrl: url.replace(\"\\\\\", \"/\"),\r\n CtmsTime: vm.data.ctmsTime, //訓練系統timeout 時數\r\n CtmsConfirmTime: vm.timeConfig.ctmsConfirmTime, //觀看影片時,如遇到timeout,會彈出一確認視窗,這時數就是確認視窗的倒數計時\r\n CtmsCourseTimeInterval: vm.data.ctmsCourseTimeInterval, //觀看影片固定回傳時隔\r\n CtmsSeekTime: !!ctmsSeekTime ? ctmsSeekTime : 0 //影片已觀看的秒數\r\n };\r\n console.log('postToIos:', param);\r\n //mobileService.postCourseInfo(param);\r\n window.webkit.messageHandlers.msgHandler.postMessage(JSON.stringify(param));\r\n //return param;\r\n }\r\n\r\n function setSession(item) {\r\n //console.log('setSession');\r\n sessionStorage.setItem('sessionId', angular.copy(vm.data.sessionItem.sessionId));\r\n sessionStorage.setItem('itemId', angular.copy(vm.data.studyActivity.itemId));\r\n sessionStorage.setItem('userId', $rootScope.userInfo.userAccount);\r\n sessionStorage.setItem('IsLearningRecordCommit', true);\r\n\r\n // sessionStorage.setItem('sessionId',1);\r\n // sessionStorage.setItem('itemId',2);\r\n // sessionStorage.setItem('userId',3);\r\n }\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app')\r\n .controller('optionSelectorController', optionSelectorController);\r\n\r\n function optionSelectorController($rootScope, $scope, $uibModalInstance, keyValueList, titleTranslate,isCycle) {\r\n var vm = this;\r\n vm.cancel = cancel;\r\n vm.dataSelected = dataSelected;\r\n vm.title = titleTranslate;\r\n vm.isCycle = isCycle;\r\n onInit();\r\n $scope.list = GetList(keyValueList);\r\n\r\n function onInit() {\r\n dataInit();\r\n }\r\n\r\n function dataInit() {\r\n vm.isKeyValueList = false;\r\n }\r\n\r\n function cancel() {\r\n $uibModalInstance.dismiss('cancel');\r\n }\r\n\r\n function GetList(keyValueList) {\r\n //console.log('GetList:',keyValueList);\r\n var list = [];\r\n if (Object.prototype.isPrototypeOf(keyValueList[0]) && !vm.isCycle) {\r\n for (var i = 0; i <= keyValueList.length - 1; i++) {\r\n list.push({ id: keyValueList[i].id, name: keyValueList[i].name });\r\n }\r\n vm.isKeyValueList = true;\r\n // console.log('result:',list);\r\n return list;\r\n //}else if(vm.isCycle){\r\n // for (var i = 0; i <= keyValueList.length - 1; i++) {\r\n // list.push({ value: keyValueList[i].id, name: keyValueList[i].name });\r\n // }\r\n // vm.isKeyValueList = true;\r\n // console.log('result:',list);\r\n // return list;\r\n }else {\r\n //console.log('result:',keyValueList);\r\n return keyValueList;\r\n }\r\n }\r\n\r\n function dataSelected(data) {\r\n $uibModalInstance.close(data);\r\n }\r\n\r\n }\r\n})();","(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.directive')\r\n .directive('taiAskExam', taiAskExam);\r\n\r\n function taiAskExam() {\r\n var directive = {\r\n bindToController: true,\r\n controllerAs: 'vm',\r\n controller: ControllerController,\r\n link: link,\r\n restrict: 'E',\r\n templateUrl: 'controller/tsun/training/myTraining/modal/taiAskExam.html',\r\n scope: {\r\n showView: '=',\r\n sessionId: '=',\r\n courseActiveItem: '=',\r\n },\r\n };\r\n return directive;\r\n\r\n function link() {}\r\n }\r\n /* @ngInject */\r\n function ControllerController($rootScope, $scope, trainingInnerService, modalService, $q, $interval) {\r\n var vm = this;\r\n vm.submitExam = submitExam;\r\n vm.retryTest = retryTest;\r\n vm.reviewContent = reviewContent;\r\n vm.reviewResult = reviewResult;\r\n vm.countingTimeShowing = countingTimeShowing;\r\n init();\r\n //================\r\n function init() {\r\n $q.when(dataInit()).then(function() {\r\n\r\n });\r\n $scope.$watch('vm.showView', function(newValue) {\r\n // if (newValue === oldValue) { return; }\r\n if (vm.courseActiveItem && newValue) {\r\n elementLoad();\r\n } else {\r\n if (vm.countingSecsInterval) {\r\n $interval.cancel(vm.countingSecsInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function dataInit() {\r\n //該頁會使用變數都在這裡\r\n vm.view = {\r\n show: false, //............這個元件是否應該顯示\r\n content: false, //..........試題頁\r\n examInfo: false, //.........測驗額外資訊\r\n result: false, //...........測驗回傳結果\r\n resultTest: false, //.......回傳結果顯示頁面(測試)\r\n resultQuest: false, //......回傳結果顯示頁面(問卷)\r\n dataLoadSucess: false, //...畫面讀取成功\r\n dataLoadFail: false, //.....畫面讀取失敗\r\n hasSubmit: false, //........是否送出過\r\n canRetry: false, //.........是否能重新受測\r\n };\r\n vm.importData = {\r\n //為避免雙向綁定造成的一些狀況,要將來源資料保存\r\n courseActiveItem: null,\r\n sessionId: null,\r\n };\r\n vm.data = {\r\n countingSecs: 0,\r\n examContent: null,\r\n examContentGroup: null,\r\n examContentRefer: null,\r\n result: null\r\n };\r\n vm.courseActiveItem = vm.courseActiveItem || null;\r\n vm.sessionId = vm.sessionId || null;\r\n vm.showView = vm.showView || false;\r\n if (vm.countingSecsInterval) {\r\n $interval.cancel(vm.countingSecsInterval);\r\n }\r\n }\r\n\r\n function elementLoad() {\r\n $q.when(dataInit()).then(function() {\r\n if (!vm.courseActiveItem || !vm.sessionId) {\r\n return;\r\n }\r\n if (vm.courseActiveItem.type !== \"測驗\" && vm.courseActiveItem.type !== \"問卷\") {\r\n return;\r\n }\r\n vm.view.show = true;\r\n vm.importData.courseActiveItem = angular.copy(vm.courseActiveItem);\r\n vm.importData.sessionId = angular.copy(vm.sessionId);\r\n //=====\r\n var examItemOrder;\r\n trainingInnerService.getExamSurveyContent(vm.importData.sessionId, vm.importData.courseActiveItem)\r\n .then(function(data) {\r\n if (!data) {\r\n vm.view.dataLoadFail = true;\r\n return;\r\n }\r\n vm.data.examContent = data;\r\n vm.data.examContent.limitTimesText = limitTimesFormat(vm.data.examContent.limitTimes);\r\n if (vm.data.examContent.remainingTimes > vm.data.examContent.limitTimes) {\r\n vm.data.examContent.remainingTimes = vm.data.examContent.limitTimes;\r\n }\r\n if (vm.courseActiveItem.type === \"測驗\") {\r\n vm.view.examInfo = true;\r\n }\r\n if (vm.data.examContent.remainingMins > 0) {\r\n vm.countingSecsInterval = $interval(function() {\r\n if (vm.data.countingSecs < 1) {\r\n vm.data.countingSecs = 0;\r\n submitExam(true, true);\r\n } else {\r\n vm.data.countingSecs--;\r\n }\r\n }, 1000);\r\n }\r\n vm.data.countingSecs = remainingMinsFormat(vm.data.examContent.remainingMins);\r\n vm.view.content = true;\r\n vm.view.canRetry = (vm.data.examContent.remainingTimes < 0 || vm.data.examContent.remainingTimes > 1);\r\n vm.data.examContentRefer = {}; // 作為類似DIctionary的索引\r\n vm.data.examContentGroup = _.chain(vm.data.examContent.questions)\r\n .groupBy(\"groupName\")\r\n .map(function(examList) {\r\n examItemOrder = 1;\r\n _.forEach(examList, function(examItem) {\r\n //===索引製作===\r\n if (!vm.data.examContentRefer[examItem.questionId]) {\r\n vm.data.examContentRefer[examItem.questionId] = [];\r\n }\r\n vm.data.examContentRefer[examItem.questionId].push(examItem);\r\n //=============\r\n //===自訂屬性===\r\n examItem.order = examItemOrder++;\r\n examItem.value = null;\r\n examItem.typeText = '';\r\n examItem.isCorrect = null;\r\n examItem.showOrder = false;\r\n examItem.choiceStyle = {\r\n Line: false,\r\n Layer: false\r\n };\r\n _.forEach(examItem.options, function(optionItem) {\r\n optionItem.textValue = ''; //..........專門給選擇題帶問答區塊使用(像是其他)\r\n optionItem.preTitle = false; //........標題是否要前置\r\n optionItem.correctAnswer = null; //....代表為正確答案\r\n });\r\n //=============\r\n switch (examItem.questionType) {\r\n case 2:\r\n //複選\r\n examItem.choiceStyle.Layer = true;\r\n examItem.typeText = $rootScope.translate.tsunTestTypeMulti;\r\n if (!examItem.options) {\r\n break;\r\n }\r\n examItem.value = [null]; //預設位置0為NULL(因為照ORDER處理)\r\n // _.forEach(examItem.options, function (optionItem) {\r\n // if (optionItem.value) {\r\n // examItem.value[optionItem.order] = true;\r\n // }\r\n // else {\r\n // examItem.value[optionItem.order] = false;\r\n // }\r\n // });\r\n break;\r\n case 3:\r\n //問答\r\n examItem.choiceStyle.Layer = true;\r\n examItem.typeText = $rootScope.translate.tsunTestTypeEssay;\r\n examItem.value = \"\";\r\n // if (examItem.options.length > 0) {\r\n // examItem.value = examItem.options[0].value;\r\n // }\r\n break;\r\n case 7:\r\n //填充\r\n examItem.choiceStyle.Layer = true;\r\n examItem.typeText = $rootScope.translate.tsunTestTypeBlankFill;\r\n examItem.value = \"\";\r\n // if (examItem.options.length > 0) {\r\n // examItem.value = examItem.options[0].value;\r\n // }\r\n break;\r\n case 1:\r\n case 6:\r\n //單選\r\n //是非題\r\n examItem.choiceStyle.Layer = true;\r\n examItem.typeText = $rootScope.translate.tsunTestTypeSingle;\r\n examItem.value = 0;\r\n // _.forEach(examItem.options, function (optionItem) {\r\n // if (examItem.value < 1 && optionItem.value && optionItem.order > 0) {\r\n // examItem.value = optionItem.order;\r\n // }\r\n // });\r\n break;\r\n case 4:\r\n case 5:\r\n examItem.showOrder = true;\r\n examItem.options[0].preTitle = true;\r\n examItem.choiceStyle.Line = true;\r\n examItem.typeText = '';\r\n examItem.value = 0;\r\n // _.forEach(examItem.options, function (optionItem) {\r\n // if (examItem.value < 1 && optionItem.value && optionItem.order > 0) {\r\n // examItem.value = optionItem.order;\r\n // }\r\n // });\r\n break;\r\n default:\r\n //其餘\r\n examItem.choiceStyle.Line = true;\r\n examItem.typeText = '';\r\n examItem.value = 0;\r\n // _.forEach(examItem.options, function (optionItem) {\r\n // if (examItem.value < 1 && optionItem.value && optionItem.order > 0) {\r\n // examItem.value = optionItem.order;\r\n // }\r\n // });\r\n break;\r\n }\r\n });\r\n return {\r\n 'key': examList[0].groupName,\r\n 'value': examList\r\n };\r\n }).value();\r\n vm.view.dataLoadSucess = true;\r\n \r\n // 解決表單有時在IE無法輸入問題\r\n fixIeNotAbleToInput('.modal');\r\n\r\n });\r\n });\r\n }\r\n\r\n function countingTimeShowing(timeSpan) {\r\n if (timeSpan !== parseInt(timeSpan, 10)) {\r\n //如果有特別顯示字樣就不處理了。\r\n return timeSpan;\r\n }\r\n var sec_num;\r\n try {\r\n sec_num = parseInt(timeSpan, 10); // don't forget the second param\r\n } catch (exp) {\r\n sec_num = 0;\r\n }\r\n var minutes = Math.floor((sec_num / 60));\r\n var seconds = sec_num - (minutes * 60);\r\n if (minutes < 10) { minutes = \"0\" + minutes; }\r\n if (seconds < 10) { seconds = \"0\" + seconds; }\r\n return minutes + ':' + seconds;\r\n }\r\n\r\n function submitExam(finish, forceSubmit) {\r\n if (!finish) { return; }\r\n if (vm.countingSecsInterval) {\r\n $interval.cancel(vm.countingSecsInterval);\r\n }\r\n var itemType;\r\n var questRequiredUnAnswer = '';\r\n var questRequiredUnAnswerPerGroup = {};\r\n var questUnAnswer = '';\r\n var questUnAnswerPerGroup = {};\r\n var strEmptyGroupName = '';\r\n var otherAns = '';// 其他答案的自填答案\r\n itemType = vm.importData.courseActiveItem ? vm.importData.courseActiveItem.type : '';\r\n vm.data.examContent.finish = finish ? 1 : 0;\r\n vm.data.examContent.answers = [];\r\n _.forEach(vm.data.examContent.questions, function(examItem) {\r\n\r\n if (!examItem.groupName || examItem.groupName.lenght < 1) {\r\n examItem.groupName = strEmptyGroupName;\r\n }\r\n var perAnswer = '';\r\n var examItemAnswer = '';\r\n if (angular.isArray(examItem.value)) {\r\n _.forEach(examItem.value, function(value, valueIndex) {\r\n //console.log('examItem:', examItem);\r\n if (value && valueIndex > 0) {\r\n if (examItemAnswer) { examItemAnswer += ','; }\r\n examItemAnswer += valueIndex;\r\n }\r\n });\r\n //加上其他答案(複選)\r\n if (examItem.options[examItem.options.length - 1].textValue) {\r\n otherAns = examItem.options[examItem.options.length - 1].textValue;\r\n examItemAnswer += ',clOtherAnswer=' + otherAns;\r\n }\r\n if (!examItemAnswer) { examItemAnswer = 0; }\r\n //console.log('examItemAnswer:', examItemAnswer);\r\n } else {\r\n examItemAnswer = angular.copy(examItem.value);\r\n //加上其他答案 (單選)\r\n if (examItem.options[examItem.options.length - 1].textValue) {\r\n otherAns = examItem.options[examItem.options.length - 1].textValue;\r\n examItemAnswer += ',clOtherAnswer=' + otherAns;\r\n }\r\n //console.log('examItem22:', examItemAnswer);\r\n }\r\n //console.log(\"exam order:\", examItem.order, \".....examItemAnswer:\", examItemAnswer);\r\n if (!examItemAnswer || examItemAnswer.length < 1) {\r\n examItemAnswer = '0';\r\n if (examItem.questionType === 3 || examItem.questionType === 7) {\r\n examItemAnswer = '\\0';\r\n }\r\n if (examItem.required) {\r\n if (!questRequiredUnAnswerPerGroup[examItem.groupName]) {\r\n questRequiredUnAnswerPerGroup[examItem.groupName] = '';\r\n }\r\n if (questRequiredUnAnswerPerGroup[examItem.groupName].length > 0) {\r\n questRequiredUnAnswerPerGroup[examItem.groupName] += ',';\r\n }\r\n questRequiredUnAnswerPerGroup[examItem.groupName] += examItem.order;\r\n } else {\r\n if (!questUnAnswerPerGroup[examItem.groupName]) {\r\n questUnAnswerPerGroup[examItem.groupName] = '';\r\n }\r\n if (questUnAnswerPerGroup[examItem.groupName].length > 0) {\r\n questUnAnswerPerGroup[examItem.groupName] += ',';\r\n }\r\n questUnAnswerPerGroup[examItem.groupName] += examItem.order;\r\n }\r\n }\r\n if (examItemAnswer) {\r\n perAnswer = examItemAnswer;\r\n perAnswer = examItem.questionId + \"_\" + perAnswer;\r\n }\r\n if (perAnswer) {\r\n vm.data.examContent.answers.push(perAnswer);\r\n }\r\n\r\n });\r\n //======必填欄位驗證\r\n _.forEach(questRequiredUnAnswerPerGroup, function(value, key) {\r\n if (key.lenght > 0) {\r\n questRequiredUnAnswer += key + ':';\r\n }\r\n questRequiredUnAnswer += value + '\\n';\r\n });\r\n if (questRequiredUnAnswer.length > 0 && vm.data.examContent.finish === 1 && !forceSubmit) {\r\n toastr.warning($rootScope.translate.tsunTest + '\\n' + questRequiredUnAnswer + $rootScope.translate.tsunTestRequiredAlert);\r\n return;\r\n }\r\n //=====未填欄位確認\r\n _.forEach(questUnAnswerPerGroup, function(value, key) {\r\n if (key.lenght > 0) {\r\n questUnAnswer += key + ':';\r\n }\r\n questUnAnswer += value + '\\n';\r\n });\r\n\r\n vm.data.examContent.activeItemtype = itemType; //TODO 這邊加入是為了測試環境的簡單互動,若要移除測試環境時可以將此行拿掉。\r\n if (questUnAnswer.length > 0 && vm.data.examContent.finish === 1 && !forceSubmit) {\r\n\r\n var confirmDialog = modalService.confrimDialog({\r\n confirmContent: ($rootScope.translate.tsunTest + '\\n' + questUnAnswer + $rootScope.translate.tsunTestComfirm),\r\n });\r\n confirmDialog.result.then(function(result) {\r\n result = !!result;\r\n if (result !== true) {\r\n return;\r\n }\r\n return postExamSurveyContent(finish, itemType);\r\n });\r\n } else {\r\n return postExamSurveyContent(finish, itemType);\r\n }\r\n }\r\n\r\n function postExamSurveyContent(finish, itemType) {\r\n console.log(\"examContent :\", vm.data.examContent);\r\n var resultPost = trainingInnerService.postExamSurveyContent(vm.importData.sessionId, vm.data.examContent);\r\n return resultPost.then(function(result) {\r\n console.log(\"postExamSurveyContent result:\", result);\r\n if (!result) { return; }\r\n vm.data.result = result;\r\n viewShowContentFormat();\r\n vm.view.hasSubmit = true;\r\n vm.view.examInfo = false;\r\n\r\n // 問卷後續會 emit 報名課程作業,因此由那邊顯示成功或失敗訊息即可\r\n if (finish && itemType === '測驗') {\r\n console.log('yo-postExamSurveyContent:', result);\r\n //應台新要求將發送成功的訊息拿掉\r\n //toastr.success($rootScope.translate.tsunSendSuccess); \r\n }\r\n\r\n if (itemType === '測驗') {\r\n vm.view.resultTest = true;\r\n }\r\n if (itemType === '問卷') {\r\n vm.view.resultQuest = true;\r\n }\r\n if (itemType === '測驗' && vm.data.examContent.finish === 1) {\r\n vm.view.result = true;\r\n //測驗結果顯示\r\n _.forEach(vm.data.result.questionResults, function(resultItem) {\r\n var referData;\r\n //===資料檢核===\r\n if (!vm.data.examContentRefer[resultItem.questionId]) { return; }\r\n if (!angular.isArray(vm.data.examContentRefer[resultItem.questionId])) { return; }\r\n //=============\r\n referData = vm.data.examContentRefer[resultItem.questionId];\r\n _.forEach(referData, function(examItem) {\r\n var resultCorrectAnswerForMulti = resultItem.correctAnswer.split(',');\r\n examItem.isCorrect = (resultItem.correctAnswer === resultItem.studentAnswer);\r\n examItem.value = null;\r\n //=====處理學生填答=====\r\n if (examItem.questionType === 3 || examItem.questionType === 7) {\r\n examItem.value = resultItem.studentAnswer;\r\n } else if (examItem.questionType === 2) {\r\n var resultStudentAnswer = resultItem.studentAnswer.split(',');\r\n examItem.value = [];\r\n _.forEach(resultStudentAnswer, function(answerItem) {\r\n examItem.value[answerItem] = true;\r\n });\r\n } else {\r\n examItem.value = resultItem.studentAnswer;\r\n }\r\n //===================\r\n //=====正確答案處理=====\r\n //若resultItem.correctAnswer為空應該就是沒有正確答案 = 不用處理\r\n if (resultItem.correctAnswer.length < 1) { return; }\r\n _.forEach(examItem.options, function(optionItem) {\r\n var optionOrder = optionItem.order + '';\r\n\r\n if (examItem.questionType === 3 || examItem.questionType === 7) {\r\n // 移除此行避免用戶輸入的資料變成正確資料\r\n // examItem.value = resultItem.correctAnswer;\r\n optionItem.correctAnswer = resultItem.correctAnswer;\r\n //console.log('examItem:', examItem);\r\n } else if (examItem.questionType === 2) {\r\n _.forEach(resultCorrectAnswerForMulti, function(answerItem) {\r\n //console.log('answerItem:',answerItem);\r\n //optionItem.correctAnswer = false; //\r\n if (optionOrder === answerItem) {\r\n optionItem.correctAnswer = true;\r\n }\r\n });\r\n } else {\r\n optionItem.correctAnswer = (optionOrder === resultItem.correctAnswer);\r\n }\r\n });\r\n\r\n //=====================\r\n });\r\n });\r\n }\r\n\r\n // 觸發 emitExamSubmit 執行報名作業\r\n // courseDetailModalController enroll\r\n $scope.$emit('emitExamSubmit', '');\r\n\r\n });\r\n }\r\n\r\n function viewShowContentFormat() {\r\n vm.view.resultTest = false;\r\n vm.view.resultQuest = false;\r\n vm.view.content = false;\r\n }\r\n\r\n function retryTest() {\r\n elementLoad();\r\n $scope.$emit('goTop', '');\r\n }\r\n\r\n function reviewContent() {\r\n viewShowContentFormat();\r\n vm.view.content = true;\r\n }\r\n\r\n function reviewResult() {\r\n viewShowContentFormat();\r\n vm.view.resultTest = true;\r\n }\r\n\r\n function limitTimesFormat(times) {\r\n var result = times;\r\n if (parseInt(times) < 0) {\r\n result = $rootScope.translate.tsunNoLimit;\r\n }\r\n return result;\r\n }\r\n\r\n function remainingMinsFormat(remainMins) {\r\n var result = '';\r\n if (remainMins > -1) {\r\n result = remainMins;\r\n } else {\r\n result = $rootScope.translate.tsunNoLimit;\r\n }\r\n return result;\r\n }\r\n }\r\n})();"]}