src/resources/vendorlibs/angularjs-datepicker/angular-datepicker.js
File `angular-datepicker.js` has 789 lines of code (exceeds 250 allowed). Consider refactoring./*global angular document navigator*/Function `withAngular` has a Cognitive Complexity of 438 (exceeds 5 allowed). Consider refactoring.
Function `withAngular` has 786 lines of code (exceeds 25 allowed). Consider refactoring.(function withAngular(angular, navigator) { 'use strict'; var A_DAY_IN_MILLISECONDS = 86400000 , isMobile = (function isMobile() { Consider simplifying this complex logical expression. if (navigator.userAgent && (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i))) { return true; } }())Function `generateMonthAndYearHeader` has 48 lines of code (exceeds 25 allowed). Consider refactoring. , generateMonthAndYearHeader = function generateMonthAndYearHeader(prevButton, nextButton, preventMobile) { if (preventMobile) { isMobile = false; } if (isMobile) { return [ '<div class="_720kb-datepicker-calendar-header">', '<div class="_720kb-datepicker-calendar-header-middle _720kb-datepicker-mobile-item _720kb-datepicker-calendar-month">', '<select ng-model="month" title="{{ dateMonthTitle }}" ng-change="selectedMonthHandle(month)">', '<option ng-repeat="item in months" ng-selected="item === month" ng-disabled=\'!isSelectableMaxDate(item + " " + day + ", " + year) || !isSelectableMinDate(item + " " + day + ", " + year)\' ng-value="$index + 1" value="$index + 1">', '{{ item }}', '</option>', '</select>', '</div>', '</div>', '<div class="_720kb-datepicker-calendar-header">', '<div class="_720kb-datepicker-calendar-header-middle _720kb-datepicker-mobile-item _720kb-datepicker-calendar-month">', '<select ng-model="mobileYear" title="{{ dateYearTitle }}" ng-change="setNewYear(mobileYear)">', '<option ng-repeat="item in paginationYears track by $index" ng-selected="year === item" ng-disabled="!isSelectableMinYear(item) || !isSelectableMaxYear(item)" ng-value="item" value="item">', '{{ item }}', '</option>', '</select>', '</div>', '</div>' ]; } return [ '<div class="_720kb-datepicker-calendar-header">', '<div class="_720kb-datepicker-calendar-header-left">', '<a class="_720kb-datepicker-calendar-month-button" href="javascript:void(0)" ng-class="{\'_720kb-datepicker-item-hidden\': !willPrevMonthBeSelectable()}" ng-click="prevMonth()" title="{{ buttonPrevTitle }}">', prevButton, '</a>', '</div>', '<div class="_720kb-datepicker-calendar-header-middle _720kb-datepicker-calendar-month">', '{{month}} ', '<a href="javascript:void(0)" ng-click="paginateYears(year); showYearsPagination = !showYearsPagination;">', '<span>', '{{year}}', '<i ng-class="{\'_720kb-datepicker-calendar-header-closed-pagination\': !showYearsPagination, \'_720kb-datepicker-calendar-header-opened-pagination\': showYearsPagination}"></i>', '</span>', '</a>', '</div>', '<div class="_720kb-datepicker-calendar-header-right">', '<a class="_720kb-datepicker-calendar-month-button" ng-class="{\'_720kb-datepicker-item-hidden\': !willNextMonthBeSelectable()}" href="javascript:void(0)" ng-click="nextMonth()" title="{{ buttonNextTitle }}">', nextButton, '</a>', '</div>', '</div>' ]; } , generateYearsPaginationHeader = function generateYearsPaginationHeader(prevButton, nextButton) { return [ '<div class="_720kb-datepicker-calendar-header" ng-show="showYearsPagination">', '<div class="_720kb-datepicker-calendar-years-pagination">', '<a ng-class="{\'_720kb-datepicker-active\': y === year, \'_720kb-datepicker-disabled\': !isSelectableMaxYear(y) || !isSelectableMinYear(y)}" href="javascript:void(0)" ng-click="setNewYear(y)" ng-repeat="y in paginationYears track by $index">', '{{y}}', '</a>', '</div>', '<div class="_720kb-datepicker-calendar-years-pagination-pages">', '<a href="javascript:void(0)" ng-click="paginateYears(paginationYears[0])" ng-class="{\'_720kb-datepicker-item-hidden\': paginationYearsPrevDisabled}">', prevButton, '</a>', '<a href="javascript:void(0)" ng-click="paginateYears(paginationYears[paginationYears.length -1 ])" ng-class="{\'_720kb-datepicker-item-hidden\': paginationYearsNextDisabled}">', nextButton, '</a>', '</div>', '</div>' ]; } , generateDaysColumns = function generateDaysColumns() { return [ '<div class="_720kb-datepicker-calendar-days-header">', '<div ng-repeat="d in daysInString">', '{{d}}', '</div>', '</div>' ]; } , generateDays = function generateDays() { return [ '<div class="_720kb-datepicker-calendar-body">', '<a href="javascript:void(0)" ng-repeat="px in prevMonthDays" class="_720kb-datepicker-calendar-day _720kb-datepicker-disabled">', '{{px}}', '</a>', '<a href="javascript:void(0)" ng-repeat="item in days" ng-click="setDatepickerDay(item)" ng-class="{\'_720kb-datepicker-active\': selectedDay === item && selectedMonth === monthNumber && selectedYear === year, \'_720kb-datepicker-disabled\': !isSelectableMinDate(year + \'/\' + monthNumber + \'/\' + item ) || !isSelectableMaxDate(year + \'/\' + monthNumber + \'/\' + item) || !isSelectableDate(monthNumber, year, item) || !isSelectableDay(monthNumber, year, item),\'_720kb-datepicker-today\': item === today.getDate() && monthNumber === (today.getMonth() + 1) && year === today.getFullYear()}" class="_720kb-datepicker-calendar-day">', '{{item}}', '</a>', '<a href="javascript:void(0)" ng-repeat="nx in nextMonthDays" class="_720kb-datepicker-calendar-day _720kb-datepicker-disabled">', '{{nx}}', '</a>', '</div>' ]; } , generateHtmlTemplate = function generateHtmlTemplate(prevButton, nextButton, preventMobile) { var toReturn = [ '<div class="_720kb-datepicker-calendar {{datepickerClass}} {{datepickerID}}" ng-class="{\'_720kb-datepicker-forced-to-open\': checkVisibility()}" ng-blur="hideCalendar()">', '</div>' ] , monthAndYearHeader = generateMonthAndYearHeader(prevButton, nextButton, preventMobile) , yearsPaginationHeader = generateYearsPaginationHeader(prevButton, nextButton) , daysColumns = generateDaysColumns() , days = generateDays() , iterator = function iterator(aRow) { toReturn.splice(toReturn.length - 1, 0, aRow); }; monthAndYearHeader.forEach(iterator); yearsPaginationHeader.forEach(iterator); daysColumns.forEach(iterator); days.forEach(iterator); return toReturn.join(''); }Function `datepickerDirective` has 658 lines of code (exceeds 25 allowed). Consider refactoring.
Function `datepickerDirective` has 6 arguments (exceeds 4 allowed). Consider refactoring. , datepickerDirective = function datepickerDirective($window, $compile, $locale, $filter, $interpolate, $timeout) { Function `linkingFunction` has 633 lines of code (exceeds 25 allowed). Consider refactoring. var linkingFunction = function linkingFunction($scope, element, attr) { $scope.today = new Date(); //get child input var selector = attr.selector , thisInput = angular.element(selector ? element[0].querySelector('.' + selector) : element[0].children[0]) , theCalendar , defaultPrevButton = '<b class="_720kb-datepicker-default-button">⟨</b>' , defaultNextButton = '<b class="_720kb-datepicker-default-button">⟩</b>' , prevButton = attr.buttonPrev || defaultPrevButton , nextButton = attr.buttonNext || defaultNextButton , dateFormat = attr.dateFormat //, dateMinLimit //, dateMaxLimit , dateDisabledDates = $scope.$eval($scope.dateDisabledDates) , dateEnabledDates = $scope.$eval($scope.dateEnabledDates) , dateDisabledWeekdays = $scope.$eval($scope.dateDisabledWeekdays) , date = new Date() , isMouseOn = false , isMouseOnInput = false , preventMobile = typeof attr.datepickerMobile !== 'undefined' && attr.datepickerMobile !== 'false' , datetime = $locale.DATETIME_FORMATS , pageDatepickers , hours24h = 86400000 , htmlTemplate = generateHtmlTemplate(prevButton, nextButton, preventMobile) , n , onClickOnWindow = function onClickOnWindow() { if (!isMouseOn && !isMouseOnInput && theCalendar) { $scope.hideCalendar(); } }Function `setDaysInMonth` has 45 lines of code (exceeds 25 allowed). Consider refactoring. , setDaysInMonth = function setDaysInMonth(month, year) { var i , limitDate = new Date(year, month, 0).getDate() , firstDayMonthNumber = new Date(year + '/' + month + '/' + 1).getDay() , lastDayMonthNumber = new Date(year + '/' + month + '/' + limitDate).getDay() , prevMonthDays = [] , nextMonthDays = [] , howManyNextDays , howManyPreviousDays , monthAlias , dateWeekEndDay; $scope.days = []; $scope.dateWeekStartDay = $scope.validateWeekDay($scope.dateWeekStartDay); dateWeekEndDay = ($scope.dateWeekStartDay + 6) % 7; for (i = 1; i <= limitDate; i += 1) { $scope.days.push(i); } //get previous month days if first day in month is not first day in week if (firstDayMonthNumber === $scope.dateWeekStartDay) { //no need for it $scope.prevMonthDays = []; } else { howManyPreviousDays = firstDayMonthNumber - $scope.dateWeekStartDay; if (firstDayMonthNumber < $scope.dateWeekStartDay) { howManyPreviousDays += 7; } //get previous month if (Number(month) === 1) { monthAlias = 12; } else { monthAlias = month - 1; } //return previous month days for (i = 1; i <= new Date(year, monthAlias, 0).getDate(); i += 1) { prevMonthDays.push(i); } //attach previous month days $scope.prevMonthDays = prevMonthDays.slice(-howManyPreviousDays); } //get next month days if last day in month is not last day in week if (lastDayMonthNumber === dateWeekEndDay) { //no need for it $scope.nextMonthDays = []; } else { howManyNextDays = 6 - lastDayMonthNumber + $scope.dateWeekStartDay; if (lastDayMonthNumber < $scope.dateWeekStartDay) { howManyNextDays -= 7; } //get previous month //return next month days for (i = 1; i <= howManyNextDays; i += 1) { nextMonthDays.push(i); } //attach previous month days $scope.nextMonthDays = nextMonthDays; } }Similar blocks of code found in 2 locations. Consider refactoring. , resetToMinDate = function resetToMinDate() { $scope.month = $filter('date')(new Date($scope.dateMinLimit), 'MMMM'); $scope.monthNumber = Number($filter('date')(new Date($scope.dateMinLimit), 'MM')); $scope.day = Number($filter('date')(new Date($scope.dateMinLimit), 'dd')); $scope.year = Number($filter('date')(new Date($scope.dateMinLimit), 'yyyy')); setDaysInMonth($scope.monthNumber, $scope.year); }Similar blocks of code found in 2 locations. Consider refactoring. , resetToMaxDate = function resetToMaxDate() { $scope.month = $filter('date')(new Date($scope.dateMaxLimit), 'MMMM'); $scope.monthNumber = Number($filter('date')(new Date($scope.dateMaxLimit), 'MM')); $scope.day = Number($filter('date')(new Date($scope.dateMaxLimit), 'dd')); $scope.year = Number($filter('date')(new Date($scope.dateMaxLimit), 'yyyy')); setDaysInMonth($scope.monthNumber, $scope.year); } , prevYear = function prevYear() { $scope.year = Number($scope.year) - 1; } , nextYear = function nextYear() { $scope.year = Number($scope.year) + 1; }Function `localDateTimestamp` has 45 lines of code (exceeds 25 allowed). Consider refactoring. , localDateTimestamp = function localDateTimestamp(rawDate, dateFormatDefinition) { var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|MMMM|MMM|MM|M|dd?d?|yy?yy?y?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g ,formatDate,dateSplit, m, d, y, index, el, longName, shortName; for (index = 0; index < datetime.MONTH.length; index += 1) { longName = datetime.MONTH[index]; shortName = datetime.SHORTMONTH[index]; if (rawDate.indexOf(longName) !== -1) { rawDate = rawDate.replace(longName, index + 1); break; } if (rawDate.indexOf(shortName) !== -1) { rawDate = rawDate.replace(shortName, index + 1); break; } } dateSplit = rawDate .split(/\D/) .filter(function dateSplitFilter(item) { return item.length > 0; }); formatDate = dateFormatDefinition .match(formattingTokens) .filter(function fromatDateFilter(item) { return item.match(/^[a-zA-Z]+$/i) !== null; }); for (index = 0; index < formatDate.length; index += 1) { el = formatDate[index]; switch (true) {Similar blocks of code found in 3 locations. Consider refactoring. case el.indexOf('d') !== -1: { d = dateSplit[index - (formatDate.length - dateSplit.length)]; break; }Similar blocks of code found in 3 locations. Consider refactoring. case el.indexOf('M') !== -1: { m = dateSplit[index - (formatDate.length - dateSplit.length)]; break; }Similar blocks of code found in 3 locations. Consider refactoring. case el.indexOf('y') !== -1: { y = dateSplit[index - (formatDate.length - dateSplit.length)]; break; } default: { break; } } } return new Date(y + '/' + m + '/' + d); } , setInputValue = function setInputValue() { if ($scope.isSelectableMinDate($scope.year + '/' + $scope.monthNumber + '/' + $scope.day) && $scope.isSelectableMaxDate($scope.year + '/' + $scope.monthNumber + '/' + $scope.day)) { var modelDate = new Date($scope.year + '/' + $scope.monthNumber + '/' + $scope.day); if (attr.dateFormat) { thisInput.val($filter('date')(modelDate, dateFormat)); } else { thisInput.val(modelDate); } thisInput.triggerHandler('input'); thisInput.triggerHandler('change');//just to be sure; } else { return false; } } , classHelper = { 'add': function add(ele, klass) { var classes; if (ele.className.indexOf(klass) > -1) { return; } classes = ele.className.split(' '); classes.push(klass); ele.className = classes.join(' '); }, 'remove': function remove(ele, klass) { var i , classes; if (ele.className.indexOf(klass) === -1) { return; } classes = ele.className.split(' '); for (i = 0; i < classes.length; i += 1) { if (classes[i] === klass) { classes = classes.slice(0, i).concat(classes.slice(i + 1)); break; } } ele.className = classes.join(' '); } }Function `showCalendar` has 33 lines of code (exceeds 25 allowed). Consider refactoring. , showCalendar = function showCalendar() { //lets hide all the latest instances of datepicker pageDatepickers = $window.document.getElementsByClassName('_720kb-datepicker-calendar'); angular.forEach(pageDatepickers, function forEachDatepickerPages(value, key) { if (pageDatepickers[key].classList) { pageDatepickers[key].classList.remove('_720kb-datepicker-open'); } else { classHelper.remove(pageDatepickers[key], '_720kb-datepicker-open'); } }); if (theCalendar.classList) { theCalendar.classList.add('_720kb-datepicker-open');Identical blocks of code found in 3 locations. Consider refactoring. if (dateFormat) { date = localDateTimestamp(thisInput[0].value.toString(), dateFormat); } else { date = new Date(thisInput[0].value.toString()); } $scope.selectedMonth = Number($filter('date')(date, 'MM')); $scope.selectedDay = Number($filter('date')(date, 'dd')); $scope.selectedYear = Number($filter('date')(date, 'yyyy')); } else { classHelper.add(theCalendar, '_720kb-datepicker-open'); } $scope.today = new Date(); $timeout(function timeoutForYears() { if ($scope.selectedDay) { $scope.year = $scope.selectedYear; $scope.monthNumber = $scope.selectedMonth; } else { $scope.year = $scope.today.getFullYear(); $scope.monthNumber = $scope.today.getMonth() + 1; } $scope.month = $filter('date')(new Date($scope.year, $scope.monthNumber - 1), 'MMMM'); setDaysInMonth($scope.monthNumber, $scope.year); }, 0); } , checkToggle = function checkToggle() { if (!$scope.datepickerToggle) { return true; } return $scope.$eval($scope.datepickerToggle); } , checkVisibility = function checkVisibility() { if (!$scope.datepickerShow) { return false; }Identical blocks of code found in 3 locations. Consider refactoring. if (dateFormat) { date = localDateTimestamp(thisInput[0].value.toString(), dateFormat); } else { date = new Date(thisInput[0].value.toString()); } $scope.selectedMonth = Number($filter('date')(date, 'MM')); $scope.selectedDay = Number($filter('date')(date, 'dd')); $scope.selectedYear = Number($filter('date')(date, 'yyyy')); return $scope.$eval($scope.datepickerShow); } , unregisterDataSetWatcher = $scope.$watch('dateSet', function dateSetWatcher(newValue) { if (newValue && !isNaN(Date.parse(newValue))) { date = new Date(newValue); $scope.month = $filter('date')(date, 'MMMM');//december-November like $scope.monthNumber = Number($filter('date')(date, 'MM')); // 01-12 like $scope.day = Number($filter('date')(date, 'dd')); //01-31 like $scope.year = Number($filter('date')(date, 'yyyy'));//2014 like setDaysInMonth($scope.monthNumber, $scope.year); if ($scope.dateSetHidden !== 'true') { setInputValue(); } } }) , unregisterDateMinLimitWatcher = $scope.$watch('dateMinLimit', function dateMinLimitWatcher(newValue) { if (newValue) { resetToMinDate(); } }) , unregisterDateMaxLimitWatcher = $scope.$watch('dateMaxLimit', function dateMaxLimitWatcher(newValue) { if (newValue) { resetToMaxDate(); } }) , unregisterDateFormatWatcher = $scope.$watch('dateFormat', function dateFormatWatcher(newValue) { if (newValue) { setInputValue(); } })Similar blocks of code found in 2 locations. Consider refactoring. , unregisterDateDisabledDatesWatcher = $scope.$watch('dateDisabledDates', function dateDisabledDatesWatcher(newValue) { if (newValue) { dateDisabledDates = $scope.$eval(newValue); if (!$scope.isSelectableDate($scope.monthNumber, $scope.year, $scope.day)) { thisInput.val(''); thisInput.triggerHandler('input'); thisInput.triggerHandler('change');//just to be sure; } } })Similar blocks of code found in 2 locations. Consider refactoring. , unregisterDateEnabledDatesWatcher = $scope.$watch('dateEnabledDates', function dateEnabledDatesWatcher(newValue) { if (newValue) { dateEnabledDates = $scope.$eval(newValue); if (!$scope.isSelectableDate($scope.monthNumber, $scope.year, $scope.day)) { thisInput.val(''); thisInput.triggerHandler('input'); thisInput.triggerHandler('change');//just to be sure; } } }); $scope.nextMonth = function nextMonth() { Similar blocks of code found in 2 locations. Consider refactoring. if ($scope.monthNumber === 12) { $scope.monthNumber = 1; //its happy new year nextYear(); } else { $scope.monthNumber += 1; } //check if max date is ok if ($scope.dateMaxLimit) { if (!$scope.isSelectableMaxDate($scope.year + '/' + $scope.monthNumber + '/' + $scope.days[0])) { resetToMaxDate(); } } //set next month $scope.month = $filter('date')(new Date($scope.year, $scope.monthNumber - 1), 'MMMM'); //reinit days setDaysInMonth($scope.monthNumber, $scope.year); //deactivate selected day $scope.day = undefined; }; $scope.willPrevMonthBeSelectable = function willPrevMonthBeSelectable() { var monthNumber = $scope.monthNumber , year = $scope.year , prevDay = $filter('date')(new Date(new Date(year + '/' + monthNumber + '/01').getTime() - hours24h), 'dd'); //get last day in previous month if (monthNumber === 1) { monthNumber = 12; year = year - 1; } else { monthNumber -= 1; } if ($scope.dateMinLimit) { if (!$scope.isSelectableMinDate(year + '/' + monthNumber + '/' + prevDay)) { return false; } } return true; }; $scope.willNextMonthBeSelectable = function willNextMonthBeSelectable() { var monthNumber = $scope.monthNumber , year = $scope.year; if (monthNumber === 12) { monthNumber = 1; year += 1; } else { monthNumber += 1; } if ($scope.dateMaxLimit) { if (!$scope.isSelectableMaxDate(year + '/' + monthNumber + '/01')) { return false; } } return true; }; $scope.prevMonth = function managePrevMonth() { Similar blocks of code found in 2 locations. Consider refactoring. if ($scope.monthNumber === 1) { $scope.monthNumber = 12; //its happy new year prevYear(); } else { $scope.monthNumber -= 1; } //check if min date is ok if ($scope.dateMinLimit) { if (!$scope.isSelectableMinDate($scope.year + '/' + $scope.monthNumber + '/' + $scope.days[$scope.days.length - 1])) { resetToMinDate(); } } //set next month $scope.month = $filter('date')(new Date($scope.year, $scope.monthNumber - 1), 'MMMM'); //reinit days setDaysInMonth($scope.monthNumber, $scope.year); //deactivate selected day $scope.day = undefined; }; $scope.selectedMonthHandle = function manageSelectedMonthHandle(selectedMonthNumber) { $scope.monthNumber = Number($filter('date')(new Date(selectedMonthNumber + '/01/2000'), 'MM')); setDaysInMonth($scope.monthNumber, $scope.year); setInputValue(); }; $scope.setNewYear = function setNewYear(year) { //deactivate selected day if (!isMobile) { $scope.day = undefined; } if ($scope.dateMaxLimit && $scope.year < Number(year)) { if (!$scope.isSelectableMaxYear(year)) { return; } } else if ($scope.dateMinLimit && $scope.year > Number(year)) { if (!$scope.isSelectableMinYear(year)) { return; } } $scope.paginateYears(year); $scope.showYearsPagination = false; $timeout(function timeoutForYears() { $scope.year = Number(year); setDaysInMonth($scope.monthNumber, $scope.year); }, 0); }; $scope.hideCalendar = function hideCalendar() { if (theCalendar.classList) { theCalendar.classList.remove('_720kb-datepicker-open'); } else { classHelper.remove(theCalendar, '_720kb-datepicker-open'); } }; $scope.setDatepickerDay = function setDatepickerDay(day) { if ($scope.isSelectableDay($scope.monthNumber, $scope.year, day) && $scope.isSelectableDate($scope.monthNumber, $scope.year, day) && $scope.isSelectableMaxDate($scope.year + '/' + $scope.monthNumber + '/' + day) && $scope.isSelectableMinDate($scope.year + '/' + $scope.monthNumber + '/' + day)) { $scope.day = Number(day); $scope.selectedDay = $scope.day; $scope.selectedMonth = $scope.monthNumber; $scope.selectedYear = $scope.year; setInputValue(); if (attr.hasOwnProperty('dateRefocus')) { thisInput[0].focus(); } $scope.hideCalendar(); } }; Function `paginateYears` has 71 lines of code (exceeds 25 allowed). Consider refactoring. $scope.paginateYears = function paginateYears(startingYear) { var i , theNewYears = [] , daysToPrepend = 10 , daysToAppend = 10; $scope.paginationYears = []; if (isMobile) { daysToPrepend = 50; daysToAppend = 50; if ( $scope.dateMinLimit && $scope.dateMaxLimit) { startingYear = new Date($scope.dateMaxLimit).getFullYear(); daysToPrepend = startingYear - new Date($scope.dateMinLimit).getFullYear(); daysToAppend = 1; } } for (i = daysToPrepend; i > 0; i -= 1) { theNewYears.push(Number(startingYear) - i); } for (i = 0; i < daysToAppend; i += 1) { theNewYears.push(Number(startingYear) + i); } //date typing in input date-typer if ($scope.dateTyper === 'true') { Function `onTyping` has 30 lines of code (exceeds 25 allowed). Consider refactoring. thisInput.on('keyup blur', function onTyping() { if (thisInput[0].value && thisInput[0].value.length && thisInput[0].value.length > 0) { try {Identical blocks of code found in 3 locations. Consider refactoring. if (dateFormat) { date = localDateTimestamp(thisInput[0].value.toString(), dateFormat); } else { date = new Date(thisInput[0].value.toString()); } Consider simplifying this complex logical expression. if (date.getFullYear() && !isNaN(date.getDay()) && !isNaN(date.getMonth()) && $scope.isSelectableDay(date.getMonth(), date.getFullYear(), date.getDay()) && $scope.isSelectableDate(date.getMonth(), date.getFullYear(), date.getDay()) && $scope.isSelectableMaxDate(date) && $scope.isSelectableMinDate(date)) { $scope.$apply(function applyTyping() { $scope.month = $filter('date')(date, 'MMMM');//december-November like $scope.monthNumber = Number($filter('date')(date, 'MM')); // 01-12 like $scope.day = Number($filter('date')(date, 'dd')); //01-31 like if (date.getFullYear().toString().length === 4) { $scope.year = Number($filter('date')(date, 'yyyy'));//2014 like } setDaysInMonth($scope.monthNumber, $scope.year); }); } } catch (e) { return e; } } }); } //check range dates if ($scope.dateMaxLimit && theNewYears && theNewYears.length && !$scope.isSelectableMaxYear(Number(theNewYears[theNewYears.length - 1]) + 1)) { $scope.paginationYearsNextDisabled = true; } else { $scope.paginationYearsNextDisabled = false; } if ($scope.dateMinLimit && theNewYears && theNewYears.length && !$scope.isSelectableMinYear(Number(theNewYears[0]) - 1)) { $scope.paginationYearsPrevDisabled = true; } else { $scope.paginationYearsPrevDisabled = false; } $scope.paginationYears = theNewYears; }; $scope.isSelectableDay = function isSelectableDay(monthNumber, year, day) { var i = 0; if (dateDisabledWeekdays && dateDisabledWeekdays.length > 0) { for (i; i <= dateDisabledWeekdays.length; i += 1) { if (dateDisabledWeekdays[i] === new Date(monthNumber + '/' + day + '/' + year).getDay()) { return false; } } } return true; }; $scope.isSelectableDate = function isSelectableDate(monthNumber, year, day) { var i = 0; if (dateDisabledDates && dateDisabledDates.length > 0) { Similar blocks of code found in 2 locations. Consider refactoring. for (i; i <= dateDisabledDates.length; i += 1) { if (new Date(dateDisabledDates[i]).getTime() === new Date(monthNumber + '/' + day + '/' + year).getTime()) { return false; } } } if (dateEnabledDates) { Similar blocks of code found in 2 locations. Consider refactoring. for (i; i <= dateEnabledDates.length; i += 1) { if (new Date(dateEnabledDates[i]).getTime() === new Date(monthNumber + '/' + day + '/' + year).getTime()) { return true; } } return false; } return true; }; Similar blocks of code found in 2 locations. Consider refactoring. $scope.isSelectableMinDate = function isSelectableMinDate(aDate) { //if current date if (!!$scope.dateMinLimit && !!new Date($scope.dateMinLimit) && new Date(aDate).getTime() < new Date($scope.dateMinLimit).getTime()) { return false; } return true; }; Similar blocks of code found in 2 locations. Consider refactoring. $scope.isSelectableMaxDate = function isSelectableMaxDate(aDate) { //if current date if (!!$scope.dateMaxLimit && !!new Date($scope.dateMaxLimit) && new Date(aDate).getTime() > new Date($scope.dateMaxLimit).getTime()) { return false; } return true; }; Similar blocks of code found in 2 locations. Consider refactoring. $scope.isSelectableMaxYear = function isSelectableMaxYear(year) { if (!!$scope.dateMaxLimit && year > new Date($scope.dateMaxLimit).getFullYear()) { return false; } return true; }; Similar blocks of code found in 2 locations. Consider refactoring. $scope.isSelectableMinYear = function isSelectableMinYear(year) { if (!!$scope.dateMinLimit && year < new Date($scope.dateMinLimit).getFullYear()) { return false; } return true; }; $scope.validateWeekDay = function isValidWeekDay(weekDay) { var validWeekDay = Number(weekDay, 10); // making sure that the given option is valid if (!validWeekDay || validWeekDay < 0 || validWeekDay > 6) { validWeekDay = 0; } return validWeekDay; }; // respect previously configured interpolation symbols. htmlTemplate = htmlTemplate.replace(/{{/g, $interpolate.startSymbol()).replace(/}}/g, $interpolate.endSymbol()); $scope.dateMonthTitle = $scope.dateMonthTitle || 'Select month'; $scope.dateYearTitle = $scope.dateYearTitle || 'Select year'; $scope.buttonNextTitle = $scope.buttonNextTitle || 'Next'; $scope.buttonPrevTitle = $scope.buttonPrevTitle || 'Prev'; $scope.month = $filter('date')(date, 'MMMM');//december-November like $scope.monthNumber = Number($filter('date')(date, 'MM')); // 01-12 like $scope.day = Number($filter('date')(date, 'dd')); //01-31 like $scope.dateWeekStartDay = $scope.validateWeekDay($scope.dateWeekStartDay); if ($scope.dateMaxLimit) { $scope.year = Number($filter('date')(new Date($scope.dateMaxLimit), 'yyyy'));//2014 like } else { $scope.year = Number($filter('date')(date, 'yyyy'));//2014 like } $scope.months = datetime.MONTH; $scope.daysInString = []; for (n = $scope.dateWeekStartDay; n <= $scope.dateWeekStartDay + 6; n += 1) { $scope.daysInString.push(n % 7); } $scope.daysInString = $scope.daysInString.map(function mappingFunc(el) { return $filter('date')(new Date(new Date('06/08/2014').valueOf() + A_DAY_IN_MILLISECONDS * el), 'EEE'); }); //create the calendar holder and append where needed if ($scope.datepickerAppendTo && $scope.datepickerAppendTo.indexOf('.') !== -1) { Similar blocks of code found in 2 locations. Consider refactoring. $scope.datepickerID = 'datepicker-id-' + new Date().getTime() + (Math.floor(Math.random() * 6) + 8);Identical blocks of code found in 3 locations. Consider refactoring. angular.element(document.getElementsByClassName($scope.datepickerAppendTo.replace('.', ''))[0]).append($compile(angular.element(htmlTemplate))($scope, function afterCompile(el) { theCalendar = angular.element(el)[0]; })); } else if ($scope.datepickerAppendTo && $scope.datepickerAppendTo.indexOf('#') !== -1) { Similar blocks of code found in 2 locations. Consider refactoring. $scope.datepickerID = 'datepicker-id-' + new Date().getTime() + (Math.floor(Math.random() * 6) + 8);Identical blocks of code found in 3 locations. Consider refactoring. angular.element(document.getElementById($scope.datepickerAppendTo.replace('#', ''))).append($compile(angular.element(htmlTemplate))($scope, function afterCompile(el) { theCalendar = angular.element(el)[0]; })); } else if ($scope.datepickerAppendTo && $scope.datepickerAppendTo === 'body') { $scope.datepickerID = 'datepicker-id-' + (new Date().getTime() + (Math.floor(Math.random() * 6) + 8));Identical blocks of code found in 3 locations. Consider refactoring. angular.element(document).find('body').append($compile(angular.element(htmlTemplate))($scope, function afterCompile(el) { theCalendar = angular.element(el)[0]; })); } else { thisInput.after($compile(angular.element(htmlTemplate))($scope)); //get the calendar as element theCalendar = element[0].querySelector('._720kb-datepicker-calendar'); } //if datepicker-toggle="" is not present or true by default if (checkToggle()) { thisInput.on('focus click focusin', function onFocusAndClick() { isMouseOnInput = true; if (!isMouseOn && !isMouseOnInput && theCalendar) { $scope.hideCalendar(); } else { showCalendar(); } }); } thisInput.on('focusout blur', function onBlurAndFocusOut() { isMouseOnInput = false; }); //some tricky dirty events to fire if click is outside of the calendar and show/hide calendar when needed angular.element(theCalendar).on('mouseenter', function onMouseEnter() { isMouseOn = true; }); angular.element(theCalendar).on('mouseleave', function onMouseLeave() { isMouseOn = false; }); angular.element(theCalendar).on('focusin', function onCalendarFocus() { isMouseOn = true; }); angular.element($window).on('click focus focusin', onClickOnWindow); //check always if given range of dates is okSimilar blocks of code found in 2 locations. Consider refactoring. if ($scope.dateMinLimit && !$scope.isSelectableMinYear($scope.year) || !$scope.isSelectableMinDate($scope.year + '/' + $scope.monthNumber + '/' + $scope.day)) { resetToMinDate(); } Similar blocks of code found in 2 locations. Consider refactoring. if ($scope.dateMaxLimit && !$scope.isSelectableMaxYear($scope.year) || !$scope.isSelectableMaxDate($scope.year + '/' + $scope.monthNumber + '/' + $scope.day)) { resetToMaxDate(); } //datepicker boot start $scope.paginateYears($scope.year); setDaysInMonth($scope.monthNumber, $scope.year); $scope.checkVisibility = checkVisibility; $scope.$on('$destroy', function unregisterListener() { unregisterDataSetWatcher(); unregisterDateMinLimitWatcher(); unregisterDateMaxLimitWatcher(); unregisterDateFormatWatcher(); unregisterDateDisabledDatesWatcher(); unregisterDateEnabledDatesWatcher(); thisInput.off('focus click focusout blur'); angular.element(theCalendar).off('mouseenter mouseleave focusin'); angular.element($window).off('click focus focusin', onClickOnWindow); }); }; return { 'restrict': 'AEC', 'scope': { 'dateSet': '@', 'dateMinLimit': '@', 'dateMaxLimit': '@', 'dateMonthTitle': '@', 'dateYearTitle': '@', 'buttonNextTitle': '@', 'buttonPrevTitle': '@', 'dateDisabledDates': '@', 'dateEnabledDates': '@', 'dateDisabledWeekdays': '@', 'dateSetHidden': '@', 'dateTyper': '@', 'dateWeekStartDay': '@', 'datepickerAppendTo': '@', 'datepickerToggle': '@', 'datepickerClass': '@', 'datepickerShow': '@' }, 'link': linkingFunction }; }; angular.module('720kb.datepicker', []) .directive('datepicker', ['$window', '$compile', '$locale', '$filter', '$interpolate', '$timeout', datepickerDirective]);}(angular, navigator));