/// <reference path="../scripts/angular.js" />
var app;
app = angular.module('constellation', ['ui.bootstrap', 'xeditable', 'ngRoute', 'remoteValidation', 'ui.calendar', 'ui.mask', 'mgcrea.ngStrap', 'ngSanitize', 'isteven-multi-select', 'ngAria', 'ngAnimate', 'ui.tree']);

//app.config(['$httpProvider', function ($httpProvider) {
//    $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
//    $httpProvider.defaults.headers.common['Content-Type'] = 'application/json';
//}]);

app.factory('Base64', function () {
    var keyStr = 'ABCDEFGHIJKLMNOP' +
        'QRSTUVWXYZabcdef' +
        'ghijklmnopqrstuv' +
        'wxyz0123456789+/' +
        '=';
    return {
        encode: function (input) {
            var output = "";
            var chr1, chr2, chr3 = "";
            var enc1, enc2, enc3, enc4 = "";
            var i = 0;

            do {
                chr1 = input.charCodeAt(i++);
                chr2 = input.charCodeAt(i++);
                chr3 = input.charCodeAt(i++);

                enc1 = chr1 >> 2;
                enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
                enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
                enc4 = chr3 & 63;

                if (isNaN(chr2)) {
                    enc3 = enc4 = 64;
                } else if (isNaN(chr3)) {
                    enc4 = 64;
                }

                output = output +
                    keyStr.charAt(enc1) +
                    keyStr.charAt(enc2) +
                    keyStr.charAt(enc3) +
                    keyStr.charAt(enc4);
                chr1 = chr2 = chr3 = "";
                enc1 = enc2 = enc3 = enc4 = "";
            } while (i < input.length);

            return output;
        },

        decode: function (input) {
            var output = "";
            var chr1, chr2, chr3 = "";
            var enc1, enc2, enc3, enc4 = "";
            var i = 0;

            // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
            var base64test = /[^A-Za-z0-9\+\/\=]/g;
            if (base64test.exec(input)) {
                alert("There were invalid base64 characters in the input text.\n" +
                    "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
                    "Expect errors in decoding.");
            }
            input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

            do {
                enc1 = keyStr.indexOf(input.charAt(i++));
                enc2 = keyStr.indexOf(input.charAt(i++));
                enc3 = keyStr.indexOf(input.charAt(i++));
                enc4 = keyStr.indexOf(input.charAt(i++));

                chr1 = (enc1 << 2) | (enc2 >> 4);
                chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
                chr3 = ((enc3 & 3) << 6) | enc4;

                output = output + String.fromCharCode(chr1);

                if (enc3 != 64) {
                    output = output + String.fromCharCode(chr2);
                }
                if (enc4 != 64) {
                    output = output + String.fromCharCode(chr3);
                }

                chr1 = chr2 = chr3 = "";
                enc1 = enc2 = enc3 = enc4 = "";

            } while (i < input.length);

            return output;
        }
    };
});

// SET FIXED LENGTH
// CREDIT: http://stackoverflow.com/questions/17648014/how-can-i-use-an-angularjs-filter-to-format-a-number-to-have-leading-zeros
app.filter('numberFixedLen', function () {
    return function (n, len) {
        var num = parseInt(n, 10);
        len = parseInt(len, 10);
        if (isNaN(num) || isNaN(len)) {
            return n;
        }
        num = '' + num;
        while (num.length < len) {
            num = '0' + num;
        }
        return num;
    };
});

app.filter('split', function () {
    return function (input, splitChar, splitIndex) {
        return input.split(splitChar)[splitIndex];
    }
});

app.filter('digits', function () {
    return function (input) {
        while (input.length < 8) input = '0' + input;
        return input;
    }
});


app.directive('dlEnterKey', function () {
    return function (scope, element, attrs) {

        element.bind("keydown keypress", function (event) {
            var keyCode = event.which || event.keyCode;

            // If enter key is pressed
            if (keyCode === 13) {
                scope.$apply(function () {
                    // Evaluate the expression
                    scope.$eval(attrs.dlEnterKey);
                });

                event.preventDefault();
            }
        });
    };
});

app.directive('convertToNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            ngModel.$parsers.push(function (val) {
                return val != null ? parseInt(val, 10) : null;
            });
            ngModel.$formatters.push(function (val) {
                return val != null ? '' + val : null;
            });
        }
    };
});

app.directive('resetFocus', [function () {
    return function (scope, element, attr, ctrl) {
        if (scope.$last) {
            element.find('input').focus();
        }
        scope.$watch('$last', function () {
            if (scope.$last) {
                element.find('input').focus();
            }
        });
    };
}])

app.directive('validPwd', function () {
    return {
        require: 'ngModel',
        link: function (scope, elm, attrs, ctrl) {
            ctrl.$parsers.unshift(function (viewValue) {
                var containsLetter = containsLetter(viewValue);
                var containsDigit = containsDigit(viewValue);
                var hasCorrectLength = hasCorrectLength(viewValue);

                ctrl.$setValidity('containsLetter', containsLetter);
                ctrl.$setValidity('containsDigit', containsDigit);
                ctrl.$setValidity('hasCorrectLength', hasCorrectLength);

                if (containsLetter && containsDigit && hasCorrectLength) {
                    return viewValue;
                }
                else {
                    return undefined;
                }
            });
        }
    };
});





var directiveId = 'ngMatch';
app.directive(directiveId, ['$parse', function ($parse) {

    var directive = {
        link: link,
        restrict: 'A',
        require: '?ngModel'
    };
    return directive;

    function link(scope, elem, attrs, ctrl) {
        // if ngModel is not defined, we don't need to do anything
        if (!ctrl) return;
        if (!attrs[directiveId]) return;

        var firstPassword = $parse(attrs[directiveId]);

        var validator = function (value) {
            var temp = firstPassword(scope),
            v = value === temp;
            ctrl.$setValidity('match', v);
            return value;
        }

        ctrl.$parsers.unshift(validator);
        ctrl.$formatters.push(validator);
        ctrl.$parsers.unshift(function (viewValue) {
            var pwdValidLength, pwdHasLetter, pwdHasNumber, pwHasOneUpperCase;

            pwdValidLength = (viewValue && viewValue.length >= 8 ? true : false);
            pwdHasLetter = (viewValue && /[A-z]/.test(viewValue)) ? true : false;
            pwdHasOneUpperCase = (viewValue && /[A-Z]/.test(viewValue)) ? true : false;
            pwdHasNumber = (viewValue && /\d/.test(viewValue)) ? true : false;

            if (pwdValidLength && pwdHasLetter && pwdHasNumber && pwdHasOneUpperCase) {
                ctrl.$setValidity('pwd', true);
            } else {
                ctrl.$setValidity('pwd', false);
            }
            return viewValue;
        });
        attrs.$observe(directiveId, function () {
            validator(ctrl.$viewValue);
        });

    }
}]);

app.config(function ($httpProvider) {
    //$httpProvider.interceptors.push('httpRequestInterceptor');


    $httpProvider.interceptors.push(function ($q, $injector, Base64, $rootScope) {
        return {
            request: function (req) {
                // Set the `Authorization` header for every outgoing HTTP request
                req.headers['X-Requested-With'] = 'XMLHttpRequest';
                req.headers['Content-Type'] = 'application/json';
                return req;
            },
            responseError: function (rejection) {
                if (rejection.status === 401) {
                    // Return a new promise

                    // return $injector.get('$http')(rejection.config);

                }

                /* If not a 401, do nothing with this error.
                 * This is necessary to make a `responseError`
                 * interceptor a no-op. */

                return $q.reject(rejection);
            }

        };
    });

});

app.directive('validFile', function () {
    return {
        require: 'ngModel',
        link: function (scope, el, attrs, ngModel) {
            //change event is fired when file is selected
            el.bind('change', function () {
                scope.$apply(function () {
                    ngModel.$setViewValue(el.val());
                    ngModel.$render();
                });
            });
        }
    }
});


app.directive('ruDateTimePicker', function () {
    return {
        restrict: 'C',
        link: function (scope, element, attrs) {
            element.datetimepicker({});
        }
    }
});


app.directive('ruTimePicker', function () {
    return {
        restrict: 'C',
        link: function (scope, element, attrs) {
            element.timepicker({
                showInputs: false
            });
        }
    }
});


app.directive('ruDatePicker', function () {
    return {
        restrict: 'C',
        link: function (scope, element, attrs) {
            element.datepicker({
                autoclose: true
            });
        }
    }
});

app.directive('bootstrapSwitch', [
        function () {
            return {
                restrict: 'A',
                require: '?ngModel',
                link: function (scope, element, attrs, ngModel) {
                    element.bootstrapSwitch();

                    element.on('switchChange.bootstrapSwitch', function (event, state) {
                        if (ngModel) {
                            scope.$apply(function () {
                                ngModel.$setViewValue(state);
                            });
                        }
                    });

                    scope.$watch(attrs.ngModel, function (newValue, oldValue) {
                        if (newValue) {
                            element.bootstrapSwitch('state', true, true);
                        } else {
                            element.bootstrapSwitch('state', false, true);
                        }
                    });
                }
            };
        }
]);

app.filter('startFrom', function () {
    return function (input, start) {
        if (!input || !input.length) return;
        return input.slice(start);
    }
});


app.filter("mark", function () {
    return function (input, regEx) {


        if (regEx == null || regEx == "")
            return input;


        input = input.replace(regEx, '<mark>$1</mark>');
        return input;
    };
});

app.directive("highlightKeywords", function () {
    return {
        restrict: "EA",
        require: 'ngModel',
        link: function (scope, element, attrs) {

            scope.$watch(attrs.ngModel, function (newValue, oldValue, scope) {

                if (newValue) {
                    var matchText = newValue;
                    var matchTexts = matchText.split(" ");
                    var len = matchTexts.length;
                    var regStr = "";
                    for (var i = 0; i < len; i++) {
                        regStr += matchTexts[i] + '|';
                    }
                    regStr = regStr.substr(0, regStr.length - 1);

                    scope.$$searchRegex = new RegExp('(' + regStr + ')', 'gi');

                } else {

                    scope.$$searchRegex = null;
                }
            });

        }

    };
});

app.directive('datePicker', function () {
    var link = function (scope, element, attrs) {
        var modelName = attrs['datePicker'];
        $(element).datepicker(
            {
                onSelect: function (dateText) {
                    scope[modelName] = dateText;
                    scope.$apply();
                }
            });
    };
    return {
        require: 'ngModel',
        restrict: 'A',
        link: link
    }
});

app.directive('timePicker', function () {
    var link = function (scope, element, attrs, ngModel) {
        
        var modelName = attrs['timePicker'];

        var modelPreferences = { format: 'h\:mm A', sideBySide: true };

        element.datetimepicker(modelPreferences);
        element.on('dp.change', function (event) {
            scope.$apply(function () {
                ngModel.$setViewValue(moment(event.date).add(moment(event.date).utcOffset(), 'minutes')._d);
            });
        });
    };
    return {
        require: 'ngModel',
        restrict: 'A',
        link: link
    }
});

app.directive('dateTimePicker', function () {
    var link = function (scope, element, attrs, ngModel) {
        var modelName = attrs['dateTimePicker'];
        var minDate = scope.minDate;
        var minDatePresent = scope.minDate !== undefined;

        var modelPreferences = { format: 'M/D/YYYY h\:mm A', sideBySide: true };
        //if (minDatePresent)
        //    modelPreferences.minDate = new Date(minDate);

        element.datetimepicker(modelPreferences);
        element.on('dp.change', function (event) {
            if (scope.dtEndDate !== undefined) {
                $(scope.dtEndDate).data("DateTimePicker").minDate(event.date);
            }

            if (scope.dtStartDate !== undefined) {
                $(scope.dtStartDate).data("DateTimePicker").maxDate(event.date);
            }
            scope.$apply(function () {
                ngModel.$setViewValue(moment(event.date).add(moment(event.date).utcOffset(), 'minutes')._d);
                //ngModel.$setViewValue(event.date);
                //ngModel.$setViewValue(time._d);
            });
        });
    };
    return {
        require: 'ngModel',
        restrict: 'A',
        link: link,
        scope: {
            dtEndDate: '=?',
            dtStartDate: '=?'
        }
    }
});

app.directive('iChecksquaregreen', function ($timeout, $parse) {
    return {
        link: function ($scope, element, $attrs) {
            return $timeout(function () {
                var ngModelGetter, value;
                ngModelGetter = $parse($attrs['ngModel']);
                value = $parse($attrs['ngValue'])($scope);
                return $(element).iCheck({
                    checkboxClass: 'icheckbox',
                    radioClass: 'iradio_minimal-blue',
                    checkboxClass: 'icheckbox_square-green',
                    increaseArea: '20%'
                }).on('ifChanged', function (event) {
                    if (this.checked) {
                        $('[name="iCheck"]').iCheck('check');
                        if ($scope.pageType !== null && $scope.pageType !== undefined && $scope.pageType === 0) {
                            $('#checkAllBot').iCheck('check');
                        }
                        $('#checkAll').iCheck('check');
                        if ($scope.filteredUsers !== null && $scope.filteredUsers !== undefined)
                            angular.forEach($scope.filteredUsers,
                                                function (value) {
                                                    value.Checked = true;
                                                });
                        if ($scope.emailsOverview !== null && $scope.emailsOverview !== undefined)
                            angular.forEach($scope.emailsOverview,
                                            function (value) {
                                                value.Checked = true;
                                            });
                        if ($scope.applications !== null && $scope.applications !== undefined)
                            angular.forEach($scope.applications,
                                            function (value) {
                                                value.Checked = true;
                                            });
                        if ($scope.members !== null && $scope.members !== undefined)
                            angular.forEach($scope.members,
                                function (value) {
                                    value.Checked = true;
                                });
                    } else {
                        $('[name="iCheck"]').iCheck('uncheck');
                        if ($scope.pageType !== null && $scope.pageType !== undefined && $scope.pageType === 0) {
                            $('#checkAllBot').iCheck('uncheck');
                        }
                        $('#checkAll').iCheck('uncheck');
                        if ($scope.filteredUsers !== null && $scope.filteredUsers !== undefined)
                            angular.forEach($scope.filteredUsers,
                                                function (value) {
                                                    value.Checked = false;
                                                });
                        if ($scope.emailsOverview !== null && $scope.emailsOverview !== undefined)
                            angular.forEach($scope.emailsOverview,
                                            function (value) {
                                                value.Checked = false;
                                            });
                        if ($scope.applications !== null && $scope.applications !== undefined)
                            angular.forEach($scope.applications,
                                            function (value) {
                                                value.Checked = false;
                                            });
                        if ($scope.members !== null && $scope.members !== undefined)
                            angular.forEach($scope.members,
                                function (value) {
                                    value.Checked = false;
                                });
                    }
                    if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) {
                        $timeout(function () {
                            return ngModelGetter.assign($scope, event.target.checked);
                        });
                    }
                    if ($(element).attr('type') === 'radio' && $attrs['ngModel']) {
                        return $scope.$apply(function () {
                            return ngModelGetter.assign($scope, value);
                        });
                    }
                });
            });
        }
    };
});

app.directive('iCheckCriteria', function ($timeout, $parse) {
    return {
        link: function ($scope, element, $attrs) {
            return $timeout(function () {
                var ngModelGetter, value;
                ngModelGetter = $parse($attrs['ngModel']);
                value = $parse($attrs['ngValue'])($scope);
                return $(element).iCheck({
                    checkboxClass: 'icheckbox',
                    radioClass: 'iradio_minimal-blue',
                    checkboxClass: 'icheckbox_minimal-blue',
                    increaseArea: '20%'
                }).on('ifChanged', function (event) {
                    var e = new CustomEvent('ngChange', {});
                    document.dispatchEvent(e);

                    if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) {
                        $timeout(function () {
                            return ngModelGetter.assign($scope, event.target.checked);
                        });
                    }
                    if ($(element).attr('type') === 'radio' && $attrs['ngModel']) {
                        return $scope.$apply(function () {
                            return ngModelGetter.assign($scope, value);
                        });
                    }
                });
            });
        }
    };
});

app.directive('iCheck', function ($timeout, $parse) {
    return {
        link: function ($scope, element, $attrs) {
            return $timeout(function () {
                var ngModelGetter, value;
                ngModelGetter = $parse($attrs['ngModel']);
                value = $parse($attrs['ngValue'])($scope);

                //$scope.$watch($attrs['ngModel'], function (newValue) {
                //    $(element).iCheck('update');
                //})

                if (document.getElementById('checkAll') !== null &&
                    document.getElementById('checkAll') !== undefined &&
                    document.getElementById('checkAll').checked) {
                    $('[name="iCheck"]').iCheck('check');
                }

                $(element).iCheck({
                    checkboxClass: 'icheckbox',
                    radioClass: 'iradio_minimal-blue',
                    checkboxClass: 'icheckbox_minimal-blue',
                    increaseArea: '20%'
                }).on('ifChanged',
                    function (event) {
                        if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) {
                            $timeout(function () {
                                return ngModelGetter.assign($scope, event.target.checked);
                            });
                        }
                        if ($(element).attr('type') === 'radio' && $attrs['ngModel']) {
                            return $scope.$apply(function () {
                                return ngModelGetter.assign($scope, value);
                            });
                        }
                    }).on('ifCreated', function (event) {
                        if ($scope.user.Checked) {
                            $(element).iCheck('check');
                        }
                    });
            });
        }
    };
});

app.run(function (editableOptions,$window) {
    editableOptions.theme = 'bs3';

   /* $window.fbAsyncInit = function () {
        FB.init({
            appId: '322233564891437',
            status: true,
            cookie: true,
            xfbml: true,
            version: 'v2.4'
        });
    };*/

    (function (d) {
        // load the Facebook javascript SDK

        var js,
        id = 'facebook-jssdk',
        ref = d.getElementsByTagName('script')[0];

        if (d.getElementById(id)) {
            return;
        }

        js = d.createElement('script');
        js.id = id;
        js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";

        ref.parentNode.insertBefore(js, ref);

    }(document));
});

app.animation('.slide', [function () {
    return {
        // make note that other events (like addClass/removeClass)
        // have different function input parameters
        enter: function (element, doneFn) {
            jQuery(element).fadeIn(1000, doneFn);

            // remember to call doneFn so that AngularJS
            // knows that the animation has concluded
        },

        move: function (element, doneFn) {
            jQuery(element).fadeIn(1000, doneFn);
        },

        leave: function (element, doneFn) {
            jQuery(element).fadeOut(1000, doneFn);
        }
    }
}]);

/* HELPER METHODS */
var jwru = {
    constellation: {
        utils: {
            formatDateTime: function (date) {
                var dateObj = new Date(date);
                var hour = (dateObj.getUTCHours() > 12 ? (dateObj.getUTCHours() - 12) : dateObj.getUTCHours() === 0 ? 12 : dateObj.getUTCHours());
                var timeOfDay = (dateObj.getUTCHours() > 11 ? 'PM' : 'AM');

                if (dateObj.getYear() > '0001')
                    return (dateObj.getUTCMonth() + 1) + '/' + (dateObj.getUTCDate()) + '/' + (dateObj.getFullYear() > 2000 ? dateObj.getFullYear() : (new Date()).getFullYear()) + ' ' + hour + ':' + ('0' + dateObj.getUTCMinutes()).slice(-2) + ' ' + timeOfDay;
                return '';
            },
            formatNormalDateTime: function (date) {
                var dateObj = new Date(date);
                var hour = (dateObj.getHours() > 12 ? (dateObj.getHours() - 12) : dateObj.getHours() === 0 ? 12 : dateObj.getHours());
                var timeOfDay = (dateObj.getHours() > 11 ? 'PM' : 'AM');

                return (dateObj.getMonth() + 1) + '/' + (dateObj.getDate()) + '/' + (dateObj.getFullYear() > 2000 ? dateObj.getFullYear() : (new Date()).getFullYear()) + ' ' + hour + ':' + ('0' + dateObj.getMinutes()).slice(-2) + ' ' + timeOfDay;
            },
            formatShortDate: function (date) {
                var dateObj = new Date(date);

                return (dateObj.getUTCMonth() + 1) + '/' + (dateObj.getUTCDate()) + '/' + (dateObj.getFullYear() > 2000 ? dateObj.getFullYear() : (new Date()).getFullYear());
            },
            formatExtraShortDate: function (date) {
                var dateObj = new Date(date);

                return (dateObj.getUTCMonth() + 1) + '/' + (dateObj.getUTCDate());
            },
            formatTime: function (date) {
                var dateObj = new Date(date);
                var hour = (dateObj.getUTCHours() > 12 ? (dateObj.getUTCHours() - 12) : dateObj.getUTCHours() === 0 ? 12 : dateObj.getUTCHours());
                var timeOfDay = (dateObj.getUTCHours() > 11 ? 'PM' : 'AM');
                return hour + ':' + ('0' + dateObj.getUTCMinutes()).slice(-2) + ' ' + timeOfDay;
            },           
            getObjectById: function (array, propertyName, value) {
                if (array == null) {
                    return null;
                }
                var len = array.length;
                for (var i = 0; i < len; i++) {
                    if (array[i][propertyName] == value) {
                        return array[i];
                    }
                }
                return null;
            },
            validation: {
                validateForm: function (formId) {
                    $.validator.unobtrusive.parse($(formId));
                    return $(formId).valid();
                }
            }

        },
        startup: {
            jQueryInit: function () {
                jwru.constellation.widgets.dateTime.activate();
            }
        },
        widgets: {
            dateTime: {
                activate: function () {
                    $('.ru-date-picker').datepicker({
                        autoclose: true
                    });
                    $('.ru-time-picker').timepicker({
                        showInputs: false
                    });
                    $('.ru-date-time-picker').datetimepicker({
                    });
                }
            },
            confirmationDialog: {
                open: function ($uibModal, messageHeader, messageBody) {
                    $uibModal.open({
                        animation: true,
                        templateUrl: '/app/views/confirmedDialog/confirmation.html?c=' + (new Date()).getTime(),
                        controller: confirmationMessageModalController,
                        resolve: {
                            messageHeader: function () { return messageHeader; },
                            message: function () { return messageBody; }
                        }
                    });
                }
            }
        }
    }
};

// PROTOTYPES
if (!String.prototype.format) {
    String.prototype.format = function () {
        var args = arguments;
        return this.replace(/{(\d+)}/g, function (match, number) {
            return typeof args[number] != 'undefined'
              ? args[number]
              : match
            ;
        });
    };
}

if (!Date.prototype.formatDateTime) {
    Date.prototype.formatDateTime = function () {
        return jwru.constellation.utils.formatDateTime(this);
    };
}


if (!String.prototype.formatDateTime) {
    String.prototype.formatDateTime = function () {
        return jwru.constellation.utils.formatDateTime(this);
    };
}


if (!Date.prototype.formatNormalDateTime) {
    Date.prototype.formatNormalDateTime = function () {
        return jwru.constellation.utils.formatNormalDateTime(this);
    };
}


if (!String.prototype.formatNormalDateTime) {
    String.prototype.formatNormalDateTime = function () {
        return jwru.constellation.utils.formatNormalDateTime(this);
    };
}
// DIALOG COTNROLLERS (Angular)
var confirmationMessageModalController = function ($scope, $uibModalInstance, messageHeader, message) {
    $scope.messageHeader = messageHeader;
    $scope.message = message;
    $scope.close = function () {
        $uibModalInstance.close();
    };
};



/*
 * Insert any jQuery that needs to be executed on page initialization here. This will be executed at all pages
 */
$(function () {
    jwru.constellation.startup.jQueryInit();
});


/*
 * 
 */
app.filter('paragraphize', function () {
    return function (input) {
        input = String(input).trim();
        return (input.length > 0 ? '<p>' + input.replace(/[\r\n]{2,}/g, '</p><p>').replace(/[\r\n]/g, '<br/>') + '</p>' : null);
    }
});

app.filter('limitParagraphs', function () {
    return function (input, n) {
        return input.split(/[\r\n]{2,}/g).slice(0, n).join('\n\n');
    }
});

app.filter('limitWords', function () {
    return function (input, length) {
        input = input.split(' ');
        var result = input.slice(0, length).join(' ');
        return input.length > length ? result + '...' : result;
    }
});

app.filter('parseLink', function () {
    var urlPattern = /((ftp|https?):\/\/|(www\.)|!(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/gi;
    var mailPattern = /((mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/gi;
    return function (text, target) {
        return text.replace(urlPattern, '<a target="' + target + '" href="$&">$&</a>').replace(mailPattern, '<a href="mailto:$&?">$&</a>');
    };
});

app.filter('decodeUTF8',function(){
    /* https://stackoverflow.com/questions/5396560/how-do-i-convert-special-utf-8-chars-to-their-iso-8859-1-equivalent-using-javasc */
    return function(input){
        var output;
        try{
            output = decodeURIComponent(escape(input));
        } catch(e){
            output = input;
        }
        return output;
    }
});

app.filter('splitText', function () {
    return function (input) {
        var output = input.replace('/', '/<wbr>').replace('\\', '\\<wbr>');
        return output;
    }

});

app.filter('startFrom', function () {
    return function (input, start) {
        if (!input || !input.length) return;
        return input.slice(start);
    }
});


app.directive('scrollTo', function ($location, $anchorScroll) {
    return {
        link: function (scope, element, attrs) {
            element.bind('click', function (event) {
                event.stopPropagation();
                $location.hash(attrs.scrollTo);
                $anchorScroll();
            });
        }
    }
});



/* ck editor */
app.directive('ckEditor', function () {
    return {
        require: '?ngModel',
        link: function (scope, elm, attr, ngModel) {
            var ck = CKEDITOR.replace(elm[0]);

            if (!ngModel) return;

            ck.on('pasteState', function () {
                scope.$apply(function () {
                    ngModel.$setViewValue(ck.getData());
                });
            });

            ngModel.$render = function (value) {
                ck.setData(ngModel.$viewValue);
            };
        }
    };
});


app.factory('ngClipboard', function ($compile, $rootScope, $document) {
        return {
            toClipboard: function (element) {

                var copyElement = angular.element('<span id="ngClipboardCopyId">' + element + '</span>');
                var body = $document.find('body').eq(0);
                body.append($compile(copyElement)($rootScope));

                var ngClipboardElement = angular.element(document.getElementById('ngClipboardCopyId'));
                var range = document.createRange();

                range.selectNode(ngClipboardElement[0]);

                window.getSelection().removeAllRanges();
                window.getSelection().addRange(range);

                var successful = document.execCommand('copy');

                var msg = successful ? 'successful' : 'unsuccessful';
                window.getSelection().removeAllRanges();

                copyElement.remove();
            }
        }
    })

    .directive('ngCopyable', function () {
        return {
            restrict: 'A',
            link: link
        };
        function link(scope, element, attrs) {
            element.bind('click', function () {

                var range = document.createRange();
                range.selectNode(element[0]);
                window.getSelection().removeAllRanges();
                window.getSelection().addRange(range);
                var successful = document.execCommand('copy');

                var msg = successful ? 'successful' : 'unsuccessful';
                window.getSelection().removeAllRanges();
            });
        }

    });
;
app.service('ApplicationService', function ($http) {
    var _rootAdminUrl = '/api/Forms/Admin/';
    var _rootUrl = '/api/Forms/';
    this.getAllApplications = function () {
        var _url = _rootAdminUrl + 'GetAllApplications';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getAllApplicationsByType = function (applicationType) {
        var _url = _rootAdminUrl + 'GetAllApplicationsByType/' + applicationType;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getApplicationsWithWorkflow = function() {
        var _url = _rootAdminUrl + 'GetApplicationsWithWorkflow/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getApplication = function (applicationId) {
        var _url = _rootUrl + 'GetApplication/' + applicationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getFormPages = function (applicationId) {
        var _url = _rootUrl + 'GetPages/' + applicationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.createNewPage = function (applicationId) {
        var _url = _rootUrl + 'CreateNewPage/' + applicationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.deletePage = function (pageId) {
        var _url = _rootUrl + 'DeletePage/' + pageId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.updatePage = function (page) {
        var _url = _rootUrl + 'UpdatePage/';
        var resp = $http({
            url: _url,
            method: "POST",
            data:page
        });
        return resp;
    }

    this.updatePageViewOrder = function (pages) {
        var _url = _rootUrl + 'UpdatePageViewOrder/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: pages
        });
        return resp;
    }

    this.getFormFields = function (pageId) {
        var _url = _rootUrl + 'GetFields/' + pageId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
    
    this.UpdateField = function (field) {
        var _url = _rootUrl + 'UpdateFieldInfo/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: field
        });
        return resp;
        
    }

    this.createField = function (pageId) {
        var _url = _rootUrl + 'CreateNewField/' + pageId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;

    }

    this.deleteField = function (fieldId) {
        var _url = _rootUrl + 'DeleteField/' + fieldId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }


    this.updateFieldViewOrder = function (fields) {
        var _url = _rootUrl + 'UpdateFieldViewOrder/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: fields
        });
        return resp;
    }

    this.getFieldResponses = function (fieldId) {
        var _url = _rootUrl + 'GetFieldResponses/' + fieldId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
        
    this.updateResponseOrder = function (responses) {
        var _url = _rootUrl + 'UpdateFieldResponseViewOrder/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: responses
        });
        return resp;
    }

    this.deleteFieldResponse = function (fieldId) {
        var _url = _rootUrl + 'DeleteFieldResponse/' + fieldId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
    
    this.createNewFieldResponse = function (fieldId) {
        var _url = _rootUrl + 'CreateFieldResponse/' + fieldId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.updateFieldResponse = function (response) {
        var _url = _rootUrl + 'UpdateFieldResponse/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: response
        });
        return resp;
    }

    this.getApplications = function (applicationId) {
        var _url = _rootUrl + 'GetApplicationList/' + applicationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
    

    
});;
/// <summary>
/// authenticationInterceptorService
/// Based on Token Based Authentication Framework
/// Credits: Taiseer Joudeh (http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/)
/// Details: Overrides $http requests and ensures that the Token Bearer authentication headers are passed back to the ASP.NET WebAPI
/// </summary>

app.factory('authenticationInterceptorService', ['$q', '$window', '$injector', '$location', 'localStorageService', function ($q, $window, $injector, $location, localStorageService) {

    var authInterceptorServiceFactory = {};

    var _request = function (config) {
        config.headers = config.headers || {};

        var authData = $window.localStorage.getItem('accessToken');
        if (authData) {
            //config.headers.Authorization = 'Bearer ' + authData;
        }

        var constellationToken = $window.localStorage.getItem('constellationToken');
        if (constellationToken) {
            config.headers.ConstellationToken = constellationToken;
        }
        //config.headers.common['X-Requested-With'] = 'XMLHttpRequest';
       
        //var obj = JSON.parse(config.headers);
        //obj.push({ 'ConstellationToken': '12345' });
        return config;
    }

    var _responseError = function (rejection) {
        if (rejection.status === 401) {
            var authService = $injector.get('authService');
            var authData = localStorageService.get('accessToken');
            var tokenExpired = false;
            if (authData) {
                if (authData.expiration !== undefined) {
                    tokenExpired = moment().isAfter(authData.expiration)
                }
                if (authData.useRefreshTokens) {
                    $location.path('/refresh');
                    return $q.reject(rejection);
                }

                if (tokenExpired) {
                    authService.logOut();
                }
            }
            //authService.logOut();
            //$location.path('/login');
        } else {

        }
        return $q.reject(rejection);
    }

    authInterceptorServiceFactory.request = _request;
    authInterceptorServiceFactory.responseError = _responseError;

    return authInterceptorServiceFactory;
}]);

app.factory('httpRequestInterceptor', function () {
    return {
        request: function (config) {

            config.headers['X-Requested-With'] = 'XMLHttpRequest';
            config.headers['Content-Type'] = 'application/json';

            return config;
        }
    };
});;
/// <summary>
/// authService
/// Based on Token Based Authentication Framework
/// Credits: Taiseer Joudeh (http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/)
/// Details: Provides the service layer to the authentication system. This is responsible with transmitting requests to the WebAPI as well as maintaining the token state
/// </summary>

'use strict';
app.factory('authService', ['$http', '$q', 'localStorageService', function ($http, $q, localStorageService) {
    var authServiceFactory = {};
    var _authentication = {
        isAuth: false,
        //userName: "",
        //givenName: '',
        //surName: '',
        //displayName: '',
        //emailAddress: '',
        //lcut : 0,
        useRefreshTokens: false
    };


    var _login = function (loginData) {

        var deferred = $q.defer();


        var data = "grant_type=password&username=" + loginData.userName + '&password=' + encodeURIComponent(loginData.password) + (loginData.mode !== undefined ? ('&mode=' + loginData.mode) : '');

        $http.post('/token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (response) {
            var responseData = angular.fromJson(response);
            localStorageService.set('accessToken', { token: response.access_token, useRefreshTokens: false, userName: responseData.username, gn: responseData.givenName, sn: responseData.sn, displayName: responseData.dn, refreshTokens: '', lcut: responseData.lcut, em: responseData.em, expiration: responseData.expires_in });
            _authentication.isAuth = true;
            //_authentication.userName = responseData.username;
            //_authentication.useRefreshTokens = false;
            //_authentication.givenName = responseData.gn;
            //_authentication.surName = responseData.sn;
            //_authentication.displayName = responseData.dn;
            //_authentication.emailAddress = responseData.em;
            //_authentication.lcut = responseData.lcut;
            deferred.resolve(loginData);
        }).error(function (data, status, headers, config) {
            if (loginData.mode !== undefined)
            {
                if (loginData.mode === 'shibboleth')
                {
//                    location.href = '/Profile/Create';
                }
            }
            if(data.error == "invalid_grant")
            {
                //dialogs.error('Invalid Username/Password', 'Kindly re-enter your email address and password').result.then(function () {
                //});
            }
        });

        return deferred.promise;
    };



    var _logOut = function () {
        
        localStorageService.remove('lcAuthorizationData');

        _authentication.isAuth = false;
        _authentication.userName = "";
        _authentication.givenName = '';
        _authentication.surName = '';
        _authentication.displayName = '';
        _authentication.emailAddress = '';
        _authentication.lcut = 0;
        _authentication.useRefreshTokens = false;

    };

    var _fillAuthData = function () {
        var authData = localStorageService.get('lcAuthorizationData');
        if (authData)
        {

            _authentication.isAuth = true;
            _authentication.userName = authData.userName;
            _authentication.useRefreshTokens = authData.useRefreshTokens;
            _authentication.givenName = authData.gn;
            _authentication.emailAddress = authData.em;
            _authentication.lcut = authData.lcut;
            _authentication.surName = authData.sn;
            _authentication.displayName = authData.displayName;
        } else
        {
            _logOut();
        }
    };

    var _loggedIn = function () {
        //_fillAuthData();
        //return _authentication.isAuth;
        return false;
    };


    authServiceFactory.logOut = _logOut;
    authServiceFactory.fillAuthData = _fillAuthData;
    authServiceFactory.refresh = _fillAuthData;
    authServiceFactory.login = _login;
    authServiceFactory.authenticationInfo = _authentication;
    authServiceFactory.loggedIn = _loggedIn;
    //authServiceFactory.isAdmin = _isAdmin;
    return authServiceFactory;

}]);

app.factory('constellationAuthFactory', ['$http', function ($window) {
    var authFactory = {};

    
    authFactory.authToken = function () {
        var constellationToken = $window.localStorage.getItem('accessToken');
        return constellationToken;
    };
    return authFactory;
}]);


;
app.service('LoginService', function ($http) {
    this.forgotPassword = function (userlogin) {

        var resp = $http({
            url: "/api/Profile/ForgotPassword",
            method: "POST",
            data: userlogin
        });
        return resp;
    };

    this.resetPassword = function (userlogin) {
        var resp = $http({
            url: "/api/Profile/ResetPassword",
            method: "POST",
            data: userlogin
        });
        return resp;
    };

    this.ehlo = function () {
        var resp = $http({
            url: "/api/Auth/EHLO",
            method: "GET"
        });
        return resp;
    }
}); ;
app.service('EmailSystemService', function ($http) {
    var rootAdminUrl = '/api/Admin/EmailSystem/';

    this.getCriteriaList = function (criteriaId, type) {
        var url = rootAdminUrl + 'GetCriteriaList/' + criteriaId + '/' + type + '/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };

    this.updateFilterCriteria = function (criteriaId, emailFilters) {
        var url = rootAdminUrl + 'UpdateFilterCriteria/' + criteriaId;
        var resp = $http({
            url: url,
            method: "POST",
            data: emailFilters
        });
        return resp;
    };

    this.saveAsDraft = function (email) {
        var url = rootAdminUrl + 'SaveAsDraft/';
        var resp = $http({
            url: url,
            method: "POST",
            data: email
        });
        return resp;
    };

    this.updateEmail = function(email) {
        var url = rootAdminUrl + 'UpdateEmail/';
        var resp = $http({
            url: url,
            method: "POST",
            data: email
        });
        return resp;
    };

    this.getEmails = function(emailType) {
        var url = rootAdminUrl + 'GetEmails/' + emailType + '/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };

    this.getEmailById = function (emailId) {
        var url = rootAdminUrl + 'GetEmailById/' + emailId + '/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };

    this.sendEmail = function (email) {
        var url = rootAdminUrl + 'SendEmail/';
        var resp = $http({
            url: url,
            method: "POST",
            data: email
        });
        return resp;
    };

    this.deleteMultipleEmails = function (emails) {
        var url = rootAdminUrl + 'DeleteMultipleEmails/';
        var resp = $http({
            url: url,
            method: "POST",
            data: emails
        });
        return resp;
    };

    this.shareEmails = function(share, emailIds) {
        var url = rootAdminUrl + 'ShareEmails/' + emailIds + '/';
        var resp = $http({
            url: url,
            method: "POST",
            data: share
        });
        return resp;
    };

    this.stopShareSelectedEmails = function(emails) {
        var url = rootAdminUrl + 'StopShareSelectedEmails/';
        var resp = $http({
            url: url,
            method: "POST",
            data: emails
        });
        return resp;
    };

    this.getSharedEmailById = function(shareId) {
        var url = rootAdminUrl + 'GetSharedEmailById/' + shareId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };
});
app.service('EventService', function ($http, $q) {
    var self = this;
    var _baseUrl = '/api/Events/';
    var _baseAdminUrl = '/api/Events/Admin/';

    //self.getAsyncEvents = function (month, year, onlyApproved, eventCategories) {
    //    var _url = _baseUrl + 'GetEvents' + '/' + month + '/' + year + '/' + onlyApproved + '/' + eventCategories;
    //    var canceller = $q.defer();
    //    var resp = $http({
    //        url: _url,
    //        method: "GET",
    //        timeout: canceller.promise
    //    });

    //    //canceller.resolve();
    //    return {
    //        requestPromise: resp,
    //        requestCanceller: canceller
    //    }
    //};

    self.getEventsByDateRange = function (startDate, endDate, events) {
        if (events === undefined)
            events = "";
        var _url = _baseUrl + 'GetEventsByDateRange/' + events + '/';

        var resp = $http({
            url: _url,
            method: "GET",
            params: { startDate: startDate, endDate: endDate }
        });
        return resp;
    };

    //self.getEvents = function (month, year, onlyApproved, eventCategories) {
    //    var _url = _baseUrl + 'GetEvents' + '/' + month + '/' + year + '/' + onlyApproved + '/' + eventCategories;

    //    var resp = $http({
    //        url: _url,
    //        method: "GET"
    //    });

    //    return resp;
    //};

    self.createNewEvent = function () {
        var _url = _baseUrl + '/NewEvent';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    self.getAdminEvents = function (pageSize, pageNo, pastDays, organizationId, approveStatus, includeDeleted, sortOrder, sortBy, searchEvent) {
        if (searchEvent == null) {
            searchEvent = "";
        }
        var _url = _baseAdminUrl + 'GetEvents/' + pageNo + '/' + pageSize + '/' + pastDays + '/' + organizationId + '/' + approveStatus + '/' + includeDeleted + '/' + sortOrder + '/' + sortBy + '/' + searchEvent;

        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    // GET ORGANIZATION EVENTS
    self.getAllOrganizationEvents = function (organizationId) {
        var _url = _baseUrl + '/GetOrganizationEvents/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    self.getOrganizationEvents = function (organizationId, daysAhead) {
        var _url = _baseUrl + organizationId + '/' + daysAhead + '/GetUpcomingEvents';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    self.getPastOrganizationEvents = function (organizationId) {
        var _url = _baseUrl + '/GetPastOrganizationEvents/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    self.getOrgUpcomingEvents = function (organizationId) {
        var _url = _baseUrl + organizationId + '/GetOrgUpcomingEvents';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };


    self.getFollowedOrgUpcomingEvents = function () {
        var _url = _baseUrl + 'GetFollowedOrgUpcomingEvents';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    //self.getOrganizationEventsForMonth = function (month, year, organizationId) {
    //    var _url = _baseUrl + '/' + month + '/' + year + '/' + organizationId + '/true/GetEvents';
    //    var resp = $http({
    //        url: _url,
    //        method: "GET"
    //    });
    //    return resp;
    //};

    // EVENT FOLLOWER
    self.getFollowingStatus = function (eventId) {
        var _url = _baseUrl + eventId + '/IsFollowing';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    self.followEvent = function (followingStatus, notify) {
        var _url = _baseUrl + notify + '/Follow';
        var resp = $http({
            url: _url,
            method: "POST",
            data: followingStatus
        });
        return resp;
    };

    self.unfollowEvent = function (followingStatus) {
        var _url = _baseUrl + 'Unfollow';
        var resp = $http({
            url: _url,
            method: "POST",
            data: followingStatus
        });
        return resp;
    };


    self.updateEvent = function (event) {
        var _url = _baseAdminUrl + 'UpdateEvent/'
        var resp = $http({
            url: _url,
            method: "POST",
            data: event
        });
        return resp;
    };

    self.deleteEvent = function (event) {
        var _url = _baseAdminUrl + 'DeleteEvent/'
        var resp = $http({
            url: _url,
            method: "POST",
            data: event
        });
        return resp;
    };

    self.getUserFollowedEvents = function () {
        var _url = _baseUrl + 'GetUserFollowedEvents';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };
});;
app.service('FormsService', function ($http) {
    var self = this;
    var _baseUrl = '/api/Forms/Submissions/';


    self.adminGetSubmissions = function (applicationID, includeTests, includeDeleted) {
        var _url = _baseUrl + 'Admin/' + applicationID + '/' + includeTests + '/' + includeDeleted + '/GetSubmissions';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    self.adminDeleteSubmission = function (submission) {
        var _url = _baseUrl + 'Admin/DeleteSubmission';
        var resp = $http({
            url: _url,
            method: "POST",
            data: submission
        });
        return resp;
    };

    self.adminRestoreSubmission = function (submission) {
        var _url = _baseUrl + 'Admin/RestoreSubmission';
        var resp = $http({
            url: _url,
            method: "POST",
            data: submission
        });
        return resp;
    };

    self.getAllApplications = function () {
        var _url = '/api/Forms/Admin/GetAllApplications';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };


    this.getFilteredApplicationSubmissions = function (keyword, maxPerPage, currentPage, applicationId, completed, incompleted, cancelled, held, pending, denied, deleted) {
        var _url = _baseUrl + 'GetFilteredApplicationSubmissions/' + keyword + '/' + maxPerPage + '/' + currentPage + '/' + applicationId + '/' + completed + '/' + incompleted + '/' + cancelled + '/' + held + '/' + pending + '/' + denied + '/' + deleted;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.remove = function (submission) {
        var _url = _baseUrl + 'Remove/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: submission
        });
        return resp;
    };

    this.restore = function (submission) {
        var _url = _baseUrl + 'Restore/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: submission
        });
        return resp;
    };

    self.getUserSubmissions = function () {
        var _url = _baseUrl +  '/GetUserSubmissions';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

   
    
});;
app.service('ManageFormsService',
    function ($http) {
        var rootUrl = '/api/Forms/';
        var rootAdminUrl = '/api/Forms/Admin/';

        this.getAllVisibleFolders = function (superUserMode) {
            var url = rootUrl + 'GetAllVisibleFolders/' + superUserMode;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        };

        this.getAllVisibleApplications = function (superUserMode) {
            var url = rootUrl + 'GetAllVisibleApplications/' + superUserMode;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        };

        this.updateFolder = function (folder) {
            var url = rootUrl + 'UpdateFolder';
            var resp = $http({
                url: url,
                method: "POST",
                data: folder
            });
            return resp;
        };

        this.updateApplication = function (application, applicationId) {
            var url = rootUrl + 'UpdateApplication/' + applicationId;
            var resp = $http({
                url: url,
                method: "POST",
                data: application
            });
            return resp;
        };

        this.removeFolder = function (folder) {
            var url = rootUrl + 'RemoveFolder/';
            var resp = $http({
                url: url,
                method: "POST",
                data: folder
            });
            return resp;
        };

        this.removeApplication = function(application) {
            var url = rootUrl + 'RemoveApplication/';
            var resp = $http({
                url: url,
                method: "POST",
                data: application
            });
            return resp;
        };

        this.saveChanges = function (wrapper) {
            var url = rootUrl + 'SaveChanges/';
            var resp = $http({
                url: url,
                method: "POST",
                data: wrapper
            });
            return resp;
        };

        this.applications_Permissions_GetPermissionsByUserAndSystemRole = function (targetId, targetType) {
            var url = rootUrl + 'Applications_Permissions_GetPermissionsByUserAndSystemRole/' + targetId + '/' + targetType;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        };

        this.updateUserPermission = function (userPermission) {
            var url = rootUrl + 'UpdateUserPermission/';
            var resp = $http({
                url: url,
                method: "POST",
                data: userPermission
            });
            return resp;
        };

        this.removeUserPermission = function (userPermission) {
            var url = rootUrl + 'RemoveUserPermission/';
            var resp = $http({
                url: url,
                method: "POST",
                data: userPermission
            });
            return resp;
        };

        this.findUsers = function (userInput, targetId, targetType) {
            var url = rootUrl + 'FindUsers/' + targetId + '/' + targetType;
            var resp = $http({
                url: url,
                method: "POST",
                data: userInput
            });
            return resp;
        };

        this.findUsersBySystemRole = function (systemRoleId, targetId, targetType) {
            var url = rootUrl + 'FindUsersBySystemRole/' + targetId + '/' + targetType;
            var resp = $http({
                url: url,
                method: "POST",
                data: systemRoleId
            });
            return resp;
        };

        this.addUserPermissions = function (userPermissions, accessLevel, targetId, targetType, systemRolesId) {
            var url = rootUrl + 'AddUserPermissions/' + accessLevel + '/' + targetId + '/' + targetType + '/' + systemRolesId;
            var resp = $http({
                url: url,
                method: "POST",
                data: userPermissions
            });
            return resp;
        };

        this.getAllPossibleParentApplications = function(applicationId) {
            var url = rootUrl + 'GetAllPossibleParentApplications/' + applicationId;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        };

        this.getSubForms = function (applicationId, accessLevel) {
            var url = rootUrl + 'GetSubForms/' + applicationId + '/' + accessLevel;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        };

        this.getFormSubmissions = function (applicationId, accessLevel, includeDeleted, includeTest) {
            var url = rootUrl + 'GetFormSubmissions/' + applicationId + '/' + accessLevel + '/' + includeDeleted + '/' + includeTest;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        };

        this.adminDeleteSubmission = function (submission) {
            var url = rootAdminUrl + 'DeleteSubmission';
            var resp = $http({
                url: url,
                method: "POST",
                data: submission
            });
            return resp;
        };

        this.adminRestoreSubmission = function (submission) {
            var url = rootAdminUrl + 'RestoreSubmission';
            var resp = $http({
                url: url,
                method: "POST",
                data: submission
            });
            return resp;
        };
    });;
app.service('SGBallotService', function ($http) {
    var _rootUrl = '/api/SGBallot/';

    this.ValidateAddress = function (address) {
        var _url = _rootUrl + 'ValidateAddress';
        var resp = $http({
            url: _url,
            method: "POST",
            data: address,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.UpdateAddress = function (address) {
        var _url = _rootUrl + 'UpdateAddress';
        var resp = $http({
            url: _url,
            method: "POST",
            data: address,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.UpdateDates = function (dates) {
        var _url = _rootUrl + 'UpdateDates';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dates,
            headers: { 'Content-Type': 'application/json' }
        });
        return resp;
    };

    this.GetAddress = function (userinfo) {
        var _url = _rootUrl + 'GetAddress';
        var resp = $http({
            url: _url,
            method: "POST",
            data: userinfo,
            headers: { 'Content-Type': 'application/json' }
        });
        return resp;
    };

    this.GetDates = function () {
        var _url = _rootUrl + 'GetDates';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.IsOpen = function () {
        var _url = _rootUrl + 'SGBallotIsOpen';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.GetUserCollegeInfo = function (studentid) {
        var _url = _rootUrl + 'GetCollegeInfo/' +  studentid  + '/';
        var resp = $http({
            url: _url,
            method: "GET" ,
           // data: studentid,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };
});;
self.addEventListener("message", function (e) {
    // the passed-in data is available via e.data
    //console.log(e);
    var keywords = e.data.searchText.split(' ');
    keywords = keywords.map(function (keyword) {
        return keyword.toLowerCase();
    });
    var s = new Date().getTime()
    var organizations = e.data.orgs;

    var result =  organizations.filter(function (org) {           

        for (var i = 0; i < keywords.length; i++) {
            var k = keywords[i];
            if (org.OrganizationName.toLowerCase().indexOf(k) != -1) {
                return true;
            }
        }
        return false;
    });
    console.log(new Date().getTime() - s);
    postMessage(result);

}, false);;
app.service('OrgDirectoryService', function ($http) {
    var _rootUrl = '/api/Organizations/';
    var _rootAdminUrl = '/api/Admin/Organizations/'

    this.getMasterDirectory = function () {
        var _url = _rootUrl + 'GetOrganizationList';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getAdminMasterDirectory = function () {
        var _url = _rootAdminUrl + 'GetAdminOrganizationList';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    

});

app.service("OrgFilterService",function($q){

    var worker = new Worker('/app/services/org/doWork.js');
    var defer = $q.defer();
    worker.addEventListener('message', function(e) {
        defer.resolve(e.data);
    }, false);

    return {
        doWork : function(myData){
            defer = $q.defer();
            worker.postMessage(myData); // Send data to our worker. 
            return defer.promise;
        }
    };

});;
app.service('OrgNotesService', function ($http) {
    var _rootAdminUrl = '/api/Organizations/';

   

   

    this.editNote = function (note) {
        var _url = _rootAdminUrl + 'EditNote/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: note,
        });
        return resp;
    }

    this.deleteNote = function (note) {
        var _url = _rootAdminUrl + 'DeleteNote/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: note,
        });
        return resp;
    }

    this.restoreNote = function (note) {
        var _url = _rootAdminUrl + 'RestoreNote/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: note,
        });
        return resp;
    }

    this.getOrgNotes = function (includeDeleted, organizationId) {

         var _url = _rootAdminUrl + 'GetOrganizationNotes/' + includeDeleted + '/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' }
        });
        return resp;
    }

    this.newNote = function (organizationId) {
        var _url = _rootAdminUrl + 'NewNote/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.getAvailableTaggedAdmins = function () {
        var _url = _rootAdminUrl + 'GetAvailableTaggedAdmins';
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.createTaggedAdmins = function (userIds, organizationId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'CreateTaggedAdmins/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

    this.getTaggedAdmins = function (organizationId) {
        var _url = _rootAdminUrl + 'GetTaggedAdmins/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST"

        });
        return resp;
    };

    this.removeTaggedAdmins = function (userIds, organizationId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'RemoveTaggedAdmins/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

  
});
app.service('OrgOfficerService', function ($http) {
    var _rootUrl = '/api/Organizations/';
    this.getPublicOfficers= function (organizationId) {
        var _url = _rootUrl + organizationId + '/GetPublicOfficers';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.sendEmailToOfficer = function(message) {
        var url = _rootUrl + 'Officer/SendMessage';
        var resp = $http({
            url: url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: message
        });
        return resp;
    };
    
    this.checkIfUserIsPresident = function (organizationId) {
        var url = _rootUrl + 'CheckIfUserIsPresident/' + organizationId + '/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };

    this.checkIfUserIsTreas = function (organizationId) {
        var url = _rootUrl + 'CheckIfUserIsTreas/' + organizationId + '/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }
});;
app.service('OrgService', function ($http,$q) {
    var _rootUrl = '/api/Organizations/';
    var _rootAdminUrl = '/api/Admin/Organizations/';

    this.getMasterDirectory = function () {
        var _url = _rootUrl + 'GetOrganizationList';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getOrganizationsByStatusAndDateCreated = function (emailFilters) {
        var _url = _rootAdminUrl + 'GetOrganizationsByStatusAndDateCreated/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: emailFilters
        });
        return resp;
    };

    this.getOrganizationsByOrgTypes = function (orgTypes) {
        var _url = _rootAdminUrl + 'GetOrganizationsByOrgTypes/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: orgTypes
        });
        return resp;
    };

    this.getConstitution = function (orgId) {
        
        var _url = _rootUrl + 'GetConstitution/' + orgId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.sendEmailToOrg = function (message) {
        var url = _rootUrl + 'SendMessage';
        var resp = $http({
            url: url,
            method: "POST",
            data: message
        });
        return resp;
    };  

    this.getOrganizationGeneralInformation = function (orgId) {
        var _url = _rootAdminUrl + 'GetOrganizationGeneralInformation/' + orgId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getParentOrganizationList = function (orgId) {
        var _url = _rootAdminUrl + 'GetParentOrganizationList/' + orgId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.updateOrganizationGeneralInformation = function (orgInfo) {      

        var _url = _rootAdminUrl + 'UpdateOrganizationGeneralInformation/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: orgInfo
        });
        return resp;
    }

    this.unfollowOrganization = function (orgId) {

        var _url = _rootUrl + 'UnfollowOrganization/' + orgId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    }

    this.followOrganization = function (orgId) {

        var _url = _rootUrl + 'FollowOrganization/' + orgId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    }



    this.getFollowedOrganizations = function () {

        var _url = _rootUrl + 'GetFollowedOrganizations/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getOrgFollowHistory = function () {

        var _url = _rootUrl + 'GetOrganizationFollowHistory/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getOrgFollowers = function (organizationId) {

        var _url = _rootUrl + 'GetOrganizationFollowers/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getFollowStatus = function (organizationId) {
        var _url = _rootUrl + 'GetFollowStatus/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.checkIsUserOfficerEligible = function () {
        var _url = _rootUrl + 'CheckIsUserOfficerEligible/' ;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

});;
app.service('OrgSocialMediaService', function ($http, $q) {
    var _rootUrl = '/api/Organizations/';
    this.getAvailableSocialMedia = function (orgId) {
        var url = _rootUrl + 'GetAvailableSocialMedia/' + orgId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }

    this.updateAvailableSocialMedia = function (orgId, medias) {
        var url = _rootUrl + 'UpdateAvailableSocialMedia/' + orgId;
        var resp = $http({
            url: url,
            method: "POST",
            data: medias
        });
        return resp;
    }

    this.getTweets = function (orgId) {

        var url = _rootUrl + 'GetTweets/' + orgId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;

    }

    this.getFBPosts = function (orgId) {
        var url = _rootUrl + 'GetFBPosts/' + orgId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }
    this.getFBPageInfo = function(orgId) {
        var url = _rootUrl + 'GetFBPageInfo/' + orgId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }

    this.post = function (msg, username) {
        var deferred = $q.defer();
        FB.api(
            "/"+username+"/feed",
            "POST",
            {
                "message": msg
            },
            function (response) {
                if (!response || response.error) {
                    deferred.reject('Error occured');
                } else {
                    deferred.resolve(response);
                }
            }
        );
        return deferred.promise;
    }

    this.getPosts = function () {
        var deferred = $q.defer();
        FB.api('/uflorida/feed', {
            fields: 'message,actions,shares,full_picture,status_type,created_time,from,story,reactions.type(LIKE).limit(0).summary(true).as(like),reactions.type(LOVE).limit(0).summary(true).as(love),reactions.type(WOW).limit(0).summary(true).as(wow),reactions.type(HAHA).limit(0).summary(true).as(haha),reactions.type(SAD).limit(0).summary(true).as(sad),reactions.type(ANGRY).limit(0).summary(true).as(angry), reactions.type(THANKFUL).limit(0).summary(true).as(thankful)'
        }, function (response) {
            if (!response || response.error) {
                deferred.reject('Error occured');
            } else {
                deferred.resolve(response);
            }
        });
        return deferred.promise;
        
    }

    this.login = function () {
        var deferred = $q.defer();
        FB.login(function (response) {
            if (response.authResponse) {
               

                if (!response || response.error) {
                    deferred.reject('Error occured');
                } else {
                    deferred.resolve(response);
                }

            } else {
                console.log('User cancelled login or did not fully authorize.');
            }
        }, { scope: 'publish_actions' });
        return deferred.promise;
    }
    this.getLoginStatus = function () {
        var deferred = $q.defer();
        FB.getLoginStatus(function (response) {
            if (!response || response.error) {
                deferred.reject('Error occured');
            } else {
                deferred.resolve(response);
            }
        });
        return deferred.promise;
    }

    this.getInstaUserId = function (accessToken,username) {
      
        
        var url = _rootUrl + 'GetInstaUserInfo/' + username + '/?accessToken=' + encodeURI(accessToken);
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }
    

    this.getInstaPosts = function (accessToken,userid) {
        var url = _rootUrl + 'GetInstaPosts/' + userid + '/?accessToken=' + encodeURI(accessToken);
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }

    this.getDirectInstaMedia = function (orgId) {
        var url = _rootUrl + 'GetDirectInstaPosts/' + orgId;
        
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }

    this.getSocialMediaPlatforms = function () {
        var url = _rootUrl + 'GetSocialMediaPlatforms/';

        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }

    this.checkValidUrl = function (url) {
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }
    
});;
app.service('OrgAdvisorService', function ($http) {
    var _rootAdminUrl = '/api/Admin/Advisors/',
        _rootUrl = '/api/Advisors/';

    this.getAdvisors = function(organizationId, includeDeleted) {
        var url = _rootAdminUrl + 'GetAdvisors/' + organizationId + '/' + includeDeleted;
        var resp = $http({
            url: url,
            method: "GET",
        });
        return resp;
    }

    this.assignAdvisor = function(organizationId, userInput)
    {
        var url = _rootAdminUrl + 'AssignAdvisor/' + organizationId + '/' + userInput + '/';
        var resp = $http({
            url: url,
            method: "GET",
        });
        return resp;
    }

    this.removeAdvisor = function(advisorId)
    {
        var url = _rootAdminUrl + 'RemoveAdvisor/' + advisorId + '/';
        var resp = $http({
            url: url,
            method: "GET",
        });
        return resp;
    }

    this.bulkRemoveAdvisorsByOrgIds = function (orgIds)
    {
        var url = _rootAdminUrl + 'BulkRemoveAdvisorsByOrgIds/';
        var resp = $http({
            url: url,
            method: "POST",
            data: orgIds
        });
        return resp;
    }

    this.getOrgAdvisors = function (organizationId) {
        var url = _rootUrl + 'GetOrgAdvisors/' + organizationId + '/';
        var resp = $http({
            url: url,
            method: "GET",
        });
        return resp;
    }

    this.sendEmailToAdvisor = function (message) {
        var url = _rootUrl + 'SendMessage';
        var resp = $http({
            url: url,
            method: "POST",
            data: message
        });
        return resp;
    }
});;
app.service("OrganizationCategoryService", function($http) {
    var rootAdminUrl = "/api/Admin/Organization/Category/";
    var rootUrl = "/api/Organization/Category/";

    this.getOrgCategories = function (organizationId) {
        var url = rootAdminUrl + "GetOrgCategories/" + organizationId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };

    this.addCategory = function (category, organizationId) {
        var url = rootAdminUrl + "AddCategory/" + organizationId;
        var resp = $http({
            url: url,
            method: "POST",
            data: category
        });
        return resp;
    };

    this.removeCategory = function (orgCategory) {
        var url = rootAdminUrl + "RemoveCategory/";
        var resp = $http({
            url: url,
            method: "POST",
            data: orgCategory
        });
        return resp;
    };

    this.getDashboardOrgCategories = function (organizationId) {
        var url = rootUrl + "GetOrgCategories/" + organizationId;
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    };

    this.addDashboardCategory = function (category, organizationId) {
        var url = rootUrl + "AddCategory/" + organizationId;
        var resp = $http({
            url: url,
            method: "POST",
            data: category
        });
        return resp;
    };

    this.removeDashboardCategory = function (orgCategory) {
        var url = rootUrl + "RemoveCategory/";
        var resp = $http({
            url: url,
            method: "POST",
            data: orgCategory
        });
        return resp;
    };
});
app.service('ExtendedPropertyService', function ($http) {
    var _rootUrl = '/api/ExtendedProperty/';
    var _rootAdminUrl = '/api/Admin/ExtendedProperty/';

    //get only the groups
    this.getPropertyGroups = function (organizationId) {
        var _url = _rootAdminUrl + 'GetPropertyGroups/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getExtendedPropertyDetail = function (propertyGroupId) {
        var _url = _rootAdminUrl + 'GetExtendedPropertyDetail/' + propertyGroupId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getAllPropertyGroups = function () {
        var _url = _rootAdminUrl + 'GetAllExtendedPropertyGroups/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getExtendedProperties = function (organizationId, propertyGroupId) {
        var _url = _rootAdminUrl + 'GetExtendedProperties/' + organizationId + '/' + propertyGroupId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    //get groups and properties
    this.getExtendedPropertyGroups = function (registrationId) {
        var _url = _rootUrl + 'GetExtendedPropertyGroups/' + registrationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.saveProperties = function (extendedProperties, organizationId) {
        var _url = _rootAdminUrl + 'SaveProperties/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: extendedProperties,
        });
        return resp;
    }

    this.saveExtendedPropertyGroups = function (extendedGroups, registrationId) {
        var _url = _rootUrl + 'SaveExtendedPropertyGroups/' + registrationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: extendedGroups,
        });
        return resp;
    }

    this.updatePropertyGroup = function (propertyGroup) {
        var _url = _rootAdminUrl + 'UpdatePropertyGroup/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: propertyGroup,
        });
        return resp;
    }

    this.removePropertyGroup = function (extendedPropertyGroup) {
        var _url = _rootAdminUrl + 'RemovePropertyGroup/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: extendedPropertyGroup,
        });
        return resp;
    }

    this.getPropertyTypes = function () {
        var _url = _rootAdminUrl + 'GetPropertyTypes/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.updateProperty = function (property) {
        var _url = _rootAdminUrl + 'UpdateProperty/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: property,
        });
        return resp;
    }

    this.removeProperty = function (property) {
        var _url = _rootAdminUrl + 'RemoveProperty/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: property,
        });
        return resp;
    }

    this.getExtendedPropertyZones = function () {
        var _url = _rootAdminUrl + 'GetExtendedPropertyZones/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getMemberExtendedPropertyGroups = function (memberId) {
        var _url = _rootUrl + 'GetMemberExtendedPropertyGroups/' + memberId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.updateMemberExtendedProperties = function (propertyGroups, memberId) {
        var _url = _rootUrl + 'UpdateMemberExtendedProperties/' + memberId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: propertyGroups,
        });
        return resp;
    }

    this.getPublicOrgExtendedProperties = function (organizationId) {
        var _url = _rootUrl + 'GetPublicOrgExtendedProperties/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getNewMemberExtendedPropertyGroups = function (organizationId) {
        var _url = _rootUrl + 'GetNewMemberExtendedPropertyGroups/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getOrganizationExtendedPropertyGroupsByOrgTypes = function (orgTypes) {
        var _url = _rootUrl + 'GetOrganizationExtendedPropertyGroupsByOrgTypes/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: orgTypes
        });
        return resp;
    }

    this.getOrgExtendedPropertiesByPropertyGroups = function (sysExtendedPropertyGroups) {
        var _url = _rootUrl + 'GetOrgExtendedPropertiesByPropertyGroups/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: sysExtendedPropertyGroups
        });
        return resp;
    }
});
app.service('OrganizationMemberService', function ($http) {
    var _rootUrl = '/api/Organization/OrganizationMember/';
    var _rootAdminUrl = '/api/Admin/Organization/OrganizationMember/';

    this.getMembershipStatusTypes = function () {
        var _url = _rootAdminUrl + 'GetMembershipStatusTypes/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.updateOrganizationMember = function (member) {
        var _url = _rootAdminUrl + 'UpdateOrganizationMember/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }

    this.getMembershipStatus = function (organizationId) {
        var _url = _rootUrl + 'GetMembershipStatus/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.join = function (organizationId) {
        var _url = _rootUrl + 'Join/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
        });
        return resp;
    }

    this.getMembersByMemberstatusAndOrganizationId = function (membershipStatus, organizationId) {
        var _url = _rootUrl + 'GetMembersByMemberstatusAndOrganizationId/' + membershipStatus + '/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getFilteredMembers = function (membershipStatus, organizationId, keyword, maxRows, currentPage) {
        var _url = _rootUrl + 'GetFilteredMembers/' + membershipStatus + '/' + organizationId + '/' + keyword + '/' + maxRows + '/' + currentPage;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.update = function (member, membershipStatus) {
        var _url = _rootUrl + 'UpdateMembershipStatus/' + membershipStatus + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }

    this.getPreviewMembers = function (userInput, organizationId) {
        var _url = _rootAdminUrl + 'GetPreviewMembers/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: userInput
        });
        return resp;
    }

    this.submit = function (members, membershipStatus, organizationId) {
        var _url = _rootAdminUrl + 'Submit/' + membershipStatus + '/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: members
        });
        return resp;
    }

    this.getMemberTotals = function (organizationId, publicOnly) {
        if (publicOnly === undefined)
            publicOnly = true;
        var _url = '/api/Organization/Members/' + organizationId + '/' + publicOnly + '/GetMemberTotals';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getAllOrganizationMembers = function(organizationId) {
        var _url = '/api/Organization/Members/GetAllOrganizationMembers/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.bulkUpdateMemberStatus = function(membershipStatusUpdateModel) {
        var _url = _rootUrl + 'BulkUpdateMemberStatus/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: membershipStatusUpdateModel
        });
        return resp;
    }

    this.getRoom = function (member) {
        var _url = _rootAdminUrl + 'GetRoom/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }

    this.addRoom = function (member) {
        var _url = _rootAdminUrl + 'AddRoom/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }

    this.removeRoom = function (member) {
        var _url = _rootAdminUrl + 'RemoveRoom/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }

    this.editRoom = function (member) {
        var _url = _rootAdminUrl + 'EditRoom/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }

    this.removeRoom2 = function (member) {
        var _url = _rootAdminUrl + 'RemoveRoomv2/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: member,
        });
        return resp;
    }
    
});;
app.service('SysOrganizationMembershipStatusService', function ($http) {
    var _rootUrl = '/api/SystemOrganizationMembershipStatus/';
    var _rootAdminUrl = '/api/Admin/SystemOrganizationMembershipStatus/';

    this.getMembershipStatusTypes = function (organizationId) {
        var _url = _rootAdminUrl + 'GetSystemOrganizationMembershipStatusOverviewByOrganizationId/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId = function (organizationTypeId) {
        var _url = _rootAdminUrl + 'GetSystemOrganizationMembershipStatusOverviewByOrganizationTypeId/' + organizationTypeId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getSystemOrganizationMembershipStatusByOrganizations = function (organizations) {
        var _url = _rootAdminUrl + 'GetSystemOrganizationMembershipStatusByOrganizations/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: organizations
        });
        return resp;
    }

    this.updateSystemOrganizationMembershipStatus = function (membershipStatus) {
        var _url = _rootAdminUrl + 'UpdateSystemOrganizationMembershipStatus/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: membershipStatus
        });
        return resp;
    }

    this.removeMembershipStatus = function (membershipStatus) {
        var _url = _rootAdminUrl + 'RemoveMembershipStatus/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: membershipStatus
        });
        return resp;
    }
});
app.service('AdminOfficerService', function ($http) {
    var _rootUrl = '/api/Admin/Officer/';

    this.getUserInfo = function (userInput) {
        var url = _rootUrl + 'GetUserInfo/' + userInput + '/';
        var resp = $http({
            url: url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.assignOfficer = function (userInput, positionId, orgId) {
        var url = _rootUrl + 'AssignOfficer/' + userInput + '/' + positionId + '/' + orgId;
        var resp = $http({
            url: url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.overrideOfficer = function (userInput, positionId, orgId) {
        var url = _rootUrl + 'OverrideOfficer/' + userInput + '/' + positionId + '/' + orgId;
        var resp = $http({
            url: url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };
});
app.service('OfficerService', function ($http) {
    var _rootUrl = '/api/Registration/Officer/';

    this.updateUserInfo = function (requiredPositionView) {
        var url = _rootUrl + 'UpdateUserInfo/';
        var resp = $http({
            url: url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: requiredPositionView
        });
        return resp;
    }

    this.getAllPositions = function (organizationRegistrationId) {
        var url = _rootUrl + 'GetAllPositions/' + organizationRegistrationId + '/';
        var resp = $http({
            url: url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.getAllPositionViewWithOfficers = function (organizationRegistrationId) {
        var url = _rootUrl + 'GetAllPositionViewWithOfficers/' + organizationRegistrationId + '/';
        var resp = $http({
            url: url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.updateAllPositions = function (allPositionView) {
        var url = _rootUrl + 'UpdateAllPositions/';
        var resp = $http({
            url: url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: allPositionView
        });
        return resp;
    }
});;
app.service('OrganizationPermissionService',
    function($http) {
        var rootUrl = '/api/Organization/Permission/';

        this.getOrganizationPermission = function (organizationId, permissionType) {
            var url = rootUrl + 'GetOrganizationPermission/' + organizationId + '/' + permissionType; 
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        }

        this.updateOrganizationPermission = function (organizationPermission) {
            var url = rootUrl + 'UpdateOrganizationPermission/';
            var resp = $http({
                url: url,
                method: "POST",
                data: organizationPermission
            });
            return resp;
        }

        this.getOfficerPermissionOverview = function (organizationId, permissionType) {
            var url = rootUrl + 'GetOfficerPermissionOverview/' + organizationId + '/' + permissionType;
            var resp = $http({
                url: url,
                method: "GET"
            });
            return resp;
        }

        this.togglePermission = function (officerPermissionOverview, organizationId, permissionType) {
            var url = rootUrl + 'TogglePermission/' + organizationId + '/' + permissionType;
            var resp = $http({
                url: url,
                method: "POST",
                data: officerPermissionOverview
            });
            return resp;
        }
    });;
app.service('OrgPositionService', function ($http) {
    var _rootUrl = '/api/Admin/Organizations/';

    this.addNewPosition = function (organizationId, positionTitle, isPublic, isRequired) {
        var url = _rootUrl + 'AddPosition/'  + organizationId + '/' + positionTitle + '/' + isPublic + '/' + isRequired + '/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }

    this.getPositionsByOrganizations = function(organizations) {
        var url = _rootUrl + 'GetPositionsByOrganizations/';
        var resp = $http({
            url: url,
            method: "POST",
            data: organizations
        });
        return resp;
    }

    this.getSysRequriedPositions = function() {
        var url = _rootUrl + 'GetSysRequriedPositions/';
        var resp = $http({
            url: url,
            method: "GET"
        });
        return resp;
    }
});
app.service('OrganizationStateService', function ($http) {
    var _rootAdminUrl = '/api/Admin/Organization/OrganizationState/';

    this.getSystemState = function () {
        var _url = _rootAdminUrl + 'GetSystemState/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getAdminOrganizationState = function (organizationId) {
        var _url = _rootAdminUrl + 'GetOrganizationState/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getOrganizationState = function (organizationId) {
        var _url = '/api/Organization/' + organizationId + '/GetOrganizationState';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getOrgsByStateId = function (stateId) {
        var _url = '/api/Organization/' + stateId + '/GetOrgsByStateId';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.updateOrganizationState = function (orgStateId, organizationStateId) {
        var _url = _rootAdminUrl + 'UpdateOrganizationState/' + orgStateId + '/' + organizationStateId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getStateHistory = function (organizationId) {
        var _url = _rootAdminUrl + 'GetStateHistory/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getOrgsByTypesCombo = function (historicalOrgTypeId, primaryOrgTypeId) {
        var _url = _rootAdminUrl + 'GetOrgsByTypesCombo/' + historicalOrgTypeId + '/' + primaryOrgTypeId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.bulkUpdateOrganizationStates = function (states) {
        var _url = _rootAdminUrl + 'BulkUpdateOrganizationStates/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: states
        });
        return resp;
    }
});
app.service('OrganizationTypeService', function ($http) {
    var _rootAdminUrl = '/api/Admin/OrganizationType/';

    this.getAllSystemOrganizationType = function () {
        var _url = _rootAdminUrl + 'GetAllSystemOrganizationType/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getOrgsByPrimaryType = function (OrganizationTypeId) {
        var _url = _rootAdminUrl + 'GetOrgsByPrimaryType/' + OrganizationTypeId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.BulkUpdateOrgPrimaryTypes = function (orgList, organizationTypeId) {
        var _url = _rootAdminUrl + 'BulkUpdateOrgPrimaryTypes/' + organizationTypeId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: orgList
        });
        return resp;
    }
});;
app.service('OrgDashboardService', function ($http) {
    var _rootUrl = '/api/Registration/';

    //this.reRegistration = function (organizationId, userId) {
    //    var _url = _rootUrl + 'ReRegistration/' + organizationId + '/' + userId + '/';
    //    var resp = $http ({
    //        url: _url,
    //        method: "GET",
    //        headers: { 'Content-Type': 'application/json' },
    //    });
    //    return resp;
    //}

    this.reRegistration = function (organizationId) {
        var _url = _rootUrl + 'ReRegistration/' + organizationId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.loadCurrentOrganizationInfo = function (organizationId) {
        var _url = _rootUrl + 'LoadCurrentOrganizationInfo/' + organizationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }
});;
app.service('OrgOfficerLoginService', function ($http) {
    var _rootUrl = '/api/Profile/';

    this.getActiveOrgList = function () {
        var _url = _rootUrl + 'GetOrganizationList';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };
});;
app.service('PermitService', function ($http) {
    var _rootUrl = '/api/Permit/';
    var _rootAdminUrl = '/api/Admin/Permit/';

    this.getNumberOfUploadedFiles = function (permitVersionId) {
        var _url = _rootAdminUrl + 'GetNumberOfUploadedFiles/' + permitVersionId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
       
    this.getListOfFiles = function (permitVersionId) {
        var _url = _rootAdminUrl + "GetListOfFiles/" + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.downloadFile = function (permitVersionId, fileName) {
        var info = [permitVersionId, fileName];
        var _url = _rootAdminUrl + 'DownloadFile/';

        var resp = $http({
            url: _url,
            method: "POST",
            headers: {
                "Content-Type": "application/octet-stream"
            },
            data: info,
            responseType: "blob"
        });
        return resp;
    }

    this.deleteFiles = function (folderName, fileNames) {
        var _url = _rootAdminUrl + 'DeleteFiles/' + folderName;

        var resp = $http({
            url: _url,
            method: "POST",
            data: fileNames,
        });
        return resp;
    }

    this.getPermitListing = function (keywords, maxPerPage, currentPage, completed, incomplete, canceled, held, pending, denied, deleted, onlyMine, orderBy, sortBy) {

        var _url = _rootAdminUrl + 'GetPermitListing/' + ((keywords) ? keywords + '/' : '') + maxPerPage + '/' + currentPage + '/' + completed + '/' + incomplete + '/' + canceled + '/' + held + '/' + pending + '/' + denied + '/' + deleted + '/' + onlyMine + '/' + orderBy + '/' + sortBy + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.remove = function (permitVersionId) {
        var _url = _rootAdminUrl + 'Remove/' + permitVersionId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.restore = function (permitVersionId) {
        var _url = _rootAdminUrl + 'Restore/' + permitVersionId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getPermitListingByOrg = function (orgId, keywords, maxPerPage, currentPage, completed, incomplete, canceled, held, pending, denied, deleted) {

        var _url = _rootUrl + orgId + '/GetPermitListing/' + ((keywords) ? keywords + '/' : '') + maxPerPage + '/' + currentPage + '/' + completed + '/' + incomplete + '/' + canceled + '/' + held + '/' + pending + '/' + denied + '/' + deleted + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getPermitListingByUserId = function (keywords, maxPerPage, currentPage, completed, incomplete, canceled, held, pending, denied, deleted) {

        var _url = _rootUrl + 'GetPermitListing/' + ((keywords) ? keywords + '/' : '') + maxPerPage + '/' + currentPage + '/' + completed + '/' + incomplete + '/' + canceled + '/' + held + '/' + pending + '/' + denied + '/' + deleted + '/';

        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };
  
    this.updateApprovalStatus = function (stepItemId, stepItemApprovalStatusId, processId) {
        var _url = _rootAdminUrl + 'UpdateApprovalStatus/' + stepItemId + '/' + stepItemApprovalStatusId + '/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getSystemPermitTypes = function () {

        var _url = _rootAdminUrl + 'GetSystemPermitTypes';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getAdminSystemPermitTypes = function () {

        var _url = _rootAdminUrl + 'GetAdminSystemPermitTypes';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getAdminPermitDetails = function (permitVersionId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetDetails',
            method: 'GET'
        });
        return promise;
    };

    this.getNoteStatusInfo = function (permitVersionId, isPublicNote) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + isPublicNote + '/GetNoteStatusInfo',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitPermissions = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetPermitPermissions',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitDetails = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetDetails',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitDates = function (permitVersionId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + includeDeleted + '/GetDates',
            method: 'GET'
        });
        return promise;
    };

    this.deletePermitDate = function (permitVersionId, permitDate) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/DeleteDate',
            data: permitDate,
            method: 'POST'
        });
        return promise;
    };

    this.restorePermitDate = function (permitVersionId, permitDate) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/RestoreDate',
            data: permitDate,
            method: 'POST'
        });
        return promise;
    };

    this.updatePermitInfo = function(permitInfo){
        var promise = $http({
            url: _rootAdminUrl + '/UpdatePermitInfo',
            data: permitInfo,
            method: 'POST'
        });
        return promise;
    };

    this.updatePermitDate = function (permitDate) {
        var promise = $http({
            url: _rootAdminUrl + 'UpdatePermitDate',
            data: permitDate,
            method: 'POST'
        });
        return promise;
    };

    this.newPermitDate = function (permitVersionId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/NewDate',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitNotes = function (permitVersionId, includeDeleted) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetNotes/' + includeDeleted,
            method: 'GET'
        });
        return promise;
    };

    this.getPermitNotesByType = function (permitVersionId, permitType, includeDeleted) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetNotes/' + permitType + '/' + includeDeleted,
            method: 'GET'
        });
        return promise;
    };

    this.newPermitNote = function (permitVersionId, parentNoteId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/NewNote/' + parentNoteId,
            method: 'GET'
        });
        return promise;
    };

    this.updatePermitNote = function (permitNote) {
        var promise = $http({
            url: _rootAdminUrl + 'UpdatePermitNote',
            data: permitNote,
            method: 'POST'
        });
        return promise;
    };

    this.updateNoteStatusInfo = function (permitVersionId, statusInfo) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + 'UpdateNoteStatusInfo',
            data: statusInfo,
            method: 'POST'
        });
        return promise;
    };

    this.deletePermitNote = function (permitNote) {
        var promise = $http({
            url: _rootAdminUrl + 'DeletePermitNote',
            data: permitNote,
            method: 'POST'
        });
        return promise;
    };

    this.restorePermitNote = function (permitNote) {
        var promise = $http({
            url: _rootAdminUrl + 'RestorePermitNote',
            data: permitNote,
            method: 'POST'
        });
        return promise;
    };


    this.getPermitLocationTemplatesByType = function (permitTypeId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + includeDeleted + '/GetPermitLocationTemplates',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitLocationTemplatesByPermitVersion = function (permitVersionId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + includeDeleted + '/GetPermitLocationTemplatesByPermitVersionId',
            method: 'GET'
        });
        return promise;
    };

    this.getAvailableTaggedAdmins = function () {
        var _url = _rootAdminUrl + 'GetAvailableTaggedAdmins' ;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.createTaggedAdmins = function (userIds, permitVersionId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'CreateTaggedAdmins/' + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

    this.getTaggedAdmins = function (permitVersionId) {
        var _url = _rootAdminUrl + 'GetTaggedAdmins/' + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "POST"
            
        });
        return resp;
    };

    this.removeTaggedAdmins = function (userIds, permitVersionId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'RemoveTaggedAdmins/' + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

    // WIZARD RELATED SERVICES

    this.getPermitTypes = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetPermitTypes',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitInfo = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetPermitInfo',
            method: 'GET'
        });
        return promise;
    };

    this.userUpdatePermitInfo = function (permitInfo) {
        var promise = $http({
            url: _rootUrl + 'UpdatePermitInfo',
            method: 'POST',
            data: permitInfo
        });
        return promise;
    };

    this.getPermitCategories = function(permitVersionId){
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetMappedPermitSystemCategories',
            method: 'GET'
        });
        return promise;
    };

    this.getSelectedPermitCategories = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetSelectedPermitCategories',
            method: 'GET'
        });
        return promise;
    };

    this.updatePermitCategories = function (permitVersionId, permitCategoriesIds) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/UpdatePermitCategories',
            method: 'POST',
            data: permitCategoriesIds 
        });
        return promise;
    };

    this.userGetPermitDates = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetDates',
            method: 'GET'
        });
        return promise;
    };

    this.userNewPermitDate = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/NewDate',
            method: 'GET'
        });
        return promise;
    };

    this.userUpdatePermitDate = function (permitVersionId, permitDate) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/UpdatePermitDate',
            method: 'POST',
            data: permitDate
        });
        return promise;
    };

    this.getDateAndLocationHistoryByPermitVersionId = function (permitVersionId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetDateAndLocationHistoryByPermitVersionId',
            method: 'GET',
        });
        return promise;
    };

    this.userDeletePermitDate = function (permitVersionId, permitDate) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/DeletePermitDate',
            method: 'POST',
            data: permitDate
        });
        return promise;
    };

    this.userGetApplicationList = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetApplicationList',
            method: 'GET'
        });
        return promise;
    };

    this.userSubmitPermit = function (permitVersion) {
        var promise = $http({
            url: _rootUrl + '/SubmitPermit',
            method: 'POST',
            data: permitVersion
        });
        return promise;
    };

    // ADMIN / SYSTEM RELATED FUNCTIONS
    this.getMappedOrganizationTypesToPermitType = function (permitTypeId) {
        var promise = $http({
            url: _rootAdminUrl + permitTypeId + '/GetMappedTypes',
            method: 'GET'
        });
        return promise;
    };

    this.newMappedOrganizationType = function (permitTypeId) {
        return {
            PermitTypeLinkId: 0,
            PermitTypeId: permitTypeId,
            OrganizationTypeId: 0,
            Added: "1/0/0001 00:00:00.000",
            Deleted: "1/0/0001 00:00:00.000"
        };
    };

    this.addMappedOrganizationType = function (permitTypeId, mappedType) {
        var promise = $http({
            url: _rootAdminUrl + permitTypeId + '/AddMappedType',
            method: 'POST',
            data: mappedType
        });
        return promise;
    };

    this.deleteMappedOrganizationType = function (permitTypeId, mappedType) {
        var promise = $http({
            url: _rootAdminUrl + permitTypeId + '/DeleteMappedType',
            method: 'POST',
            data: mappedType
        });
        return promise;
    };

    this.getPermitDashboardView = function (organizationId) {
        
        var promise = $http({
            url: _rootAdminUrl + 'GetPermitDashboardView/' + organizationId,
            method: 'GET'
        });
        
        return promise;
    };

    this.getPermitDashboardViewPaginated = function (organizationId,limit,currentPage) {

        var promise = $http({
            url: _rootAdminUrl + 'GetPermitDashboardViewPaginated/' + organizationId + '/' + limit + '/' + currentPage,
            method: 'GET'
        });

        return promise;
    };

    this.getSubmissionDates = function (permitVersionId, permitTypeId) {

        var promise = $http({
            url: _rootAdminUrl + 'GetSubmissionDates/' + permitTypeId + '/' + permitVersionId,
            method: 'GET'
        });

        return promise;
    };

    this.createOrUpdateSubmissionDates = function (permit) {
        var promise = $http({
            url: _rootAdminUrl + '/CreateOrUpdateSubmissionDates',
            method: 'POST',
            data: permit
        });

        return promise;
    };

    this.checkPermitSubmissionDates = function (permit) {
        var promise = $http({
            url: _rootAdminUrl + '/CheckPermitSubmissionDates',
            method: 'GET',
            data: permit
        });

        return promise;
    };
});


app.service('PermitLocationService', function ($http) {
    var _rootUrl = '/api/Permit/';
    var _rootAdminUrl = '/api/Permit/Admin/';

    this.getLocationTemplatesByPermitTypeId = function (permitTypeId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;

        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + includeDeleted + '/GetPermitLocationTemplates'
        });

        return promise;
    };

    this.getRootLocationTemplatesByPermitTypeId = function (permitTypeId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;

        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + includeDeleted + '/GetRootPermitLocationTemplates'
        });

        return promise;
    };

    this.newLocationTemplate = function (permitTypeId, parentLocationId) {

        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + parentLocationId + '/NewLocationTemplate'
        });

        return promise;
    };



    this.updatePermitLocationTemplate = function (locationTemplate) {
        var promise = $http({
            url: _rootAdminUrl + '/UpdatePermitLocationTemplate',
            method: 'POST',
            data: locationTemplate
        });

        return promise;
    };

    this.deletePermitLocationTemplate = function (locationTemplate) {
        var promise = $http({
            url: _rootAdminUrl + '/DeletePermitLocationTemplate',
            method: 'POST',
            data: locationTemplate
        });

        return promise;
    };
});;
app.service('VendorPermitService', function ($http) {
    var _rootUrl = '/api/Vendor/Permit/';
    var _rootAdminUrl = '/api/Admin/VendorPermit/';

    this.getNumberOfUploadedFiles = function (permitVersionId) {
        var _url = _rootAdminUrl + 'GetNumberOfUploadedFiles/' + permitVersionId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getListOfFiles = function (permitVersionId) {
        var _url = _rootAdminUrl + "GetListOfFiles/" + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.downloadFile = function (permitVersionId, fileName) {
        var info = [permitVersionId, fileName];
        var _url = _rootAdminUrl + 'DownloadFile/';

        var resp = $http({
            url: _url,
            method: "POST",
            headers: {
                "Content-Type": "application/octet-stream"
            },
            data: info,
            responseType: "blob"
        });
        return resp;
    }

    this.deleteFiles = function (folderName, fileNames) {
        var _url = _rootAdminUrl + 'DeleteFiles/' + folderName;

        var resp = $http({
            url: _url,
            method: "POST",
            data: fileNames,
        });
        return resp;
    }

    this.getNoteStatusInfo = function (permitVersionId, isPublicNote) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + isPublicNote + '/GetNoteStatusInfo',
            method: 'GET'
        });
        return promise;
    };

    this.updateNoteStatusInfo = function (permitVersionId, statusInfo) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + 'UpdateNoteStatusInfo',
            data: statusInfo,
            method: 'POST'
        });
        return promise;
    };

    this.getPermitListing = function (keywords, maxPerPage, currentPage, completed, incomplete, canceled, held, pending, denied, deleted, onlyMine, orderBy, sortBy) {

        var _url = _rootAdminUrl + 'GetPermitListing/' + ((keywords) ? keywords + '/' : '') + maxPerPage + '/' + currentPage + '/' + completed + '/' + incomplete + '/' + canceled + '/' + held + '/' + pending + '/' + denied + '/' + deleted + '/' + onlyMine + '/' + orderBy + '/' + sortBy + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.remove = function (permitVersionId) {
        var _url = _rootAdminUrl + 'Remove/' + permitVersionId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.restore = function (permitVersionId) {
        var _url = _rootAdminUrl + 'Restore/' + permitVersionId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getPermitListingByOrg = function (orgId, keywords, maxPerPage, currentPage, completed, incomplete, canceled, held, pending, denied, deleted) {

        var _url = _rootUrl + orgId + '/GetPermitListing/' + ((keywords) ? keywords + '/' : '') + maxPerPage + '/' + currentPage + '/' + completed + '/' + incomplete + '/' + canceled + '/' + held + '/' + pending + '/' + denied + '/' + deleted + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };
  
    this.updateApprovalStatus = function (stepItemId, stepItemApprovalStatusId, processId) {
        var _url = _rootAdminUrl + 'UpdateApprovalStatus/' + stepItemId + '/' + stepItemApprovalStatusId + '/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getSystemPermitTypes = function () {

        var _url = _rootAdminUrl + 'GetSystemPermitTypes';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getAdminSystemPermitTypes = function () {

        var _url = _rootAdminUrl + 'GetAdminSystemPermitTypes';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    

    this.getAdminPermitDetails = function (permitVersionId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetDetails',
            method: 'GET'
        });
        return promise;
    };


    this.getPermitPermissions = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetPermitPermissions',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitDetails = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetDetails',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitDates = function (permitVersionId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + includeDeleted + '/GetDates',
            method: 'GET'
        });
        return promise;
    };

    this.updateCoApplicants = function (permitVersionId, userInput) {
             
        var promise = $http({
            url: _rootAdminUrl + 'UpdateCoApplicants/' + permitVersionId,
            data: JSON.stringify(userInput),
            method: 'POST',
        });
        return promise;
    };

   
    this.getCoApplicant = function (permitVersionId) {

        var promise = $http({
            url: _rootAdminUrl + 'GetCoApplicants/' + permitVersionId,
            method: 'GET',
        });
        return promise;
    };

    this.deletePermitDate = function (permitVersionId, permitDate) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/DeleteDate',
            data: permitDate,
            method: 'POST'
        });
        return promise;
    };

    this.restorePermitDate = function (permitVersionId, permitDate) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/RestoreDate',
            data: permitDate,
            method: 'POST'
        });
        return promise;
    };

    this.updatePermitInfo = function(permitInfo){
        var promise = $http({
            url: _rootAdminUrl + 'UpdatePermitInfo',
            data: permitInfo,
            method: 'POST'
        });
        return promise;
    };

    this.updatePermitDate = function (permitDate) {
        var promise = $http({
            url: _rootAdminUrl + 'UpdatePermitDate',
            data: permitDate,
            method: 'POST'
        });
        return promise;
    };

    this.newPermitDate = function (permitVersionId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/NewDate',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitNotes = function (permitVersionId, includeDeleted) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetNotes/' + includeDeleted,
            method: 'GET'
        });
        return promise;
    };

    this.getPermitNotesByType = function (permitVersionId, permitType, includeDeleted) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetNotes/' + permitType + '/' + includeDeleted,
            method: 'GET'
        });
        return promise;
    };

    this.newPermitNote = function (permitVersionId, parentNoteId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/NewNote/' + parentNoteId,
            method: 'GET'
        });
        return promise;
    };

    this.updatePermitNote = function (permitNote) {
        var promise = $http({
            url: _rootAdminUrl + 'UpdatePermitNote',
            data: permitNote,
            method: 'POST'
        });
        return promise;
    };

    this.deletePermitNote = function (permitNote) {
        var promise = $http({
            url: _rootAdminUrl + 'DeletePermitNote',
            data: permitNote,
            method: 'POST'
        });
        return promise;
    };

    this.restorePermitNote = function (permitNote) {
        var promise = $http({
            url: _rootAdminUrl + 'RestorePermitNote',
            data: permitNote,
            method: 'POST'
        });
        return promise;
    };


    this.getPermitLocationTemplatesByType = function (permitTypeId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + includeDeleted + '/GetPermitLocationTemplates',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitLocationTemplatesByPermitVersion = function (permitVersionId, includeDeleted, token) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + includeDeleted + '/' + token + '/GetPermitLocationTemplatesByPermitVersionId',
            method: 'GET'
        });
        return promise;
    };

    this.getAvailableTaggedAdmins = function () {
        var _url = _rootAdminUrl + 'GetAvailableTaggedAdmins';
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.createTaggedAdmins = function (userIds, permitVersionId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'CreateTaggedAdmins/' + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

    this.getTaggedAdmins = function (permitVersionId) {
        var _url = _rootAdminUrl + 'GetTaggedAdmins/' + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "POST"

        });
        return resp;
    };

    this.removeTaggedAdmins = function (userIds, permitVersionId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'RemoveTaggedAdmins/' + permitVersionId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

    // WIZARD RELATED SERVICES

    this.getPermitTypes = function (orgId,permitVersionId, token) {
        var promise = $http({
            url: _rootUrl + orgId + '/' + permitVersionId + '/' + token + '/GetPermitTypes',
            method: 'GET'
        });
        return promise;
    };

    this.getPermitInfo = function (permitVersionId, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/GetPermitInfo',
            method: 'GET'
        });
        return promise;
    };

    this.userUpdatePermitInfo = function (permitInfo, token) {
        permitInfo.Token = token;
        var promise = $http({
            url: _rootUrl + 'UpdatePermitInfo',
            method: 'POST',
            data: permitInfo
        });
        return promise;
    };

    this.getPermitCategories = function(permitVersionId, token){
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/GetMappedPermitSystemCategories',
            method: 'GET'
        });
        return promise;
    };

    this.getSelectedPermitCategories = function (permitVersionId) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/GetSelectedPermitCategories',
            method: 'GET'
        });
        return promise;
    };

    this.updatePermitCategories = function (permitVersionId, permitCategories, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/UpdatePermitCategories',
            method: 'POST',
            data: permitCategories
        });
        return promise;
    };

    this.userGetPermitDates = function (permitVersionId, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/GetDates',
            method: 'GET'
        });
        return promise;
    };

    this.userNewPermitDate = function (permitVersionId, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/NewDate',
            method: 'GET'
        });
        return promise;
    };

    this.userUpdatePermitDate = function (permitVersionId, permitDate, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/UpdatePermitDate',
            method: 'POST',
            data: permitDate
        });
        return promise;
    };

    this.getDateAndLocationHistoryByPermitVersionId = function (permitVersionId) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/GetDateAndLocationHistoryByPermitVersionId',
            method: 'GET',
        });
        return promise;
    };

    this.userDeletePermitDate = function (permitVersionId, permitDate, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/DeletePermitDate',
            method: 'POST',
            data: permitDate
        });
        return promise;
    };

    this.userDeletePermitDatev2 = function (permitVersionId, permitDate, token) {
        var promise = $http({
            url: _rootAdminUrl + permitVersionId + '/' + token + '/DeletePermitDate',
            method: 'POST',
            data: permitDate
        });
        return promise;
    };

    this.userGetApplicationList = function (permitVersionId, token) {
        var promise = $http({
            url: _rootUrl + permitVersionId + '/' + token + '/GetApplicationList',
            method: 'GET'
        });
        return promise;
    };

    this.userSubmitPermit = function (permitVersion, token) {
        var promise = $http({
            url: _rootUrl + '' + token + '/SubmitPermit',
            method: 'POST',
            data: permitVersion
        });
        return promise;
    };

    // ADMIN / SYSTEM RELATED FUNCTIONS
    this.getMappedOrganizationTypesToPermitType = function (permitTypeId) {
        var promise = $http({
            url: _rootAdminUrl + permitTypeId + '/GetMappedTypes',
            method: 'GET'
        });
        return promise;
    };

    this.newMappedOrganizationType = function (permitTypeId) {
        return {
            PermitTypeLinkId: 0,
            PermitTypeId: permitTypeId,
            OrganizationTypeId: 0,
            Added: "1/0/0001 00:00:00.000",
            Deleted: "1/0/0001 00:00:00.000"
        };
    };

    this.addMappedOrganizationType = function (permitTypeId, mappedType) {
        var promise = $http({
            url: _rootAdminUrl + permitTypeId + '/AddMappedType',
            method: 'POST',
            data: mappedType
        });
        return promise;
    };

    this.deleteMappedOrganizationType = function (permitTypeId, mappedType) {
        var promise = $http({
            url: _rootAdminUrl + permitTypeId + '/DeleteMappedType',
            method: 'POST',
            data: mappedType
        });
        return promise;
    };

    this.getPermitDashboardView = function(organizationId) {
        var promise = $http({
            url: _rootAdminUrl + 'GetPermitDashboardView/' + organizationId,
            method: 'GET'
        });
        return promise;
    };
});


app.service('PermitLocationService', function ($http) {
    var _rootUrl = '/api/Permit/';
    var _rootAdminUrl = '/api/Permit/Admin/';

    this.getLocationTemplatesByPermitTypeId = function (permitTypeId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;

        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + includeDeleted + '/GetPermitLocationTemplates'
        });

        return promise;
    };

    this.getRootLocationTemplatesByPermitTypeId = function (permitTypeId, includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;

        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + includeDeleted + '/GetRootPermitLocationTemplates'
        });

        return promise;
    };

    this.newLocationTemplate = function (permitTypeId, parentLocationId) {

        var promise = $http({
            url: _rootUrl + permitTypeId + '/' + parentLocationId + '/NewLocationTemplate'
        });

        return promise;
    };



    this.updatePermitLocationTemplate = function (locationTemplate) {
        var promise = $http({
            url: _rootAdminUrl + '/UpdatePermitLocationTemplate',
            method: 'POST',
            data: locationTemplate
        });

        return promise;
    };

    this.deletePermitLocationTemplate = function (locationTemplate) {
        var promise = $http({
            url: _rootAdminUrl + '/DeletePermitLocationTemplate',
            method: 'POST',
            data: locationTemplate
        });

        return promise;
    };
});;
app.service('PositionTemplateService', function ($http) {

    var _rootAdminUrl = '/api/Admin/PositionTemplate/';

    this.getPositionTemplates = function () {
        var _url = _rootAdminUrl + 'GetPositionTemplates/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.updatePositionTemplate = function (positionTemplate) {
        var _url = _rootAdminUrl + 'UpdatePositionTemplate/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: positionTemplate
        });
        return resp;
    }

    this.removePositionTemplate = function (positionTemplate) {
        var _url = _rootAdminUrl + 'RemovePositionTemplate/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: positionTemplate
        });
        return resp;
    }

    this.getPositionsByPositionTemplateId = function (positionTemplateId) {
        var _url = _rootAdminUrl + 'GetPositionsByPositionTemplateId/' + positionTemplateId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.updatePosition = function (position) {
        var _url = _rootAdminUrl + 'UpdatePosition/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: position
        });
        return resp;
    }

    this.removePosition = function (position) {
        var _url = _rootAdminUrl + 'RemovePosition/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: position
        });
        return resp;
    }

});;
app.service('ProcessStatusService', function ($http) {

    var _rootUrl = '/api/ProcessStatus/Admin/';

    this.getApprovalStatusDates = function (processId, workflowStepItemId, userIds, approvalTypes) {

        var users = [userIds, approvalTypes];

        var _url = _rootUrl + 'GetApprovalStatusDates/' + processId + '/' + workflowStepItemId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: users
        });
        return resp;
    }

    this.getProcessStatusOverview = function (processId) {
        var _url = _rootUrl + 'GetProcessStatusOverview/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getAllStepViews = function (processId) {
        var _url = _rootUrl + 'GetAllStepViews/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getStepViews = function (processId) {
        var _url = _rootUrl + 'GetStepViews/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.createNewOneTimeApprover = function (userId, stepItemId, processId, required) {
        var _url = _rootUrl + 'CreateNewOneTimeApprover/' + userId + '/' + stepItemId + '/' + processId + '/' + required;
        var resp = $http({
            url: _url,
            method: "POST",
        });
        return resp;
    }

    this.createMultipleOneTimeApprovers = function (userIds, stepItemIds, processId, required) {
        var dataObject = {
            userIds: userIds,
            stepItemIds: stepItemIds
        };

        var _url = _rootUrl + 'CreateMultipleOneTimeApprovers/' + processId + '/' + required;
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject, 
        });
        return resp;
    }

    this.removeOneTimeApprover = function (approverId, processId) {
        var _url = _rootUrl + 'RemoveOneTimeApprover/' + approverId  + '/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
        });
        return resp;
    }

    this.updateApproval = function (stepItemId, processId, userId) {
        var _url = _rootUrl + 'UpdateApproval/' + stepItemId + '/' + processId + '/' + userId;
        var resp = $http({
            url: _url,
            method: "POST",
        });
        return resp;
    }

    this.getGroupApproverDetail = function (processId, groupId, stepId) {
        var _url = _rootUrl + 'GetGroupApproverDetail/' + processId + '/' + groupId + '/' + stepId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }
});
app.service('UserProfileService', function ($http) {
    var _rootUrl = '/api/Profile/';

    this.getMemberHistory = function () {
        var _url = _rootUrl + 'GetMemberHistory';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getOrganizationDashboard = function (officerId) {
        var _url = _rootUrl + 'getOrganizationDashboard/' + officerId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getUserProfile = function () {
        var _url = _rootUrl + 'GetUserProfile';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.updateUserProfile = function (profile) {
        var _url = _rootUrl + 'UpdateUserProfile';
        if (profile.Password === undefined  || profile.Password === null)
            profile.Password = '';
        var resp = $http({
            url: _url,
            method: "POST",
            data: profile,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.createUserProfile = function (profile, auth) {
        var _url = _rootUrl + auth + '/UpdateUser';
        if (profile.Password === undefined || profile.Password === null)
            profile.Password = '';
        var resp = $http({
            url: _url,
            method: "POST",
            data: profile,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.deleteUserProfile = function (profile) {
        var _url = _rootUrl + 'DeleteUser';
        var resp = $http({
            url: _url,
            method: "POST",
            data: profile,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.restoreUserProfile = function (profile) {
        var _url = _rootUrl + 'RestoreUser';
        var resp = $http({
            url: _url,
            method: "POST",
            data: profile,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };


    this.getUsers = function (includeDeleted) {
        if (includeDeleted === undefined)
            includeDeleted = false;
        var _url = _rootUrl + 'GetUsers/' + includeDeleted;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getUsersRoles = function (userId) {
        var _url = _rootUrl + userId + '/GetUsersRoles';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getSystemRoles = function () {
        var _url = _rootUrl + 'GetRoles';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getSystemUserTypes = function () {
        var _url = _rootUrl + 'GetUserTypes';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getUsersTypes = function (userId) {
        var _url = _rootUrl + userId + '/GetUsersTypes';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.requestNewUser = function () {
        var _url = _rootUrl + 'RequestNewUser';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.assignRole = function(userId, role)
    {
        var _url = _rootUrl + userId + '/AssignRole';
        var resp = $http({
            url: _url,
            method: "POST",
            data: role,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;

    };

    this.removeRole = function (userId, role) {
        var _url = _rootUrl + userId + '/RemoveRole';
        var resp = $http({
            url: _url,
            method: "POST",
            data: role,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;

    };

    this.assignUserType = function (userId, userType) {
        var _url = _rootUrl + userId + '/AssignUserType';
        var resp = $http({
            url: _url,
            method: "POST",
            data: userType,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;

    };

    this.removeUserType = function (userId, userType) {
        var _url = _rootUrl + userId + '/RemoveUserType';
        var resp = $http({
            url: _url,
            method: "POST",
            data: userType,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;

    };

    this.deleteUser = function (user) {
        var _url = _rootUrl + 'DeleteUser';
        var resp = $http({
            url: _url,
            method: "POST",
            data: user,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;

    };

    this.restoreUser = function (user) {
        var _url = _rootUrl + 'RestoreUser';
        var resp = $http({
            url: _url,
            method: "POST",
            data: user,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;

    };

    this.updateUser = function (user) {
        var _url = _rootUrl + 'UpdateUser';
        var resp = $http({
            url: _url,
            method: "POST",
            data: user
        });
        return resp;

    };

    this.getUsersBySystemRoles = function(systemRoles) {
        var _url = _rootUrl + 'GetUsersBySystemRoles/' + systemRoles + '/';
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.getUsersByUserIds = function (userIds) {
        var _url = _rootUrl + 'GetUsersByUserIds/' + userIds + '/';
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.registerUser = function (profile) {
        var _url = _rootUrl + "RegisterUser";
        var resp = $http({
            url: _url,
            method: 'POST',
            data: profile
        });
        return resp;
    };

    this.AssignMultipleUsersToRole = function (userIdsAndRole) {
        var systemRoleId = userIdsAndRole.systemRoleId;
        var _url = _rootUrl + systemRoleId + "/AssignMultipleUsersToRole";
        var resp = $http({
            url: _url,
            method: 'POST',
            data: userIdsAndRole
        });
        return resp;
    }

    this.GetMultipleUsersByUfIdOrEmail = function (userInputAndRole) {
        var systemRoleId = userInputAndRole.systemRoleId;
        var _url = _rootUrl + systemRoleId + "/GetMultipleUsersByUfIdOrEmail"
        var resp = $http({
            url: _url,
            method: 'POST',
            data: userInputAndRole
        });
        return resp;
    }

    this.RemoveMultipleUsersInRole = function (userRoleIdsAndRole) {
        var systemRoleId = userRoleIdsAndRole.systemRoleId;
        var _url = _rootUrl + systemRoleId + "/RemoveMultipleUsersInRole"
        var resp = $http({
            url: _url,
            method: 'POST',
            data: userRoleIdsAndRole
        });
        return resp;
    }

    this.getUsersBySystemUserTypes = function (systemUserTypes) {
        var _url = _rootUrl + 'GetUsersBySystemUserTypes/' + systemUserTypes + '/';
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.AssignMultipleUsersToUserType = function (userIdsAndUserType) {
        var systemUserTypeId = userIdsAndUserType.systemUserTypeId;
        var _url = _rootUrl + systemUserTypeId + "/AssignMultipleUsersToUserType";
        var resp = $http({
            url: _url,
            method: 'POST',
            data: userIdsAndUserType
        });
        return resp;
    }

    this.GetMultipleUsersByUfIdOrEmailv2 = function (userInputAndUserType) {
        var systemUserTypeId = userInputAndUserType.systemUserTypeId;
        var _url = _rootUrl + systemUserTypeId + "/GetMultipleUsersByUfIdOrEmailv2"
        var resp = $http({
            url: _url,
            method: 'POST',
            data: userInputAndUserType
        });
        return resp;
    }

    this.RemoveMultipleUsersInUserType = function (usrUsrTypeIdsAndUsrType) {
        var systemUserTypeId = usrUsrTypeIdsAndUsrType.userInput;
        var _url = _rootUrl + systemUserTypeId + "/RemoveMultipleUsersInUserType"
        var resp = $http({
            url: _url,
            method: 'POST',
            data: usrUsrTypeIdsAndUsrType
        });
        return resp;
    }

});;
app.service('RegistrationDetailService', function ($http) {
    var _rootAdminUrl = '/api/Admin/Registration/';
    var _rootUrl = '/api/Registration/';

    this.getNumberOfUploadedFiles = function (orgRegistrationId) {
        var _url = _rootAdminUrl + 'GetNumberOfUploadedFiles/' + orgRegistrationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getListOfFiles = function (orgRegistrationId) {
        var _url = _rootAdminUrl + "GetListOfFiles/" + orgRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.downloadFile = function (orgRegistrationId, fileName) {
        var info = [orgRegistrationId, fileName];
        var _url = _rootAdminUrl + 'DownloadFile/';

        var resp = $http({
            url: _url,
            method: "POST",
            headers: {
                "Content-Type": "application/octet-stream"
            },
            data: info,
            responseType: "blob"
        });
        return resp;
    }

    this.deleteFiles = function (folderName, fileNames) {
        var _url = _rootAdminUrl + 'DeleteFiles/' + folderName;

        var resp = $http({
            url: _url,
            method: "POST",
            data: fileNames,
        });
        return resp;
    }

    this.getNoteStatusInfo = function (OrgRegistrationId, IsPublicNote) {
        var _url = _rootAdminUrl + OrgRegistrationId + '/' + IsPublicNote + '/GetNoteStatusInfo';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
            data: IsPublicNote
        });
        return resp;
    }

    this.updateNoteStatusInfo = function (OrgRegistrationId, statusInfo) {
        var _url = _rootAdminUrl + OrgRegistrationId + '/UpdateNoteStatusInfo';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: statusInfo
        });
        return resp;
    }

    this.getRegistration = function (organizationRegistrationId) {
        var _url = _rootAdminUrl + 'GetRegistration/' + organizationRegistrationId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.updateRegistrationData = function (registration) {
        var _url = _rootAdminUrl + 'UpdateRegistrationData/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: registration,
        });
        return resp;
    }

    this.updateAdvisorInfo = function (organizationRegistrationId, advisor) {
        var _url = _rootUrl + 'UpdateAdvisorInfo/' + organizationRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: advisor,
        });
        return resp;
    }

    this.getAdvisorDetail = function(userInput) {
        var _url = _rootAdminUrl + 'GetAdvisorDetail/' + userInput + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.replaceOfficer = function (userInput, positionTitle, organizationRegistrationId) {
        var _url = _rootAdminUrl + 'ReplaceOfficer/' + userInput + '/' + positionTitle + '/' + organizationRegistrationId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.overrideOfficer = function (userInput, positionTitle, organizationRegistrationId) {
        var _url = _rootAdminUrl + 'OverrideOfficer/' + userInput + '/' + positionTitle + '/' + organizationRegistrationId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.editNote = function (note) {
        var _url = _rootAdminUrl + 'EditNote/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: note,
        });
        return resp;
    }

    this.deleteNote = function (note) {
        var _url = _rootAdminUrl + 'DeleteNote/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: note,
        });
        return resp;
    }

    this.restoreNote = function (note) {
        var _url = _rootAdminUrl + 'RestoreNote/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: note,
        });
        return resp;
    }

    this.getWorkflowNotes = function (includeDeleted, processId) {
        var _url = _rootAdminUrl + 'GetWorkflowNotes/' + includeDeleted + '/' + processId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' }
        });
        return resp;
    }
    this.getPublicWorkflowNotes = function (processId) {
        var _url = _rootAdminUrl + 'GetPublicWorkflowNotes/' + processId;
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' }
        });
        return resp;
    }
    
    this.newWorkflowNote = function (processId) {
        var _url = _rootAdminUrl + 'NewWorkflowNote/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.getAllAdvisors = function (organizationRegistrationid) {
        var _url = _rootUrl + 'GetAllAdvisorInfo/' + organizationRegistrationid + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.addAdvisor = function () {
        var _url = _rootUrl + 'AddAdvisor/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.removeAdvisor = function (advisors, index, OrganizationRegistrationId) {
        var _url = _rootUrl + 'RemoveAdvisor/' + index + '/' + OrganizationRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: advisors,
        });
        return resp;
    }

    this.appAccessWUserLoginStatus = function (registrationPeriodId, organizationRegistrationId) {
        var _url = _rootUrl + 'AppAccessWUserLoginStatus/' + registrationPeriodId + '/' + organizationRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.getAvailableTaggedAdmins = function () {
        var _url = _rootAdminUrl + 'GetAvailableTaggedAdmins';
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.createTaggedAdmins = function (userIds, organizationRegistrationId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'CreateTaggedAdmins/' + organizationRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };

    this.getTaggedAdmins = function (organizationRegistrationId) {
        var _url = _rootAdminUrl + 'GetTaggedAdmins/' + organizationRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "POST"

        });
        return resp;
    };

    this.removeTaggedAdmins = function (userIds, organizationRegistrationId) {
        var dataObject = {
            userIds: userIds,

        };

        var _url = _rootAdminUrl + 'RemoveTaggedAdmins/' + organizationRegistrationId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: dataObject,
        });
        return resp;
    };
});
app.service('RegistrationService', function ($http) {
    var _rootAdminUrl = '/api/Admin/Registration/';

    this.getOrgRegistrationDashboardView = function () {
        var _url = _rootAdminUrl + 'GetOrgRegistrationDashboardView/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.updateApprovalStatus = function (stepItemId, stepItemApprovalStatusId, processId) {
        var _url = _rootAdminUrl + 'UpdateApprovalStatus/' + stepItemId + '/' + stepItemApprovalStatusId + '/' + processId + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
    
    this.superApprove = function (processId) {
        var _url = _rootAdminUrl + 'SuperApprove/' + processId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    }

    this.remove = function (organizationRegistrationId) {
        var _url = _rootAdminUrl + 'Remove/' + organizationRegistrationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.restore = function (organizationRegistrationId) {
        var _url = _rootAdminUrl + 'Restore/' + organizationRegistrationId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getLatestRegistrationDetails = function (orgId) {
        var _url = _rootAdminUrl + 'GetLatestRegistrationDetails/' + orgId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getOrgRegistrationInfo = function () {
        var _url = _rootAdminUrl + 'GetOrgRegistrationInfo/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.getUserRegistrations = function () {
        var _url = _rootAdminUrl + 'GetUserRegistrations/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }

    this.cancelRegistration = function(registration) {
        var _url = _rootAdminUrl + 'CancelRegistration/';
        var resp = $http({
            url: _url,
            method: "POST",
            data: registration
        });
        return resp;
    }

});;
app.service('RegistrationDataService', function ($http) {
    var _rootUrl = '/api/Registration/RegistrationData/';

    this.getRegistrationData = function (registrationInstanceId, registrationPeriodId, GUID) {
        var _url = _rootUrl + 'GetRegistrationData/' + registrationInstanceId + '/' + registrationPeriodId + '/' + GUID + '/';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        })
        return resp;
    }

    this.saveRegistrationData = function (registrationData, registrationInstanceId, registrationPeriodId) {
        var _url = _rootUrl + 'SaveRegistrationData/' + registrationInstanceId + '/' + registrationPeriodId + '/';
        var resp = $http({
            url: _url,
            method: "POST",
            headers: { 'Content-Type': 'application/json' },
            data: registrationData,
        })
        return resp;
    }
});
app.service('ReportService', function ($http) {
    var _rootUrl = '/api/Reports/';

    this.getReportList = function () {
        var _url = _rootUrl + 'GetReportList/';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        })
        return resp;
    }
});;
app.service('AnnouncementsService', function ($http) {
    var _rootUrl = '/api/Announcements/';
    this.getAll = function () {
        var _url = _rootUrl + 'GetAll';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getAllAdmin = function () {
        var _url = _rootUrl + 'GetAllAdmin';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getSystem = function () {
        var _url = _rootUrl + 'GetSystem';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    
    this.getFollowedOrgAnnouncements = function () {
        var _url = _rootUrl + 'GetFollowedOrgAnnouncements';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.getOrganization = function (organizationId) {
        var _url = _rootUrl + organizationId + '/Get';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getOrganizationPastAnnouncements = function (organizationId) {
        var _url = _rootUrl + organizationId + '/GetOrganizationPastAnnouncements';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getOrganizationFutureAnnouncements = function (organizationId) {
        var _url = _rootUrl + organizationId + '/GetOrganizationFutureAnnouncements';
        var resp = $http({
            url: _url,
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.updateAnnouncement = function (announcement) {
        var _url = _rootUrl + 'UpdateAnnouncement';
        var resp = $http({
            url: _url,
            method: "POST",
            data: announcement
        });
        return resp;
    };
    this.deleteAnnouncement = function (announcementId) {
        var _url = _rootUrl + 'DeleteAnnouncement';
        var resp = $http({
            url: _url,
            method: "POST",
            data: {
                AnnouncementId: announcementId
            }
        });
        return resp;
    };
    

});

;
app.service('CategoryServices', function ($http) {
    var _rootUrl = '/api/Admin/System/Categories/';
    this.getCategories = function () {
        var _url = _rootUrl + 'GetCategories';
        var resp = $http({
            url: _url
        });
        return resp;
    };

    this.getPublicEventCategories = function () {
        var _url = _rootUrl + 'GetPublicEventCategories';
        var resp = $http({
            url: _url
        });
        return resp;
    };

    this.getSystemOrganizationCategories = function () {
        var _url = _rootUrl + 'GetSystemOrganizationCategories';
        var resp = $http({
            url: _url,
            method: 'GET'
        });
        return resp;
    };

    this.newCategory = function () {
        var _url = _rootUrl + 'NewCategory';
        var resp = $http({
            url: _url
        });
        return resp;
    };

    this.updateCategory = function (category) {
        var _url = _rootUrl + 'UpdateCategory';
        var resp = $http({
            url: _url,
            data: category,
            method: 'POST'
        });
        return resp;
    };

    this.deleteCategory = function (category) {
        var _url = _rootUrl + 'DeleteCategory';
        var resp = $http({
            url: _url,
            data: category,
            method: 'POST'
        });
        return resp;
    };

    this.getSystemCategoriesByOrganizationId = function (organizationId)
    {
        var _url = _rootUrl + 'GetSystemCategoriesByOrganizationId/' + organizationId;
        var resp = $http({
            url: _url,
            method: 'GET'
        });
        return resp;
    };


    this.getDashboardSystemCategoriesByOrgId = function (organizationId) {
        var _url = '/api/System/Categories/GetDashboardSystemCategoriesByOrgId/' + organizationId;
        var resp = $http({
            url: _url,
            method: 'GET'
        });
        return resp;
    };
});;
app.service('NoteTemplatesService', function ($http) {
    var _rootUrl = '/api/NoteTemplate/';
    
    this.getNoteTemplates = function (ZoneId) {
        ZoneId = (ZoneId == undefined) ? null : ZoneId;
        var promise = $http({
            url: _rootUrl + 'GetNoteTemplates?ZoneId=' + ZoneId,
            method: 'GET'
        });
        return promise;
    };
    this.updateNoteTemplates = function (noteTemplate) {
       
        var promise = $http({
            url: _rootUrl + 'UpdateNoteTemplates',
            method: 'POST',
            data:noteTemplate
        });
        return promise;
    };
    this.deleteNoteTemplate = function (noteId) {
     
        var promise = $http({
            url: _rootUrl + 'DeleteNoteTemplate',
            method: 'POST',
            data: {
                noteId : noteId
            }
        });
        return promise;
    };
});;
app.service('SystemPeriodsService', function ($http) {
    var _rootUrl = '/api/SystemPeriodsApi/';
    
    this.getOrganizationRegistrationPeriods = function () {
        var resp = $http({
            url: _rootUrl + 'GetOrganizationRegistrationPeriods',
            method: 'GET'
        });
        return resp;
    };

    this.updateSystemPeriod = function (systemPeriod, applicationId) {
        var resp = $http({
            url: _rootUrl + 'UpdateSystemPeriod/' + applicationId,
            method: 'POST',
            data: systemPeriod
        });
        return resp;
    };

    this.removeSystemPeriod = function (systemPeriod) {
        var resp = $http({
            url: _rootUrl + 'RemoveSystemPeriod',
            method: 'POST',
            data: systemPeriod
        });
        return resp;
    };

    this.getApplicationBySystemPeriodId = function (systemPeriodId) {
        var resp = $http({
            url: _rootUrl + 'GetApplicationBySystemPeriodId/' + systemPeriodId,
            method: 'GET'
        });
        return resp;
    };

    this.checkIfRegistrationIsOpen = function () {
        var resp = $http({
            url: _rootUrl + 'CheckIfRegistrationIsOpen/',
            method: 'GET'
        });
        return resp;
    };
});;
app.service('TypesService', function ($http) {
    var _rootUrl = '/api/Types/';
    
    this.getOrganizationTypes = function (ZoneId) {
        var promise = $http({
            url: _rootUrl + 'GetOrganizationTypes',
            method: 'GET'
        });
        return promise;
    };

    this.getRegistrationTargetTypes = function () {
        return [{ registrationTargetTypeId: 0, registrationTargetType: 'Organization Type' },
                { registrationTargetTypeId: 1, registrationTargetType: 'Single Organization' }]
    }

    this.updateRegistrationPeriod = function (regPeriod) {
        var promise = $http({
            url: _rootUrl + 'UpdateOrganizationRegistrationPeriod',
            data: regPeriod,
            method: 'POST'
        });
        return promise;
    };
});;
app.service('SystemRolesService', function ($http) {
    var _rootUrl = '/api/Profile/';

    this.createSystemRole = function (systemRoleId, systemRole) {
        var _url = _rootUrl + systemRoleId + '/CreateSystemRole'
        var resp = $http({
            url: _url,
            method: "POST",
            data: systemRole,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.updateSystemRole = function (systemRoleId, systemRole) {
        var _url = _rootUrl + systemRoleId + '/UpdateSystemRole'
        var resp = $http({
            url: _url,
            method: "POST",
            data: systemRole,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.deleteSystemRole = function (systemRoleId, systemRole) {
        var _url = _rootUrl + systemRoleId + '/DeleteSystemRole'
        var resp = $http({
            url: _url,
            method: "POST",
            data: systemRole,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

});;
app.service('SystemUserTypesService', function ($http) {
    var _rootUrl = '/api/Profile/';

    this.createSystemUserType = function (systemUserTypeId, systemUserType) {
        var _url = _rootUrl + systemUserTypeId + '/CreateSystemUserType'
        var resp = $http({
            url: _url,
            method: "POST",
            data: systemUserType,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.updateSystemUserType = function (systemUserTypeId, systemUserType) {
        var _url = _rootUrl + systemUserTypeId + '/UpdateSystemUserType'
        var resp = $http({
            url: _url,
            method: "POST",
            data: systemUserType,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.deleteSystemUserType = function (systemUserTypeId, systemUserType) {
        var _url = _rootUrl + systemUserTypeId + '/DeleteSystemUserType'
        var resp = $http({
            url: _url,
            method: "POST",
            data: systemUserType,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

    this.addAllUserstoSystemUserType = function () {
        var _url = _rootUrl + '/AddAllUserToSystemUserType'
        var resp = $http({
            url: _url,
            method: "POST",
            data: "",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    }

});;
app.service('PermitWizardService', function ($http) {
    this.deletePermitCategory = function (PermitCategoryId) {
        var resp = $http({
            url: "/api/Student/Permit/" + PermitCategoryId + "/DeletePermitCategory",
            method: "POST",
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        });
        return resp;
    };

    this.getPermitCategories = function (PermitVersionId) {

        var resp = $http({
            url: "/api/Student/Permit/" + PermitVersionId + "/GetPermitCategories",
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.getSystemPermitCategories = function (PermitVersionId) {

        var resp = $http({
            url: "/api/Student/Permit/" + PermitVersionId + "/GetSystemPermitCategories",
            method: "GET",
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };

    this.updateCategory = function (PermitVersionId, CategoryId) {

        var data = { PermitVersionId: PermitVersionId, CategoryId: CategoryId }
        var resp = $http({
            url: "/api/Student/Permit/AddPermitCategory",
            method: "POST",
            data: data,
            headers: { 'Content-Type': 'application/json' },
        });
        return resp;
    };
});;
app.service('WorkflowService', function ($http) {
    var _rootUrl = '/api/Workflow/Admin/';

    this.getWorkflows = function () {
        var _url = _rootUrl + 'GetWorkflows';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getWorkflowDesignations = function () {
        var _url = _rootUrl + 'GetWorkflowDesignations/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getWorkflowRoles = function () {
        var _url = _rootUrl + 'GetWorkflowRoles/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getWorkflowDetail = function (workflowId) {
        var _url = _rootUrl + 'GetWorkflowDetail/' + workflowId + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getStepItemDetail = function (workflowStepItemId) {
        var _url = _rootUrl + 'GetStepItemDetail/' + workflowStepItemId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getApproverList = function (stepItemId) {
        var _url = _rootUrl + 'GetApproverList/' + stepItemId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getStepDetail = function (ID) {
        var _url = _rootUrl + 'GetStepDetail/' + ID;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getStepItemList = function (ID) {
        var _url = _rootUrl + 'GetStepItemList/' + ID;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getStatusList = function () {
        var _url = _rootUrl + 'GetStatusList/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getWorkflowSteps = function (workflowStepItemId) {
        var _url = _rootUrl + 'GetWorkflowSteps/' + workflowStepItemId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.getWorkflowRoleDetail = function (workflowRoleId) {
        var _url = _rootUrl + 'GetWorkflowRoleDetail/' + workflowRoleId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.removeWorkflow = function (workflowId) {
        var _url = _rootUrl + 'RemoveWorkflow/' + workflowId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.removeWorkflowRoles = function (workflowRolesId) {
        var _url = _rootUrl + 'RemoveWorkflowRoles/' + workflowRolesId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.removeStepItem = function (workflowStepItemId) {
        var _url = _rootUrl + 'RemoveStepItem/' + workflowStepItemId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    }

    this.removeApprover = function (stepItemApproverId) {
        var _url = _rootUrl + 'RemoveApprover/' + stepItemApproverId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.assignWorkflow = function(selectedWorkflowId, workflowDesignationId) {
        var _url = _rootUrl + 'AssignWorkflow/' + selectedWorkflowId + '/' + workflowDesignationId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.createNewWorkflow = function (workflow) {
        var _url = _rootUrl + 'CreateNewWorkflow';
        var resp = $http({
            url: _url,
            method: "POST",
            data: workflow
        });
        return resp;
    };

    this.createNewWorkflowRoles = function (workflowRoles) {
        var _url = _rootUrl + 'CreateNewWorkflowRoles';
        var resp = $http({
            url: _url,
            method: "POST",
            data: workflowRoles
        });
        return resp;
    };

    this.createNewStep = function (step, workflowId) {
        var _url = _rootUrl + 'CreateNewStep/' + workflowId;
        var resp = $http({
            url: _url,
            method: "POST",
            data: step
        });
        return resp;
    };

    this.createNewApprover = function (workflowRoleId, userId, workflowStepItemId, isGroupApprover, minimumApprovalCount, required) {
        var _url = _rootUrl + 'CreateNewApprover/' + workflowRoleId + '/' + userId + '/' + workflowStepItemId + '/' + isGroupApprover + '/' + minimumApprovalCount + '/' + required + '/';
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.removeLastStep = function (workflowId) {
        var _url = _rootUrl + 'RemoveLastStep/' + workflowId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.createNewStepItem = function (stepId, stepItemName, stepItemDescription, status, changeMasterStatus, pause, superUserOnly, defaultItem, redirect, redirectStepId) {
        var _url = _rootUrl + 'CreateNewStepItem/' + stepId + '/' + stepItemName  + '/' + status + '/' + changeMasterStatus + '/' + pause + '/' + superUserOnly + '/' + defaultItem + '/' + redirect  + '/' + redirectStepId + '/' + stepItemDescription;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.updateStep = function (step) {
        var _url = _rootUrl + 'UpdateStep';
        var resp = $http({
            url: _url,
            method: "POST",
            data: step
        });
        return resp;
    };

    this.updateStepItem = function (stepItem) {
        var _url = _rootUrl + 'UpdateStepItem';
        var resp = $http({
            url: _url,
            method: "POST",
            data: stepItem
        });
        return resp;
    };

    this.updateWorkflowRole = function (workflowRole) {
        var _url = _rootUrl + 'UpdateWorkflowRole';
        var resp = $http({
            url: _url,
            method: "POST",
            data: workflowRole
        });
        return resp;
    };

    this.getWorkflowUserRolesOverview = function (workflowRoleId) {
        var _url = _rootUrl + 'GetWorkflowUserRolesOverview/' + workflowRoleId;
        var resp = $http({
            url: _url,
            method: "GET",
        });
        return resp;
    };

    this.removeWorkflowUserRoles = function (workflowUserRoleId) {
        var _url = _rootUrl + 'RemoveWorkflowUserRoles/' + workflowUserRoleId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.toggleEmailNotification = function(workflowUserRoleId) {
        var _url = _rootUrl + 'ToggleEmailNotification/' + workflowUserRoleId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    }

    this.createNewWorkflowUserRole = function (userInput, workflowRoleId, emailNotify) {
        var _url = _rootUrl + 'CreateNewWorkflowUserRole/' + userInput + '/' + workflowRoleId + '/' + emailNotify + '/';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getWorkflowStatus = function() {
        var _url = _rootUrl + 'GetWorkflowStatus';
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getPossibleResponsesByProcessId = function (processId) {
        var _url = _rootUrl + 'GetPossibleResponsesByProcessId/' + processId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.getApprovalStatusByProcessId = function (processId) {
        var _url = _rootUrl + 'GetApprovalStatusByProcessId/' + processId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    };

    this.updateApprovalStatus = function (workflowStepItemId, processId) {
        var _url = _rootUrl + 'UpdateApprovalStatus/' + workflowStepItemId + '/' + processId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.superApprove = function (processId) {
        var _url = _rootUrl + 'SuperApprove/' + processId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.superDeny = function (processId) {
        var _url = _rootUrl + 'SuperDeny/' + processId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.approve = function (processId) {
        var _url = '/api/Workflow/Approve/' + processId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.deny = function (processId) {
        var _url = '/api/Workflow/Deny/' + processId;
        var resp = $http({
            url: _url,
            method: "POST"
        });
        return resp;
    };

    this.getPermitApprovalsNeededCount = function (processId) {
        var _url = _rootUrl + 'GetPermitApprovalsNeededCount/' + processId;
        var resp = $http({
            url: _url,
            method: "GET"
        });
        return resp;
    }
});;
app.controller('adminApplicationController',
    function ($scope, ApplicationService) {
        $scope.applicationFilters = { ApplicationType: 0 };
        $scope.applications = [];

        $scope.itemsPerPage = 10;
        $scope.currentPage = 1;
        $scope.loadingApplication = false;
        $scope.propertyName = '-ApplicationName';
        $scope.reverse = false;

        $scope.exportAllSubmissions = function () {
            var applicationIds = '';
            angular.forEach($scope.applications,
                function (application) {
                    if (application.Checked)
                        applicationIds += (application.ApplicationId + ',');
                });
            if (applicationIds !== null && applicationIds !== undefined) {
                window.open((window.location.protocol) +
                    '//' +
                    window.location.host +
                    '/Admin/Application/ExportToCsvFile?applicationIds=' +
                    applicationIds +
                    ($scope.applicationFilters.ApplicationSubmittedDateRange !== undefined
                        ? '&submittedDateRange=' + $scope.applicationFilters.ApplicationSubmittedDateRange
                        : '') +
                    ($scope.applicationFilters.ApplicationType !== undefined
                        ? '&applicationType=' + $scope.applicationFilters.ApplicationType
                        : ''));
            }
        };

        $scope.changeOrderByProperty = function (newPropertyName) {
            $scope.propertyName = '-' + newPropertyName;
            $scope.reverse = !$scope.reverse;
        };

        $scope.getAllApplications = function (applicationType) {
            var promise = ApplicationService.getAllApplicationsByType(applicationType);
            promise.then(function (response) {
                $scope.applications = response.data;
                $('#checkAll').iCheck('uncheck');
            });
        };

        $scope.init = function () {
            $scope.loadingApplication = true;
            $scope.getAllApplications(0);
            $scope.loadingApplication = false;
        };

        $scope.init();
    });;
app.controller('submissionDashboardController',
    function ($scope, FormsService, ApplicationService, WorkflowService, $uibModal) {
        $scope.loading = false;
        $scope.applicationSubmissions = {};
        $scope.maxPerPage = 10;
        $scope.currentPage = 1;
        $scope.maxPages = 1;
        $scope.numberOfResults = 0;
        $scope.searchKeywords = "";
        $scope.pageNumbers = [{
            text: "Page 1 of 1",
            value: 1
        }];

        var $ctrl = this;

        $scope.selectedApplication = { ApplicationId: 0, ApplicationName: 'All Applications' };
        $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];
        $scope.selectedPage = $scope.pageNumbers[0];

        $scope.applications = {};

        $scope.includePending = true;
        $scope.includeCompleted = false;
        $scope.includeIncomplete = false;
        $scope.includeCancelled = false;
        $scope.includeHeld = false;
        $scope.includeDenied = false;
        $scope.includeDeleted = false;

        $scope.reset = true;

        $scope.changePage = function () {
            $scope.currentPage = $scope.selectedPage.value;
            if (!$scope.reset) {
                $scope.getFilteredApplicationSubmissions();
            } else {
                $scope.reset = false;
            }
        };

        $scope.changeApplication = function () {
            $scope.reset = true;
            $scope.currentPage = 1;
            $scope.getFilteredApplicationSubmissions();
        };

        $scope.remove = function (submission) {
            var promise = FormsService.remove(submission);
            promise.then(function (response) {
                $scope.getFilteredApplicationSubmissions();
            });
        };

        $scope.restore = function (submission) {
            var promise = FormsService.restore(submission);
            promise.then(function (response) {
                $scope.getFilteredApplicationSubmissions();
            });
        };

        $scope.toggleCheckBox = function (model) {
            switch (model) {
                case 'pending':
                    $scope.includePending = !$scope.includePending;
                    break;
                case 'completed':
                    $scope.includeCompleted = !$scope.includeCompleted;
                    break;
                case 'denied':
                    $scope.includeDenied = !$scope.includeDenied;
                    break;
                case 'held':
                    $scope.includeHeld = !$scope.includeHeld;
                    break;
                case 'canceled':
                    $scope.includeCancelled = !$scope.includeCancelled;
                    break;
                case 'incomplete':
                    $scope.includeIncomplete = !$scope.includeIncomplete;
                    break;
                case 'deleted':
                    $scope.includeDeleted = !$scope.includeDeleted;
                    break;
            }
            $scope.getFilteredApplicationSubmissions();
        };

        $scope.getWorkflowDetail = function (processId, status) {
            $ctrl.varList = [processId, status];
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/workflow.html',
                controller: 'workflowModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: 'lg',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    promise.then(function (response) {
                        $scope.init();
                    });
                }
            }, function () {
                $scope.init();
            });
        };

        $scope.superApprove = function (processId) {
            $ctrl.varList = 'SUPER Approve this Submission(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.superApprove(processId);
                    promise.then(function (response) {
                        $scope.init();
                    });
                }
            }, function () {

            });
        };

        $scope.superDeny = function (processId) {
            $ctrl.varList = 'SUPER Deny this Submission(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.superDeny(processId);
                    promise.then(function (response) {
                        $scope.init();
                    });
                }
            });
        };

        $scope.updateApprovalStatus = function (workflowStepItemId, processId) {
            var promise = WorkflowService.updateApprovalStatus(workflowStepItemId, processId);
            promise.then(function (response) {
                $scope.init();
            });
        };

        $scope.getPossibleResponses = function (application) {
            var promise = WorkflowService.getPossibleResponsesByProcessId(application.ProcessId);
            promise.then(function (response) {
                application.PossibleResponses = response.data;
            });
        };

        $scope.getApprovalStatus = function (application) {
            var promise = WorkflowService.getApprovalStatusByProcessId(application.ProcessId);
            promise.then(function (response) {
                application.ApprovalStatus = response.data;
            });
        };

        $scope.getApplicationsWithWorkflow = function () {
            var promise = ApplicationService.getApplicationsWithWorkflow();
            promise.then(function (response) {
                $scope.applications = response.data;
            });
        };

        $scope.getFilteredApplicationSubmissions = function () {
            $scope.loading = true;

            var promise = FormsService.getFilteredApplicationSubmissions(encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, $scope.selectedApplication.ApplicationId,
                $scope.includeCompleted, $scope.includeIncomplete, $scope.includeCancelled, $scope.includeHeld, $scope.includePending, $scope.includeDenied, $scope.includeDeleted);
            promise.then(function (response) {
                var data = response.data;
                $scope.numberOfResults = data.NumResults;
                $scope.applicationSubmissions = data.Submissions;
                $scope.currentPage = data.CurrentPage;
                $scope.maxPages = data.PageCount;
                $scope.loading = false;
                $scope.pageNumbers = [];

                if (data.PageCount === 0) {
                    $scope.pageNumbers.push({
                        text: "Page " + 0 + " of " + 0,
                        value: 1
                    });
                } else {
                    for (var i = 1; i <= data.PageCount; i++) {
                        $scope.pageNumbers.push({
                            text: "Page " + i.toString() + " of " + data.PageCount.toString(),
                            value: i
                        }
                        );
                    }
                }

                $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];

                angular.forEach($scope.applicationSubmissions,
                    function (application) {
                        $scope.getApprovalStatus(application);
                        $scope.getPossibleResponses(application);
                    });
            });
        };

        $scope.init = function () {
            $scope.getApplicationsWithWorkflow();
            $scope.getFilteredApplicationSubmissions();
        };

        $scope.init();
    });;
app.controller('userSubmissionController', function ($scope, $http, $q, $uibModal, FormsService, RegistrationDetailService, RegistrationService, ExtendedPropertyService, PermitService) {

    var $ctrl = this;

    $scope.submissionStatuses = [
        {
            status: -1,
            text: 'None',
            checked: true,
            className: 'bg-green'
        },
        {
            status: 0,
            text: 'Pending',
            checked: true,
            className: 'bg-grey'
        },
        {
            status: 1,
            text: 'Approved',
            checked: true,
            className: 'bg-green'
        },
        {
            status: 2,
            text: 'Denied',
            checked: true,
            className: 'bg-red'
        },
        {
            status: 3,
            text: 'Held',
            checked: true,
            className: 'bg-yellow'
        },
        {
            status: 4,
            text: 'Cancelled',
            checked: true,
            className: 'bg-red'
        },
        {
            status: 5,
            text: 'Completed',
            checked: true,
            className: 'bg-green'
        },
        {
            status: 99,
            text: 'Incomplete',
            checked: true,
            className: 'bg-blue'
        }
    ];

    $scope.registrations = [];


    $scope.statusChanged = function (event, status) {
        if (event.target.nodeName.toLowerCase() == 'label') {

            status.checked = !status.checked;
            $scope.filterSubmissions();
        }
    }

    $scope.filterSubmissions = function () {

        var statusToShow = $scope.submissionStatuses.filter(function (status) {
            return status.checked;
        }).map(function (status) {
            return status.status;
        });

        $scope.filteredSubmissions = $scope.submissions.filter(function (submission) {
            if ($.inArray(submission.Status, statusToShow) >= 0) {
                return true;
            }
        });

    }

    $scope.registrationDetail = function (registration) {
        $ctrl.varList = registration.OrganizationRegistrationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/userRegistrationDetail.html',
            controller: 'userRegistrationDetailModalInstanceController',
            controllerAs: '$ctrl',
            size: 'xl',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
        }, function () { });
    }

    $scope.getUserRegistrations = function () {
        RegistrationService.getUserRegistrations().then(function (response) {
            if (response.data.length > 0) {
                $scope.registrations = response.data.map(function (registration) {
                    registration.className = jwru.constellation.utils.getObjectById($scope.submissionStatuses, 'status', registration.Status).className;
                    return registration;
                });
                $scope.filterSubmissions();
            }
        });
        
    }

    $scope.getUserSubmissions = function () {

        FormsService.getUserSubmissions().then(function (response) {
            $scope.submissions = response.data.map(function (submission) {
                submission.className = jwru.constellation.utils.getObjectById($scope.submissionStatuses, 'status', submission.Status).className;
                return submission;
            });
            $scope.filterSubmissions();
        })
    }

    $scope.init = function () {
        $scope.getUserSubmissions();
        $scope.getUserRegistrations();
        $scope.getUserPermits();
    }

    $scope.getUserPermits = function () {
        PermitService.getPermitListingByUserId('', 10, 1, false, true, true, true, true, true, false).then(function (result) {
            $scope.recentPermits = result.data;
           
        });
    };

    $scope.cancelRegistration = function(registration){
        $ctrl.varList = 'Cancel the Registration(This can NOT be UNDONE)';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                RegistrationService.cancelRegistration(registration).then(function(response){
                    $scope.getUserRegistrations();
                });
            }
        }, function() {});
    };


    //notes variables
    $scope.includeDeletedNotes = false;

    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentProcessNoteId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";
    $scope.registration = {};

    $scope.getOrgRegistrationInfo = function () {
        RegistrationService.getOrgRegistrationInfo().then(function (response) {
            $scope.registration = response.data;
            if ($scope.registration.ProcessId > 0) {
                $scope.getProcessNotes();
            }
            if ($scope.registration.registrationView)
                $scope.getExtendedPropertyGroups($scope.registration.registrationView.OrganizationRegistrationId);
        });
    }

    $scope.getExtendedPropertyGroups = function (OrganizationRegistrationId) {
        var promise = ExtendedPropertyService.getExtendedPropertyGroups(OrganizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.propertyGroups = data;
            $scope.activeAdditionalInfoEdit = false;
        });
    };

    $scope.getProcessNotes = function () {
        var promise = RegistrationDetailService.getPublicWorkflowNotes($scope.registration.registrationView.ProcessId);
        promise.then(function (response) {
            $scope.currentProcessNotes = response.data;
        });
    };

    $scope.newProcessNote = function (parentNoteId, IsPrivate) {
        if ($scope.currentProcessNoteId === 0) {
            RegistrationDetailService.newWorkflowNote($scope.registration.registrationView.ProcessId).then(function (response) {
                var note = response.data;
                response.data.Note = $scope.newNoteText;
                $scope.makeNotePublic(note);
                $scope.newNoteText = "";
            });
        }
        else {
            var note = getNote($scope.currentProcessNoteId);
            note.Note = $scope.newNoteText;
            RegistrationDetailService.editNote(note).then(function (response) {
                $scope.getProcessNotes($scope.includeDeletedNotes);
                $scope.currentProcessNoteId = 0;
                $scope.newNoteText = "";
                $scope.buttonText = "Post";
                note.customStyle = "";
            });
        }
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        var promise = RegistrationDetailService.editNote(note);
        promise.then(function (response) {
            $scope.getProcessNotes(1);
        });
    };

    function getNote(processNoteId) {
        var len = $scope.currentProcessNotes.length;
        for (var i = 0; i < len; i++) {
            if ($scope.currentProcessNotes[i].WorkflowNoteId === processNoteId) {
                return $scope.currentProcessNotes[i];
            }
        }
        return null;
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }


    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };

});;
app.controller('loginController', function ($scope, $uibModal,  LoginService) {
    var self = this;
    $scope.userLogonModel = {};
    $scope.userLogonModelResponse = {};
    $scope.loginModal = {};
    $scope.$parent.verification = '';
    $scope.returnUrl = '/';

    $scope.hasUFID = true;

    $scope.verifyForm = function (loadForgotPassword) {
        if ($scope.frmLogin.$invalid) {
            angular.forEach($scope.frmLogin.$error, function (field) {
                angular.forEach(field, function (errorField) {
                    errorField.$setDirty();
                })
            });
        } else
        {
            if (loadForgotPassword) {
                var promise = LoginService.forgotPassword($scope.userLogonModel);
                promise.then(function (response) {
                    $scope.verification = '';
                    $scope.userLogonModelResponse = response.data;
                    $scope.loginModal = $uibModal.open({
                        templateUrl: '/app/views/userManagement/reset_password.html?c=' + (new Date()).getTime(),
                        scope: $scope,
                        size: 'md',

                    });
                });
            }
        }

    };

    $scope.initRegistration = function () {
        showUserRegistrationDialog($uibModal,$scope.returnUrl);
    };

    $scope.resetPassword = function () {

        if ($scope.verification === $scope.userLogonModelResponse.Email) {
            $scope.userLogonModelResponse.Verified = true;
            var promise = LoginService.resetPassword($scope.userLogonModelResponse);
            promise.then(function (response) {
                $scope.loginModal.dismiss();
                jwru.constellation.widgets.confirmationDialog.open($uibModal, 'Password Reset Email Sent!', 'Thank you for confirming your email address. Please check your email for a password reset link.');
            });
        }
    };

    $scope.initController = function (returnUrl) {
        if (returnUrl !== undefined) {
            $scope.returnUrl = returnUrl;
        }
        $scope.userLogonModel = {
            Username: "",
            Lastname: "",
            Password : ""
        };
    };
});

app.controller('passwordResetController', function ($scope, $uibModal, LoginService) {
    var self = this;
    $scope.userConfirmationModel = {};
    $scope.userLogonModelResponse = {};
    $scope.loginModal = {};
    $scope.$parent.verification = '';

    $scope.verifyForm = function (loadForgotPassword) {
        if ($scope.frmLogin.$invalid) {
            angular.forEach($scope.frmLogin.$error, function (field) {
                angular.forEach(field,
                    function(errorField) {
                        errorField.$setDirty();
                    });
            });
        } else {
            var promise = LoginService.forgotPassword($scope.userLogonModel);
            promise.then(function (response) {
                $scope.verification = '';
                $scope.userLogonModelResponse = response.data;
                $scope.loginModal = $uibModal.open({
                    templateUrl: '/app/views/userManagement/reset_password.html?c=' + (new Date()).getTime(),
                    scope: $scope,
                    size: 'md',

                });
            });
        }

    };

    $scope.resetPassword = function () {
        if ($scope.verification === $scope.userLogonModelResponse.Email) {
            $scope.userLogonModelResponse.Verified = true;
            var promise = LoginService.resetPassword($scope.userLogonModelResponse);
            promise.then(function (response) {

            });
        }
    };

    $scope.initController = function () {
        $scope.userConfirmationModel = {
            Password : "",
            Confirmation : ""
        };
    };
});;
app.controller('emailSystemController', function ($scope, $timeout, $uibModal, $window, $compile, $filter, EmailSystemService, UserProfileService) {
    var $ctrl = this;
    $scope.minDate = new Date(0);

    $scope.alerts = [];
    $scope.loading = false;

    $scope.selectedFiles = [];

    $scope.emailsOverview = [];
    $scope.allEmails = [];
    $scope.targetUsers = [];

    $scope.email = {
        To: '',
        Cc: '',
        Bcc: '',
        Subject: '',
        ShareId: 0
    };

    $scope.share = {};

    $scope.ccEnabled = false;
    $scope.toEnabled = false;

    // Sent: 0, Draft: 1, Scheduled: 2, My Shared Mails: 3, Mails Shared With Me: 4
    $scope.emailType = 0;

    // Mail Box: 0, Mail Detail: 1, View Only: 2
    $scope.pageType = 0;

    // Pagination
    $scope.currentPage = 1;
    $scope.totalEmails = 0;
    $scope.emailPerPage = 10;
    $scope.currentShowingEmails = [];

    var currentDateTime = {};
    var keyword = '';

    $scope.compareDateTime = function (source, target) {
        // -1 : source is smaller than target, 0 : tie, 1 : bigger
        var result = 0;
        var sourceTime = new Date(source).getTime();
        var targetTime = new Date(target).getTime();
        if (sourceTime > targetTime) {
            result = 1;
        } else if (sourceTime < targetTime) {
            result = -1;
        }

        return result;
    }

    $scope.closeAlert = function (index) {
        $scope.alerts.splice(index, 1);
    };

    $scope.toggle = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.stopPropagation = function (e) {
        e.stopPropagation();
    };

    $scope.shareEmail = function () {
        var emailsToShare = [];
        angular.forEach($scope.emailsOverview,
            function (value) {
                if (value.Checked)
                    emailsToShare.push(value.EmailId);
            });
        if (emailsToShare.length > 0) {
            $scope.varList = "Share These " + emailsToShare.length + " Emails?";
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: "/app/views/confirmedDialog/confirm.html",
                controller: "confirmedModalInstanceCtrl",
                controllerAs: "$ctrl",
                size: "",
                resolve: {
                    varList: function () {
                        return $scope.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                $scope.varList = [[3, 4, 5, 99]];
                if (result === 1) {
                    var modalInstance2 = $uibModal.open({
                        animation: true,
                        ariaLabelledBy: "modal-title",
                        ariaDescribedBy: "modal-body",
                        templateUrl: "/app/views/modalViews/systemRoleUserList.html",
                        controller: "systemRoleUserListModalInstanceCtrl",
                        controllerAs: "$ctrl",
                        size: "lg",
                        resolve: {
                            varList: function () {
                                return $scope.varList;
                            }
                        }
                    });
                    modalInstance2.result.then(function (result) {
                        $('#checkAll').iCheck('uncheck');
                        $('#checkAllBot').iCheck('uncheck');
                        if (result !== -1 && result.length > 0) {
                            var share = {
                                ShareId: 0,
                                TargetUserId: result.join(',')
                            };
                            var promise = EmailSystemService.shareEmails(share, emailsToShare.join(','));
                            promise.then(function (response) {
                                $scope.alerts.push({ type: 'success', msg: 'Email(s) Shared Successful!' });
                            });
                        }
                    });
                }
            });
        }
    };

    $scope.editSharedUserList = function () {
        $scope.varList = [[3, 4, 5, 99], $scope.share];
        var modalInstance2 = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: "/app/views/modalViews/systemRoleUserList.html",
            controller: "systemRoleUserListModalInstanceCtrl",
            controllerAs: "$ctrl",
            size: "lg",
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance2.result.then(function (result) {
            $('#checkAll').iCheck('uncheck');
            $('#checkAllBot').iCheck('uncheck');
            if (result !== -1 && result.length > 0) {
                var share = {
                    ShareId: $scope.share.ShareId,
                    TargetUserId: result.join(',')
                };
                var promise = EmailSystemService.shareEmails(share, $scope.share.EmailId);
                promise.then(function (response) {
                    $scope.showMailDetail($scope.share.EmailId, $scope.share.ShareId);
                    $scope.alerts.push({ type: 'success', msg: 'Shared User List Updated Successful!' });
                });
            }
        });
    };

    $scope.showMailDetail = function (emailId, shareId) {
        $scope.loading = true;
        var promise = EmailSystemService.getEmailById(emailId);
        promise.then(function (response) {
            $scope.email = response.data;
            document.getElementById('scheduledForStr').value = new Date($scope.email.ScheduledFor) <= 0 ? '' : $filter('date')($scope.email.ScheduledFor, 'MM/dd/yyyy h:mm a');
            $scope.pageType = 1;
            $scope.ccEnabled = $scope.email.Cc !== '';
            $scope.toEnabled = $scope.email.To !== '';
            $window.uploadedFiles = [];
            $window.filesStringArr = [];
            var html = '';
            for (var i = 0; i < $scope.email.Attachments.length; i++) {
                $window.uploadedFiles.push({
                    name: $scope.email.Attachments[i].Name,
                    size: $scope.email.Attachments[i].Size,
                    lastModified: $scope.email.Attachments[i].LastModified
                });
                $window.filesStringArr.push($scope.email.Attachments[i].Content);
                html += '<div class="col-md-2" id=' +
                    i +
                    '>' +
                    '<div class="box box-success">' +
                    '<div class="box-header with-border">' +
                    '<div class="box-tools pull-right">' +
                    '<button type="button" class="btn btn-box-tool" onclick="removeFile(' +
                    i +
                    ')">' +
                    '<i class="fa fa-times text-red"></i>' +
                    '</button>' +
                    '</div>' +
                    '</div>' +
                    '<div class="box-body" style="white-space: nowrap; text-align: center" data-toggle="tooltip" data-placement="top" title="' +
                    $scope.email.Attachments[i].Name +
                    '">' +
                    '<a class="btn" href="" ng-click="downloadAttachment(' +
                    i +
                    ')">' +
                    '<i class="fa fa-file fa-3x" aria-hidden="true"></i></a>' +
                    '<div style="text-overflow: ellipsis; overflow: hidden">' +
                    '<span>' +
                    $scope.email.Attachments[i].Name +
                    '</span>' +
                    '</div>' +
                    '<div style="text-overflow: ellipsis; overflow: hidden">' +
                    '<span>' +
                    formatBytes($scope.email.Attachments[i].Size, 2) +
                    '</span>' +
                    '</div>' +
                    '</div>' +
                    '</div>' +
                    '</div>';
            }

            $window.lastIndex = $scope.email.Attachments.length;
            $('#attachments').empty();
            angular.element(document.getElementById('attachments')).append($compile(html)($scope));
            $scope.share = {};
            if (shareId > 0) {
                $scope.share.ShareId = shareId;
                var promise2 = EmailSystemService.getSharedEmailById(shareId);
                promise2.then(function (response2) {
                    $scope.share = response2.data;
                    if ($scope.share.TargetUserId !== undefined &&
                        $scope.share.TargetUserId !== null &&
                        $scope.share.TargetuserId !== '') {
                        var promise3 = UserProfileService.getUsersByUserIds($scope.share.TargetUserId);
                        promise3.then(function (response3) {
                            $scope.targetUsers = response3.data;
                        });
                    }
                });
            }
            $scope.loading = false;
        });
    };

    $scope.downloadAttachment = function (index) {
        var url = (window.location.protocol) + '//' + window.location.host + '/Admin_Email/Default/DownloadAttachment?fileName=' + $scope.email.Attachments[index].Name + '&emailId=' + $scope.email.EmailId;
        window.location = url;
    };

    $scope.composeNewEmail = function () {
        $scope.pageType = 1;
        $scope.emailType = -1;
        $scope.email = {
            To: '',
            Cc: '',
            Bcc: '',
            Subject: '',
            ShareId: 0
        };
        document.getElementById('scheduledForStr').value = '';
        $scope.ccEnabled = false;
        $scope.toEnabled = false;
        $scope.checkedAll = false;
        $scope.checkedAllBot = false;
        $window.uploadedFiles = [];
        $window.filesStringArr = [];
        resetFileInput();
    };

    function resetFileInput() {
        document.getElementById('attachments').innerHTML = '<div class="form-group" id="attachments"></div>';
    };

    $scope.getTimeDiff = function (dt) {
        var dateTime = new Date(dt);
        var result = '';
        var unitCount = 0;
        var minutesDiff = Math.floor((currentDateTime - dateTime) / 1000 / 60);
        if (minutesDiff >= 60) {
            var hoursDiff = Math.floor(minutesDiff / 60);
            minutesDiff -= ((hoursDiff).toFixed(0) * 60).toFixed(0);
            if (hoursDiff >= 24) {
                var daysDiff = Math.floor(hoursDiff / 24);
                hoursDiff -= ((daysDiff).toFixed(0) * 24).toFixed(0);
                if (daysDiff >= 30) {
                    var monthsDiff = Math.floor(daysDiff / 30);
                    daysDiff -= ((monthsDiff).toFixed(0) * 30).toFixed(0);
                    if (monthsDiff >= 12) {
                        result += Math.floor(monthsDiff / 12) + ' Years ';
                        unitCount++;
                        monthsDiff -= (Math.floor(monthsDiff / 12) * 12).toFixed(0);
                    }
                    if ((monthsDiff).toFixed(0) > 0) {
                        result += (monthsDiff).toFixed(0) + ' Months ';
                        unitCount++;
                    }
                }
                if ((daysDiff).toFixed(0) > 0 && unitCount < 2) {
                    result += (daysDiff).toFixed(0) + ' Days ';
                    unitCount++;
                }
            }
            if ((hoursDiff).toFixed(0) > 0 && unitCount < 2) {
                result += (hoursDiff).toFixed(0) + ' Hours ';
                unitCount++;
            }
        }
        if ((minutesDiff).toFixed(0) > 0 && unitCount < 2) {
            result += (minutesDiff).toFixed(0) + ' Minutes ';
        } else if ((minutesDiff).toFixed(0) <= 0 && unitCount === 0) {
            result += 'Moment ';
        }
        return result;
    };

    function killDuplicate(a1, a2) {
        var hash = {};
        var arr = [];
        for (var i = 0; i < a1.length; i++) {
            if (hash[a1[i].EmailId] !== true) {
                hash[a1[i].EmailId] = true;
                arr[arr.length] = a1[i];
            }
        }
        for (var i = 0; i < a2.length; i++) {
            if (hash[a2[i].EmailId] !== true) {
                hash[a2[i].EmailId] = true;
                arr[arr.length] = a2[i];
            }
        }
        return arr;
    }

    function filterEmails(email) {
        return email.FirstName.toLowerCase().indexOf(keyword.toLowerCase()) !== -1
            || email.LastName.toLowerCase().indexOf(keyword.toLowerCase()) !== -1
            || email.Subject.toLowerCase().indexOf(keyword.toLowerCase()) !== -1;
    };

    $scope.searchEmails = function (keywords) {
        var keywordArr = keywords.split(' ');
        var emails = [];
        if (keywordArr.length <= 1 && keywordArr[0].length <= 0) {
            emails = $scope.allEmails;
        } else {
            for (var i = 0; i < keywordArr.length; i++) {
                keyword = keywordArr[i];
                var temp = $scope.allEmails.filter(filterEmails);
                emails = killDuplicate(emails, temp);
            }
        }
        $scope.emailsOverview = emails;
        $scope.currentPage = 1;
        $scope.totalEmails = $scope.emailsOverview.length;
        $scope.currentShowingEmails = $scope.emailsOverview.slice(($scope.currentPage - 1) * $scope.emailPerPage,
                (($scope.currentPage * $scope.emailPerPage) > $scope.totalEmails) ? $scope.totalEmails : $scope.currentPage * $scope.emailPerPage);
    };

    $scope.emailPerPageChanged = function () {
        $scope.currentPage = 1;
        $scope.currentShowingEmails = $scope.emailsOverview.slice(($scope.currentPage - 1) * $scope.emailPerPage,
                (($scope.currentPage * $scope.emailPerPage) > $scope.totalEmails) ? $scope.totalEmails : $scope.currentPage * $scope.emailPerPage);
    };

    $scope.prevPage = function () {
        $scope.currentPage--;
        $scope.currentShowingEmails = $scope.emailsOverview.slice(($scope.currentPage - 1) * $scope.emailPerPage,
                (($scope.currentPage * $scope.emailPerPage) > $scope.totalEmails) ? $scope.totalEmails : $scope.currentPage * $scope.emailPerPage);
    };

    $scope.nextPage = function () {
        $scope.currentPage++;
        $scope.currentShowingEmails = $scope.emailsOverview.slice(($scope.currentPage - 1) * $scope.emailPerPage,
                (($scope.currentPage * $scope.emailPerPage) > $scope.totalEmails) ? $scope.totalEmails : $scope.currentPage * $scope.emailPerPage);
    };

    $scope.getEmails = function (emailType) {
        $('#checkAll').iCheck('uncheck');
        $('#checkAllBot').iCheck('uncheck');
        $scope.emailType = emailType;
        $scope.pageType = 0;
        var promise = EmailSystemService.getEmails(emailType);
        promise.then(function (response) {
            $scope.emailsOverview = response.data;
            $scope.checkAll = false;
            $scope.checkAllBot = false;
            $scope.allEmails = response.data;
            $scope.currentPage = 1;
            $scope.totalEmails = $scope.emailsOverview.length;
            $scope.emailPerPage = 10;
            $scope.currentShowingEmails = $scope.emailsOverview.slice(($scope.currentPage - 1) * $scope.emailPerPage,
                (($scope.currentPage * $scope.emailPerPage) > $scope.totalEmails) ? $scope.totalEmails : $scope.currentPage * $scope.emailPerPage);
        });
    };

    // Make Sure the Size of All Attachments Will Not Exceed 10 MB
    $scope.checkAttachmentsSize = function () {
        var attachments = $window.uploadedFiles;
        var totalSize = 0;
        for (var i = 0; i < attachments.length; i++) {
            if (attachments[i] !== null) {
                totalSize += attachments[i].size;
            }
        }

        if (totalSize < 10 * 1024 * 1000)
            return true;
        else {
            $scope.alerts.push({ type: 'danger', msg: 'Attachments Size Exceed Max Limit (10 MB)!!!' });
            return false;
        }
    };

    $scope.updateEmail = function () {
        if ($scope.checkAttachmentsSize()) {
            var attachments = $window.uploadedFiles;
            var fileContents = $window.filesStringArr;
            var tempList = [];
            for (var i = 0; i < attachments.length; i++) {
                if (attachments[i] !== null) {
                    var attachment = {
                        Name: attachments[i].name,
                        Size: attachments[i].size,
                        Content: fileContents[i],
                        LastModified: attachments[i].lastModified
                    };
                    tempList.push(attachment);
                }
            }
            $scope.email.Attachments = tempList;
            $scope.email.AttachmentsCount = tempList.length;
            $scope.email.ScheduledForStr = document.getElementById('scheduledForStr').value;

            if (!$scope.ccEnabled)
                $scope.email.Cc = '';
            if (!$scope.toEnabled)
                $scope.email.To = '';

            var promise = EmailSystemService.updateEmail($scope.email);
            promise.then(function (response) {
                if (response.data > 0) {
                    $scope.email.EmailId = response.data;
                    $scope.alerts.push({ type: 'success', msg: 'All Changes Saved Successful!' });
                };
            });
        }
    }

    $scope.saveAsDraft = function () {
        if ($scope.checkAttachmentsSize()) {
            var attachments = $window.uploadedFiles;
            var fileContents = $window.filesStringArr;
            var tempList = [];
            for (var i = 0; i < attachments.length; i++) {
                if (attachments[i] !== null) {
                    var attachment = {
                        Name: attachments[i].name,
                        Size: attachments[i].size,
                        Content: fileContents[i],
                        LastModified: attachments[i].lastModified
                    };
                    tempList.push(attachment);
                }
            }
            $scope.email.Attachments = tempList;
            $scope.email.AttachmentsCount = tempList.length;
            $scope.email.ScheduledForStr = document.getElementById('scheduledForStr').value;

            if (!$scope.ccEnabled)
                $scope.email.Cc = '';
            if (!$scope.toEnabled)
                $scope.email.To = '';

            var promise = EmailSystemService.saveAsDraft($scope.email);
            promise.then(function (response) {
                if (response.data > 0) {
                    $scope.email.EmailId = response.data;
                    $scope.alerts.push({ type: 'success', msg: 'Draft Saved Successful!' });
                };
            });
        }
    };

    $scope.convertToCommaList = function () {
        $scope.email.Bcc = $scope.email.Bcc.split(';').join(",");
        $scope.email.Bcc = $scope.email.Bcc.split(', ,').join(",");
        $scope.email.Bcc = $scope.email.Bcc.split(',null,').join(",");

        if ($scope.email.Cc) {
            $scope.email.Cc = $scope.email.Cc.split(';').join(",");
            $scope.email.Cc = $scope.email.Cc.split(', ,').join(",");
            $scope.email.Cc = $scope.email.Cc.split(',null,').join(",");
        }

        if ($scope.email.To) {
            $scope.email.To = $scope.email.To.split(';').join(",");
            $scope.email.To = $scope.email.To.split(', ,').join(",");
            $scope.email.To = $scope.email.To.split(',null,').join(",");
        }
    }

    $scope.sendEmail = function () {

        //In case emails are separated by semicolons instead of commas or have an empty string between commas
        $scope.convertToCommaList();

        if ($scope.checkAttachmentsSize()) {
            $scope.varList = "Send Out This Email";
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: "/app/views/confirmedDialog/confirm.html",
                controller: "confirmedModalInstanceCtrl",
                controllerAs: "$ctrl",
                size: "",
                resolve: {
                    varList: function () {
                        return $scope.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var attachments = $window.uploadedFiles;
                    var fileContents = $window.filesStringArr;
                    var tempList = [];
                    for (var i = 0; i < attachments.length; i++) {
                        if (attachments[i] !== null) {
                            var attachment = {
                                Name: attachments[i].name,
                                Size: attachments[i].size,
                                Content: fileContents[i],
                                LastModified: attachments[i].lastModified
                            };
                            tempList.push(attachment);
                        }
                    }
                    $scope.email.Attachments = tempList;
                    $scope.email.AttachmentsCount = tempList.length;
                    $scope.email.ScheduledForStr = document.getElementById('scheduledForStr').value;

                    if (!$scope.ccEnabled)
                        $scope.email.Cc = '';
                    if (!$scope.toEnabled)
                        $scope.email.To = '';
                    var promise = EmailSystemService.sendEmail($scope.email);
                    promise.then(function (response) {
                        if (response.data > 0) {
                            $scope.getEmails(0);
                            if ($scope.email.ScheduledForStr !== '' &&
                                $scope.email.ScheduledForStr !== null &&
                                $scope.email.ScheduledForStr !== undefined) {
                                $scope.alerts.push({ type: 'success', msg: 'Email Scheduled Successful!' });
                            } else {
                                $scope.alerts.push({ type: 'success', msg: 'Email Sent Successful!' });
                            }
                        }
                        else if (response.data === -1) {
                            $scope.alerts.push({ type: 'danger', msg: 'Too many recipients, you MUST schedule email for another time! (7:00 PM to 6:59 AM)' });
                        }
                    });
                }
            });
        }
    };

    $scope.stopShareThisEmail = function () {
        $scope.varList = "Stop Share This Email?";
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: "/app/views/confirmedDialog/confirm.html",
            controller: "confirmedModalInstanceCtrl",
            controllerAs: "$ctrl",
            size: "",
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var temp = $scope.email;
                temp['ShareId'] = $scope.share.ShareId;
                var email = [temp];
                var promise = EmailSystemService.stopShareSelectedEmails(email);
                promise.then(function (response) {
                    $scope.init($scope.pageType);
                });
            }
        });
    };

    $scope.stopShareSelectedEmails = function () {
        var stopShareList = [];
        angular.forEach($scope.emailsOverview,
            function (value) {
                if (value.Checked)
                    stopShareList.push(value);
            });
        if (stopShareList.length > 0) {
            $scope.varList = "Stop Share These " + stopShareList.length + " Emails?";
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: "/app/views/confirmedDialog/confirm.html",
                controller: "confirmedModalInstanceCtrl",
                controllerAs: "$ctrl",
                size: "",
                resolve: {
                    varList: function () {
                        return $scope.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = EmailSystemService.stopShareSelectedEmails(stopShareList);
                    promise.then(function (response) {
                        $scope.init($scope.pageType);
                    });
                }
            });
        }
    };

    $scope.deleteSelectedEmails = function () {
        var emailsToDelete = [];
        angular.forEach($scope.emailsOverview,
            function (value) {
                if (value.Checked)
                    emailsToDelete.push(value.EmailId);
            });
        if (emailsToDelete.length > 0) {
            $scope.varList = "Delete These " + emailsToDelete.length + " Emails? This CANNOT be UNDONE!";
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: "/app/views/confirmedDialog/confirm.html",
                controller: "confirmedModalInstanceCtrl",
                controllerAs: "$ctrl",
                size: "",
                resolve: {
                    varList: function () {
                        return $scope.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = EmailSystemService.deleteMultipleEmails(emailsToDelete);
                    promise.then(function (response) {
                        $scope.init($scope.pageType);
                    });
                }
            });
        }
    };

    $scope.discard = function () {
        $scope.varList = "Discard This Email? All Your Changes Will Be Lost!";
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: "/app/views/confirmedDialog/confirm.html",
            controller: "confirmedModalInstanceCtrl",
            controllerAs: "$ctrl",
            size: "",
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.init();
                $window.uploadedFiles = [];
                $window.filesStringArr = [];
            }
        });
    };

    $scope.findUsers = function (type) {
        $ctrl.varList = type;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/getUserList.html?c=' + (new Date()).getTime(),
            controller: 'getUserListModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'xl',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result[1] !== 0 && result[1] !== null && result[1] !== undefined) {
                if (result[0] === 1)
                    $scope.email.To += result[1].toString() + ',';
                if (result[0] === 2)
                    $scope.email.Cc += result[1].toString() + ',';
                if (result[0] === 3)
                    $scope.email.Bcc += result[1].toString() + ',';
            }

        }, function () {

        });
    };

    $scope.init = function () {
        currentDateTime = new Date() - 3600000 * (5);
        $scope.getEmails($scope.emailType >= 0 ? $scope.emailType : 0);
    };

    $scope.init();
});
app.controller('adminEventController',
    function ($scope, $http, $filter, $uibModal, EventService, OrgDirectoryService) {

        $scope.searchRegex;
        $scope.searchEvent = null;
        $scope.includeDeleted;
        $scope.approvedStatus;
        $scope.totalEventCount;
        $scope.events = [];
        $scope.baseEvents = [];
        $scope.filteringByLocation = false;
        $scope.filterLocation = '';
        $scope.selectedOrg = {
            OrganizationId: null,
            OrganizationName: 'All'
        }

        $scope.emptyEvent;
        $scope.selectedColumn = 1;
        $scope.sortBy;
        $scope.sortOrder = true;
        $scope.organizations = [];
        $scope.organizations.push($scope.selectedOrg);
        $scope.totalPageCount;
        $scope.selectedPageSize = 10;
        $scope.selectedPageNo = 1;
        $scope.numberOfResults = 0;
        $scope.searchKeywords = "";
        $scope.loading = true;
        $scope.pageNumbers = [{
            text: "Page 1 of 1",
            value: 1
        }];
        $scope.pageSizeOptions = [5, 10, 25, 50, 100, 200];

        $scope.selectedPastDay = {
            text: 'All',
            value: null
        }


        $scope.pastDaysOptions = [];
        $scope.pastDaysOptions.push($scope.selectedPastDay);


        function createPastDaysOptions(pastDays) {
            var len = pastDays.length;
            for (var i = 0; i < len; i++) {
                $scope.pastDaysOptions.push({
                    text: 'Past ' + pastDays[i] + ' days',
                    value: pastDays[i]
                });
            }
        }

        $scope.getEmptyEvent = function () {
            EventService.createNewEvent().then(function (response) {
                $scope.emptyEvent = response.data;
            });
        }

        $scope.selectedPageNo = $scope.pageNumbers[0];

        function formatSearchString(str) {

            return str == null ? str : str.trim().replace(/\s+/g, ',');
        }

        $scope.getAllEvents = function () {

            $scope.loading = true;

            var searchString = formatSearchString($scope.searchEvent, $scope);

            var promise = EventService.getAdminEvents($scope.selectedPageSize, $scope.selectedPageNo.value, $scope.selectedPastDay.value,
                $scope.selectedOrg.OrganizationId,
                $scope.approvedStatus === true ? 1 : undefined,
                $scope.includeDeleted,
                $scope.sortOrder,
                ($scope.sortBy === null || $scope.sortBy === '') ? 'nothing' : $scope.sortBy,
                searchString);

            promise.then(function (response) {
                $scope.events = response.data.EventItems;
                $scope.baseEvents = response.data.EventItems;
                $scope.totalEventCount = response.data.TotalEventCount;
                $scope.selectedPageSize = response.data.PageSize;
                $scope.totalPageCount = Math.ceil($scope.totalEventCount / $scope.selectedPageSize);
                setPageArray();
                $scope.selectedPageNo = {
                    text: "Page " + response.data.PageNo + " of " + $scope.totalPageCount,
                    value: response.data.PageNo
                }
                $scope.loading = false;
            });
        }

        $scope.getOrganizations = function () {
            OrgDirectoryService.getAdminMasterDirectory().then(function (response) {
                $scope.organizations = $scope.organizations.concat(response.data);
            });

        }

        $scope.filterByLocation = function (locationName) {
            $scope.filterLocation = (locationName == $scope.filterLocation) ? '' : locationName;
            $scope.filteringByLocation = (locationName == $scope.filterLocation);
        };

        $scope.deleteEvent = function (event) {
            EventService.deleteEvent(event).then(function (response) {
                $scope.getAllEvents();
            });
        }

        function setPageArray() {
            $scope.pageNumbers = [];
            var total = $scope.totalPageCount;

            for (var i = 1; i <= total; i++) {
                $scope.pageNumbers.push({
                    text: "Page " + i + " of " + total,
                    value: i
                });
            }
            if (total === 0) {
                $scope.pageNumbers.push({
                    text: "Page " + 0 + " of " + total,
                    value: 1
                });
            }
        }

        $scope.init = function () {
            $scope.getOrganizations();
            createPastDaysOptions([30, 60, 90]);
            $scope.getAllEvents();
            $scope.getEmptyEvent();
        }
        var $ctrl = this;
        $scope.createEvent = function () {
            $scope.AddUpdateEvent(angular.copy($scope.emptyEvent));
        }
        $scope.editEvent = function (event) {
            $scope.AddUpdateEvent(event);
        }

        $scope.sortEvents = function (sortBy, selectedColumn) {
            if ($scope.sortBy === sortBy) {
                $scope.sortOrder = !$scope.sortOrder;
            } else {
                $scope.sortOrder = true;
            }
            $scope.selectedColumn = selectedColumn;
            $scope.sortBy = sortBy;
            $scope.getAllEvents();

        }


        $scope.AddUpdateEvent = function (event) {
            $ctrl.varList = [event, $scope.organizations];
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/addEvent.html?c=' + (new Date()).getTime(),
                controller: 'eventModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function () {
            }, function () {
                $scope.getAllEvents();
            });
        }


    });;
app.controller('masterEventController', function ($scope, $http, $filter, $uibModal, $window, $location, $anchorScroll, uiCalendarConfig, EventService, CategoryServices) {

    $scope.currentEventDetails = null;

    var isFirstTime = true;
    var eventRequest;


    $scope.currentPage = 1;
    $scope.itemsPerPage = 12;
    $scope.itemsOptions = [12, 24, 48, 96];

    $scope.collapseCat = $window.innerWidth < 992 ? true : false;
    $scope.collapseDat = $window.innerWidth < 992 ? true : false;

    $scope.filterDateStart = new Date();
    $scope.filterDateStart.setHours(0, 0, 0, 0);
    $scope.filterDateEnd = new Date();
    $scope.filterDateEnd.setDate($scope.filterDateEnd.getDate() + 6);
    $scope.filterDateEnd.setHours(23, 59, 59, 999);

    $scope.events = [];

    $scope.eventDetailDialog = {};
    $scope.followingStatus;
    $scope.showFollowingOptions = false;

    $scope.allEventCategories = [];

    $scope.delayTime = 700;
    $scope.eventsLoading = true;

    $scope.scrollTo = function (id) {
        $location.hash(id);
        $anchorScroll();
    }

    $scope.toggleCategory = function (index) {
        $scope.allEventCategories[index].Selected = !$scope.allEventCategories[index].Selected;
        if (moment.isMoment($scope.filterDateStart)) {
            $scope.filterDateStart = $scope.filterDateStart.toDate();
            $scope.filterDateEnd = $scope.filterDateEnd.toDate();
        }
        $scope.getEvents($scope.filterDateStart, $scope.filterDateEnd);
    };

    $scope.closeEventDetails = function () {
        $scope.eventDetailDialog.close();
    };

    $scope.followEvent = function (notify) {
        if ($scope.followingStatus !== undefined) {
            var promise = EventService.followEvent($scope.followingStatus, notify);
            promise.then(function (response) {
                $scope.followingStatus = response.data;
            });
        }
    };

    $scope.unfollowEvent = function () {
        if ($scope.followingStatus !== undefined) {
            var promise = EventService.unfollowEvent($scope.followingStatus);
            promise.then(function (response) {
                $scope.followingStatus = response.data;
            });
        }
    };

    // Load events from server
    var d = new Date();
    var m = d.getMonth();
    var y = d.getFullYear();

    $scope.viewRender = function (view) {
        m = view.end.month();
        m = m === 0 ? 12 : m;
        y = view.end.year();
        y = view.end.month() == 0 ? y - 1 : y;


    };

    $scope.search = function () {
        $scope.searchTextChanged = true;
        $('.calendar').fullCalendar('refetchEvents');
        $scope.searchTextChanged = false;
    }

    $scope.filterEvents = function (events, searchText) {

        if (searchText == '' || searchText == null) {
            return events;
        } else {
            var keywords = searchText.split(' ');
            var filteredEvents = events.filter(function (evt) {
                for (var i = 0; i < keywords.length; i++) {
                    var k = keywords[i].toLowerCase();
                    if (evt.OrganizationName.toLowerCase().indexOf(k) != -1
                        || evt.EventLocation.toLowerCase().indexOf(k) != -1
                        || evt.title.toLowerCase().indexOf(k) != -1) {
                        return true;
                    }
                }
                return false;

            });
            return filteredEvents;
        }

    }

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };

    $scope.formatShortDate = function (dateTime) {
        return jwru.constellation.utils.formatShortDate(dateTime);
    };

    $scope.formatExtraShortDate = function (dateTime) {
        return jwru.constellation.utils.formatExtraShortDate(dateTime);
    };

    $scope.formatTime = function (dateTime) {
        return jwru.constellation.utils.formatTime(dateTime);
    };


    $scope.fetchEvents = function (start, end, timezone, callback) {
        if ($scope.searchTextChanged == true) {

            var events = $scope.filterEvents($scope.events, $scope.searchString);
            $scope.filteredEventsLength = events.length;
            callback(events);

        } else {
            var evtCategories = getEventCategoriesSelected();
            if (eventRequest != null) {
                eventRequest.requestCanceller.resolve();
            }
            eventRequest = EventService.getAsyncEvents(m, y, false, encodeURIComponent(evtCategories));
            eventRequest.requestPromise.then(function (response) {

                eventRequest = null;

                $scope.events = JSON.parse(response.data);

                var events = $scope.filterEvents($scope.events, $scope.searchString);
                $scope.filteredEventsLength = events.length;
                callback(events);
            });
        }

    };

    $scope.changeView = function (view, calendar) {

        currentView = view;
        $(calendar).fullCalendar('changeView', view);
        $scope.$apply(function () {
            $scope.alertMessage = ('You are looking at ' + currentView);
        });
    };

    $scope.getEventCategories = function () {

        CategoryServices.getPublicEventCategories().then(function (result) {

            $scope.allEventCategories = result.data.filter(function (a) {
                a.Selected = false;
                return true;
            });
            $scope.getEvents($scope.filterDateStart, $scope.filterDateEnd);
        });
    }

    // configure calendar
    $scope.uiConfig = {
        calendar: {
            editable: false,
            displayEventTime: false,
            header: {
                right: 'monthly weekly daily',
                left: 'title prev,next'
            },
            eventClick: function (event) {
                $scope.currentEventDetails = event;

                var promise = EventService.getFollowingStatus(event.id);
                promise.then(function success(response) {

                    $scope.showFollowingOptions = true;
                    $scope.followingStatus = response.data;

                }, function error(response) {

                });

                $scope.eventDetailDialog = $uibModal.open({
                    templateUrl: '/app/views/events/user_event_details_dialog.html?c=' + (new Date()).getTime(),
                    scope: $scope,
                    size: 'lg',

                });

            },
            eventAfterAllRender: function () {
                if ($scope.events.length > 0 && isFirstTime) {
                    // Focus on the first event on initial load
                    //uiCalendarConfig.calendars.myCalendar.fullCalendar('gotoDate', $scope.events[0].start);
                    isFirstTime = false;
                }
                //  $('.fc-other-month.fc-widget-content').addClass('disableDays');
            },
            viewRender: $scope.viewRender,
            timezone: 'UTC',
            events: $scope.fetchEvents,
            views: {
                monthly: {
                    type: 'month',
                    buttonText: 'Month',
                    displayEventTime: false
                },
                weekly: {
                    type: 'basicWeek',
                    buttonText: 'Week'
                },
                daily: {
                    type: 'agendaDay',
                    buttonText: 'Day',
                    displayEventTime: true
                }
            }
        }
    };


    $scope.getFilteredEvents = function () {
        $('.calendar').fullCalendar('refetchEvents');
    }

    function getEventCategoriesSelected() {
        var evtCat = "";

        var evt = jwru.constellation.utils.getObjectById($scope.allEventCategories, 'CategoryId', 0);
        if (evt != null && evt.Selected === true) {
            return evtCat;
        } else {
            var len = $scope.allEventCategories.length;
            for (var i = 0; i < len; i++) {
                if ($scope.allEventCategories[i].Selected === true) {
                    evtCat += $scope.allEventCategories[i].CategoryId + ",";
                }
            }
            if (evtCat == "") {
                return "-1";
            }
        }
        return evtCat.substr(0, evtCat.length - 1);
    }

    /* Get event details */
    $scope.getEventDetails = function (event) {
        $scope.currentEventDetails = event;

        var promise = EventService.getFollowingStatus(event.id);
        promise.then(function success(response) {
            $scope.showFollowingOptions = true;
            $scope.followingStatus = response.data;
        }, function error(response) { });

        $scope.eventDetailDialog = $uibModal.open({
            templateUrl: '/app/views/events/user_event_details_dialog.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'lg',
        });
    };

    /* Populate events */
    function getSelectedCategories() {
        var evtCat = [];
        var len = $scope.allEventCategories.length;
        for (var i = 0; i < len; i++) {
            if ($scope.allEventCategories[i].Selected === true) {
                evtCat.push($scope.allEventCategories[i].CategoryId)
            }
        }
        if (evtCat.length === 0) {
            for (var i = 0; i < len; i++) {
                evtCat.push($scope.allEventCategories[i].CategoryId);
            }
        }
        return evtCat.join(',');
    }
    $scope.getEvents = function (startDate, endDate) {
        //$scope.eventsLoading = true;
        var events = getSelectedCategories();
        var promise = EventService.getEventsByDateRange(startDate, endDate, events);
        promise.then(function (response) {
            $scope.events = response.data;
            $scope.eventsLoading = false;
            angular.forEach($scope.events, function (event) {
                if (new Date(event.start) >= new Date().setHours(0, 0, 0, 0) && new Date(event.start) < new Date().setHours(24, 0, 0, 0))
                    event.IsTodaysEvent = true;
            });
        });
    }

    //$scope.eventSources = [$scope.events];
    $scope.getEventCategories();

    $scope.$watchGroup(['filterDateStart', 'filterDateEnd'], function (newVal, oldVal) {
        if (newVal != oldVal) {
            if (moment.isMoment(newVal[0])) {
                newVal[0] = newVal[0].toDate();
                newVal[1] = newVal[1].toDate();
            }
            $scope.getEvents(newVal[0], newVal[1]);
        }
    });
});

app.filter('eventSearchFilter', function () {
    return function (events, searchText) {

        if (searchText == '' || searchText == null) {
            return events;
        } else {
            var keywords = searchText.split(' ');
            var filteredEvents = events.filter(function (evt) {
                for (var i = 0; i < keywords.length; i++) {
                    var k = keywords[i].toLowerCase();
                    if (evt.OrganizationName.toLowerCase().indexOf(k) != -1
                        || evt.EventLocation.toLowerCase().indexOf(k) != -1
                        || evt.title.toLowerCase().indexOf(k) != -1) {
                        return true;
                    }
                }
                return false;

            });
            return filteredEvents;
        }

    }
});

app.filter('inDateRange', function () {
    return function (events, start, end) {
        return filteredEvents = events.filter(function (event) {
            var event_start = new Date(event.start);
            var event_end = new Date(event.end);
            if ((event_start >= start && event_start <= end) || (event_end >= start && event_end <= end) || (event_start <= start && event_end >= end)) {
                return true;
            }
            else {
                return false;
            }
        });

    }
});

app.directive('daterangepicker', function ($compile) {
    return {
        restrict: 'AE',
        scope: {
            startDate: '=',
            endDate: '='
        },
        link: function (scope, element, attrs) {
            // init
            $(element).daterangepicker({
                autoApply: true,
                singleCalendar: true,
                inline: true,
                startDate: scope.startDate,
                endDate: scope.endDate
            });

            // watch
            $(element).on('apply.daterangepicker', function (ev, picker) {
                scope.startDate = $(element).data('daterangepicker').startDate;
                scope.endDate = $(element).data('daterangepicker').endDate;
                setTimeout(function () {
                    // wait until initial digest cycle finishes before applying
                    scope.$apply();
                });
            });

        }
    };
});

;
app.controller('userEventsController', function ($scope, $http, $interval, EventService, ngClipboard) {

    //
    $scope.followedEvents;
    //

   $scope.getUserFollowedEvents = function() {
       EventService.getUserFollowedEvents().then(function (response) {
           if ($scope.followedEvents == null || response.data.length != $scope.followedEvents.length) {
               $scope.followedEvents = response.data;
               
           }
       });
   }

   

    $scope.unfollowEvent = function (event) {
        
        var promise = EventService.unfollowEvent(event);
            promise.then(function (response) {
                //$scope.followingStatus = response.data;
            });
        
        
            var idx;
            var len = $scope.followedEvents.length;

            for (var i = 0; i < len; i++) {
                if (event.id == $scope.followedEvents[i].id) {
                    idx = i;
                    break;
                }
            }
           
            $scope.followedEvents.splice(idx, 1);

        
        
    };

    $scope.copyToClipboard = function (value) {
        ngClipboard.toClipboard(value);
    }

   $scope.init = function() {
       $scope.getUserFollowedEvents();
       $interval($scope.getUserFollowedEvents, 10000);

   }

});;
app.controller('formPageController', function ($scope, ApplicationService, $uibModal) {

    $scope.treeOptions = {
        dropped: function (event) {
            $scope.updatePageViewOrder();
        },
        accept: function (sourceNodeScope, destNodesScope, destIndex) {
            return destNodesScope.$treeScope == sourceNodeScope.$treeScope;
        }
    };

    $scope.selectedPage;
    $scope.applicationId;
    $scope.$on('fetchPages', function (events, applicationId) {

        $scope.pages = [];
        $scope.applicationId = applicationId;
        $scope.getPages(applicationId);
    });

    $scope.getPages = function (applicationId) {
        ApplicationService.getFormPages(applicationId).then(function (response) {
            $scope.pages = response.data;
           
        });
    }

    $scope.pageClicked = function (page) {
        $.each($scope.pages, function (idx, value) {
            value.selected = false;
        });

        page.selected = true;
        $scope.showPageForm = false;
        $scope.$emit('pageClicked', page);
    }

   
    $scope.createNewPage = function () {
        $scope.showPageForm = true;
        ApplicationService.createNewPage($scope.applicationId).then(function (response) {
            $scope.selectedPage = response.data;
            $scope.selectedPage.selected = true;
        });
    }

    $scope.editPage = function (evt, page) {
        evt.stopImmediatePropagation();
        $scope.showPageForm = true;
        $scope.selectedPage = angular.copy(page);
    }

    $scope.updatePage = function () {
        $scope.showPageForm = false;
        ApplicationService.updatePage($scope.selectedPage).then(function (response) {
            // $scope.getPages($scope.applicationId);
            var index;
           
            var exist = $scope.pages.some(function (page,idx) {
                if (page.PageId == $scope.selectedPage.PageId) {
                    index = idx;
                    return true;
                }
            });

            if (exist) {
                $scope.pages[index] = $scope.selectedPage;
            }
            else {

                $scope.pages.push(response.data);
                $scope.updatePageViewOrder();
            }

            

        });
        
    }

    $scope.deletePage = function (evt, page) {
        $scope.showPageForm = false;
        evt.stopImmediatePropagation();
        
        $scope.varList = "Are you sure you want to delete a page?";
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: "/app/views/confirmedDialog/confirm.html",
            controller: "confirmedModalInstanceCtrl",
            controllerAs: "$ctrl",
            size: "",
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var pageId = page.PageId;
                ApplicationService.deletePage(page.PageId).then(function (response) {
                    $scope.pages = $scope.pages.filter(function (page) {
                        if (page.PageId != pageId) return true;
                    });
                });
            }
        });
    }

    $scope.cancel = function () {
        $scope.showPageForm = false;
    }

    $scope.updatePageViewOrder = function () {
        var pages = $scope.pages.map(function (page, idx) {
            return {
                ViewOrder: idx+1,
                PageId: page.PageId,
                ApplicationId: page.ApplicationId
            };
        });

        ApplicationService.updatePageViewOrder(pages).then(function (response) {
        });
    }

});;
app.controller('adminSubmissionReviewController', function ($scope, $http, $filter, $uibModal, FormsService) {
    var self = this;
    
    self.applicationId = 0;
    
    $scope.submissions = {};
    $scope.previewUrl = '';
    $scope.downloadUrl = '';
    $scope.includeTest = false;
    $scope.includeDeleted = false;


    self.loadSubmissions = function () {
        var promise = FormsService.adminGetSubmissions(self.applicationId, $scope.includeTest, $scope.includeDeleted);
        promise.then(function (response) {
            $scope.submissions = response.data;
        });
    };

    $scope.deleteSubmission = function (submission) {
        if (confirm('Are you sure you want to delete the submission?')) {
            var promise = FormsService.adminDeleteSubmission(submission);
            promise.then(function (response) {
                self.loadSubmissions();

            });
        }
    };

    $scope.restoreSubmission = function (submission) {
        var promise = FormsService.adminRestoreSubmission(submission);
        promise.then(function (response) {
            self.loadSubmissions();

        });
    };

    $scope.reloadSubmissions = function () {
        self.loadSubmissions();
    };

    $scope.renderUrl = function (url, submission) {
        url = url.replace('{{submission.SubmissionGuid}}', submission.SubmissionGuid);
        return url;
    };

    $scope.initSubmissionReview = function (applicationId, previewUrl, downloadUrl) {
        $scope.previewUrl = previewUrl;
        $scope.downloadUrl = downloadUrl;
        self.applicationId = applicationId;
        self.loadSubmissions();
    };


    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };

    $scope.formatShortDate = function (dateTime) {
        return jwru.constellation.utils.formatShortDate(dateTime);
    };

    $scope.formatExtraShortDate = function (dateTime) {
        return jwru.constellation.utils.formatExtraShortDate(dateTime);
    };

    $scope.formatTime = function (dateTime) {
        return jwru.constellation.utils.formatTime(dateTime);
    };
});


app.controller('frmWizardController', function ($scope, $http, $filter, $uibModal, FormsService) {
    $scope.frmModel = {};

    $scope.initWizard = function () {
        
        if (typeof baseModel !== 'undefined')
        {
            $scope.frmModel = baseModel;
        }
    };

    $scope.isOptionsRequired = function (obj) {

        if (obj.some === undefined)
            return true;
        return !obj.some(function(options) {
            return options.selected;
        });
    };


    //**Start--code to restrict files to PDF only**

    ////Remove note about using word documents and replace with directions to only attach PDF files that don't exceed 15MB
    //$(document).ready(function () {
    //    $("span[class='fa fa-info-circle pull-left']").css("display", "none");
    //    $("p:contains('Please use Microsoft Word Processors for your uploaded items. ')").css("display", "none");
    //    $('<p>*Only <strong>PDF</strong> files and those not exceeding <strong>15MB</strong> accepted</p>').insertBefore('input[type="file"]')
    //});

    //var extErrorShowing = false;

    ////Check the file extension to ensure file is PDF before allowing user to proceed
    //$(document).ready(function () {
    //    $('input[type="file"]').change(function (e) {

    //        if (e.target.files.length > 0) {

    //            var fileName = e.target.files[0].name;
    //            var extension = fileName.split('.').pop().toLowerCase();

    //            if (extension != 'pdf') {

    //                if (extErrorShowing === false) {

    //                    //Create p element to show message of PDF restriction
    //                    $('<p class="highlight-red">The file must be a PDF!</p>').insertAfter('input[type="file"]');
    //                    extErrorShowing = true;
    //                }

    //                $('button[type="submit"]').prop('disabled', true);

    //            } else {//If the extension error message is being displayed, remove it and enable the "next" button

    //                $('p[class="highlight-red"]').css("display", "none");
    //                extErrorShowing = false;
    //                $('button[type="submit"]').prop('disabled', false);
    //            }
    //        }
    //    });
    //});

    //**Finish--code to restrict files to PDF only**
});;
app.controller('manageFormController', function ($scope, $timeout, ApplicationService, $rootScope) {

    $scope.application;
    $scope.disabled = false;

    //events
    $scope.$on('pageClicked', function (event, page) {
        $scope.$broadcast('pageSelected', page);
    });
    
    $scope.$on('field clicked', function (event, field) {
        $scope.$broadcast('fieldSelected', field);
    });
   
    $scope.$on('fieldUpdated', function (event, field) {
        $scope.$broadcast('fieldSelected', field);
        $scope.$broadcast('fieldInfoUpdated', field);
    });

    $scope.fetchCalled = function () {
        $scope.getApplicationInfo($scope.appId);
        $scope.$broadcast('fetchPages', $scope.appId);
    }

    $scope.$on('NewQuestionClicked', function (event, pageId) {
        $scope.$broadcast('CreateNewQuestion', pageId);
    });

    $scope.getApplicationInfo = function (applicationId) {
        ApplicationService.getApplication(applicationId).then(function (response) {
            $scope.application = response.data;
            $scope.$broadcast('fetchApplicationList', $scope.application.ApplicationId);
        });
    }

    $scope.init = function (applicationId, disabled) {
        $scope.disabled = disabled;
        $scope.getApplicationInfo(applicationId);
        $timeout(function () {
            $scope.$broadcast('fetchPages', applicationId);
        }, 100);
    }

    $rootScope.$on('manageFormDetail',
        function (event, args) {
            $scope.init(args.applicationId, args.disabled);
        });
});;
app.controller('manageFormsController',
    function ($scope, ManageFormsService, WorkflowService, $uibModal, $rootScope, $timeout) {

        $scope.superUserModeEnabled = false;
        $scope.currentUserId = 0;
        $scope.editable = false;

        $scope.pageType = 0;
        var $ctrl = this;
        $scope.query = '';

        $scope.itemsPerPage = 10;
        $scope.queryUser = '';
        $scope.currentPage = 1;
        $scope.loadingUsers = false;

        //Keep Track Of Folder Level

        $scope.originalFoldersTree = [];
        $scope.folders = [];
        $scope.folderTitle;
        $scope.applications = [];
        $scope.permissionOverview = [];
        $scope.subForms = [];
        $scope.submissions = [];
        $scope.users;
        $scope.systemRoles;

        $scope.includeTest = false;
        $scope.includeDeleted = false;

        $scope.currentFolderOrApplication = {};

        $scope.itemsPerPage = 10;
        $scope.currentPage = 1;

        $scope.toggle = function (scope) {
            scope.toggle();
        };

        $scope.toggleSuperUserMode = function () {
            $scope.superUserModeEnabled = !$scope.superUserModeEnabled;
            $scope.init();
        };

        $scope.expandAll = function () {
            $scope.$broadcast('angular-ui-tree:expand-all');
        };

        $scope.collapseAll = function () {
            $scope.$broadcast('angular-ui-tree:collapse-all');
        };

        $scope.checkAllowed = function (value, decimal) {
            return (value & (0x01 << decimal)) > 0;
        };

        $scope.unique = function (folder) {
            if (folder.CreatedBy === -2) {
                return 'A' + folder.FolderId;
            } else {
                return 'F' + folder.FolderId;
            }
        };

        $scope.visible = function (folder) {
            return !($scope.query && $scope.query.length > 0
                && folder.FolderName.toLowerCase().search($scope.query.toLowerCase()) === -1);
        };

        $scope.hasChanged = function () {
            return !angular.equals($scope.originalFoldersTree, $scope.folders);
        };

        $scope.undoChanges = function () {
            $scope.folders = angular.copy($scope.originalFoldersTree);
        };

        $scope.manageApplication = function (application) {
            $scope.currentFolderOrApplication = application;
            $scope.pageType = 4;
            $timeout(function () {
                $rootScope.$broadcast('manageFormDetail', { applicationId: $scope.currentFolderOrApplication.FolderId, disabled: !$scope.checkAllowed(application.AccessLevel, 2) });
            });
        };

        $scope.saveChanges = function () {
            $ctrl.varList = 'save all the changes';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var changes = findChanges($scope.folders, $scope.originalFoldersTree, 0);
                    var folders = $.grep(changes, function (c) { return c.CreatedBy !== -2 });

                    var applications = $scope.applications.map(function (app) {
                        var application = $.grep(changes, function (c) { return c.CreatedBy === -2 && c.FolderId === app.ApplicationId });
                        if (application && application.length > 0) {
                            app.FolderId = application[0].ParentFolderId;
                            return app;
                        }
                        return null;
                    });
                    var wrapper = {
                        Folders: folders,
                        Applications: applications
                    };
                    var promise = ManageFormsService.saveChanges(wrapper);
                    promise.then(function (response) {
                        $scope.getAllVisibleFolders();
                    });
                }
            }, function () {

            });
        };

        $scope.removeFolder = function (folder) {
            if (folder.children.length <= 0) {
                $ctrl.varList = 'folder';
                var modalInstance = $uibModal.open({
                    animation: true,
                    ariaLabelledBy: 'modal-title',
                    ariaDescribedBy: 'modal-body',
                    templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                    controller: 'confirmedRemoveModalInstanceCtrl',
                    controllerAs: '$ctrl',
                    size: '',
                    resolve: {
                        varList: function () {
                            return $ctrl.varList;
                        }
                    }
                });
                modalInstance.result.then(function (result) {
                    if (result === 1) {
                        var promise = ManageFormsService.removeFolder(folder);
                        promise.then(function (response) {
                            $scope.getAllVisibleFolders();
                            $scope.pageType = 0;
                        });
                    }
                },
                    function () {

                    });
            }
        };

        $scope.removeForm = function (application) {
            $ctrl.varList = 'this form';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                controller: 'confirmedRemoveModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var actualApplication = $.grep($scope.applications,
                        function (app) { return app.ApplicationId === application.FolderId });
                    if (actualApplication.length > 0) {
                        var promise = ManageFormsService.removeApplication(actualApplication[0]);
                        promise.then(function (response) {
                            $scope.getAllVisibleFolders();
                            $scope.pageType = 0;
                        });
                    }
                }
            },
                function () {

                });
        };

        $scope.removePermission = function (userPermission, index) {
            $ctrl.varList = 'permission';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                controller: 'confirmedRemoveModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (confirmRemove) {

                if (confirmRemove) {
                    $scope.removeUserPermission(userPermission, index)
                }
            },
                function () {

                });
        };

        $scope.createFolder = function (parentFolder) {
            $ctrl.varList = {
                FolderId: 0,
                FolderName: '',
                FolderDescription: '',
                ParentFolderId: parentFolder.FolderId
            };
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/folder.html',
                controller: 'folderModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: 'md',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    $scope.getAllVisibleFolders();
                }
            }, function () {

            });
        };

        $scope.createForm = function (parentFolder) {
            $ctrl.varList = {
                ApplicationId: 0,
                FolderId: parentFolder.FolderId,
                StartDate: 0,
                EndDate: 0,
                Published: false,
                Public: false,
                ParentApplicationId: 0,
                WorkflowId: 0,
                SuperUserModeEnabled: $scope.superUserModeEnabled
            };
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/form.html',
                controller: 'formModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: 'lg',
                backdrop: 'static',
                keyboard: false,
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    $scope.getAllVisibleFolders();
                }
            }, function () {

            });
        };

        $scope.editFolder = function (folder) {
            if ($scope.checkAllowed(folder.AccessLevel, 2)) {
                $ctrl.varList = folder;
                var modalInstance = $uibModal.open({
                    animation: true,
                    ariaLabelledBy: 'modal-title',
                    ariaDescribedBy: 'modal-body',
                    templateUrl: '/app/views/modalViews/folder.html',
                    controller: 'folderModalInstanceCtrl',
                    controllerAs: '$ctrl',
                    size: 'md',
                    resolve: {
                        varList: function () {
                            return $ctrl.varList;
                        }
                    }
                });
                modalInstance.result.then(function (result) {
                    if (result === 1) {
                        $scope.getAllVisibleFolders();
                    }
                },
                    function () {

                    });
            }
        };

        $scope.editApplication = function (application) {
            if ($scope.checkAllowed(application.AccessLevel, 2)) {
                var actualApplication = $.grep($scope.applications,
                    function (app) { return app.ApplicationId === application.FolderId });
                if (actualApplication.length > 0) {
                    $ctrl.varList = actualApplication[0];
                    var modalInstance = $uibModal.open({
                        animation: true,
                        ariaLabelledBy: 'modal-title',
                        ariaDescribedBy: 'modal-body',
                        templateUrl: '/app/views/modalViews/form.html',
                        controller: 'formModalInstanceCtrl',
                        controllerAs: '$ctrl',
                        size: 'lg',
                        backdrop: 'static',
                        keyboard: false,
                        resolve: {
                            varList: function () {
                                return $ctrl.varList;
                            }
                        }
                    });
                    modalInstance.result.then(function (result) {
                        if (result === 1) {
                            $scope.getAllVisibleFolders();
                        }
                    },
                        function () {

                        });
                }
            }
        };

        $scope.viewUrl = function (application) {
            if ($scope.checkAllowed(application.AccessLevel, 3)) {
                var actualApplication = $.grep($scope.applications,
                    function (app) { return app.ApplicationId === application.FolderId });

                if (actualApplication.length > 0) {
                    $ctrl.varList = actualApplication[0].FriendlyUrl;
                    var modalInstance = $uibModal.open({
                        animation: true,
                        ariaLabelledBy: 'modal-title',
                        ariaDescribedBy: 'modal-body',
                        templateUrl: 'viewUrl.html',
                        controller: 'viewUrlModalInstanceCtrl',
                        controllerAs: '$ctrl',
                        size: 'lg',
                        backdrop: 'static',
                        keyboard: false,
                        resolve: {
                            varList: function () {
                                return $ctrl.varList;
                            }
                        }
                    });
                    modalInstance.result.then(function (result) {
                    }, function () {
                    });
                }
            }
        };

        $scope.addUserPermission = function () {
            $ctrl.varList = $scope.currentFolderOrApplication;
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/addUserPermission.html',
                controller: 'addUserPermissionModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: 'lg',
                backdrop: 'static',
                keyboard: false,
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    $scope.editPermission($scope.currentFolderOrApplication);
                }
            },
                function () {

                });
        };

        $scope.editPermission = function (folderOrApplication) {
            $scope.pageType = 1;
            $scope.loadingUsers = true;
            $scope.currentFolderOrApplication = folderOrApplication;
            $scope.currentPage = 1;
            $scope.itemsPerPage = 10;
            $scope.folderTitle = folderOrApplication.FolderName;

            var convertNegativeOneIdToNull = function (array) { //Issue being fixed: C# fill method converts UserId NULL value to -1 when pulling from db. Before binding -1 to elements on page,
                array.forEach(function (permission) {           // convert back to null. Not changing fill method since it was already in place and don't want to break anything that relies on the -1 value.
                    permission.UserId = null;
                });
            }

            var promise = ManageFormsService.applications_Permissions_GetPermissionsByUserAndSystemRole(folderOrApplication.FolderId, folderOrApplication.CreatedBy !== -2 ? 0 : 1);
            promise.then(function (response) {
                $scope.permissionOverview = response.data;

                if ($scope.permissionOverview.m_Item1.userId === -1) {
                    convertNegativeOneIdToNull($scope.permissionOverview.m_Item1);     
                    
                    $scope.users = $scope.permissionOverview.m_Item2;
                    $scope.systemRoles = $scope.permissionOverview.m_Item1;

                } else {
                    convertNegativeOneIdToNull($scope.permissionOverview.m_Item2);

                    $scope.users = $scope.permissionOverview.m_Item1;
                    $scope.systemRoles = $scope.permissionOverview.m_Item2;
                }
            });

            $scope.loadingUsers = false;
        };

        $scope.removeUserPermission = function (userPermission, index) {
            var promise = ManageFormsService.removeUserPermission(userPermission);
            promise.then(function (response) {

                if (userPermission.UserId !== null) {     // Decide if this is a permission for individual user or a systemRole
                    $scope.users.splice(index, 1);

                } else {
                    $scope.systemRoles.splice(index, 1);

                }
            });
        };

        $scope.manageSubForms = function (application) {
            $scope.pageType = 2;
            var promise = ManageFormsService.getSubForms(application.FolderId, application.AccessLevel);
            promise.then(function (response) {
                $scope.subForms = response.data;
            });
        };

        $scope.filterIncomplete = function () {
            $scope.submissions = [];
            angular.forEach($scope.originalSubmissions, function (submission) {
                if (submission.Status !== 99 || $scope.includeIncomplete) {
                    $scope.submissions.push(submission);
                }
            });
        };

        $scope.viewSubmissions = function (application) {
            $scope.pageType = 3;
            $scope.currentFolderOrApplication = application;
            $scope.currentPage = 1;
            $scope.itemsPerPage = 10;
            var promise = ManageFormsService.getFormSubmissions(application.FolderId,
                application.AccessLevel,
                $scope.includeDeleted,
                $scope.includeTest);
            promise.then(function (response) {
                $scope.submissions = response.data;
                $scope.originalSubmissions = angular.copy($scope.submissions);
                $scope.filterIncomplete();
            });
        };

        $scope.deleteSubmission = function (submission) {
            $ctrl.varList = 'Delete this submission?';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                controller: 'confirmedRemoveModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = ManageFormsService.adminDeleteSubmission(submission);
                    promise.then(function (response) {
                        $scope.viewSubmissions($scope.currentFolderOrApplication);
                    });
                }
            },
                function () {

                });
        };

        $scope.restoreSubmission = function (submission) {
            var promise = ManageFormsService.adminRestoreSubmission(submission);
            promise.then(function (response) {
                $scope.viewSubmissions($scope.currentFolderOrApplication);
            });
        };

        $scope.toggleAllowed = function (userPermission, decimal, userOrRole) {
            var i = 0;
            var newAccessLevel = 0;
            while (i < 4) {
                if (i === 3) {
                    if (newAccessLevel > 0) {
                        newAccessLevel += 8;
                    } else if (i === decimal) {
                        newAccessLevel += (userPermission.AccessLevel & (0x01 << i)) > 0 ? 0 : Math.pow(2, decimal);
                    } else {
                        newAccessLevel += userPermission.AccessLevel & (0x01 << i);
                    }
                } else if (i === decimal) {
                    newAccessLevel += (userPermission.AccessLevel & (0x01 << i)) > 0 ? 0 : Math.pow(2, decimal);
                } else {
                    newAccessLevel += userPermission.AccessLevel & (0x01 << i);
                }

                i++;
            }
            if (userPermission.AccessLevel !== newAccessLevel) {
                userPermission.AccessLevel = newAccessLevel;
                var promise = ManageFormsService.updateUserPermission(userPermission);
                promise.then(function (response) {

                });
            }
        };

        $scope.approve = function (processId) {
            $ctrl.varList = 'Approve this Submission(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.approve(processId);
                    promise.then(function (response) {
                        $scope.viewSubmissions($scope.currentFolderOrApplication);
                    });
                }
            }, function () {

            });
        };

        $scope.deny = function (processId) {
            $ctrl.varList = 'Deny this Submission(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.deny(processId);
                    promise.then(function (response) {
                        $scope.viewSubmissions($scope.currentFolderOrApplication);
                    });
                }
            });
        };

        $scope.getAllVisibleApplications = function () {
            var promise = ManageFormsService.getAllVisibleApplications($scope.superUserModeEnabled);
            promise.then(function (response) {
                $scope.applications = angular.copy(response.data);
                $scope.applicationsAsFolders = processApplicationAsFolder(response.data);
                $scope.folders = embedApplicationsIntoFolders($scope.applicationsAsFolders, $scope.folders, 0);
                $scope.originalFoldersTree = angular.copy($scope.folders);
            });
        };

        $scope.getAllVisibleFolders = function () {
            var promise = ManageFormsService.getAllVisibleFolders($scope.superUserModeEnabled);
            promise.then(function (response) {

                $scope.folders = createTree(response.data);
                $scope.getAllVisibleApplications();
            });
        };

        $scope.init = function () {
            $scope.getAllVisibleFolders();
        };

        $scope.init();

        function createTree(nodes) {
            var map = {}, node, roots = [];
            for (var i = 0; i < nodes.length; i++) {
                node = nodes[i];
                node.children = [];
                map[node.FolderId] = i; // use map to look-up the parents
                if (node.ParentFolderId !== 0) {
                    //console.log(nodes[map[node.ParentFolderId]]);
                    if (nodes[map[node.ParentFolderId]] !== undefined)
                        nodes[map[node.ParentFolderId]].children.push(node);
                } else {
                    roots.push(node);
                }
            }
            return roots;
        };

        function convertTreeToFolders(tree, parentFolderId) {
            var folders = [];
            for (var i = 0; i < tree.length; i++) {
                tree[i].ParentFolderId = parentFolderId;
                folders.push(tree[i]);
                if (tree[i].children && tree[i].children.length > 0) {
                    Array.prototype.push.apply(folders, convertTreeToFolders(tree[i].children, tree[i].FolderId));
                }
            }
            return folders;
        };

        function findChanges(newFolders, oldFolders, parentFolderId) {
            var changes = [];
            for (var i = 0; i < newFolders.length; i++) {
                var folder = $.grep(oldFolders, function (f) { return f.FolderId === newFolders[i].FolderId && f.CreatedBy === newFolders[i].CreatedBy });
                if (!folder || folder.length === 0) {
                    newFolders[i].ParentFolderId = parentFolderId;
                    changes.push(newFolders[i]);
                    if (newFolders[i].children && newFolders[i].children.length > 0) {
                        Array.prototype.push.apply(changes, findChanges(newFolders[i].children, [], newFolders[i].FolderId));
                    }
                } else if (newFolders[i].children && newFolders[i].children.length > 0) {
                    Array.prototype.push.apply(changes, findChanges(newFolders[i].children, folder[0].children, newFolders[i].FolderId));
                }
            }
            return changes;
        };

        function processApplicationAsFolder(applications) {
            var result = [];
            for (var i = 0; i < applications.length; i++) {
                result.push({
                    FolderId: applications[i].ApplicationId,
                    FolderName: applications[i].ApplicationName,
                    FolderDescription: applications[i].ApplicationDescription,
                    ParentFolderId: applications[i].FolderId,
                    CreatedBy: -2, //Originally created as a way to determine that trees etc are being repurposed for an application instead of folder. Use formCreatedBy at end of array as true creator ID
                    AccessLevel: applications[i].AccessLevel,
                    DateCreated: null,
                    DateDeleted: null,
                    formCreatedBy: applications[i].CreatedBy
                });
            }
            return result;
        };

        function embedApplicationsIntoFolders(applications, folders, parentFolderId) {
            for (var i = 0; i < folders.length; i++) {
                embedApplicationsIntoFolders(applications, folders[i].children, folders[i].FolderId);
            }
            Array.prototype.push.apply(folders, $.grep(applications, function (a) { return a.ParentFolderId === parentFolderId }));
            return folders;
        };

        $scope.previewUsersInRole = function (systemRole) {
            $scope.valsList = {
                systemRoleId: systemRole.SystemRolesId,
                systemRoleName: systemRole.FirstName,
                folderId: systemRole.TargetId,
                folderOrApplication: $scope.currentFolderOrApplication.CreatedBy !== -2 ? 0 : 1,
                previewingForRoleManagement: false
            };
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: '/app/views/modalViews/previewUsersInRole.html',
                controller: 'previewUsersInRoleModalInstanceCtrl',
                controllerAs: "$ctrl",
                size: " ",
                resolve: {
                    valsList: function () {
                        return $scope.valsList;
                    }
                }
            });
        };

    });

app.controller('viewUrlModalInstanceCtrl', function ($scope, $uibModalInstance, ngClipboard, varList) {
    var $ctrl = this;
    $ctrl.url = (window.location.protocol) + '//' + window.location.host + '/Forms/' + varList;

    $scope.copyToClipboard = function (value) {
        ngClipboard.toClipboard(value);
    }

    $ctrl.ok = function () {
        $uibModalInstance.close($ctrl.url);
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('pageQuestionController', function ($scope, ApplicationService, $uibModal) {

    $scope.treeOptions = {
        dropped: function (event) {
            $scope.updateFieldViewOrder();
        },
        accept: function (sourceNodeScope, destNodesScope, destIndex) {
            return destNodesScope.$treeScope == sourceNodeScope.$treeScope;
        }
        
    };

    $scope.$on('fetchPages', function (events, applicationId) {

        $scope.fields = null;
    });


    $scope.$on('pageSelected', function (event, page) {
        $scope.pageId = page.PageId;
        $scope.getFields(page.PageId);
    });

    $scope.$on('fieldInfoUpdated', function (event, field) {
        var index;
    
        $scope.fields.some(function (fild, i) {
            if (fild.FieldId == field.FieldId) {
                index = i;
                return true;
            }
        });
        field.selected = true;
        if (index != null) {
            $scope.fields[index] = field;
        }
        else {
            $scope.fields.push(field);
            $scope.updateFieldViewOrder();
        }
       
    });

    $scope.getFields = function (pageId) {
       
        ApplicationService.getFormFields(pageId).then(function (response) {
            $scope.fields = response.data;
        });

    }
    $scope.fieldClicked = function(field){
        $.each($scope.fields, function (idx, value) {
            value.selected = false;
        });

        field.selected = true;

        $scope.$emit('field clicked', field);
    }

    $scope.createNewQuestion = function () {
        $.each($scope.fields, function (idx, value) {
            value.selected = false;
        });
        $scope.$emit('NewQuestionClicked',$scope.pageId);
    }

    $scope.deleteField = function (evt,field) {
        evt.stopImmediatePropagation();
       
        $scope.varList = "Are you sure you want to delete a question?";
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: "/app/views/confirmedDialog/confirm.html",
            controller: "confirmedModalInstanceCtrl",
            controllerAs: "$ctrl",
            size: "",
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                ApplicationService.deleteField(field.FieldId).then(function (response) {
                    var index;
                    $scope.fields.some(function (fld, idx) {
                        if (fld.FieldId == field.FieldId) {
                            index = idx;
                            return true;
                        }
                    });

                    $scope.fields.splice(index, 1);
                });
            }
        }, function() {
            
        });
    }

    $scope.updateFieldViewOrder = function () {
        var fields = $scope.fields.map(function (fld, idx) {

            return {
                ViewOrder: idx+1,
                FieldId: fld.FieldId,
                PageId: fld.PageId
            };
       });

       ApplicationService.updateFieldViewOrder(fields).then(function (response) {

       });
    }

   
});;
app.controller('questionController', function ($scope, $anchorScroll, $location, $timeout, $uibModal, ApplicationService) {

    $scope.Options = {
        dropped: function (event) {
            $scope.updateResponseViewOrder();
        },
        
        accept: function (sourceNodeScope, destNodesScope, destIndex) {
            return destNodesScope.$treeScope == sourceNodeScope.$treeScope;
        }
    };

    $scope.$on('CreateFieldAndSendFieldId', function () {
        $scope.CreateOrUpdateField();
    });

    $scope.fieldTypes = [
        {TypeId : 0, TypeName : "Text Box"},
        {TypeId : 1, TypeName : "Email Address"},
        {TypeId : 2, TypeName : "Large Text Box"},
        {TypeId : 3, TypeName : "Phone Number"},
        {TypeId : 5, TypeName : "Multi-selection Check Boxes"},
        {TypeId : 6, TypeName : "Radio Button List"},
        {TypeId : 7, TypeName : "Drop Down"},
        {TypeId : 8, TypeName : "File Upload"},
        {TypeId : 9, TypeName : "Horizontal Radio Button List"},
        {TypeId : 10, TypeName : "Auto Fill User First Name"},
        {TypeId : 11, TypeName : "Auto Fill User Last Name"},
        {TypeId : 12, TypeName : "Auto Fill Student Id"},
        {TypeId : 13, TypeName : "Date Picker"},
        {TypeId : 14, TypeName : "Date and Time Picker"},
        {TypeId : 15, TypeName : "Time Picker"},
        {TypeId : 16, TypeName : "Content Block (No Response)"}
    ];



    $scope.$on('fieldSelected', function (event, field) {
        $scope.field = angular.copy(field);
        $scope.sourceField = field;
        $scope.selectedFieldType = jwru.constellation.utils.getObjectById($scope.fieldTypes, 'TypeId', field.FieldType);

        if ($scope.selectedFieldType.TypeId >= 5 && $scope.selectedFieldType.TypeId != 8 && $scope.selectedFieldType.TypeId < 10) {
            $scope.getFieldResponses(field.FieldId);
        }
        else {
            $scope.responses = [];
        }

    });

    $scope.$on('CreateNewQuestion', function (event, pageId) {
        $scope.responses = [];
        ApplicationService.createField(pageId).then(function (response) {
            $scope.field = response.data;
            $scope.selectedFieldType = jwru.constellation.utils.getObjectById($scope.fieldTypes, 'TypeId', $scope.field.FieldType);

        });
    });

    $scope.$on('fetchPages', function (events, applicationId) {

        $scope.field = null;
    });
    $scope.$on('pageSelected', function (events, applicationId) {

        $scope.field = null;
    });
    
    $scope.$on('responseUpdated', function (event, response) {
        var index = null;

        var found = $scope.responses.some(function (fild, i) {
            if (fild.FieldResponseId == response.FieldResponseId) {
                index = i;
                return true;
            }
        });

        if (found) {
            $scope.responses[index] = response;
        }
        else {
            $scope.responses.push(response);
            $scope.updateResponseViewOrder();
        }
        
    });

    $scope.fieldTypeChanged = function () {
        $scope.field.FieldType = $scope.selectedFieldType.TypeId;
    }

    $scope.CreateOrUpdateField = function (callBack) {
       
        ApplicationService.UpdateField($scope.field).then(function (response) {
           
            var field = response.data;
            $scope.$emit('fieldUpdated',field);
            
            return field;

        }).then(function (field) {
            $scope.$broadcast('NewField',field);
        });
    }
            
    $scope.getFieldResponses = function (fieldId) {
        ApplicationService.getFieldResponses(fieldId).then(function (response) {

            $scope.responses = response.data;

        });
    }

 

    $scope.createOrEditResponse = function (response) {
        if (response == null) {
            $scope.$broadcast('createOrEditResponse', { FieldId: $scope.field.FieldId });
        }
        else {
            $scope.$broadcast('createOrEditResponse', response);
        }
        $timeout($scope.scrollToResponse, 100);
    }

    $scope.deleteResponse = function (response) {
        var fieldId = response.FieldId;
       
        $scope.varList = "Are you sure you want to delete a response?";
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: "/app/views/confirmedDialog/confirm.html",
            controller: "confirmedModalInstanceCtrl",
            controllerAs: "$ctrl",
            size: "",
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                ApplicationService.deleteFieldResponse(response.FieldResponseId).then(function (response) {
                    $scope.getFieldResponses(fieldId);
                });
            }
        }, function() {
            
        });
    }

    $scope.updateResponseViewOrder = function () {
        var responses = $scope.responses.map(function (resp, idx) {
            return {
                ViewOrder: idx + 1,
                FieldResponseId: resp.FieldResponseId
            };
        });

        ApplicationService.updateResponseOrder(responses).then(function (response) {
        });
    }

    $scope.scrollToResponse = function () {
        
        $location.hash('responseContainer');
        $anchorScroll();
    }
   
});;
app.controller('responseController', function ($scope, ApplicationService, $timeout) {

    

    $scope.getApplications = function (applicationId) {
        ApplicationService.getApplications(applicationId).then(function (response) {
            $scope.applications = response.data;
        });
    }

    $scope.$on('createOrEditResponse', function (event, response) {
        if (response.FieldResponseId != null) {
            
            $scope.response = angular.copy(response);
            $scope.setStartDate(response.DisplayStartDate);
            $scope.setEndDate(response.DisplayEndDate);
            var form = jwru.constellation.utils.getObjectById($scope.applications, "ApplicationId", response.LinkToApplication);
            $scope.selectedApplication = form == null? $scope.applications[0]:form;

        }
        else {


            $scope.createNewResponse(response.FieldId);
            $scope.selectedApplication = $scope.applications[0];
        }

    });

   // $scope.getApplications();

    $scope.$on('CreateNewQuestion',
        function(event, pageId) {
            $scope.response = null;
        });

    $scope.$on('NewField', function (event, field) {
        if ($scope.isWaitingForFieldId) {
            $scope.isWaitingForFieldId = false;
            $scope.response.FieldId = field.FieldId;
            $scope.updateFieldResponse();
        }
    });

    $scope.$on('fetchApplicationList', function (evt, applicationId) {
        $scope.getApplications(applicationId);
    });

    $scope.createNewResponse = function (fieldId) {
        ApplicationService.createNewFieldResponse(fieldId).then(function (response) {
            $scope.response = response.data;
            $scope.response.DisplayStartDate = null;
            $scope.response.DisplayEndDate = null;
            $scope.setStartDate();
            $scope.setEndDate();

        });
    }

    $scope.cancel = function () {
        $scope.response = null;
    }

    $scope.updateFieldResponse = function () {

        if ($scope.response.FieldId <= 0) {
            $scope.isWaitingForFieldId = true;
            $scope.$emit('CreateFieldAndSendFieldId');
        }
        else {
            $scope.response.DisplayStartDate = $scope.getStartDate();
            $scope.response.DisplayEndDate = $scope.getEndDate();

            ApplicationService.updateFieldResponse($scope.response).then(function (response) {

               
                $scope.response.FieldResponseId = response.data.FieldResponseId;
                $scope.$emit('responseUpdated', $scope.response);
                $scope.response = null;

            });
        }
    }

    $scope.applicationChanged = function () {
        $scope.response.LinkToApplication = $scope.selectedApplication.ApplicationId;
        $scope.response.LinkToApplicationName = jwru.constellation.utils.getObjectById($scope.applications, 'ApplicationId', $scope.selectedApplication.ApplicationId).ApplicationName;
    }

    $scope.setStartDate = function (startDate) {
        
        // $('#dateTimePickerStartDate').data("DateTimePicker").date(moment(startDate).format('MM/DD/YYYY h:mm A'));
        if (startDate == null) {
            $timeout(function () { $('#startDateStr').val(moment(new Date()).format('MM/DD/YYYY h:mm A'));  }, 50);
        }
        else {
            $timeout(function () { $('#startDateStr').val(moment(startDate).format('MM/DD/YYYY h:mm A'));  }, 50);
        }
    }
    $scope.setEndDate = function (endDate) {
        // $('#dateTimePickerEndDate').data("DateTimePicker").date(endDate);
        if (endDate == null) {
            $timeout(function () { $('#endDateStr').val("");  }, 50);
        }
        else if (endDate.toString() == "0001-01-01T00:00:00") {
            $timeout(function () { $('#endDateStr').val("");  }, 50);
        }
        else {
            $timeout(function () { $('#endDateStr').val(moment(endDate).format('MM/DD/YYYY h:mm A')); }, 50);
        }
    }

    $scope.getStartDate = function () {
        var date = $('#dateTimePickerStartDate').data("DateTimePicker").date();
        return date == null? null: date.toDate();
    }
    $scope.getEndDate = function () {
        var date = $('#endDateStr').val().trim() == "" ? null : $('#dateTimePickerEndDate').data("DateTimePicker").date();
        return date == null ? null : date.toDate();
    }

    $scope.startDate = $('#dateTimePickerStartDate').datetimepicker({
        format: 'MM/DD/YYYY h:mm A',
        minDate: moment(),
        widgetPositioning: {
            horizontal: 'auto',
            vertical: 'top'
        }
    });
     $('#dateTimePickerEndDate').datetimepicker({
         format: 'MM/DD/YYYY h:mm A',
         useStrict:true,
        minDate: moment(),
        widgetPositioning: {
            horizontal: 'auto',
            vertical: 'top'
        }
     });
});;
app.controller('sgBallotController', function ($scope, $filter, $anchorScroll, $location, $timeout, $uibModal, $window, UserProfileService, SGBallotService) {

    $scope.showLoader = true;
    $scope.currentUserProfile = {};
    $scope.studentid = '';
    $scope.confirmedAddress = true;
    $scope.savedSuccess = false;
    $scope.SavedFailed = false;
    $scope.wrongAddressDesc = '';
    $scope.validAddressobj = {};
    $scope.successmsg = false;
    $scope.failedmsg = false;
    $scope.isOpen = false;
    $scope.isRegistered = false;


    $scope.currentAddress = {
        addressLine1: '',
        addressLine2: '',
        addressLine3: '',
        city: '',
        state: '',
        zip: ''
    };

    $scope.savedAddress = {
        AddressLine1: '',
        AddressLine2: '',
        AddressLine3: '',
        City: '',
        State: '',
        Zip: '',
        Classification: '',
        FirstName: '',
        LastName: '',
        UserProfileId: 0,
        StudentId: ''
    };

    $scope.submitBallotDates = {
        UserProfileId: 0,
        startdate: '',
        enddate: ''

    };

    $scope.mode = {
        report: true,
        submissions: false
    };

    $scope.userinfo = {
        UserProfileId: 0,
        AddressType: 0,

    }; 

    $scope.updateMode = function (modeOption) {

        $scope.mode.report = false;
        $scope.mode.submissions = false;        

        $scope.mode[modeOption] = true

        //If user was working in the advisor tab, but selects another tab, reset the advisor tab. See end of orgAdvisorsBulkUpdateCtrl.js file
       // $rootScope.$emit("resetTab", $scope.mode);
    };

    $scope.loadUserProfile = function () {
        var promise = UserProfileService.getUserProfile();
        promise.then(function (response) {
            $scope.currentUserProfile = response.data;
           // console.log($scope.currentUserProfile);
            $scope.studentid = $scope.currentUserProfile.StudentId;
            $scope.showLoader = false;
            $scope.getCollegeInfo($scope.studentid);
        });


    };


    $scope.updateUserBallot = function () {

        $scope.confirmedAddress = true;
       
        $scope.currentAddress.addressLine1 = $scope.streetaddress1;
        $scope.currentAddress.addressLine2 = $scope.streetaddress2;
        $scope.currentAddress.city = $scope.city;
        $scope.currentAddress.state = $scope.state;
        $scope.currentAddress.zip = $scope.zipcode;

       
       // console.log($scope.currentAddress);
        var promise = SGBallotService.ValidateAddress($scope.currentAddress);
        promise.then(function (response) {
           // console.log(response.data);
            //console.log(response.data[0]);
            //console.log(response.data[1]);

           // if (response.data[1] != null) {
            if (!response.data[1])
            {
                $scope.confirmedAddress = false;
                $scope.wrongAddressDesc = response.data[0];
                jwru.constellation.widgets.confirmationDialog.open($uibModal, 'You entered the wrong address', $scope.wrongAddressDesc);
            }
            else //if (obj[1] != null)
            {
                 var obj = response.data;

               // console.log(obj);

                if (obj[1] === 'N')
                {
                    $scope.confirmedAddress = false;
                    jwru.constellation.widgets.confirmationDialog.open($uibModal, 'You entered the wrong address', 'The address entered was undeliverable');
                }
                if (obj[1] === 'D')
                {
                    $scope.confirmedAddress = false;
                    jwru.constellation.widgets.confirmationDialog.open($uibModal, 'The address entered is incomplete', 'The address entered was undeliverable. Please enter additional info on Street Address 2');
                }
                else
                {
                    $scope.correctAddress(obj[0]);
                }

            }

        })
            
    };

    $scope.correctAddress = function (addressReturned) {

        $scope.confirmationMsg = 'Verify Address';
          
        //console.log(addressReturned);
       
        if ($scope.streetaddress2 !== null && $scope.streetaddress2 !== undefined) {
           // console.log(addressReturned.addressLine1);
            $scope.validAddressobj.street1 = addressReturned.addressLine1;
            $scope.savedAddress.AddressLine1 = addressReturned.addressLine1;
           // console.log("going into if statement");
        }

        //console.log("before first addition");
        $scope.validAddressobj.street2 = addressReturned.addressLine2;
       // console.log("after first addition");
        $scope.validAddressobj.city = addressReturned.city;
        $scope.validAddressobj.state = addressReturned.state;
        $scope.validAddressobj.zip = addressReturned.zip;

        //console.log($scope.validAddressobj);

        $scope.savedAddress.AddressLine2 = addressReturned.addressLine2;
        $scope.savedAddress.City = addressReturned.city;
        $scope.savedAddress.State = addressReturned.state;
        $scope.savedAddress.Zip = addressReturned.zip;
        $scope.savedAddress.FirstName = $scope.currentUserProfile.FirstName;
        $scope.savedAddress.LastName = $scope.currentUserProfile.LastName;
        $scope.savedAddress.StudentId = $scope.currentUserProfile.StudentId;
        $scope.savedAddress.UserProfileId = $scope.currentUserProfile.UserProfileId;
        $scope.savedAddress.Classification = $scope.college;

        //console.log($scope.savedAddress);


        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/verifyAddress.html',
            controller: 'confirmedAddressModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $scope.validAddressobj;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1 && $scope.confirmedAddress ) {
               
                //console.log('Success');
                //console.log(addressReturned);
                $scope.saveAddress($scope.savedAddress);
            }
            else {
                $scope.confirmedAddress = false;
            }
        });


    };

    $scope.saveAddress = function (address) {
        var promise = SGBallotService.UpdateAddress(address);
        promise.then(function (response) {
            if (response.data >= 1) {
               // console.log("went to db success");
                $scope.savedSuccess = true;
            }
            else {
               // console.log("failed");
                $scope.SavedFailed = true;
            }

        })
    };

    $scope.convertDate = function (date) {
        var d = new Date(date).toLocaleDateString('en-US', {
            day: '2-digit',
            month: '2-digit',
            year: 'numeric',
        })

        return d;
    };

    $scope.downloadReport = function () {        

        var s = $scope.convertDate($scope.startdate);
        var e = $scope.convertDate($scope.enddate);

        
        var reportUrl = "/Utils/Export/GenerateReport?ReportName=SGBallot&Parameters=start$" + s + ",end$" + e;
        $window.open(reportUrl, '_blank');
    };
        
    $scope.allowRequests = function () {

        $scope.submitBallotDates.UserProfileId = $scope.currentUserProfile.UserProfileId;
        $scope.submitBallotDates.startdate = new Date($scope.startdate2).toJSON();
        $scope.submitBallotDates.enddate = new Date($scope.enddate2).toJSON();

      //  console.log($scope.submitBallotDates);

        var promise = SGBallotService.UpdateDates($scope.submitBallotDates);
        promise.then(function (response) {
            if (response.data > 0) {
                $scope.successmsg = true;
            }
            else {
                $scope.failedmsg = true;
            }

        })
    };

    $scope.getdates = function () {

        var promise = SGBallotService.GetDates();
        promise.then(function (response) {
            //console.log(response.data);

            if (response.data != null) {               
                
                $scope.startdate2 = new Date(response.data.OpenDate).formatNormalDateTime();
                $scope.enddate2 = new Date(response.data.CloseDate).formatNormalDateTime();

            }

        })
    };

    $scope.checkDates = function () {

        var promise = SGBallotService.IsOpen();
        promise.then(function (response) {            

            if (response.data != null) {
                $scope.isOpen = response.data;
            }
        })

    }

    $scope.addressTypeSelected = function (addressType) {
       // console.log(addressType);

        $scope.userinfo.UserProfileId = $scope.currentUserProfile.UserProfileId;
        $scope.userinfo.AddressType = addressType;

        var promise = SGBallotService.GetAddress($scope.userinfo);
        promise.then(function (response) {
           // console.log(response.data);
            if (addressType < 1) {
                $scope.streetaddress1 = '';
                $scope.streetaddress2 = '';
                $scope.city = '';
                $scope.state = '';
                $scope.zipcode = '';
                //console.log("address type = 0");
            }

            if (addressType > 0) {
                $scope.streetaddress1 = response.data[0].addressLine1;
               // $scope.streetaddress2 = response.data[0].addressLine2;
                $scope.city = response.data[0].city;
                $scope.state = response.data[0].state;
                $scope.zipcode = response.data[0].zip;
                //console.log(obj[0].addressLine1);
               // console.log("address type is 6 or 9");
                var s = response.data[0].addressLine2.trim();
                if (s.length > 0) {
                    $scope.streetaddress2 = response.data[0].addressLine2;
                }


            }
           
           
        })


    }

    $scope.getCollegeInfo = function (studentid) {
       // console.log(studentid);
        //console.log("testing");
        //console.log(studentid);
        $scope.studentid = studentid;
        var promise = SGBallotService.GetUserCollegeInfo($scope.studentid);
        promise.then(function (response) {
           // console.log(response.data);

            if (response.data.Registered === 'R') {
                $scope.isRegistered = true;
                if (response.data.Classification == 1) {
                    $scope.college = 'Freshman';
                }
                if (response.data.Classification == 2) {
                    $scope.college = 'Sophomore';
                }
                if (response.data.Classification == 3) {
                    $scope.college = 'Junior';
                }
                if (response.data.Classification == 4 || response.data.Classification == 5 ) {
                    $scope.college = 'Senior';
                }
                if (response.data.Classification == 6 || response.data.Classification == 7 ) {
                    $scope.college = 'Graduate';
                }

                //$scope.college = response.data.Classification + ' ' + response.data.College;
            }
            else {
                $scope.isRegistered = false;
            }

            //console.log($scope.isRegistered);
        })

    };

    $scope.init = function () {
        $scope.loadUserProfile();
        $scope.getdates();
        $scope.checkDates();
        //$scope.getCollegeInfo();
        
    };

    $scope.init();
});;
app.controller('homeController', function ($scope, SystemPeriodsService) {
    $scope.registrationIsOpen = false;

    $scope.checkIfRegistrationIsOpen = function () {
        var promise = SystemPeriodsService.checkIfRegistrationIsOpen();
        promise.then(function (response) {
            $scope.registrationIsOpen = response.data;
        });
    };

    $scope.init = function () {
        $scope.checkIfRegistrationIsOpen();
    };

    $scope.init();
});
app.controller('profileMenuController', function ($scope, $uibModal, $window) {
    
    $scope.generateModal = function () {
        showReportModal();
    }

    $scope.downloadReport = function () {
       
        var reportUrl = "/Utils/Export/GenerateReport?ReportName=On Call Dean&Parameters=StudentId$"+$scope.studentId;
        $window.open(reportUrl, '_blank');
    }

    $scope.cancel = function () {
        $scope.modalInstance.dismiss('cancel');
    };

    function showReportModal() {
       $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/downloadReport.html',
            scope: $scope,
            controller: 'profileMenuController',
            controllerAs: '$ctrl',
            size: ''
        });
    }
});;
app.controller('eventModalInstanceCtrl', function ($scope, $uibModalInstance, EventService, CategoryServices, varList) {
    var $ctrl = this;

    $scope.systemPeriod;
    $scope.selectedOrg;
    $scope.applications;
    $scope.organizationType;
    $scope.organizations;
    $scope.allEventCategories;

    $scope.eventCategories = [];

    $scope.updateEvent = function () {
        $scope.event.EventCategories = $scope.eventCategories;
        var promise = EventService.updateEvent($scope.event);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.changeOrg = function() {
        $scope.event.OrganizationId = $scope.selectedOrg.OrganizationId;
    }

    $scope.getEventCategories = function() {

        CategoryServices.getCategories().then(function (result) {
            
            $scope.allEventCategories = result.data.filter(function (a) {
                if (a.Zone == 2)
                    return true;
            });
            $scope.allEventCategories.unshift({
                Name: 'All',
                CategoryId: 0
            });

            setEventCategories();

        });
    }
  
    $scope.init = function () {
        $scope.organizations = varList[1];
        $scope.event = angular.copy(varList[0]);
        $scope.eventCategories = $scope.event.EventCategories;
        $scope.selectedOrg = jwru.constellation.utils.getObjectById($scope.organizations, "OrganizationId", $scope.event.OrganizationId);
        if ($scope.event.start != null)
            $scope.event.start = $scope.event.start.formatDateTime();
        if ($scope.event.end != null)
            $scope.event.end = $scope.event.end.formatDateTime();

        $scope.getEventCategories();

        

    };

    $scope.init();

    $scope.addCategory = function () {
        var catId = $scope.selectedEventCategory.CategoryId;
        var len = $scope.allEventCategories.length;
        if (catId <= 0) {
            $scope.allEventCategories = $scope.allEventCategories.concat($scope.eventCategories);
            $scope.eventCategories = [];

        } else {
            if ($scope.eventCategories == null) {
                $scope.eventCategories = [];
            }
            for (var i = 0; i < len; i++) {

                if (catId == $scope.allEventCategories[i].CategoryId) {

                    $scope.eventCategories.push($scope.allEventCategories.splice(i, 1)[0]);

                    break;
                }
            }
        }


    }

    $scope.deleteSelectedCategory = function(category) {
        
        var len = $scope.eventCategories.length;
        var catId = category.CategoryId;
        for (var i = 0; i < len; i++) {

            if (catId == $scope.eventCategories[i].CategoryId) {

                $scope.allEventCategories.push($scope.eventCategories.splice(i, 1)[0]);

                break;
            }
        }
    }

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

    function setEventCategories() {

        if ($scope.event.EventCategories == null)
            return;

        $scope.allEventCategories = $scope.allEventCategories.filter(function (a) {
            if (jwru.constellation.utils.getObjectById($scope.event.EventCategories,
                    "CategoryId",
                    a.CategoryId) ==
                null) {
                return true;
            }
        });

    }
});
app.controller('addOrganizationMemberModalInstanceCtrl', function ($scope, OrganizationMemberService, SysOrganizationMembershipStatusService, $uibModal, $log, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.status;
    $scope.memberStatus;

    $scope.getMembershipStatusTypes = function () {
        var promise = SysOrganizationMembershipStatusService.getMembershipStatusTypes(varList);
        promise.then(function (response) {
            $scope.status = response.data;
        });
    };

    $scope.preview = function (userInput) {
        $ctrl.varList = [userInput, $scope.memberStatus.MembershipStatusId, varList];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/previewOrganizationMembers.html',
            controller: 'previewOrganizationMemberModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $uibModalInstance.close(1);
            }
        }, function () {

        });
    };

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.cancel = function () {
        $ctrl.varList = 'Close This Window, All Your Data Will Be Lost!';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                $uibModalInstance.close(0);
            }
        });
    };

    $scope.init = function () {
        $scope.getMembershipStatusTypes();
    };

    $scope.init();
});
app.controller('addUserPermissionModalInstanceCtrl',
    function ($scope, varList, $uibModalInstance, ManageFormsService, UserProfileService) {

        $scope.itemsPerPage = 10;
        $scope.query = '';
        $scope.currentPage = 1;
        $scope.loadingUsers = false;
        $scope.itemsPerAccodionModalPage = 10;
        $scope.currentAccordionModalPage = 1;

        $scope.userInput = '';
        $scope.folderOrApplication = {};
        $scope.filteredUsers = [];
        $scope.preSetAccessLevel = 8;
        $scope.preSetAccessLevelOfSystemRole = 8;

        $scope.selectRoleToAdd = {};
        $scope.availableSystemRoles = {};
        $scope.usersBySystemRoles = [];
        $scope.myBool = false; //is this needed??

        $scope.checkAllowed = function (value, decimal) {
            return (value & (0x01 << decimal)) > 0;
        };

        // Taken from JWRU.Constellation.UI.WebV2\app\controllers\profile\adminUserProfileControllers.js
        $scope.loadSystemRoles = function () {
            var promise = UserProfileService.getSystemRoles();

            promise.then(function (response) {
                $scope.availableSystemRoles = response.data;
            });
        };
        $scope.loadSystemRoles();

        $scope.findUsers = function () {
            var userInputs = { UserInput: $scope.userInput };

            var promise = ManageFormsService.findUsers(userInputs, $scope.folderOrApplication.FolderId, $scope.folderOrApplication.CreatedBy === -2 ? 1 : 0);
            promise.then(function (response) {
                $scope.filteredUsers = response.data;
            });
        };

        $scope.findUsersBySystemRole = function () {

            var promise = ManageFormsService.findUsersBySystemRole($scope.selectRoleToAdd.SystemRolesId, $scope.folderOrApplication.FolderId, $scope.folderOrApplication.CreatedBy === -2 ? 1 : 0);
            promise.then(function (response) {
                $scope.usersBySystemRoles = response.data;
            });
        };

        $scope.removeUser = function (user) {
            var index = $scope.filteredUsers.indexOf(user);
            $scope.filteredUsers.splice(index, 1);
        };

        $scope.addUserPermissions = function () {

            if ($scope.filteredUsers[0]) {      // last 0 param for systemRoleId when none is needed, leave as 0 instead of null. In applicationDataProvider it will convert the 0 to DBNull before inputting in DB. An int is expected.
                var promise = ManageFormsService.addUserPermissions($scope.filteredUsers, $scope.preSetAccessLevel, $scope.folderOrApplication.FolderId, $scope.folderOrApplication.CreatedBy === -2 ? 1 : 0, 0);  
                promise.then(function (response) {          
                    $uibModalInstance.close(1);
                });
            }

            if ($scope.usersBySystemRoles[0]) {
                // POST request to add permissions by systemrole. Use same call to update permissions.
                // Null param for filteredUsers when none is needed, leave as null because applicationDataProvider expects string -> will be converted to DBNull before inpute into DB
                var promise = ManageFormsService.addUserPermissions(null, $scope.preSetAccessLevelOfSystemRole, $scope.folderOrApplication.FolderId, $scope.folderOrApplication.CreatedBy === -2 ? 1 : 0, $scope.selectRoleToAdd.SystemRolesId);
                promise.then(function (response) {
                    $uibModalInstance.close(1);
                });                
            }
        };

        $scope.toggleAllowed = function (accessLevel, decimal, userOrRole) {
            var i = 0;
            var newAccessLevel = 0;
            while (i < 4) {
                if (i === 3) {
                    if (newAccessLevel > 0) {
                        newAccessLevel += 8;
                    } else if (i === decimal) {
                        newAccessLevel += (accessLevel & (0x01 << i)) > 0 ? 0 : Math.pow(2, decimal);
                    } else {
                        newAccessLevel += accessLevel & (0x01 << i);
                    }
                } else if (i === decimal) {
                    newAccessLevel += (accessLevel & (0x01 << i)) > 0 ? 0 : Math.pow(2, decimal);
                } else {
                    newAccessLevel += accessLevel & (0x01 << i);
                }

                i++;
            }

            if (userOrRole === "users") {
                $scope.preSetAccessLevel = newAccessLevel;

            } else if (userOrRole === "systemRole") {
                $scope.preSetAccessLevelOfSystemRole = newAccessLevel;
            }           
        };

        $scope.cancel = function () {
            $uibModalInstance.close(0);
        };

        $scope.init = function () {
            $scope.folderOrApplication = angular.copy(varList);
        };

        $scope.init();
    });;
app.controller('addUserToSysRoleModalCtrlr', function ($scope, $rootScope, $uibModalInstance, $uibModal, UserProfileService, varsObject) {

    $scope.itemsPerPage = 10;
    $scope.query = '';
    $scope.currentPage = 1;
    $scope.loadingUsers = false;
    $scope.itemsPerAccodionModalPage = 10;
    $scope.currentAccordionModalPage = 1;
    $scope.usersInRole = [];
    $scope.userInput = '';
    $scope.showingAllUsers = false;
    $scope.noUsersInRole = false;
    $scope.viewingAllUsersInRole;

    var varsPassedToModal = angular.copy(varsObject);
    $scope.modalTitle = varsPassedToModal.modalTitle;
    $scope.systemRoleId = varsPassedToModal.systemRolesId;
    $scope.roleLevel = varsPassedToModal.roleLevel;
    var $ctrl = this;

    $scope.multiVarReset = function () {
        $scope.userToAdd = [];
        $scope.usersToRemove = [];
        $scope.filteredUsers = [];
        $scope.usersAdded = false;
    }
    $scope.multiVarReset();

    $scope.findUsers = function () {
        $scope.multiVarReset();
        $scope.showingAllUsers = false;
        $scope.noUsersInRole = false;
        $scope.viewingAllUsersInRole = false;

        var userInputAndRole = {
            userInput: $scope.userInput.toString(),
            systemRoleId: $scope.systemRoleId
        }

        var promise = UserProfileService.GetMultipleUsersByUfIdOrEmail(userInputAndRole);
        promise.then(function (response) {
            $scope.filteredUsers = response.data;
        });
    };

    $scope.findAllUsers = function () {
        $scope.multiVarReset();
        $scope.viewingAllUsersInRole = true;

        // Sending roleLevel because pre-existing DB procedure uses roleLevel instead of systemRoleId to find users
        var promise = UserProfileService.getUsersBySystemRoles($scope.roleLevel.toString()); 
        promise.then(function (response) {
            response.data.forEach(function (item) {

                    item.deletedFlag = false;
                $scope.filteredUsers.push(item);
            });
            $scope.showingAllUsers = true;

            if ($scope.filteredUsers.length == 0) {
                $scope.noUsersInRole = true
            }

        });
    };

    $scope.removeUser = function (user) {
        var index = $scope.filteredUsers.indexOf(user);
        $scope.filteredUsers.splice(index, 1);
    };

    $scope.cancel = function () {
        $scope.filteredUsers = [];
        $scope.userInput = '';
        $scope.usersAdded = false;
        $scope.userToAdd = [];
        $scope.usersToRemove = [];

        $uibModalInstance.close();
    };

    $scope.deleteConfirmation = function (userRolesToDelete) {
        $ctrl.varList = 'Selection';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {

                var promise = UserProfileService.RemoveMultipleUsersInRole(userRolesToDelete);
                promise.then(function (response) {
                    $scope.filteredUsers = response.data;
                    $scope.cancel();
                });
            }
        },
            function () {

            });
    }

    $scope.commitChanges = function () {

        if ($scope.filteredUsers.length > 0) {

            $scope.filteredUsers.forEach(function (user) {

                if (!$scope.viewingAllUsersInRole && !user.DuplicateUser) {
                    $scope.userToAdd.push(user.UserId);
                }

                if ($scope.viewingAllUsersInRole && user.deletedFlag) {
                    $scope.usersToRemove.push(user.UserRoleId);
                }
            });
        }

        //Add users section:
        if (!$scope.viewingAllUsersInRole && !$scope.usersAdded && $scope.userToAdd.length > 0) {
            // $scope.userToAdd.length > 0: If all the users attempting to be added are duplicates (which aren't pushed to array) and therefore nothing is in the array -> don't make call to DB

                var userIds = $scope.userToAdd.join(',');

                var userIdsAndRole = {
                    userInput: userIds, // naming userInput in order to line up with expected model used in C# to accept object in post request (UserPermissionView model)
                    systemRoleId: $scope.systemRoleId
                }

                var promise = UserProfileService.AssignMultipleUsersToRole(userIdsAndRole);
                promise.then(function (response) {

                    $scope.filteredUsers = response.data;

                    if ($scope.usersAdded) {
                        $scope.cancel();
                    }
                    $scope.usersAdded = true;
                });
        }

        //Remove users section:
        if ($scope.viewingAllUsersInRole) {
            var userRoleIds = $scope.usersToRemove.join(',');

            var userRoleIdsAndRole = {
                userInput: userRoleIds, // naming userInput in order to line up with expected model used in C# to accept object in post request (UserPermissionView model)
                systemRoleId: 0
            }
            if ($scope.usersToRemove.length > 0) {
                $scope.deleteConfirmation(userRoleIdsAndRole);
            }
        }
    }
});;
app.controller('addUserToSysUserTypeModalCtrlr', function ($scope, $rootScope, $uibModalInstance, $uibModal, UserProfileService, varsObject) {

    $scope.itemsPerPage = 10;
    $scope.query = '';
    $scope.currentPage = 1;
    $scope.loadingUsers = false;
    $scope.itemsPerAccodionModalPage = 10;
    $scope.currentAccordionModalPage = 1;
    $scope.usersInType = [];
    $scope.userInput = '';
    $scope.showingAllUsers = false;
    $scope.noUsersInUserType = false;
    $scope.viewingAllUsersInUserType;

    var varsPassedToModal = angular.copy(varsObject);
    $scope.modalTitle = varsPassedToModal.modalTitle;
    $scope.systemUserTypeId = varsPassedToModal.systemUserTypesId;
    //$scope.userTypeLevel = varsPassedToModal.userTypeLevel;
    $scope.userTypeLevel = varsPassedToModal.systemUserTypesId;
    var $ctrl = this;
    

    $scope.multiVarReset = function () {
        $scope.userToAdd = [];
        $scope.usersToRemove = [];
        $scope.filteredUsers = [];
        $scope.usersAdded = false;
    }
    $scope.multiVarReset();

    $scope.findUsers = function () {
        $scope.multiVarReset();
        $scope.showingAllUsers = false;
        $scope.noUsersInUserType = false;
        $scope.viewingAllUsersInUserType = false;

        var userInputAndUserType = {
            userInput: $scope.userInput.toString(),
            systemUserTypeId: $scope.systemUserTypeId
        }

        var promise = UserProfileService.GetMultipleUsersByUfIdOrEmailv2(userInputAndUserType);
        promise.then(function (response) {
            $scope.filteredUsers = response.data;
        });
    };

    $scope.findAllUsers = function () {
        $scope.multiVarReset();
        $scope.viewingAllUsersInUserType = true;
       
        // Sending roleLevel because pre-existing DB procedure uses roleLevel instead of systemRoleId to find users
        var promise = UserProfileService.getUsersBySystemUserTypes($scope.userTypeLevel.toString());
        promise.then(function (response) {
            response.data.forEach(function (item) {

                item.deletedFlag = false;
                $scope.filteredUsers.push(item);
            });
            $scope.showingAllUsers = true;

            if ($scope.filteredUsers.length == 0) {
                $scope.noUsersInUserType = true
            }
 
        });
    };

    $scope.removeUser = function (user) {
       
        var index = $scope.filteredUsers.indexOf(user);
        $scope.filteredUsers.splice(index, 1);
    };

    $scope.cancel = function () {
        $scope.filteredUsers = [];
        $scope.userInput = '';
        $scope.usersAdded = false;
        $scope.userToAdd = [];
        $scope.usersToRemove = [];

        $uibModalInstance.close();
    };

    $scope.deleteConfirmation = function (userUserTypesToDelete) {
        $ctrl.varList = 'Selection';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
               
                var promise = UserProfileService.RemoveMultipleUsersInUserType(userUserTypesToDelete);
                promise.then(function (response) {
                    $scope.filteredUsers = response.data;
                    $scope.cancel();
                });
            }
        },
            function () {

            });
    }

    $scope.commitChanges = function () {
      
        if ($scope.filteredUsers.length > 0) {

            $scope.filteredUsers.forEach(function (user) {

                if (!$scope.viewingAllUsersInUserType && !user.DuplicateUser) {
                    $scope.userToAdd.push(user.UserId);
                
                }

                if ($scope.viewingAllUsersInUserType && user.deletedFlag) {
                    $scope.usersToRemove.push(user.UserTypesId);
                
                }
            });
        }

        //Add users section:
        if (!$scope.viewingAllUsersInUserType && !$scope.usersAdded && $scope.userToAdd.length > 0) {
            // $scope.userToAdd.length > 0: If all the users attempting to be added are duplicates (which aren't pushed to array) and therefore nothing is in the array -> don't make call to DB

            var userIds = $scope.userToAdd.join(',');
          
            var userIdsAndUserType = {
                userInput: userIds, // naming userInput in order to line up with expected model used in C# to accept object in post request (UserPermissionView model)
                systemUserTypeId: $scope.systemUserTypeId
            }

            var promise = UserProfileService.AssignMultipleUsersToUserType(userIdsAndUserType);
            promise.then(function (response) {

                $scope.filteredUsers = response.data;

                if ($scope.usersAdded) {
                    $scope.cancel();
                }
                $scope.usersAdded = true;
            });
        }

        //Remove users section:
        if ($scope.viewingAllUsersInUserType) {
           
            var userUserTypeIds = $scope.usersToRemove.join(',');

            var userUserTypesIdsAndUserType = {
                userInput: userUserTypeIds, // naming userInput in order to line up with expected model used in C# to accept object in post request (UserPermissionView model)
                systemUserTypeId: $scope.systemUserTypeId
            }
            if ($scope.usersToRemove.length > 0) {
                $scope.deleteConfirmation(userUserTypesIdsAndUserType);
            }
        }
    }
});;
app.controller('changeMemberStatusModalInstanceCtrl', function($scope, $uibModalInstance, SysOrganizationMembershipStatusService, OrganizationMemberService, varList){

    $scope.status = [];
    $scope.selectedMembershipStatus;

    $scope.cancel = function() { $uibModalInstance.close(0); };

    $scope.changeMemberStatus = function() {
        var membershipStatusUpdateModel = {
            MemberIds: varList[1], 
            NewMembershipStatusId: $scope.selectedMembershipStatus.MembershipStatusId
        };
        OrganizationMemberService.bulkUpdateMemberStatus(membershipStatusUpdateModel).then(function(response){
            $uibModalInstance.close(1);
        });
    };

    $scope.getOrganizationMembershipStatus = function(){
        SysOrganizationMembershipStatusService.getMembershipStatusTypes(varList[0]).then(function (response) {
            $scope.status = response.data;
        });
    };

    $scope.init = function(){
        $scope.getOrganizationMembershipStatus();
    };

    $scope.init();
});;
app.controller('confirmBulkRemoveOrgAdvisors', function ($scope, $uibModalInstance, varList ) {
    $scope.message = angular.copy(varList.message);
    $scope.confirmButtonText = angular.copy(varList.confirmButtonText);
    $scope.cancelButtonText = angular.copy(varList.cancelButtonText);
    $scope.showLinks = false;
    var $ctrl = this;

    //these two vars are for html file to view total affected orgs (this controller is used for two popups)
    $scope.currentPage = 1;
    $scope.itemsPerPage = 10;

    $scope.confirmed = function () {
        $uibModalInstance.close(1);
    };

    $ctrl.cancel = function () {
        $uibModalInstance.close(0);
    };

    $scope.followLink = function (target) {
        $uibModalInstance.close("view orgs");
    }

    $scope.init = function () {

        if (varList.header != undefined) {
            $scope.header = angular.copy(varList.header);
        }

        if (varList.orgs != undefined) {
            $scope.orgs = angular.copy(varList.orgs);
        }

        if (varList.links != undefined) {
            $scope.links = angular.copy(varList.links);
            $scope.showLinks = true;
        }
    }

    $scope.init();
});;
app.controller('confirmCustomizableCtrl', function ($scope, $uibModalInstance, varList) {
    $scope.message = angular.copy(varList.message);
    $scope.confirmButtonText = angular.copy(varList.confirmButtonText);
    $scope.cancelButtonText = angular.copy(varList.cancelButtonText);
    $scope.showLinks = false;
    var $ctrl = this;

    $scope.confirmed = function () {
        $uibModalInstance.close('confirm');
    };

    $ctrl.cancel = function () {
        $uibModalInstance.close('cancel');
    };

    //followLink is not being used, only for possible future links that need to be included in confirmation modals
    $scope.followLink = function (target) {
        $uibModalInstance.close("link clicked");
    }

    $scope.init = function () {

        if (varList.header != undefined) {
            $scope.header = angular.copy(varList.header);
        }

        if (varList.links != undefined) {
            $scope.links = angular.copy(varList.links);
            $scope.showLinks = true;
        }
    }

    $scope.init();
});;
app.controller('confirmedModalInstanceCtrl', function ($scope, $uibModalInstance, varList) {
    $scope.message = varList;
    var $ctrl = this;

    $scope.confirmed = function () {
        $uibModalInstance.close(1);
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('confirmedAddressModalInstanceCtrl', function ($scope, $uibModalInstance, varList) {
    $scope.address = varList;
    var $ctrl = this;

    //console.log($scope.address);
   // console.log($scope.address.street2);
    $scope.confirmed = function () {
        $uibModalInstance.close(1);
    };

    $ctrl.cancel = function () {
        //$uibModalInstance.dismiss('cancel');
        $uibModalInstance.close(0);
    };
});
app.controller('confirmedRemoveModalInstanceCtrl', function ($scope, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.message = varList;

    $scope.confirmed = function () {
        $uibModalInstance.close(1);
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('extendedPropertyGroupModalInstanceCtrl', function ($scope, ExtendedPropertyService, OrganizationTypeService, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.sysOrgTypes;
    $scope.zones;
    $scope.propertyGroup;
    $scope.zone;
    $scope.organizationType;

    $scope.updatePropertyGroup = function () {
        $scope.propertyGroup.ZoneId = $scope.organizationType.OrganizationTypeId;
        $scope.propertyGroup.Zone = $scope.zone.Value;
        var promise = ExtendedPropertyService.updatePropertyGroup($scope.propertyGroup);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.getExtendedPropertyZones = function () {
        var promise = ExtendedPropertyService.getExtendedPropertyZones();
        promise.then(function (response) {
            $scope.zones = response.data;
        });
    };

    $scope.getAllSystemOrganizationType = function () {
        var promise = OrganizationTypeService.getAllSystemOrganizationType();
        promise.then(function (response) {
            $scope.sysOrgTypes = response.data;
            $scope.getExtendedPropertyZones();
        });
    };

    $scope.init = function () {
        $scope.organizationType = { OrganizationTypeId: varList.ZoneId };
        $scope.zone = { Value: varList.Zone };
        $scope.propertyGroup = angular.copy(varList);
        $scope.getAllSystemOrganizationType();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('folderModalInstanceCtrl',
    function ($scope, varList, $uibModalInstance, ManageFormsService) {

        $scope.folder = {};

        $scope.updateFolder = function () {
            var promise = ManageFormsService.updateFolder($scope.folder);
            promise.then(function (response) {
                $uibModalInstance.close(1);
            });
        };

        $scope.cancel = function () {
            $uibModalInstance.close(0);
        };

        $scope.init = function() {
            $scope.folder = angular.copy(varList);
        };

        $scope.init();
    });;
app.controller('formModalInstanceCtrl',
    function ($scope, varList, $uibModalInstance, ManageFormsService, WorkflowService, $filter) {
        $scope.application = {};
        $scope.possibleParentApplications = [];
        $scope.workflows = [];
        $scope.allVisibleApplications = [];

        $scope.selectedApplication = {};
        $scope.selectedWorkflow = {};
        $scope.selectedApplicationToCopy = [];

        var applicationId = 0;

        $scope.updateFolder = function () {
            $scope.application.ParentApplicationId = $scope.selectedApplication.ApplicationId;
            $scope.application.WorkflowId = $scope.selectedWorkflow.WorkflowId;
            $scope.application.StartDate = document.getElementById('StartDate').value;
            $scope.application.EndDate = document.getElementById('EndDate').value;
            var promise = ManageFormsService.updateApplication($scope.application, applicationId);
            promise.then(function (response) {
                $uibModalInstance.close(1);
            });
        };

        $scope.pasteApplication = function () {
            applicationId = $scope.selectedApplicationToCopy[0].ApplicationId;
            $scope.application.ApplicationName = $scope.selectedApplicationToCopy[0].ApplicationName + ' - Copy';
            $scope.application.ApplicationDescription = $scope.selectedApplicationToCopy[0].ApplicationDescription;
            $scope.selectedApplication.ApplicationId = $scope.selectedApplicationToCopy[0].ParentApplicationId;
            $scope.application.FriendlyUrl = $scope.selectedApplicationToCopy[0].FriendlyUrl + ' - Copy';
            document.getElementById('StartDate').value = new Date($scope.selectedApplicationToCopy[0].StartDate) <= 0 ? $filter('date')(new Date(), 'MM/dd/yyyy h:mm a') : $filter('date')($scope.selectedApplicationToCopy[0].StartDate, 'MM/dd/yyyy h:mm a');
            document.getElementById('EndDate').value = new Date($scope.selectedApplicationToCopy[0].EndDate) <= 0 ? '' : $filter('date')($scope.selectedApplicationToCopy[0].EndDate, 'MM/dd/yyyy h:mm a');
            if ($scope.selectedApplicationToCopy[0].Published)
            {
                $("#Published").iCheck("check");
            } else {
                $("#Published").iCheck("uncheck");
            }
            if ($scope.selectedApplicationToCopy[0].Public)
            {
                $("#Public").iCheck("check");
            } else {
                $("#Public").iCheck("uncheck");
            }
            $scope.selectedWorkflow.WorkflowId = $scope.selectedApplicationToCopy[0].WorkflowId;
        };

        $scope.cancel = function () {
            $uibModalInstance.close(0);
        };

        $scope.getAllWorkflows = function()
        {
            var promise = WorkflowService.getWorkflows();
            promise.then(function (response) {
                if (response.data) {
                    $scope.workflows = response.data;
                    $scope.workflows.splice(0, 0, { WorkflowId: 0, Name: '--SELECT--' });
                }
                document.getElementById('StartDate').value = new Date($scope.application.StartDate) <= 0 ? $filter('date')(new Date(), 'MM/dd/yyyy h:mm a') : $filter('date')($scope.application.StartDate, 'MM/dd/yyyy h:mm a');
                document.getElementById('EndDate').value = new Date($scope.application.EndDate) <= 0 ? '' : $filter('date')($scope.application.EndDate, 'MM/dd/yyyy h:mm a');
                $scope.selectedApplication = { ApplicationId: $scope.application.ParentApplicationId };
                $scope.selectedWorkflow = { WorkflowId: $scope.application.WorkflowId };
            });
        };

        $scope.getAllPossibleParentApplications = function() {
            var promise = ManageFormsService.getAllPossibleParentApplications($scope.application.ApplicationId);
            promise.then(function (response) {
                if (response.data) {
                    $scope.possibleParentApplications = response.data;
                    $scope.possibleParentApplications.splice(0, 0, { ApplicationId: 0, ApplicationName: '--SELECT--' });
                }
            });
        };

        $scope.getAllVisibleApplications = function () {
            ManageFormsService.getAllVisibleApplications($scope.application.SuperUserModeEnabled).then(function (response) {
                $scope.allVisibleApplications = response.data;
            });
        };

        $scope.init = function () {
            $scope.application = angular.copy(varList);
            if ($scope.application.ApplicationId === 0) {
                $scope.getAllVisibleApplications();
            }
            $scope.getAllPossibleParentApplications();
            $scope.getAllWorkflows();
        };

        $scope.init();
    });;
app.controller("getUserListModalInstanceCtrl",
    function ($scope,
        varList,
        EmailSystemService,
        $uibModal,
        $uibModalInstance,
        OrganizationTypeService,
        SysOrganizationMembershipStatusService,
        OrgPositionService,
        OrganizationStateService,
        OrgService,
        WorkflowService,
        UserProfileService,
        ExtendedPropertyService,
        SystemPeriodsService) {

        $scope.loadingUsers = false;
        $scope.currentPage = 1;
        $scope.itemsPerPage = 30;

        $scope.query = [];

        $scope.checkAll = false;

        $scope.criteriaList = [];
        $scope.filteredUsers = [];

        $scope.emailFilters = {};
        $scope.allOrganizationTypes = {};
        $scope.organizationStatus = {};
        $scope.memberTypes = [
            { MemberTypeName: "Member", MemberTypeId: 0 },
            { MemberTypeName: "Officer", MemberTypeId: 1 },
            { MemberTypeName: "Advisor", MemberTypeId: 2 }
        ];
        $scope.membershipStatus = {};
        $scope.positions = {};
        $scope.sysRequriedPositions = {};
        $scope.allOrganizations = {};

        $scope.roles = {};
        $scope.userRoles = {};

        $scope.sysExtendedPropertyGroups = {};
        $scope.systemOrganizationRegistrationPeriods = {};
        $scope.workflowStatus = [];
        $scope.workflowStatusList = [];

        $scope.updateExtendedPropertiesCriteria = function () {
            $scope.getOrgExtendedProperties();
        };

        $scope.getOrgExtendedProperties = function () {
            var promise = ExtendedPropertyService
                .getOrgExtendedPropertiesByPropertyGroups($scope.emailFilters.SysExtendedPropertyGroupses);
            promise.then(function (response) {
                $scope.emailFilters.SysExtendedPropertyGroupses = response.data;
            });
        };

        $scope.getOrgExtendedPropertyGroup = function () {
            var promise = ExtendedPropertyService
                .getOrganizationExtendedPropertyGroupsByOrgTypes($scope.emailFilters.OrganizationTypes);
            promise.then(function (response) {
                $scope.sysExtendedPropertyGroups = response.data;
                $scope.getSystemOrganizationStatus();
            });
        };

        $scope.getSystemUserRoles = function () {
            var promise = UserProfileService.getSystemRoles();
            promise.then(function (response) {
                $scope.userRoles = response.data;
            });
        };

        $scope.getAllRoles = function () {
            var promise = WorkflowService.getWorkflowRoles();
            promise.then(function (response) {
                $scope.roles = response.data;
            });
        };

        $scope.getOrganizationsByOrgTypes = function () {
            var promise = OrgService.getOrganizationsByOrgTypes($scope.emailFilters.OrganizationTypes);
            promise.then(function (response) {
                $scope.emailFilters.Organizations = response.data;
                if ($scope.selectedCriteria.CriteriaId === 6) {
                    $scope.updateOrgCriteriaList();
                }
            });
        };

        $scope.getAllOrganizations = function () {
            var promise = OrgService.getOrganizationsByStatusAndDateCreated($scope.emailFilters);
            promise.then(function (response) {
                $scope.allOrganizations = response.data;
            });
        };

        $scope.getSystemOrganizationMembershipStatusByOrganizations = function () {
            var promise = SysOrganizationMembershipStatusService
                .getSystemOrganizationMembershipStatusByOrganizations($scope.emailFilters.Organizations);
            promise.then(function (response) {
                $scope.membershipStatus = response.data;
            });
        };

        $scope.getPositionsByOrganizations = function () {
            var promise = OrgPositionService.getPositionsByOrganizations($scope.emailFilters.Organizations);
            promise.then(function (response) {
                $scope.positions = response.data;
            });
        };

        $scope.updateOrgCriteriaList = function () {
            angular.forEach($scope.memberTypes,
                function (value) {
                    value.Ticked = false;
                });
            if ($scope.emailFilters.Organizations.length > 0) {
                $scope.getSystemOrganizationMembershipStatusByOrganizations();
                $scope.getPositionsByOrganizations();
            }
        };

        $scope.getSystemOrganizationStatus = function () {
            var promise = OrganizationStateService.getSystemState();
            promise.then(function (response) {
                $scope.organizationStatus = response.data;
                if ($scope.selectedCriteria !== undefined &&
                    $scope.selectedCriteria !== null &&
                    $scope.selectedCriteria.CriteriaId === 6) {
                    $scope.emailFilters.OrganizationStatus = response.data;
                    $scope.getOrganizationsByOrgTypes();
                }
            });
        };

        $scope.getAllSystemOrganizationType = function () {
            var promise = OrganizationTypeService.getAllSystemOrganizationType();
            promise.then(function (response) {
                $scope.allOrganizationTypes = response.data;
            });
        };

        $scope.getCriteriaList = function (criteriaId, type) {
            var promise = EmailSystemService.getCriteriaList(criteriaId, type);
            promise.then(function (response) {
                $scope.criteriaList = response.data;
            });
        };

        $scope.getSystemOrganizationRegistrationPeriods = function () {
            var promise = SystemPeriodsService.getOrganizationRegistrationPeriods();
            promise.then(function (response) {
                $scope.systemOrganizationRegistrationPeriods = response.data;
            });
        };

        $scope.getSysRequriedPositions = function() {
            var promise = OrgPositionService.getSysRequriedPositions();
            promise.then(function(response) {
                $scope.sysRequriedPositions = response.data;
            });
        };

        $scope.getWorkflowStatus = function () {
            var promise = WorkflowService.getWorkflowStatus();
            promise.then(function (response) {
                var data = response.data.replace(/['"{}]+/g, '').split(',');
                for (var i = 0; i < data.length; i++) {
                    var values = data[i].split(':');
                    var status = {
                        Name: values[0],
                        Value: values[1],
                        Ticked: false
                    };
                    $scope.workflowStatus.push(status);
                }
            });
        };

        $scope.resetAllCriteria = function () {
            $scope.emailFilters = {};
            $scope.filteredUsers = [];
            $scope.sysExtendedPropertyGroups = {};

            angular.forEach($scope.allOrganizationTypes,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.memberTypes,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.allOrganizations,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.roles,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.membershipStatus,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.positions,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.userRoles,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.sysExtendedPropertyGroups,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.systemOrganizationRegistrationPeriods,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.sysRequriedPositions,
                function (value) {
                    value.Ticked = false;
                });
            angular.forEach($scope.workflowStatusList,
                function (value) {
                    value.Ticked = false;
                });
            $("input[name=criteriaCheckbox]").iCheck("uncheck");
        };

        $scope.update = function (criteriaId) {
            $scope.loadingUsers = true;
            //$scope.emailFilters.WorkflowStatus = getKeys($scope.workflowStatusList).map(function (key) { return getKeys[key] });
            var temp = [];
            angular.forEach($scope.workflowStatusList,
                function(value) {
                    temp.push(value.Value);
                });
            $scope.emailFilters.WorkflowStatus = temp;
            var promise = EmailSystemService.updateFilterCriteria(criteriaId, $scope.emailFilters);
            promise.then(function (response) {
                $scope.filteredUsers = response.data;
                $scope.loadingUsers = false;
            });
        };

        $scope.submit = function () {
            var checkedUser = [];

            angular.forEach($scope.filteredUsers,
                function (value) {
                    if (value.Checked)
                        checkedUser.push(value.Email);
                });
            $uibModalInstance.close([varList, checkedUser]);
        };

        $scope.init = function () {
            $scope.getCriteriaList(0, 0);
            $scope.getAllSystemOrganizationType();
            $scope.getSystemOrganizationStatus();
            $scope.getAllRoles();
            $scope.getSystemUserRoles();
            $scope.getSystemOrganizationRegistrationPeriods();
            $scope.getWorkflowStatus();
            $scope.getSysRequriedPositions();
        };

        $scope.init();

        $scope.switchBool = function (value) {
            $scope[value] = !$scope[value];
        };

        $scope.cancel = function () {
            $scope.varList = "Close This Window, All Your Data Will Be Lost!";
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: "/app/views/confirmedDialog/confirm.html",
                controller: "confirmedModalInstanceCtrl",
                controllerAs: "$ctrl",
                size: "",
                resolve: {
                    varList: function () {
                        return $scope.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    $uibModalInstance.close(0);
                }
            });
        };

        document.addEventListener("ngChange",
            function () {
                if ($scope.selectedCriteria !== null && $scope.selectedCriteria !== undefined) {
                    $scope.getAllOrganizations();
                }
            });
    });;
app.controller('groupDetailInstanceCtrl', function ($scope, ProcessStatusService, $uibModalInstance, varList) {

    $scope.approvers;

    $scope.getGroupApproverDetail = function (processId, groupId, stepId) {
        var promise = ProcessStatusService.getGroupApproverDetail(processId, groupId, stepId);
        promise.then(function (response) {
            $scope.approvers = response.data;
        });
    };

    $scope.init = function () {
        $scope.getGroupApproverDetail(varList[0], varList[1], varList[2]);
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.cancel = function () {
        $uibModalInstance.close();
    };
});;
app.controller('manageMemberModalInstanceCtrl', function ($scope, OrganizationMemberService, $uibModal, $log, $uibModalInstance, varList) {
    var $ctrl = this;
    var changed = 0;
    $scope.members;

    $scope.maxPerPage = 10;
    $scope.currentPage = 1;
    $scope.maxPages = 1;
    $scope.numberOfResults = 0;
    $scope.searchKeywords = "";
    $scope.loading = true;
    $scope.pageNumbers = [{
        text: "Page 1 of 1",
        value: 1
    }];
    $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];

    $scope.selectedPage = $scope.pageNumbers[0];

    $scope.changePage = function () {
        $scope.currentPage = $scope.selectedPage.value;
        $scope.getFilteredMembers();
    };

    $scope.changePagination = function (num) {
        $scope.currentPage = num;
        $scope.getFilteredMembers();
    };

    $scope.update = function (member, membershipStatus) {
        if (membershipStatus === -1) {
            $ctrl.varList = 'Member From Your Organization?';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                controller: 'confirmedRemoveModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = OrganizationMemberService.update(member, membershipStatus);
                    promise.then(function (response) {
                        changed = 1;
                        $scope.getFilteredMembers();
                    });
                }
            }, function () {
                $log.info('Modal dismissed');
            });
        }
        else {
            var promise = OrganizationMemberService.update(member, membershipStatus);
            promise.then(function (response) {
                changed = 1;
                $scope.getFilteredMembers();
            });
        }
    };

    $scope.getFilteredMembers = function () {
        var promise = OrganizationMemberService.getFilteredMembers(varList[0], varList[1], encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage);
        promise.then(function (response) {
            var data = response.data;

            $scope.numberOfResults = data.NumResults;
            $scope.members = data.memberOverview;
            $scope.currentPage = data.CurrentPage;
            $scope.maxPages = data.PageCount;
            $scope.searchKeywords = $scope.searchKeywords;
            $scope.loading = false;
            $scope.pageNumbers = [];
            for (var i = 1; i <= data.PageCount; i++) {
                $scope.pageNumbers.push({
                    text: "Page " + i.toString() + " of " + data.PageCount.toString(),
                    value: i
                }
                );
            }

            $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];
        });
    };

    $scope.init = function () {
        $scope.getFilteredMembers();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.close(changed);
    };
});
app.controller('membershipStatusModalInstanceCtrl', function ($scope, OrganizationMemberService, SysOrganizationMembershipStatusService, $uibModalInstance, varList) {
    var $ctrl = this;

    $scope.status;
    $scope.memberStatus;
    $scope.membershipStatus;

    $scope.updateMembershipStatus = function () {
        $scope.membershipStatus.StatusType = $scope.memberStatus.Value;
        var promise = SysOrganizationMembershipStatusService.updateSystemOrganizationMembershipStatus($scope.membershipStatus);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.getMembershipStatusTypes = function () {
        var promise = OrganizationMemberService.getMembershipStatusTypes();
        promise.then(function (response) {
            $scope.status = response.data;
        });
    };

    $scope.init = function () {
        $scope.getMembershipStatusTypes();
        $scope.memberStatus = { Value: varList.StatusType };
        $scope.membershipStatus = angular.copy(varList);
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('newApproverModalInstanceCtrl', function ($scope, WorkflowService, AdminOfficerService, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.showErrorMessageApprover = false;
    $scope.showErrorMessageDuplicateApprover = false;
    $scope.isGroupApprover = false;
    $scope.minimumApprovalCount = 0;
    $scope.required = false;

    $scope.workflowRoles = {};
    $scope.selectedRole = {};
    $scope.workflowUserRolesOverview = {};
    $scope.selectedUserRoles = { UserId: 0 };
    $scope.oneTimeApprover = false;

    $scope.isValid = false;

    $scope.setValid = function () {
        $scope.isValid = true;
    };

    $scope.addApprover = function () {
        $scope.showErrorMessageDuplicateApprover = false;
        if ($scope.selectedUserRoles.UserId === undefined) {
            $scope.selectedUserRoles.UserId = 0;
        }
        var promise = WorkflowService.createNewApprover($scope.selectedRole.WorkflowRoleId, $scope.selectedUserRoles.UserId, varList, $scope.isGroupApprover, $scope.minimumApprovalCount, $scope.required);
        promise.then(function (response) {
            if (response.data >= 1) {
                $ctrl.cancel();
            }
            else {
                $scope.showErrorMessageDuplicateApprover = true;
            }
        });
    };

    $scope.loadWorkflowUserRoleOverview = function (workflowRoleId) {
        var promise = WorkflowService.getWorkflowUserRolesOverview(workflowRoleId);
        promise.then(function (response) {
            $scope.workflowUserRolesOverview = response.data;
        });
    };

    $scope.loadWorkflowRoles = function () {
        var promise = WorkflowService.getWorkflowRoles();
        promise.then(function (response) {
            $scope.workflowRoles = response.data;
        }, function (response) {

        });
    };

    $scope.init = function () {
        $scope.loadWorkflowRoles();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

});;
app.controller('newOrganizationMemberModalInstanceCtrl', function ($scope, OrganizationMemberService, ExtendedPropertyService, $uibModalInstance, varList) {
    var $ctrl = this;

    $scope.status;
    $scope.propertyGroups;

    $scope.join = function () {
        var promise = OrganizationMemberService.join(varList);
        promise.then(function (response) {
            var data = response.data;
            if (data !== null && data !== undefined && data.MemberId > 0) {
                varList = data.MembershipStatus;
                $scope.updateMemberExtendedProperties(data.MemberId);
            }
        });
    };

    $scope.updateMemberExtendedProperties = function (memberId) {
        var promise = ExtendedPropertyService.updateMemberExtendedProperties($scope.propertyGroups, memberId);
        promise.then(function (response) {
            $uibModalInstance.close(varList);
        });
    };

    $scope.getNewMemberExtendedPropertyGroups = function () {
        var promise = ExtendedPropertyService.getNewMemberExtendedPropertyGroups(varList);
        promise.then(function (response) {
            $scope.propertyGroups = response.data;
        });
    };

    $scope.init = function () {
        $scope.getNewMemberExtendedPropertyGroups();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('officerPermitDetailModalInstanceCtrl', function ($scope, $uibModalInstance, PermitService, varList) {

    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.permitCategories = {};
    $scope.associatedApplications = {};
    $scope.loading = true;
    $scope.permitDates = {};

    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    };

    $scope.submitPermit = function () {
        var promise = PermitService.userSubmitPermit($scope.permitVersion);
        promise.then(function (response) {
            self.advancedUrl = self.advancedUrl.format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
            window.location.href = self.advancedUrl;
        });
    };

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            self.loadPermitDates();
            self.loadPermitCategories();
        });
    };

    self.loadPermitDates = function () {
        var promise = PermitService.userGetPermitDates($scope.permitVersionId);
        promise.then(function (response) {

            $scope.permitDates = response.data.map(function (x) {
                return { PermitVersionId: x.PermitVersionId, Start: (new Date(x.Start)).formatDateTime(), End: (new Date(x.End)).formatDateTime(), Location: x.Location, PermitDateId: x.PermitDateId };
            });
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = PermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    $scope.init = function (permitVersionId) {
        $scope.permitVersionId = permitVersionId;
        self.loadPermitVersion();
    };

    $scope.init(varList);

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('organizationMemberModalInstanceCtrl', function ($scope, OrganizationMemberService, SysOrganizationMembershipStatusService, ExtendedPropertyService, $uibModalInstance, $uibModal, $log, varList) {
    var $ctrl = this;
    var changed = 0;
    
    $scope.memberStatus = {};
    $scope.status;
    $scope.propertyGroups;
    $scope.showRoomMessage = false;

    $scope.showMessage = false;

    $scope.updateOrganizationMember = function () {
        varList.MembershipStatusId = $scope.memberStatus.MembershipStatusId;
        var promise = OrganizationMemberService.updateOrganizationMember(varList);
        promise.then(function (response) {
            changed = 1;
            $scope.updateMemberExtendedProperties();
        });
    };

    $scope.updateMemberExtendedProperties = function () {
        var promise = ExtendedPropertyService.updateMemberExtendedProperties($scope.propertyGroups, varList.MemberId);
        promise.then(function (response) {

        });
    };

    $scope.updateMember = function () {
        $scope.showMessage = false;
        $scope.updateOrganizationMember();
        $scope.organizationMemberForm.$setPristine();
        $scope.showMessage = true;
    };

    $scope.getMemberExtendedPropertyGroups = function () {
        var promise = ExtendedPropertyService.getMemberExtendedPropertyGroups(varList.MemberId);
        promise.then(function (response) {
            $scope.propertyGroups = response.data;
        });
    };

    $scope.getMembershipStatusTypes = function () {
        var promise = SysOrganizationMembershipStatusService.getMembershipStatusTypes(varList.OrganizationId);
        promise.then(function (response) {
            $scope.status = response.data;
            $scope.getMemberExtendedPropertyGroups();
        });
    };

    $scope.addRoom = function () {
        $ctrl.varList = varList;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/organizationMemberUpdateRoom.html?c=' + (new Date()).getTime(),
            controller: 'organizationMemberAddRoomModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                location.reload();
            }
        }, function () {

        });
    };

    $scope.init = function () {
        $scope.memberStatus = { MembershipStatusId: varList.MembershipStatusId };
        $scope.getMembershipStatusTypes();
       // console.log(varList);

        if (varList.MembershipStatusId == 39) {
            $scope.showRoomMessage = true;
        }
        //console.log($scope.showRoomMessage);
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.close(changed);
    };
});;
app.controller('organizationMemberAddRoomModalInstanceCtrl', function ($scope, OrganizationMemberService, SysOrganizationMembershipStatusService, ExtendedPropertyService, $uibModalInstance, varList) {
    var $ctrl = this;
    var changed = 0;

    $scope.memberStatus = {};
    $scope.status;
    $scope.propertyGroups;
    $scope.showRoomMessage = false;
    $scope.room = ""
    $scope.validuser = false;
    $scope.showMessage = false;

    $scope.updateMember = function () {
        $scope.showMessage = false;
        var str = $scope.room;
         str = str.trim();
         varList.Location = str;

        if (varList.RoomId == 0) {

        var promise = OrganizationMemberService.addRoom(varList);
        promise.then(function (response) {
            $scope.showMessage = true;
            c
            $scope.getRoom();
            })

        }

        if (varList.RoomId > 0) {

            var promise = OrganizationMemberService.editRoom(varList);
            promise.then(function (response) {
                $scope.showMessage = true;
               
                $scope.getRoom();
            })

        }
    }

    $scope.removeRoom = function () {
        $scope.showMessage = false;
        var promise = OrganizationMemberService.removeRoom(varList);
        promise.then(function (response) {
            $scope.showMessage = true;
            $scope.getRoom();
          
        })
    }

    $scope.getRoom = function () {
        //$scope.showMessage = false;
        $scope.validuser = false;
        var promise = OrganizationMemberService.getRoom(varList);
        promise.then(function (response) {
          
           // $scope.showMessage = true;
            $scope.room = response.data.Location;
            $scope.id = response.data.RoomId
            varList.Location = $scope.room;
            varList.RoomId = $scope.id;

            if ($scope.id > 0){
            $scope.validuser = true;
            }
        })
    }

    $scope.init = function () {
        $scope.memberStatus = { MembershipStatusId: varList.MembershipStatusId };
        
        $scope.getRoom();
        


    };

    $scope.init();


    $ctrl.cancel = function () {
        $uibModalInstance.close(changed);
    };
});;
app.controller('permitDateAndLocHistoryModalCtrl', function ($scope, varList, $uibModalInstance) {
    $scope.history = varList.history;
    $scope.permitVersionId = varList.permitVersionId

    $scope.itemsPerPage = 5;
    $scope.currentPage = 1;

    $scope.highlight = false;

    $scope.highlightChanges = function () {

        $scope.highlight = !$scope.highlight;

        var prevLoc = '';
        var prevStart = '';
        var prevEnd = '';
        var prevUpdated = '';
        var prevName = '';
        var prevRecordChanger = '';

        for (var i = 0; i < $scope.history.length; i++) {

            //Compare values with their previous value and if they are different then add a boolean property to the object which angular bases the highlight off of
            if ($scope.highlight) {

                $scope.history[i].locChanged = ($scope.history[i].Location != prevLoc && prevLoc != '') ? true : false;
                $scope.history[i].startChanged = ($scope.history[i].Start != prevStart && prevStart != '') ? true : false;
                $scope.history[i].endChanged = ($scope.history[i].End != prevEnd && prevEnd != '') ? true : false;
                $scope.history[i].updatedChanged = ($scope.history[i].Updated != prevUpdated && prevUpdated != '') ? true : false;
                $scope.history[i].nameChanged = (($scope.history[i].FirstName + ' ' + $scope.history[i].LastName) != prevName && prevName != '') ? true : false;
                $scope.history[i].recordChanger = ($scope.history[i].previousRecordChangedBy != prevRecordChanger && prevRecordChanger != '') ? true : false;

                //Update the previous value to the values of the current iteration
                prevLoc = $scope.history[i].Location;
                prevStart = $scope.history[i].Start;
                prevEnd = $scope.history[i].End;
                prevUpdated = $scope.history[i].Updated;
                prevName = $scope.history[i].FirstName + ' ' + $scope.history[i].LastName
                prevRecordChanger = $scope.history[i].previousRecordChangedBy;


            } else {
                $scope.removeHighlight();
            }
        }
    }

    $scope.removeHighlight = function () {

        for (var i = 0; i < $scope.history.length; i++) {

            $scope.history[i].locChanged = false;
            $scope.history[i].startChanged = false;
            $scope.history[i].endChanged = false;
            $scope.history[i].updatedChanged = false;
            $scope.history[i].nameChanged = false;
            $scope.history[i].recordChanger = false;
        }
    }

    $scope.close = function () {
        $uibModalInstance.close('close');
    };
});;
app.controller('positionModalInstanceCtrl', function ($scope, $uibModalInstance, PositionTemplateService, varList) {
    var $ctrl = this;

    $scope.position;

    $scope.updatePosition = function () {
        var promise = PositionTemplateService.updatePosition($scope.position);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.init = function () {
        $scope.position = angular.copy(varList);
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('positionTemplateModalInstanceCtrl', function ($scope, $uibModalInstance, PositionTemplateService, OrganizationTypeService, varList) {
    var $ctrl = this;

    $scope.sysOrgTypes;
    $scope.organizationType;
    $scope.positionTemplate;

    $scope.updatePositionTemplate = function () {
        $scope.positionTemplate.OrgTypeId = $scope.organizationType.OrganizationTypeId;
        var promise = PositionTemplateService.updatePositionTemplate($scope.positionTemplate);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.getAllSystemOrganizationType = function () {
        var promise = OrganizationTypeService.getAllSystemOrganizationType();
        promise.then(function (response) {
            $scope.sysOrgTypes = response.data;
            $scope.sysOrgTypes.push({ OrganizationTypeId: 0, OrganizationTypeName: "All Organizations"});
        });
    };

    $scope.init = function () {
        $scope.organizationType = { OrganizationTypeId: varList.OrgTypeId };
        $scope.positionTemplate = angular.copy(varList);
        $scope.getAllSystemOrganizationType();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('previewOrganizationMemberModalInstanceCtrl', function ($scope, OrganizationMemberService, $uibModal, $log, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.loading = true;
    $scope.disable = false;

    $scope.members;

    $scope.submit = function () {
        $scope.disable = true;
        var promise = OrganizationMemberService.submit($scope.members, varList[1], varList[2]);
        promise.then(function (response) {
            $uibModalInstance.close(1);
        });
    };

    $scope.getPreviewMembers = function () {
        var userInput = { UserInput: varList[0] };
        var promise = OrganizationMemberService.getPreviewMembers(userInput, varList[2]);
        promise.then(function (response) {
            $scope.loading = false;
            $scope.members = response.data;
        });
    };

    $scope.init = function () {
        $scope.getPreviewMembers();
    };

    $scope.init();

    $scope.cancel = function () {
        $uibModalInstance.dismiss();
    };
});;
app.controller('previewOrgsModalCtrl', function ($scope, varList, OrganizationTypeService, OrganizationStateService, $uibModalInstance) {
    $scope.orgs = angular.copy(varList.orgs);
    //optionId: 1 = orgs pulled by TYPE, 2 = pulled by STATE
    $scope.optionId = varList.optionId;
    $scope.typeOrStateId = varList.typeOrStateId;
    $scope.loadingOrgs = true;
    $scope.selectDeselectAllText = 'Select all';
    $scope.selectionSaved = false;
    $scope.savedState = {};

    $scope.currentPage = 1;
    $scope.itemsPerPage = 10;

    $scope.selectDeselectAll = function () {
        //if user had clicked save, but continues to work, remove "save complete" message
        $scope.selectionSaved = false;

        for (var i = 0; i < $scope.orgs.length; i++) {
            if ($scope.selectDeselectAllText === 'Select all') {
                $scope.orgs[i].Selected = true;
            } else {
                $scope.orgs[i].Selected = false;
            }
        };
        $scope.selectDeselectAllText = ($scope.selectDeselectAllText === 'Select all' ? 'Deselect all' : 'Select all');
    }

    $scope.pullOrgs = function () {
        if ($scope.optionId === 1) {
            promise = OrganizationTypeService.getOrgsByPrimaryType($scope.typeOrStateId);
        } else {
            promise = OrganizationStateService.getOrgsByStateId($scope.typeOrStateId);
        }
        
        promise.then(function (response) {
            $scope.orgs = response.data;
            $scope.loadingOrgs = false;
        });
    }

    $scope.saveStateOfOrgs = function () {

        var noneSelected = true;

        //length = 0 if no orgs fall under the particular state or type
        if ($scope.orgs.length === 0) {
            noneSelected = true;

        } else {
            //noneSelected = ($scope.selectDeselectAllText === 'Select all' ? true : false);
            for (var i = 0; i < $scope.orgs.length; i++) {
                if ($scope.orgs[i].Selected) {
                    noneSelected = false;
                    break;
                };
            }
        }

        $scope.savedState = {
            selectionSaved: true,
            orgs: $scope.orgs, //NEED COPY HERE OR JUST REGULAR $scope.orgs?
            noneSelected: noneSelected
        }

        $uibModalInstance.close($scope.savedState);
    }

    $scope.close = function () {

        $uibModalInstance.close();
    };

    $scope.checkIfLoneOrg = function () {
        //if only one org exists in this category, when it is selected/deselected, update the select all button text
        if ($scope.orgs.length === 1) {
            $scope.selectDeselectAllText = ($scope.selectDeselectAllText === 'Select all' ? 'Deselect all' : 'Select all');
        }

        //removes the message of "save complete" if user saves, then continues to work in modal
        $scope.selectionSaved === false
    }

    $scope.init = function () {
        //if user hadn't selected (and pulled orgs by) a type or state before previewing, pull orgs now
        if ($scope.orgs.length === 0) {
            $scope.pullOrgs();
        } else {
            //$scope.selectDeselectAll();
            $scope.selectDeselectAllText = 'Deselect all';
            $scope.loadingOrgs = false;
        }
    }

    $scope.init();
});;
app.controller('previewUsersInRoleModalInstanceCtrl',
    function ($scope, valsList, $timeout, ManageFormsService, $uibModalInstance, UserProfileService) {

        $scope.query = [];
        $scope.checkAll = false;
        $scope.filteredUsers = [];
        $scope.loadingUsers = false;
        $scope.currentPage = 1;
        $scope.itemsPerPage = 15;
        $scope.systemRole = angular.copy(valsList);
        $scope.previewingForRoleManagement = $scope.systemRole.previewingForRoleManagement;

        $scope.cancel = function () {
            $uibModalInstance.close();
        };

        $scope.findUsersBySystemRole = function () {

            $scope.systemRoleId = $scope.systemRole.systemRoleId;
            $scope.roleName = $scope.systemRole.systemRoleName;
            $scope.folderId = $scope.systemRole.folderId;
            $scope.folderOrApplication = $scope.systemRole.folderOrApplication;
            $scope.loadingUsers = true;

            var promise = ManageFormsService.findUsersBySystemRole($scope.systemRoleId, $scope.folderId, $scope.folderOrApplication);
            promise.then(function (response) {
                $scope.filteredUsers = response.data;
                $scope.loadingUsers = false;
            });
        };

        $scope.getUsersBySystemRole = function () {

            $scope.roleLevel = $scope.systemRole.roleLevel;
            $scope.loadingUsers = true;

            var promise = UserProfileService.getUsersBySystemRoles(($scope.roleLevel).toString()); // Stored procedure takes a STRING list of system role id's separated by commas as a parameter 
            promise.then(function (response) {
                $scope.filteredUsers = response.data;
                $scope.loadingUsers = false;

            })

        }

        $scope.init = function () {
            if ($scope.previewingForRoleManagement) {
                $scope.getUsersBySystemRole();

            } else {    // Preview for the permissions of forms/folders

                $scope.findUsersBySystemRole();
            }
        };

        $scope.init();
    });;
app.controller('previewUsersInUserTypeModalInstanceCtrl',
    function ($scope, valsList, $timeout, ManageFormsService, $uibModalInstance, UserProfileService) {

        $scope.query = [];
        $scope.checkAll = false;
        $scope.filteredUsers = [];
        $scope.loadingUsers = false;
        $scope.currentPage = 1;
        $scope.itemsPerPage = 15;
        $scope.systemUserType = angular.copy(valsList);
        $scope.previewingForUserTypeManagement = $scope.systemUserType.previewingForUserTypeManagement;

        $scope.cancel = function () {
            $uibModalInstance.close();
        };

        

        $scope.getUsersBySystemUserType = function () {

            $scope.userTypeLevel = $scope.systemUserType.userTypeLevel;
            $scope.loadingUsers = true;

            var promise = UserProfileService.getUsersBySystemUserTypes(($scope.userTypeLevel).toString()); // Stored procedure takes a STRING list of system role id's separated by commas as a parameter
            promise.then(function (response) {
                $scope.filteredUsers = response.data;
                $scope.loadingUsers = false;

            })

        }

        $scope.init = function () {
            if ($scope.previewingForUserTypeManagement) {
                $scope.getUsersBySystemUserType();

            } 
        };

        $scope.init();
    });;
app.controller('sysExtendedPropertyModalInstanceCtrl', function ($scope, ExtendedPropertyService, $uibModalInstance, varList) {
    $scope.property = {};
    $scope.propertyTypes;
    $scope.propertyType = {};

    var $ctrl = this;

    $scope.updateProperty = function () {
        $scope.property.PropertyType = $scope.propertyType.Value;
        var promise = ExtendedPropertyService.updateProperty($scope.property);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.getPropertyTypes = function () {
        var promise = ExtendedPropertyService.getPropertyTypes();
        promise.then(function (response) {
            $scope.propertyTypes = response.data;
        });
    };

    $scope.init = function () {
        $scope.property = varList;
        $scope.propertyType.Value = varList.PropertyType;
        $scope.getPropertyTypes();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('systemPeriodModalInstanceCtrl', function ($scope, $uibModalInstance, OrganizationTypeService, FormsService, SystemPeriodsService, varList) {
    var $ctrl = this;

    $scope.systemPeriod;
    $scope.sysOrgTypes;
    $scope.applications;
    $scope.organizationType;
    $scope.form;

    $scope.updateSystemPeriod = function () {
        var selectedTypesId = $scope.organizationType.map(function(type) {
            return type.OrganizationTypeId;
        }).join(',');

        $scope.systemPeriod.RegistrationTargetId = $scope.systemPeriod.RegistrationTargetType === 1 ? $scope.systemPeriod.RegistrationTargetId : selectedTypesId;
        var promise = SystemPeriodsService.updateSystemPeriod($scope.systemPeriod, $scope.form.ApplicationId);
        promise.then(function (response) {
            $ctrl.cancel();
        });
    };

    $scope.getAllApplications = function () {
        var promise = FormsService.getAllApplications();
        promise.then(function (response) {
            $scope.applications = response.data;
            $scope.applications.unshift({ ApplicationId: 0, ApplicationName: "- Please Select A Form -" });
        });
    };

    $scope.getAllSystemOrganizationType = function () {
        var promise = OrganizationTypeService.getAllSystemOrganizationType();
        promise.then(function (response) {
            $scope.sysOrgTypes = response.data;
            var orgTypes = $scope.systemPeriod.RegistrationTargetId.toString().split(',');
            for (var i = 0; i < $scope.sysOrgTypes.length; i++) {
                if (orgTypes.indexOf($scope.sysOrgTypes[i].OrganizationTypeId.toString()) !== -1) {
                    $scope.sysOrgTypes[i].Ticked = true;
                }
            }
        });
    };

    $scope.init = function () {
        $scope.form = { ApplicationId: varList[1] };
        $scope.systemPeriod = angular.copy(varList[0]);
        if ($scope.systemPeriod.StartDate !== null)
            $scope.systemPeriod.StartDate = $scope.systemPeriod.StartDate.formatNormalDateTime();
        if ($scope.systemPeriod.EndDate !== null)
            $scope.systemPeriod.EndDate = $scope.systemPeriod.EndDate.formatNormalDateTime();
        $scope.getAllSystemOrganizationType();
        $scope.getAllApplications();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('systemRoleUserListModalInstanceCtrl',
    function($scope, varList, $timeout, UserProfileService, $uibModalInstance) {

        $scope.query = [];
        $scope.checkAll = false;
        $scope.filteredUsers = [];
        $scope.loadingUsers = false;
        $scope.currentPage = 1;
        $scope.itemsPerPage = 30;

        $scope.cancel = function() {
            $uibModalInstance.close(0);
        };

        $scope.submit = function() {
            var selectedUsers = [];
            angular.forEach($scope.filteredUsers,
                function(value) {
                    if (value.Checked)
                        selectedUsers.push(value.UserId);
                });
            if (selectedUsers.length > 0) {
                $uibModalInstance.close(selectedUsers);
            } else {
                $uibModalInstance.close(-1);
            }
        };

        $scope.getUsersBySystemRoles = function() {
            $scope.loadingUsers = true;
            var sysRoles = varList[0];
            var promise = UserProfileService.getUsersBySystemRoles(sysRoles.join(','));
            promise.then(function(response) {
                $scope.filteredUsers = response.data;
                $scope.loadingUsers = false;
                if (varList.length > 1) {
                    var selectedUserList = varList[1].TargetUserId.split(',');
                    angular.forEach(selectedUserList,
                        function(value) {
                            $scope.filteredUsers.filter(function(user) {
                                if (user.UserId === parseInt(value)) {
                                    user.Checked = true;
                                }
                            });
                        });
                }
            });
        };

        $scope.init = function() {
            $scope.getUsersBySystemRoles();
        };

        $scope.init();
    });;
app.controller('updateSysRolesModalCtrlr', function ($scope, $rootScope, $uibModalInstance, SystemRolesService, varObject) {

    $scope.editMode = varObject.editMode;
    $scope.modalTitle = varObject.modalTitle;
    $scope.systemRole = angular.copy(varObject.selectedRole); // deep copy of original variables
    $scope.wasSaved = false;

    //$scope.init = function () {
    //    if ($scope.editMode) {
    //        $scope.
    //    }
    //};

    //$scope.init();

    $scope.saveChanges = function () {
        $scope.wasSaved = true; 
        var systemRole = $scope.systemRole;
        var systemRoleId = systemRole.SystemRolesId;

        if ($scope.editMode) {
            var promise = SystemRolesService.updateSystemRole(systemRoleId, systemRole)

            promise.then(function (response) {
                $scope.closeRoleEditDialog();
            });

        } else {
            var promise = SystemRolesService.createSystemRole(systemRoleId, systemRole)

            promise.then(function (response) {
                $scope.closeRoleEditDialog();
            });
        }
    };

    $scope.closeRoleEditDialog = function () {

        $rootScope.$emit('reloadPageAndCloseModal');
    };

    $rootScope.$on('closeModal',
        function () {
            $uibModalInstance.close();
        }
    );
    





});
app.controller('updateSysUserTypesModalCtrlr', function ($scope, $rootScope, $uibModalInstance, SystemUserTypesService, varObject) {

    $scope.editMode = varObject.editMode;
    $scope.modalTitle = varObject.modalTitle;
    $scope.systemUserType = angular.copy(varObject.selectedUserType); // deep copy of original variables
    $scope.wasSaved = false;

    //$scope.init = function () {
    //    if ($scope.editMode) {
    //        $scope.
    //    }
    //};

    //$scope.init();

    $scope.saveChanges = function () {
        $scope.wasSaved = true;
        var systemUserType = $scope.systemUserType;
        var systemUserTypeId = systemUserType.SystemUserTypesId;

        if ($scope.editMode) {
            var promise = SystemUserTypesService.updateSystemUserType(systemUserTypeId, systemUserType)

            promise.then(function (response) {
                $scope.closeUserTypeEditDialog();
            });

        } else {
            var promise = SystemUserTypesService.createSystemUserType(systemUserTypeId, systemUserType)

            promise.then(function (response) {
                $scope.closeUserTypeEditDialog();
            });
        }
    };

    $scope.closeUserTypeEditDialog = function () {

        $rootScope.$emit('reloadPageAndCloseModal');
    };

    $rootScope.$on('closeModal',
        function () {
            $uibModalInstance.close();
        }
    );






});
app.controller('uploadedPermitDetailFilesModalCtrl', function ($scope, PermitService, $uibModal, varList, $uibModalInstance) {
    $scope.fileList = varList.fileList;
    $scope.header = varList.header;
    $scope.permitVersionId = varList.permitVersionId
    $scope.selectedFilesList = [];

    $scope.downloadFile = function (fileName) {
        var promise = PermitService.downloadFile($scope.permitVersionId, fileName);

        promise.then(function (resp) {
            var saveByteArray = (function () {
                var a = document.createElement("a");
                document.body.appendChild(a);
                a.style = "display: none";
                return function (data, name) {
                    var blob = new Blob(data, { type: "octet/stream" }),
                        url = window.URL.createObjectURL(blob);
                    a.href = url;
                    a.download = name;
                    a.click();
                    window.URL.revokeObjectURL(url);
                };
            }());

            saveByteArray([resp.data], fileName);
        })
    };

    $scope.selectDeselectFile = function (fileName) {

        if (!$scope.selectedFilesList.includes(fileName)) {
            $scope.selectedFilesList.push(fileName);

        } else {
            $scope.selectedFilesList.splice($scope.selectedFilesList.indexOf(fileName), 1);
        }
    }

    $scope.deleteFiles = function () {

        if ($scope.selectedFilesList.length > 0) {

            var resultObj = {
                result: 'remove',
                selectedFilesList: $scope.selectedFilesList
            };

            //Close modal and parent controller will instantiate confirmation modal before deleting
            $uibModalInstance.close(resultObj);
        }
    }; 

    $scope.close = function () {
        $uibModalInstance.close('close');
    };
});;
app.controller('uploadOrgRegistFilesModalCtrl', function ($scope, RegistrationDetailService, $uibModal, varList, $uibModalInstance) {
    $scope.fileList = varList.fileList;
    $scope.header = varList.header;
    $scope.orgRegistrationId = varList.orgRegistrationId
    $scope.selectedFilesList = [];

    $scope.downloadFile = function (fileName) {

        var promise = RegistrationDetailService.downloadFile($scope.orgRegistrationId, fileName);

        promise.then(function (resp) {
            var saveByteArray = (function () {
                var a = document.createElement("a");
                document.body.appendChild(a);
                a.style = "display: none";
                return function (data, name) {
                    var blob = new Blob(data, { type: "octet/stream" }),
                        url = window.URL.createObjectURL(blob);
                    a.href = url;
                    a.download = name;
                    a.click();
                    window.URL.revokeObjectURL(url);
                };
            }());

            saveByteArray([resp.data], fileName);
        })
    };

    $scope.selectDeselectFile = function (fileName) {

        if (!$scope.selectedFilesList.includes(fileName)) {
            $scope.selectedFilesList.push(fileName);

        } else {
            $scope.selectedFilesList.splice($scope.selectedFilesList.indexOf(fileName), 1);
        }
    }

    $scope.deleteFiles = function () {

        if ($scope.selectedFilesList.length > 0) {

            var resultObj = {
                result: 'remove',
                selectedFilesList: $scope.selectedFilesList
            };

            //Close modal and parent controller will instantiate confirmation modal before deleting
            $uibModalInstance.close(resultObj);
        }
    };

    $scope.close = function () {
        $uibModalInstance.close('close');
    };
});;
app.controller('userRegistrationDetailModalInstanceController', function ($scope, $uibModalInstance, RegistrationDetailService, ExtendedPropertyService, varList) {
    //notes variables
    $scope.includeDeletedNotes = false;

    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentProcessNoteId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";
    $scope.registration = {};

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

    $scope.getOrgRegistrationInfo = function () {
        RegistrationDetailService.getRegistration(varList).then(function (response) {
            $scope.registration = response.data;
            $scope.currentProcessNotes = $scope.registration.currentProcessNotes;
            if ($scope.registration.registrationView)
                $scope.getExtendedPropertyGroups($scope.registration.registrationView.OrganizationRegistrationId);
        });
    }

    $scope.getExtendedPropertyGroups = function (OrganizationRegistrationId) {
        var promise = ExtendedPropertyService.getExtendedPropertyGroups(OrganizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.propertyGroups = data;
            $scope.activeAdditionalInfoEdit = false;
        });
    };

    $scope.getProcessNotes = function () {
        var promise = RegistrationDetailService.getPublicWorkflowNotes($scope.registration.registrationView.ProcessId);
        promise.then(function (response) {
            $scope.currentProcessNotes = response.data;
        });
    };

    $scope.newProcessNote = function (parentNoteId, IsPrivate) {

        var statusInfo = {
            IsPublicNote: true,
            NoteUnseen: true
        };

        var orgRegistrationId = $scope.registration.registrationView.OrganizationRegistrationId;

        if ($scope.currentProcessNoteId === 0) {
            RegistrationDetailService.newWorkflowNote($scope.registration.registrationView.ProcessId).then(function (response) {
                var note = response.data;
                response.data.Note = $scope.newNoteText;
                $scope.makeNotePublic(note);
                $scope.newNoteText = "";

                //Mark note as unread
                RegistrationDetailService.updateNoteStatusInfo(orgRegistrationId, statusInfo);
            });
        }
        else {
            var note = getNote($scope.currentProcessNoteId);
            note.Note = $scope.newNoteText;
            RegistrationDetailService.editNote(note).then(function (response) {
                $scope.getProcessNotes($scope.includeDeletedNotes);
                $scope.currentProcessNoteId = 0;
                $scope.newNoteText = "";
                $scope.buttonText = "Post";
                note.customStyle = "";

                //Mark note as unread
                RegistrationDetailService.updateNoteStatusInfo(orgRegistrationId, statusInfo);
            });
        }
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        var promise = RegistrationDetailService.editNote(note);
        promise.then(function (response) {
            $scope.getProcessNotes(1);
        });
    };

    function getNote(processNoteId) {
        var len = $scope.currentProcessNotes.length;
        for (var i = 0; i < len; i++) {
            if ($scope.currentProcessNotes[i].WorkflowNoteId === processNoteId) {
                return $scope.currentProcessNotes[i];
            }
        }
        return null;
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }


    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };

    $scope.init = function () {
        $scope.getOrgRegistrationInfo();
    };

    $scope.init();
});;
app.controller('workflowModalInstanceCtrl',
    function($scope, $uibModal, $uibModalInstance, varList) {

        $scope.rootProcessId;
        $scope.status;

        $scope.workflowHistory = function (rootProcessId) {
            $scope.varList = rootProcessId;
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/workflowHistory.html',
                controller: 'workflowHistoryInstanceCtrl',
                controllerAs: '$scope',
                size: 'lg',
                resolve: {
                    varList: function () {
                        return $scope.varList;
                    }
                }
            });
            modalInstance.result.then(function(result) {
                
            }, function() {

            });
        };

        $scope.cancel = function () {
            $uibModalInstance.close();
        };

        $scope.init = function() {
            $scope.rootProcessId = varList[0];
            $scope.status = varList[1];
        };

        $scope.init();
    });;
app.controller('workflowHistoryInstanceCtrl', function ($scope, ProcessStatusService, $uibModal, $uibModalInstance, varList) {

    $scope.rootProcessId;
    $scope.stepViews;

    var $ctrl = this;

    $scope.groupDetail = function (rootProcessId, approverType, stepId) {
        $ctrl.varList = [rootProcessId, approverType, stepId];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/groupDetail.html',
            controller: 'groupDetailInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
    };

    $scope.getAllStepViews = function () {
        if (varList !== undefined) {
            $scope.rootProcessId = varList;
            var promise = ProcessStatusService.getAllStepViews(varList);
            promise.then(function (response) {
                var data = response.data;
                $scope.stepViews = data;
            });
        }
    };

    $scope.init = function () {
        $scope.getAllStepViews();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.cancel = function () {
        $uibModalInstance.close();
    };
});
app.controller('followController', function ($scope, OrgService) {
    $scope.organizationId;


    $scope.followOrgClicked = function () {
        if (!$scope.isFollowingOrg) {
            $scope.followOrg();
        }
        else {
            $scope.unfollowOrg();
        }
    }
    $scope.getOrgFollowingStatus = function () {
        $scope.isFollowingOrg = false;
        OrgService.getFollowStatus($scope.organizationId).then(function (resp) {
            $scope.isFollowingOrg = resp.data;
        });

    }

    $scope.followOrg = function () {
        $scope.followDisabled = true;
        OrgService.followOrganization($scope.organizationId).then(function (resp) {
            $scope.isFollowingOrg = true;
            $scope.followDisabled = false;
        });
    }
    $scope.unfollowOrg = function () {
        $scope.followDisabled = true;
        OrgService.unfollowOrganization($scope.organizationId).then(function (resp) {
            $scope.isFollowingOrg = false;
            $scope.followDisabled = false;
        });
    }

    $scope.init = function (organizationId) {
        $scope.organizationId = organizationId;
        $scope.getOrgFollowingStatus();
    }
});;
app.controller('orgAddOrgController', function ($scope, $filter) {
    // BEGIN scope LEVEL VARIABLES
    //$scope.originalOrganizations = [];
    $scope.organizations = [];

    $scope.name = "New User";
   

    $scope.init = function () {

    };

    $scope.AddOrgClicked = function(e){
        $scope.organizations[$scope.organizations.length] = $scope.name;
    }

    $scope.init();
});

;
app.controller('orgGeneralController', function ($scope, OrgService) {

    $scope.electionMonths = [{ monthId: 0, monthName: "" }, { monthId: 1, monthName: "January" }, { monthId: 2, monthName: "February" }, { monthId: 3, monthName: "March" },
                            { monthId: 4, monthName: "April" }, { monthId: 5, monthName: "May" }, { monthId: 6, monthName: "June" }, { monthId: 7, monthName: "July" },
                            { monthId: 8, monthName: "August" }, { monthId: 9, monthName: "September" }, { monthId: 10, monthName: "October" }, { monthId: 11, monthName: "November" }, { monthId: 12, monthName: "December" }];


    $scope.getGeneralOrgInfo = function (orgId) {
        OrgService.getOrganizationGeneralInformation(orgId).then(function (response) {
            $scope.orgInfo = response.data;
            $scope.selectedElectionMonth = $scope.electionMonths[$scope.orgInfo.ElectionMonth];
            $scope.orgInfo.Created = $scope.orgInfo.DateCreated;
        }).then($scope.getParentOrganizationList);
    }

    $scope.init = function (orgId) {
        $scope.organizationId = orgId;
        $scope.getGeneralOrgInfo(orgId);
    }
    $scope.getParentOrganizationList = function () {
        OrgService.getParentOrganizationList($scope.organizationId).then(function (response) {
            $scope.parentOrgList = response.data;
           
        }).then(function () {
            $scope.parentOrg = jwru.constellation.utils.getObjectById($scope.parentOrgList, "OrganizationId", $scope.orgInfo.ParentOrganizationId);
        });
    }
    $scope.parentOrgChanged = function () {
        $scope.orgInfo.ParentOrganizationId = $scope.parentOrg.OrganizationId;
    }
    $scope.electionMonthChanged = function () {
        $scope.orgInfo.ElectionMonth = $scope.selectedElectionMonth.monthId;
    }

    $scope.saveOrgGenaralInfo = function () {
        $scope.showResultBox = false;
        OrgService.updateOrganizationGeneralInformation($scope.orgInfo).then(function (response) {
            $scope.showResultBox = true;
            $scope.succeed = true;
        },
        function (error) {
            $scope.showResultBox = true;
            $scope.succeed = false;
        });
    }
});;
app.controller('orgNotesController', function ($scope, $uibModal, NoteTemplatesService, OrgNotesService, $log) {



    //notes section



    $scope.currentWorkingPermitNote = {};

    $scope.includeDeletedNotes = false;

    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentOrgNoteId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";


    //note variable declaration ends
    var $ctrl = this;


    //note functions
    $scope.getNoteTemplates = function (zoneId) {
        NoteTemplatesService.getNoteTemplates(zoneId).then(function (response) {

            $scope.noteTemplates = response.data;
        });
    };

    $scope.noteTemplateSelected = function (isPrivate) {

        if (isPrivate) {
            $scope.newPrivateNoteText = this.notePrivateTemplate;
        }
        else {
            $scope.newNoteText = this.noteTemplate;
        }
    };

    $scope.getOrgNotes = function (includeDeleted) {
        /* PermitService.getPermitNotes($scope.currentPermitVersionId, includeDeleted).then(function (response) {
             $scope.currentWorkFlowNotes = response.data;
         });*/
        var promise = OrgNotesService.getOrgNotes(includeDeleted == 0 ? 'false' : 'true', $scope.organizationId);
        promise.then(function (response) {
            $scope.currentOrgNotes = response.data;

        });
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 1);
    };

    $scope.makeNotePrivate = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.changeNoteType = function (note, type) {
        note.Public = type;
        /*PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });*/
        var promise = OrgNotesService.editNote(note);
        promise.then(function (response) {
            $scope.getOrgNotes(1);
        });
    };

    $scope.newOrgNote = function (parentNoteId, IsPrivate) {



        if ($scope.currentOrgNoteId === 0) {
            // OrgNotesService.newWorkflowNote($scope.registration.registrationView.ProcessId).then(function (response) {
            //     $scope.registration.currentOrgNotes.push(response.data);
            // });
            // PermitService.newPermitNote($scope.currentPermitVersionId, parentNoteId).then(function (response) {
            OrgNotesService.newNote($scope.organizationId).then(function (response) {
                var note = response.data;
                if (IsPrivate) {
                    note.Public = 0;
                    if ($scope.newPrivateNoteText.trim() === "") {
                        alert("");
                    }
                    response.data.Note = $scope.newPrivateNoteText;
                    $scope.makeNotePrivate(note);
                    $scope.newPrivateNoteText = "";

                }
                else {
                    response.data.Note = $scope.newNoteText;
                    $scope.makeNotePublic(note);
                    // $scope.updatePermitNote(response.data);
                    //$scope.currentPermitNotes.push(response.data);
                    $scope.newNoteText = "";
                }



            });
        }
        else {

            var note = getNote($scope.currentOrgNoteId);
            if (IsPrivate) {
                note.Note = $scope.newPrivateNoteText;
            }
            else {
                note.Note = $scope.newNoteText;
            }
            OrgNotesService.editNote(note).then(function (response) {
                $scope.getOrgNotes($scope.includeDeletedNotes);
                $scope.currentOrgNoteId = 0;
                if (IsPrivate) {
                    $scope.newPrivateNoteText = "";
                    $scope.buttonPrivateText = "Post";
                }
                else {
                    $scope.newNoteText = "";
                    $scope.buttonText = "Post";
                }

                note.customStyle = "";
            });

        }
    };
    function getNote(processNoteId) {
        var len = $scope.currentOrgNotes.length;
        var note;
        for (var i = 0 ; i < len; i++) {
            if ($scope.currentOrgNotes[i].OrganizationNoteId == processNoteId) {
                return $scope.currentOrgNotes[i];
            }
        }

    }
    $scope.updatePermitNote = function (note) {
        PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
            $scope.buttonText = "Post";
        });
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentOrgNoteId = note.OrganizationNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentOrgNoteId = note.OrganizationNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }

    $scope.deleteNote = function (note) {
        OrgNotesService.deleteNote(note).then(function (response) {
            $scope.getOrgNotes($scope.includeDeletedNotes);
        });
    };

    $scope.restoreNote = function (note) {
        OrgNotesService.restoreNote(note).then(function (response) {
            $scope.getOrgNotes($scope.includeDeletedNotes);
        });
    };

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };

    $scope.editTaggedAdmin = function () {
        $scope.edit = true;
        $ctrl.varList = $scope.organizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/createTaggedAdmins.html',
            // scope: $scope,
            controller: 'orgTaggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
                // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
                // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.viewTaggedAdmins = function () {
        $scope.edit = false;
        $ctrl.varList = $scope.organizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/updateTaggedAdmins.html',
            // scope: $scope,
            controller: 'orgTaggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
                // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
                // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.closeModal = function () {
        $scope.modalInstance.close();
        $scope.currentUser = {};
    }


    //note function ends

   

    $scope.init = function (organizationId) {
        $scope.organizationId = organizationId;
        
        $scope.getNoteTemplates(1);
        $scope.getOrgNotes(0);
    };



    
});
app.controller('orgGeneralPageController', function ($scope, $timeout, $compile, $filter, $uibModal, $log, uiCalendarConfig, AnnouncementsService, OrgDirectoryService, OrgOfficerService, EventService, ExtendedPropertyService, OrganizationMemberService, OrgAdvisorService, OrgService) {
    $scope.announcementsLoading = true;
    $scope.officersLoading = true;
    $scope.advisorsLoading = true;
    $scope.additionalInfoLoading = true;
    $scope.announcements = {};
    $scope.officers = {};
    $scope.advisors = [];
    $scope.allowEmail = false;
    $scope.upcomingEvents = {};
    $scope.propertyGroups = {};
    $scope.memberTotals = {};
    $scope.memberTotalsLoading = true;
    $scope.alerts = [];
    $scope.orgHasEmail = true;
    $scope.currentlyShowingMore = false; 

     $scope.toggleShowMore = function() {
            $scope.currentlyShowingMore = $scope.currentlyShowingMore === false ? true: false;
        };

    $scope.membershipStatus;
    var $ctrl = this;

    var self = this;
    self.organizationId = 0;

    $scope.loadAnnouncements = function () {
        $scope.announcementsLoading = true;
        var promise = AnnouncementsService.getOrganization(self.organizationId);
        promise.then(function (response) {
            $scope.announcementsLoading = false;
            $scope.announcements = response.data;
        });
    };

    $scope.loadOfficers = function () {
        $scope.officersLoading = true;
        var promise = OrgOfficerService.getPublicOfficers(self.organizationId);
        promise.then(function (response) {
            $scope.officersLoading = false;
            $scope.allowEmail = response.data.CanEmail;
            $scope.officers = response.data.List;
        
            if($scope.officers.length > 3) {
                $scope.currentlyShowingMore = true;
            }           
        });
    };

    $scope.loadAdvisors = function () {
        $scope.advisorsLoading = true;
        var promise = OrgAdvisorService.getOrgAdvisors(self.organizationId);
        promise.then(function (response) {
            $scope.advisorsLoading = false;
            $scope.advisors = response.data;

            if ($scope.advisors.length > 1) {
                $scope.currentlyShowingMore = true;
            } 
        });
    };

    $scope.getEventDetails = function (event) {
        $scope.currentEventDetails = event;

        var promise = EventService.getFollowingStatus(event.id);
        promise.then(function success(response) {
            $scope.showFollowingOptions = true;
            $scope.followingStatus = response.data;
        }, function error(response) { });

        $scope.eventDetailDialog = $uibModal.open({
            templateUrl: '/app/views/events/reg_org_events_dialog.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'lg',
        });

        $scope.eventDetailDialog.result.then(function () { }, function () { });
    };

    $scope.closeEventDetails = function () {
        $scope.eventDetailDialog.close();
    };

    $scope.loadUpcomingEvents = function () {
        var promise = EventService.getOrgUpcomingEvents(self.organizationId);
        promise.then(function (response) {
            $scope.upcomingEvents = response.data.slice(0, 10);
        });
    };

    //$scope.formatDateTime = function (dateTime) {
    //    return jwru.constellation.utils.formatDateTime(dateTime);
    //};

    //$scope.formatShortDate = function (dateTime) {
    //    return jwru.constellation.utils.formatShortDate(dateTime);
    //};

    //$scope.formatExtraShortDate = function (dateTime) {
    //    return jwru.constellation.utils.formatExtraShortDate(dateTime);
    //};

    //$scope.formatTime = function (dateTime) {
    //    return jwru.constellation.utils.formatTime(dateTime);
    //};

    $scope.initOrganizationPage = function (organizationId) {
        self.organizationId = organizationId;
        $scope.organizationId = organizationId;
        $scope.loadUpcomingEvents();
        $scope.loadAnnouncements();
        $scope.loadOfficers();
        $scope.loadConstitution();
        $scope.loadAdvisors();
    };

    $scope.loadConstitution = function () {
        OrgService.getConstitution(self.organizationId).then(function (response) {
            if (response.data.OrgConstitutionId > 0) {
                $scope.constitutionExist = true;
            }
        });
    }

    $scope.composeEmailToOrg = function (organizationId, organizationName) {
        var modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/email/composeEmail.html?c=' + (new Date()).getTime(),
            controller: function ($scope, $uibModal, $uibModalInstance, alerts, organizationId, OrgService) {
                $scope.organizationId = organizationId;
                $scope.organizationName = organizationName.replace('&#39;', "'");
                $scope.message = {};
                $scope.cancel = function () {
                    $uibModalInstance.close();
                }
                $scope.sendEmail = function () {
                    var promise = OrgService.sendEmailToOrg($scope.message);
                    promise.then(function (response) {
                        $uibModalInstance.close();
                        alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                    }, function (data) { });
                };
                $scope.init = function () {
                    $scope.message = {
                        organizationId: $scope.organizationId,
                        subject: '',
                        message: ''
                    }
                };
                $scope.init();
            },
            resolve: {
                alerts: function () {
                    return $scope.alerts;
                },
                organizationId: function () { return organizationId; }
            }
        });
        modalInstance.result.then(function () { }, function () { });
    };

    $scope.composeOfficerEmail = function (officer) {
        var modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/officers/composeOfficerEmail.html?c=' + (new Date()).getTime(),
            controller: function ($scope, $uibModal, $uibModalInstance, alerts, officer, OrgOfficerService) {
                $scope.officer = officer;
                $scope.message = {};
                $scope.cancel = function() {
                    $uibModalInstance.close();
                }
                $scope.sendEmail = function () {
                    
                    var promise = OrgOfficerService.sendEmailToOfficer($scope.message);
                    promise.then(function(response) {
                        $uibModalInstance.close();
                        alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                    }, function(data) {  });
                };
                $scope.init = function() {
                    $scope.message = {
                        officerId: officer.OfficerId,
                        subject: '',
                        message:''
                    }
                };
                $scope.init();
            },
            resolve: {
                alerts: function() {
                    return $scope.alerts;
                },
                officer: function () { return officer; }
            }
        });
        modalInstance.result.then(function() {}, function() {});
    };

    $scope.composeAdvisorEmail = function (advisor) {
        var modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/email/composeAdvisorEmail.html?c=' + (new Date()).getTime(),
            controller: function ($scope, $uibModal, $uibModalInstance, alerts, advisor, OrgAdvisorService) {
                $scope.advisor = advisor;
                $scope.message = {};
                $scope.cancel = function () {
                    $uibModalInstance.close();
                }
                $scope.sendEmail = function () {
                    var promise = OrgAdvisorService.sendEmailToAdvisor($scope.message);
                    promise.then(function (response) {
                        $uibModalInstance.close();
                        alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                    }, function (data) { });
                };
                $scope.init = function () {
                    $scope.message = {
                        advisorId: advisor.AdvisorId,
                        subject: '',
                        message: ''
                    }
                };
                $scope.init();
            },
            resolve: {
                alerts: function () {
                    return $scope.alerts;
                },
                advisor: function () { return advisor; }
            }
        });
        modalInstance.result.then(function () { }, function () { });
    };

    $scope.closeAlert = function (index) {
        $scope.alerts.splice(index, 1);
    };
});

app.controller('orgEventPageController', function ($scope, $uibModal, OrgOfficerService, EventService, $routeParams) {
    $scope.upcomingEvents = [];
    $scope.pastEvents = [];

    $scope.initOrganizationPage = function (organizationId) {
        EventService.getOrgUpcomingEvents(organizationId).then(function (response) {
            $scope.upcomingEvents = response.data;
        });
        EventService.getPastOrganizationEvents(organizationId).then(function (response) {
            $scope.pastEvents = response.data;
        });
    };

    $scope.getEventDetails = function (event) {
        $scope.currentEventDetails = event;

        var promise = EventService.getFollowingStatus(event.id);
        promise.then(function success(response) {
            $scope.showFollowingOptions = true;
            $scope.followingStatus = response.data;
        }, function error(response) { });

        $scope.eventDetailDialog = $uibModal.open({
            templateUrl: '/app/views/events/user_event_details_dialog.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'lg',
        });
        $scope.eventDetailDialog.result.then(function () {

        }, function () {

        });
    };

    $scope.followEvent = function (notify) {
        if ($scope.followingStatus !== undefined) {
            var promise = EventService.followEvent($scope.followingStatus, notify);
            promise.then(function (response) {
                $scope.followingStatus = response.data;
            });
        }
    };

    $scope.unfollowEvent = function () {
        if ($scope.followingStatus !== undefined) {
            var promise = EventService.unfollowEvent($scope.followingStatus);
            promise.then(function (response) {
                $scope.followingStatus = response.data;
            });
        }
    };

    $scope.closeEventDetails = function () {
        $scope.eventDetailDialog.close();
    };
});;
app.controller('orgSearchController', function ($scope, $filter, $window, $location, $anchorScroll, OrgDirectoryService, CategoryServices) {
    // BEGIN scope LEVEL VARIABLES
    $scope.originalOrganizations = [];
    $scope.organizations = [];

    //$scope.letters = ['#', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    //$scope.letters = [{ selected: false, letter: '#' }, { selected: false, letter: 'A' }, { selected: false, letter: 'B' },
    //                  { selected: false, letter: 'C' }, { selected: false, letter: 'D' }, { selected: false, letter: 'E' },
    //                  { selected: false, letter: 'F' }, { selected: false, letter: 'G' }, { selected: false, letter: 'H' },
    //                  { selected: false, letter: 'I' }, { selected: false, letter: 'J' }, { selected: false, letter: 'K' },
    //                  { selected: false, letter: 'L' }, { selected: false, letter: 'M' }, { selected: false, letter: 'N' },
    //                  { selected: false, letter: 'O' }, { selected: false, letter: 'P' }, { selected: false, letter: 'Q' },
    //                  { selected: false, letter: 'R' }, { selected: false, letter: 'S' }, { selected: false, letter: 'T' },
    //                  { selected: false, letter: 'U' }, { selected: false, letter: 'V' }, { selected: false, letter: 'W' },
    //                  { selected: false, letter: 'X' }, { selected: false, letter: 'Y' }, { selected: false, letter: 'Z' }];
    $scope.letters = [{ selected: false, letter: '#' }, { selected: false, letter: 'A' }, { selected: false, letter: 'B' },
                  { selected: false, letter: 'C' }, { selected: false, letter: 'D' }, { selected: false, letter: 'E' },
                  { selected: false, letter: 'F' }, { selected: false, letter: 'G' }, { selected: false, letter: 'H' },
                  { selected: false, letter: 'I' }, { selected: false, letter: 'J' }, { selected: false, letter: 'K' },
                  { selected: false, letter: 'L' }, { selected: false, letter: 'M' }, { selected: false, letter: 'N' },
                  { selected: false, letter: 'O' }, { selected: false, letter: 'P' }, { selected: false, letter: 'Q' },
                  { selected: false, letter: 'R' }, { selected: false, letter: 'S' }, { selected: false, letter: 'T' },
                  { selected: false, letter: 'U' }, { selected: false, letter: 'V' }, { selected: false, letter: 'W' },
                  { selected: false, letter: 'X' }, { selected: false, letter: 'Y' }, { selected: false, letter: 'Z' }];
    $scope.selectedLetters = [];

    $scope.delayTime = 700; // wait delayTime ms after user stops typing for ng-change to fire

    $scope.currentPage = 1;
    $scope.itemsPerPage = 12;
    $scope.itemsOptions = [12, 24, 48, 96];

    $scope.listType = $window.innerWidth < 480 ? 'grid' : 'list';
    $scope.categories = {};

    $scope.scrollTo = function (id) {
        $location.hash(id);
        $anchorScroll();
    }

    $scope.collapseFL = $window.innerWidth < 992 ? true : false;
    $scope.collapseCat = $window.innerWidth < 992 ? true : false;
    $scope.collapseDir = $window.innerWidth < 992 ? true : false;

    // END

    $scope.getSystemOrganizationCategories = function () {
        var promise = CategoryServices.getSystemOrganizationCategories();
        promise.then(function (response) {
            $scope.categories = response.data;
        });
    }

    $scope.getOrganizations = function () {
        var promise = OrgDirectoryService.getMasterDirectory();
        promise.then(function (response) {
            $scope.organizations = response.data;
            $scope.originalOrganizations = $scope.organizations;
            $scope.getSystemOrganizationCategories();
        });
    };

    $scope.getAdminOrganizations = function () {
        var promise = OrgDirectoryService.getAdminMasterDirectory();
        promise.then(function (response) {
            $scope.organizations = response.data;
            $scope.originalOrganizations = $scope.organizations;
            $scope.getSystemOrganizationCategories();
        });
    };

    $scope.filterOrganizations = function () {
        var selectedCount = 0;
        $scope.organizations = [];
        $scope.letters.forEach(function (value, index) {
            if (value.selected) {
                selectedCount++;
                var result = $scope.originalOrganizations.filter(function (obj) {
                    return obj.OrganizationNameFirstCharacter.toUpperCase() === value.letter || (value.letter === '#' && !isNaN(obj.OrganizationNameFirstCharacter));
                });
                if (result) {
                    for (var i = 0; i < result.length; i++) {
                        $scope.organizations.push(result[i]);
                    }
                }
            }
        });
        if (selectedCount === 0) {
            $scope.organizations = $scope.originalOrganizations;
        }

        var resultOrgList = [];
        selectedCount = 0;
        $scope.categories.forEach(function (value, index) {
            if (value.Selected) {
                selectedCount++;
                var result = $scope.organizations.filter(function (obj) {
                    if (obj) {
                        if (obj.CategoryIds) {
                            var categoryIds = obj.CategoryIds.replace(/\s/g, '').split(',');
                            for (var i = 0; i < categoryIds.length; i++) {
                                if (parseInt(categoryIds[i]) === value.CategoryId) {
                                    return true;
                                }
                            }
                        }
                    }
                    return false;
                });
                if (result) {
                    for (var i = 0; i < result.length; i++) {
                        resultOrgList.push(result[i]);
                    }
                }
            }
        });

        if (selectedCount > 0) {
            $scope.organizations = resultOrgList;
        }
    };

    $scope.toggleCategory = function (index) {
        $scope.categories[index].Selected = !$scope.categories[index].Selected;
        $scope.filterOrganizations();
        $scope.currentPage = 1;
    };

    $scope.toggleLetter = function (index) {
        $scope.letters[index].selected = !$scope.letters[index].selected;
        $scope.filterOrganizations();
        $scope.currentPage = 1;
    };

    //$scope.init = function () {
    //    $scope.getOrganizations();
    //};

    //$scope.init();
});

app.filter('orgSearchFilter', function () {
    return function (objects, criteria) {
        var filterResult = new Array();
        if (!criteria)
            return objects;
        for (index in objects) {
            if (objects[index].OrganizationName.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].Keywords.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].OrganizationDescription.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].Acronym.toLowerCase().indexOf(criteria.toLowerCase()) !== -1) // filter by name, keyword, or description only
                filterResult.push(objects[index]);
        }
        return filterResult;
    }
});
;
app.controller('orgStartController', function ($scope, $interval,$timeout, OrgService, OrgFilterService) {

    $scope.filteredOrganization = [];
    $scope.orgDisplayLimit = 5;
  
    $scope.showMoreOrgs = function () {
        $scope.orgDisplayLimit += 5;
    }

    $scope.filterOrganization = function () {

        if ($scope.searchText.trim().length < 2) {
            $scope.filteredOrganizations = [];
            return;
        }

       
        $scope.orgDisplayLimit = 5;

        /*OrgFilterService.doWork({ orgs: $scope.organizations, searchText: $scope.searchText }).then(function (result) {
            
            $scope.filteredOrganizations = result;
        });*/

        var keywords = $scope.searchText.split(' ');
        keywords = keywords.map(function (keyword) {
            return keyword.toLowerCase();
        });

        $scope.filteredOrganizations = $scope.organizations.filter(function (org) {           
            org.matchedLength = 0;
            var ret = false;
                for (var i = 0; i < keywords.length; i++) {
                    var k = keywords[i];
                    var keyLength = k.length;
                 
                   
                    if (org.OrganizationName.toLowerCase().indexOf(k) != -1) {
                        ret = true;
                        org.matchedLength += keyLength;
                    }

                }
            return ret;
        });
        
        $scope.filteredOrganizations.sort(function (a, b) { return (a.matchedLength < b.matchedLength) ? 1 : ((b.matchedLength < a.matchedLength) ? -1 : 0); });
       /* var mapped = $scope.filteredOrganizations.map(function (el, i) {
            return { index: i };
        })

        // sorting the mapped array containing the reduced values
        mapped.sort(function (a, b) {
            return  (a.matchedLength < b.matchedLength) ? 1 : ((b.matchedLength < a.matchedLength) ? -1 : 0);
        });

        // container for the resulting order
        var result = mapped.map(function (el) {
            return $scope.filteredOrganizations[el.index];
        });

        $scope.filteredOrganizations = result;*/
    }

    $scope.getOrganizations = function () {

        OrgService.getMasterDirectory().then(function (response) {
            $scope.organizations = response.data;
        });
    }

    $scope.init = function () {
        $scope.getOrganizations();
    }
});;
app.controller('orgTaggedAdminsModalCtrl', function ($scope, $uibModalInstance, OrgNotesService, varList, edit) {

    $scope.userInput = '';
    $scope.itemsPerPage = 10;
    $scope.query = '';
    $scope.currentPage = 1;
    $scope.loadingUsers = false;
    $scope.itemsPerAccodionModalPage = 10;
    $scope.currentAccordionModalPage = 1;
    $scope.userInput = '';
    $scope.showingAllUsers = false;
    $scope.noUsersAvailable = false;
    $scope.selectedUserIDs = [];


    var $ctrl = this;

    $scope.addAdmins = function () {

        var promise = OrgNotesService.createTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.loadAvailableAdmins();

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereAdded = true;
        });

    };

    $scope.getTaggedAdmins = function (varList) {
        //console.log('getTaggedAdmins');
        $scope.loadingUsers = true;
        var promise = OrgNotesService.getTaggedAdmins(varList);
        promise.then(function (response) {
            //  console.log(response.data);
            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        });
    };

    $scope.removeTaggedAdmins = function () {
        //console.log('remove tagged admins');

        var promise = OrgNotesService.removeTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.getTaggedAdmins(varList);

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereRemoved = true;
        });

    };

    $scope.selectUser = function (user) {

        //if user was selected and the ID is not already in the array, then add the ID
        if (user.Selected && !$scope.selectedUserIDs.includes(user.UserId)) {
            $scope.selectedUserIDs.push(user.UserId)
        }

        //if user was deselected and the ID is in the array, then remove the ID
        if (!user.Selected && $scope.selectedUserIDs.includes(user.UserId)) {
            var index;
            index = $scope.selectedUserIDs.indexOf(user.UserId);
            $scope.selectedUserIDs.splice(index, 1);
        }
    }

    $scope.loadAvailableAdmins = function () {
        $scope.loadingUsers = true;
        var promise = OrgNotesService.getAvailableTaggedAdmins()
        promise.then(function (response) {
            //console.log(response.data);

            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        })

    };

    $scope.init = function () {
        if (edit) {
            $scope.loadAvailableAdmins();
        }
        else {
            $scope.getTaggedAdmins(varList);
        }

    };

    $scope.init();

    $ctrl.cancel = function () {

        if ($scope.usersWereAdded) {
            $uibModalInstance.close(1);

        } else {
            $uibModalInstance.dismiss('cancel');
        }
    };
});
app.controller('socialMediaController', function ($scope,$location,$window,$q, OrgSocialMediaService) {
    $scope.FBReactions = [
        {
            className: "like",
            propertyName: "like"
        },
        {
            className: "haha",
            propertyName: "haha"
        },
        {
            className: "love",
            propertyName: "love"
        },
        {
            className: "sad",
            propertyName: "sad"
        },
        {
            className: "wow",
            propertyName: "wow"
        },
        {
            className: "yay",
            propertyName: "thankful"
        }
    ];

    $scope.getAvailableSocialMedia = function (orgId) {
        OrgSocialMediaService.getAvailableSocialMedia(orgId).then(function (response) {
            $scope.socialMedias = response.data.map(function (m) {
                 switch(m.SocialMediaId) {
                     case 1: m.className = "fa-twitter-square"; 
                         break;
                     case 2: m.className = "fa-facebook-official";
                         break;
                     case 3:
                         m.className = "fa-instagram"
                         break;
                 }
                 m.SocialMediaURL = window.encodeURIComponent(m.SocialMediaURL);
                 return m;
            });
        },
        function (err) {
            
        });
    }
    
   
    $scope.init = function (orgId) {
        $scope.getAvailableSocialMedia(orgId);
       
    }

    $scope.getTweets = function (orgId) {
        OrgSocialMediaService.getTweets(orgId).then(function (response) {
            
            $scope.tweets = JSON.parse(response.data).map(function (t) {
                t.created_at = new Date(t.created_at).getTime();
                return t;
            });
        });
    }

    $scope.parseText = function (text) {
        var idx = text.lastIndexOf("https://");
        if (idx >= 0) {
            var link = text.substring(idx);
            var plain = text.substring(0, idx);
            text = plain + ' <a href="' + link + '" target="_blank"> <i class="fa fa-external-link" aria-hidden="true"></i></a>';
        }
        return text;
    }

    $scope.getFBPosts = function (orgId) {
        $scope.organizationId = orgId;
        $scope.getPagePosts();
        //$scope.initializeFBSDK();
    }

    $scope.getFBPageInfo = function (orgId) {
        $scope.organizationId = orgId;

        OrgSocialMediaService.getFBPageInfo($scope.organizationId).then(function (response) {
            $scope.pageInfo = JSON.parse(response.data);
        });

        //$scope.initializeFBSDK();

    }

    $scope.getAllPost = function (orgId) {
        //$scope.login();
        OrgSocialMediaService.getLoginStatus().then(function (response) {
            if (response.status != "connected") {
                OrgSocialMediaService.login().then(function (response) {
                    $scope.getPagePosts();
                });
            }
            else {
                $scope.getPagePosts();
            }
        })
        
    }
   
    $scope.getPagePosts = function () {
        OrgSocialMediaService.getFBPosts($scope.organizationId).then(function (response) {
            $scope.posts = JSON.parse(response.data).data.map(function (t) {
                t.created_time = new Date(t.created_time).getTime();
                return t;
            });;
        });
    }
    $scope.initializeFBSDK = function () {
        $window.fbAsyncInit = function () {
            FB.init({
                appId: '322233564891437',
                status: true,
                cookie: true,
                xfbml: true,
                version: 'v2.4'
            });
            $scope.isLoaded = true;
            //$scope.getAllPost();
        };
    }

    $scope.post = function (id) {
        $scope.getMediaUserName($scope.organizationId, 2).then(function (response) {
            var username = response;
            OrgSocialMediaService.getLoginStatus().then(function (response) {
                if (response.status != "connected") {
                    OrgSocialMediaService.login().then(function (response) {
                        OrgSocialMediaService.post($scope.message, username).then(function (response) {
                            $scope.getPagePosts();
                        });
                    });
                }
                else {
                    OrgSocialMediaService.post($scope.message, username).then(function (response) {
                        $scope.getPagePosts();
                    });
                }
            })
        });
        
        
    }

    $scope.redirectOrganisationInstagram = function () {
        var loc = window.location.toString();
        loc = loc.substring(loc.indexOf("?") + 1);
        var access_token = loc.substring(loc.indexOf("access_token") + 13);
        var orgName = loc.substring(loc.indexOf("orgName") + 8, loc.indexOf("#"));
        window.location = "/Organization/" + orgName + "/SocialMedia?type=Instagram&access_token=" + access_token;
    }

    $scope.getInstaAccessToken = function () {
        var loc = window.location.toString();
        loc = loc.substring(loc.indexOf("?") + 1);
        $scope.insta_access_token = loc.substring(loc.indexOf("access_token") + 13);
       
    }
    $scope.getInstaPosts = function (orgId) {
        $scope.getDirectInstaMedia();
        if ($scope.insta_access_token == null) {
            $scope.getInstaAccessToken();
        }
        $scope.getMediaUserName(orgId, 3).then(function (response) {
            var userName = response;
            OrgSocialMediaService.getInstaUserId($scope.insta_access_token, userName).then(function (response) {
                var userid = JSON.parse(response.data).data[0].id;
                OrgSocialMediaService.getInstaPosts($scope.insta_access_token, userid).then(function (resp) {

                    $scope.instaPosts = JSON.parse(resp.data).data;
                });
            });

        });
    }

   

    $scope.getMediaUserName = function (orgId, mediaType) {
        var defered = $q.defer();
        OrgSocialMediaService.getAvailableSocialMedia(orgId).then(function (response) {
            if (response != null) {
                var medias = response.data.filter(function (m) {
                    if (m.SocialMediaId == mediaType) return true;
                });
                defered.resolve($scope.getUserName(medias[0].SocialMediaURL));
            }
            else {
                defered.reject("error");
            }
        });
        return defered.promise;
    }
    $scope.getUserName = function (url) {
        var uname = url.substring(url.lastIndexOf("/") + 1);
        if (uname == "") {
            url = url.substring(0,url.lastIndexOf("/"))
        }
        return url.substring(url.lastIndexOf("/")+1);
    }
   

    $scope.getDirectInstaMedia = function (orgId) {
        OrgSocialMediaService.getDirectInstaMedia(orgId).then(function (resp) {
            $scope.instaPosts = JSON.parse(resp.data).items.slice(0, 10);

            $scope.instaPosts = $scope.instaPosts.map(function (p) {
                p.created_time = p.created_time * 1000;
                return p;
            });
        });
    }

});;
app.controller('uploadFileController', function ($scope, $filter) {
    // BEGIN scope LEVEL VARIABLES
    //$scope.originalOrganizations = [];
    $scope.organizations = [];

    $scope.name = "New User";
   

    $scope.init = function () {
        //$scope.getOrganizations();
      //  $scope.$apply();
    };

    $scope.UploadFile = function (e) {
      //  $scope.organizations[$scope.organizations.length] = $scope.name;
    }

    $scope.init();
});

;
app.controller('orgAdvisorController', function ($scope, OrgAdvisorService, $uibModal) {
    $scope.organizationId;
    $scope.advisors = [];

    $scope.varList = {};

    $scope.removeAdvisor = function (advisorId) {
        var promise = OrgAdvisorService.removeAdvisor(advisorId);
        promise.then(function (response) {
            $scope.getAdvisors($scope.organizationId);
        });
    };

    $scope.addAdvisor = function () {
        $scope.varList = [$scope.advisors, $scope.organizationId];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'newAdvisor.html',
            controller: 'ModalNewAdvisorCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });
        modalInstance.result.then(function () {
            $scope.getAdvisors($scope.organizationId);
        }, function () {
            
        });
    };

    $scope.getAdvisors = function (organizationId) {
        // This is an Admin Function
        var promise = OrgAdvisorService.getAdvisors(organizationId, true);
        promise.then(function (response) {
            var data = response.data;
            $scope.advisors = data;
        });
    };

    $scope.init = function () {
        if ($scope.organizationId) {
            $scope.getAdvisors($scope.organizationId);
        }
    };

    $scope.init();
});

app.controller('ModalNewAdvisorCtrl', function ($scope, $uibModalInstance, OrgAdvisorService, AdminOfficerService, varList) {

    var $ctrl = this;
    $scope.firstName;
    $scope.lastName;
    $scope.studentId;
    $scope.email;
    $scope.loading = false;
    $scope.isValid = 0;
    $scope.showErrorMessage = false;
    $scope.duplicateAdvisor = false;
    $scope.duplicateOfficer = false;
    $scope.userEligible = true;

    $ctrl.addNewAdvisor = function (userInput) {
        $scope.duplicateAdvisor = false;
        $scope.showErrorMessage = false;
        $scope.duplicateOfficer = false;
        if (varList[0] !== null && varList[0] !== undefined)
        {
            for (var i = 0; i < varList[0].length; i++) {
                if ((userInput.toUpperCase() === varList[0][i].Email.toUpperCase() || userInput.toUpperCase() === varList[0][i].StudentId.toUpperCase()) && varList[0][i].DateDeleted === 0) {
                    $scope.duplicateAdvisor = true;
                    break;
                }
            }
        }

        if (!$scope.duplicateAdvisor) {
            var promise = OrgAdvisorService.assignAdvisor(varList[1], $scope.userInput);
            promise.then(function (response) {
                var data = response.data;
                if (data.UserId > 0 && data.userEligible) {
                    $uibModalInstance.close();
                }
                else if (!data.userEligible) {
                    $scope.userEligible = false;
                }
                else if (data.UserId === -1)
                {
                    $scope.duplicateOfficer = true;
                }
                else {
                    $scope.showErrorMessage = true;
                }
            });
        }
    };

    $ctrl.getUserInfo = function (userInput) {
        $scope.loading = true;

        //reset if previous user searched was ineligible
        $scope.userEligible = true;

        var promise = AdminOfficerService.getUserInfo(userInput);
        promise.then(function (response) {
            var data = response.data;
            $scope.firstName = data.FirstName;
            $scope.lastName = data.LastName;
            $scope.studentId = data.StudentId;
            $scope.email = data.Email;

            if ($scope.studentId > 0) {
                $scope.isValid = 1;
            }
            else {
                $scope.isValid = 0;
            }
            $scope.loading = false;

        });
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('orgAdvisorsBulkUpdateCtrl', function ($scope, OrgAdvisorService, OrganizationTypeService, OrganizationStateService, $rootScope, $uibModal) {

    $scope.currentPage = 1;
    $scope.itemsPerPage = 10;

    $scope.selectDeselectAllText = 'Select all';
    $scope.currentListDisplayed = [];
    $scope.selectedApplyToOption;
    $scope.affectedOrgIds = [];
    $scope.showCompletedMessage = false;

    $scope.applyToOptions = [
        { optionId: 1, optionName: 'Organization Type' },
        { optionId: 2, optionName: 'Organization Status' }
    ];

    $scope.changeApplyToList = function () {

        //reset message if user continues to work
        $scope.showCompletedMessage = false;

        if ($scope.selectedApplyToOption) {

            if ($scope.selectedApplyToOption.optionId === 1) {
                $scope.currentListDisplayed = $scope.typeList;

            } else {
                $scope.currentListDisplayed = $scope.statusList;
            }

            // Reset select all button text and deselect any options user had previously chosen
            if ($scope.previousOptionId != $scope.selectedApplyToOption.optionId) {

                if ($scope.previousList) {
                    $scope.resetSelectAll($scope.previousList);
                }
            }

            // Store which list was last used for future comparison
            if ($scope.currentListDisplayed != undefined) {
                $scope.previousList = ($scope.selectedApplyToOption.optionId === 1 ? $scope.typeList : $scope.statusList);
                $scope.previousOptionId = $scope.selectedApplyToOption.optionId;
            }

            //reset the state the orgs were in when user was working with previous applyToOption
            $scope.affectedOrgIds = [];
        }
    }
    
    $scope.getAllSystemOrganizationType = function () {
        var promise = OrganizationTypeService.getAllSystemOrganizationType();

        promise.then(function (response) {
            $scope.typeList = response.data;
        });
    };

    $scope.getSystemState = function () {
        var promise = OrganizationStateService.getSystemState();
        promise.then(function (response) {
            $scope.statusList = response.data;
        });
    };

    $scope.selectDeselectAll = function (currentButtonText) {
        //reset message if user continues to work
        $scope.showCompletedMessage = false;

        for (var i = 0; i < $scope.currentListDisplayed.length; i++) {

            if (currentButtonText === 'Select all') {
                $scope.currentListDisplayed[i].Selected = true;
                $scope.pullOrRemoveOrgIds($scope.currentListDisplayed[i]);

            } else {
                $scope.currentListDisplayed[i].Selected = false;
                $scope.affectedOrgIds = [];
            }
        };
        $scope.selectDeselectAllText = ($scope.selectDeselectAllText === 'Select all' ? 'Deselect all' : 'Select all');
    };

    $scope.resetSelectAll = function (previousList) {

        $scope.selectDeselectAllText = 'Select all';

        for (var i = 0; i < previousList.length; i++) {
            previousList[i].Selected = false;
        };
    }

    $scope.openModal = function (templateUrl, controller, varList, size) {
         $scope.confirmModalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl,
            controller,
            controllerAs: '$ctrl',
            size,
            resolve: {
                varList: function () {
                    return varList;
                }
            }
        });
    }

    $scope.removeAdvisors = function () {

        var onlyOrgs = [];
        var onlySelectedOrgs = [];
        var orgIds = [];

        for (var i = 0; i < $scope.affectedOrgIds.length; i++) {
            //place the objects from the Orgs/orgTypeId array into the new array (leaving behind the old array and type or state ids)
            onlyOrgs.push(...$scope.affectedOrgIds[i].Orgs)
        }

        //pull only the orgs that were selected
        for (var i = 0; i < onlyOrgs.length; i++) {
            if (onlyOrgs[i].Selected) {
                onlySelectedOrgs.push(onlyOrgs[i]);
            }
        }

        for (var i = 0; i < onlySelectedOrgs.length; i++) {
            if (onlySelectedOrgs[i].Selected) {
                orgIds.push(onlySelectedOrgs[i].OrganizationId);
            }
        };

        var varListWOrgCount = {
            message: 'Are you sure you want to remove the advisors from ' + orgIds.length + ' organizations?',
            confirmButtonText: 'Yes',
            cancelButtonText: 'Cancel',
            links: [{ text: 'View Organizations' }],
        };

        var varListWOrgList = {
            header: 'All Affected Organizations',
            message: '',
            confirmButtonText: 'Continue',
            cancelButtonText: 'Cancel',
            orgs: onlySelectedOrgs
        };

        var varListFinalMessage = {
            message: "Are you sure you want to complete this bulk remove (IT CAN'T BE UNDONE)?",
            confirmButtonText: 'Yes',
            cancelButtonText: 'Cancel'
        }

        //check twice that they want to really remove the advisors and warn it can't be undone
        $scope.openModal('/app/views/confirmedDialog/confirmCustomizable.html',
            'confirmBulkRemoveOrgAdvisors', varListWOrgCount, 'md');

        $scope.confirmModalInstance.result.then(function (result) {

            //user said 'yes' when asked if they are sure they want to remove all advisors from the variable number of orgs
            if (result > 0) {
                $scope.openModal('/app/views/confirmedDialog/confirmCustomizable.html',
                    'confirmBulkRemoveOrgAdvisors', varListFinalMessage, 'md');

                $scope.confirmModalInstance.result.then(function (result) {
                    //user confirmed second time they want to remove advisors of selected orgs
                    if (result > 0) {

                        promise = OrgAdvisorService.bulkRemoveAdvisorsByOrgIds(orgIds);
                        promise.then((response) => {
                            $scope.showCompletedMessage = true;

                            $scope.resetSelectAll($scope.currentListDisplayed);
                            $scope.affectedOrgIds = [];
                        });
                    }
                });

                //user wants to view the final list of orgs
            } else if (result === "view orgs") {

                $scope.openModal('/app/views/confirmedDialog/confirmOrgsOfAdvisorRemoval.html',
                    'confirmBulkRemoveOrgAdvisors', varListWOrgList, 'md');

                $scope.confirmModalInstance.result.then(function (result) {

                    //user said 'continue' after previewing orgs
                    if (result > 0) {
                        $scope.openModal('/app/views/confirmedDialog/confirmCustomizable.html',
                            'confirmBulkRemoveOrgAdvisors', varListFinalMessage, 'md');

                        $scope.confirmModalInstance.result.then(function (result) {
                            //user confirmed second time they want to remove advisors of selected orgs
                            if (result > 0) {

                                promise = OrgAdvisorService.bulkRemoveAdvisorsByOrgIds(orgIds);
                                promise.then((response) => {
                                    $scope.showCompletedMessage = true;

                                    $scope.resetSelectAll($scope.currentListDisplayed);
                                    $scope.affectedOrgIds = [];
                                });
                            }
                        });

                    };
                });
            };
        });
    };

    $scope.pullOrgs = function (typeOrState) {
        //reset message if user continues to work
        $scope.showCompletedMessage = false;

        //check whether the user has selected a type or state
        if ($scope.selectedApplyToOption.optionId === 1) {
            promise = OrganizationTypeService.getOrgsByPrimaryType(typeOrState.OrganizationTypeId);
        } else {
            promise = OrganizationStateService.getOrgsByStateId(typeOrState.OrganizationStateId);
        }

        promise.then(function (response) {
            if (response.data.length > 0) {

                var incomingOrgs = response.data;

                for (var i = 0; i < incomingOrgs.length; i++) {
                    incomingOrgs[i].Selected = true;
                }

                if ($scope.selectedApplyToOption.optionId === 1) {
                    $scope.affectedOrgIds.push(
                        {
                            OrganizationTypeId: typeOrState.OrganizationTypeId,
                            Orgs: incomingOrgs
                        });
                } else {
                    $scope.affectedOrgIds.push(
                        {
                            OrganizationStateId: typeOrState.OrganizationStateId,
                            Orgs: incomingOrgs
                        });
                }
            }
        });
    }

    $scope.deselectOrgs = function (typeOrState) {
        for (var i = 0; i < $scope.affectedOrgIds.length; i++) {
            //check whether the user has selected a type or state
            if ($scope.selectedApplyToOption.optionId === 1) {

                //find the typeId of the deselected org and remove it from the array of affectedTypesWOrgIds
                if ($scope.affectedOrgIds[i].OrganizationTypeId === typeOrState.OrganizationTypeId) {
                    $scope.affectedOrgIds.splice(i, 1);
                    break;
                }
            } else {

                if ($scope.affectedOrgIds[i].OrganizationStateId === typeOrState.OrganizationStateId) {
                    $scope.affectedOrgIds.splice(i, 1);
                    break;
                }
            }
        }
    }

    $scope.pullOrRemoveOrgIds = function (typeOrState) {

        //they selected the org type or state, pull the related orgIds 
        if (typeOrState.Selected === true) {
            $scope.pullOrgs(typeOrState);

        } else 
        {
            $scope.deselectOrgs(typeOrState);
        }
    };

    //For select/deselect of type or state only, does not remove from affectedOrgIds list
    $scope.selectDeselectOrgsAsModalResult = function (typeOrStateId, selectAll) {
        //find the type or state
        for (var i = 0; i < $scope.currentListDisplayed.length; i++) {

            if ($scope.selectedApplyToOption.optionId === 1 &&
                $scope.currentListDisplayed[i].OrganizationTypeId === typeOrStateId) {

                $scope.currentListDisplayed[i].Selected = selectAll; /*!$scope.currentListDisplayed[i].Selected;*/

            } else if ($scope.currentListDisplayed[i].OrganizationStateId === typeOrStateId) {

                $scope.currentListDisplayed[i].Selected = selectAll; /*!$scope.currentListDisplayed[i].Selected;*/
            }
        }
    }

    $scope.previewAffectedOrgs = function (typeOrStateId) {
        //reset message if user continues to work
        $scope.showCompletedMessage = false;

        var varList = {
            orgs: [],
            optionId: $scope.selectedApplyToOption.optionId,
            typeOrStateId: typeOrStateId
        };
        var indexOfOrgPreview;

        if ($scope.affectedOrgIds.length > 0) {
            for (var i = 0; i < $scope.affectedOrgIds.length; i++) {
                //check whether the user has made a selection, if so is it a type or state?
                if ($scope.selectedApplyToOption.optionId === 1) {

                    if ($scope.affectedOrgIds[i].OrganizationTypeId === typeOrStateId) {
                        varList.orgs = $scope.affectedOrgIds[i].Orgs;
                        indexOfOrgPreview = i;
                        break;
                    }
                    //probably only need else here not else if
                } else if ($scope.selectedApplyToOption) {

                    if ($scope.affectedOrgIds[i].OrganizationStateId === typeOrStateId) {
                        varList.orgs = $scope.affectedOrgIds[i].Orgs;
                        indexOfOrgPreview = i;
                        break;
                    }
                }
            }
        }

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/previewOrgs.html',
            controller: 'previewOrgsModalCtrl',
            controllerAs: '$ctrl',
            size: 'md',
            resolve: {
                varList: function () {
                    return varList;
                }
            }
        });

        //upon closing modal, if any changes were saved, pass the orgs to this controller,
        //include in affected orgs list, and set that parent type or state id to selected
        modalInstance.result.then(function (result) {

            //person selected the type or state before previewing so we already know the index of it for updates to affectedOrgIds
            if (indexOfOrgPreview != undefined && result != undefined) {

                if (result.selectionSaved && result.noneSelected === false) {
                    //replace current list of orgs for this type or state in affectedOrgIds with the new org selection
                    $scope.affectedOrgIds[indexOfOrgPreview].Orgs = result.orgs;

                //user deselected all orgs in modal and saved changes
                } else if (result.selectionSaved && result.noneSelected) {

                    //find the type or state, deselect it, and remove from affectedOrgs list
                    $scope.selectDeselectOrgsAsModalResult(typeOrStateId, !result.noneSelected); //param 2 of method is selectAll, so need to make noneSelected the opposite of what it is for the bool to be correct
                    $scope.affectedOrgIds.splice(indexOfOrgPreview, 1);
                }

                //if indexOfOrgPreview is undefined (user didn't originally select the type or state before preview, 
                //but now they are choosing orgs), add the type/stateId and orgs to the affectedOrgs list
            } else if (result != undefined && result.selectionSaved && result.noneSelected === false/*&& result.orgs.length > 0*/) {

                //for OrgType
                if ($scope.selectedApplyToOption.optionId === 1) {
                    $scope.selectDeselectOrgsAsModalResult(typeOrStateId, !result.noneSelected);
                    $scope.affectedOrgIds.push(
                        {
                            OrganizationTypeId: typeOrStateId,
                            Orgs: result.orgs
                        });

                //for OrgState
                } else {
                    $scope.selectDeselectOrgsAsModalResult(typeOrStateId, !result.noneSelected);
                    $scope.affectedOrgIds.push(
                        {
                            OrganizationStateId: typeOrStateId,
                            Orgs: result.orgs
                        });
                }
            }

        });
    }

    $scope.init = function () {
        $scope.getAllSystemOrganizationType();
        $scope.getSystemState();
    };

    $scope.resetController = () => {
        $scope.currentListDisplayed = [];
        $scope.showCompletedMessage = false;

        $scope.applyToOptions = [
                { optionId: 1, optionName: 'Organization Type' },
                { optionId: 2, optionName: 'Organization Status' }
        ];

        $scope.selectDeselectAllText = 'Select all';
        $scope.affectedOrgIds = [];
    };

    $rootScope.$on("resetTab", (event, tabMode) => {
        //This is mainly for if user was working in the advisor tab, but selects another tab, reset the advisor tab
        if (!tabMode.advisors) {

            $scope.resetController();

            $scope.init()
        };
    });

});;
app.controller('orgRegistrationAdvisorController', function ($scope, RegistrationDetailService) {

    $scope.organizationRegistrationId;
    $scope.advisors;
    $scope.invalidAdvisorMessage = false;
    $scope.duplicateOfficer = false;
    $scope.showAdvisorSavedMessage = false;
    $scope.userEligible = true;
    $scope.ineligibleEmail;

    $scope.advisorIsValid = false;

    $scope.updateAdvisorInfo = function () {

        //Check if the form is private and if the user is still logged in or if they timed out and need to login again
        var appAccessWUserLoginStatusPromise = RegistrationDetailService.appAccessWUserLoginStatus(null, $scope.organizationRegistrationId);

        appAccessWUserLoginStatusPromise.then(function (response) {
            var isApplicationPublic = response.data.appPublic;
            var loggedIn = response.data.userIsLoggedIn;
            
            if (!isApplicationPublic && !loggedIn) {

                var url = (window.location.protocol) + '//' + window.location.host + '/auth/login/';
                window.location = url;

            } else {
                angular.forEach($scope.advisors, function (advisor) {

            

                            if (advisor.HaveMoreThanOneResult) {
                                delete advisor.HaveMoreThanOneResult;
                            }
                            if (advisor.possibleUsers) {
                                delete advisor.possibleUsers;
                            }
                            if (advisor.selectedUser) {
                                advisor.UserProfileId = advisor.selectedUser.UserProfileId;
                                advisor.FirstName = advisor.selectedUser.FirstName;
                                advisor.LastName = advisor.selectedUser.LastName;
                                advisor.FullName = advisor.selectedUser.FullName;
                                advisor.StudentId = advisor.selectedUser.StudentId;
                                advisor.Email = advisor.selectedUser.Email;
                                delete advisor.selectedUser;
                            }
                });

                $scope.invalidAdvisorMessage = false;
                $scope.duplicateOfficer = false;
                $scope.showAdvisorSavedMessage = false;
                var promise = RegistrationDetailService.updateAdvisorInfo($scope.organizationRegistrationId, $scope.advisors);
                promise.then(function (response) {
                    var data = response.data;

                    $scope.advisorInfo.$setPristine();

                    if (typeof data === 'string' && data.includes('@')) {
                        $scope.userEligible = false;
                        $scope.ineligibleEmail = data;
                    }
                    else if (data === -1) {
                        $scope.duplicateOfficer = true;
                        $scope.advisorIsValid = false;
                    } else if (data === 0) {
                        $scope.invalidAdvisorMessage = true;
                        $scope.advisorIsValid = false;
                    } else if (data == 1) {
                        $scope.advisorIsValid = true;
                        url = (window.location.protocol) + '//' + window.location.host + '/Register/ExtendedProperties/Index/' + $scope.organizationRegistrationId;
                        window.location = url;
                    } else {
                        $scope.advisorIsValid = true;
                        url = (window.location.protocol) + '//' + window.location.host + '/Register/Default/Review/' + $scope.organizationRegistrationId;
                        window.location = url;
                    }
                });
            }
        });
    };

    $scope.getAdvisorDetail = function (userInput, index) {

        //reset if previous user searched was ineligible
        $scope.userEligible = true;
        $scope.ineligibleEmail = '';

        var promise = RegistrationDetailService.getAdvisorDetail(userInput);
        promise.then(function (response) {
            if (response.data && Object.prototype.toString.call(response.data) === '[object Array]') {
                if (response.data.length > 1) {
                    $scope.advisors[index].HaveMoreThanOneResult = true;
                    $scope.advisors[index].possibleUsers = response.data;
                    $scope.advisors[index].possibleUsers.unshift({ UserId: -1, FullName: '- Please Select the User -' });
                    if ($scope.advisors[index].UserProfileId <= 0) {
                        $scope.advisors[index].UserProfileId = -1;
                    } else {
                        $scope.advisors[index].selectedUser = {
                            UserProfileId: $scope.advisors[index].UserProfileId,
                            FullName: $scope.advisors[index].FullName,
                            Email: $scope.advisors[index].Email
                        };
                    }
                } else {
                    if (response.data.length <= 0 || !response.data[0].FullName) {
                        response.data.push({ FullName: 'Invalid User', UserProfileId: 0 });
                    }
                    $scope.advisors[index].FullName = response.data[0].FullName;
                    $scope.advisors[index].UserProfileId = response.data[0].UserProfileId;
                }
            } else {
                $scope.registration.registrationDataOverview.Advisors[index].FullName = 'Invalid Email';
                $scope.registration.registrationDataOverview.Advisors[index].UserProfileId = 0;
            }
        });
    };

    $scope.addAdvisor = function () {
        if ($scope.advisors.length < 5) {
            var promise = RegistrationDetailService.addAdvisor($scope.advisors);
            promise.then(function (response) {
                var data = response.data;
                $scope.advisors.push(data);
            });
        }
    };

    $scope.removeAdvisor = function (index) {
        if ($scope.advisors.length > 1) {
            var promise = RegistrationDetailService.removeAdvisor($scope.advisors, index, $scope.organizationRegistrationId);
            promise.then(function (response) {
                var data = response.data;
                $scope.advisors = data;
                $scope.getAllAdvisors();
                $scope.advisorInfo.$setPristine();
            });
        }
    };

    $scope.getAllAdvisors = function () {
        var promise = RegistrationDetailService.getAllAdvisors($scope.organizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.advisors = data;
        });
    };

    $scope.init = function () {
        $scope.getAllAdvisors();
    };

    $scope.init();
});
app.controller('organizationCategoryController', function($scope, OrganizationCategoryService, CategoryServices) {
    $scope.categories = {};

    $scope.systemCategories = {};
    $scope.selectedCategory = {};

    $scope.removeCategory = function (orgCategory) {
        var promise = OrganizationCategoryService.removeCategory(orgCategory);
        promise.then(function (response) {
            $scope.init();
        });
    };

    $scope.addCategory = function() {
        var promise = OrganizationCategoryService.addCategory($scope.selectedCategory, $scope.organizationId);
        promise.then(function (response) {
            $scope.init();
        });
    };

    $scope.getOrgCategories = function (organizationId) {
        var promise = OrganizationCategoryService.getOrgCategories(organizationId);
        promise.then(function (response) {
            $scope.categories = response.data;
        });
    };

    $scope.getSystemCategoriesByOrganizationId = function(organizationId) {
        var promise = CategoryServices.getSystemCategoriesByOrganizationId(organizationId);
        promise.then(function(response) {
            $scope.systemCategories = response.data;
        });
    };

    $scope.init = function () {
        $scope.getOrgCategories($scope.organizationId);
        $scope.getSystemCategoriesByOrganizationId($scope.organizationId);
    };

    $scope.init();
});
app.controller('extendedPropertyAdminController', function ($scope, $log, $uibModal, ExtendedPropertyService) {
    $scope.allPropertyGroups;

    var $ctrl = this;

    $scope.editPropertyGroup = function (group) {
        $ctrl.varList = group;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/extendedPropertyGroup.html',
            controller: 'extendedPropertyGroupModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
            $scope.getAllPropertyGroups();
        });
    };

    $scope.removePropertyGroup = function (propertyGroup) {
        $ctrl.varList = 'Extended Property Group';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = ExtendedPropertyService.removePropertyGroup(propertyGroup);
                promise.then(function (response) {
                    $scope.getAllPropertyGroups();
                });
            }
        }, function () {

        });
    };

    $scope.createExtendedPropertyGroup = function () {
        $ctrl.varList = {
            PropertyGroupId: 0,
            Zone: 1,
            ZoneId: 1,
            GroupName: null,
            Public: 0,
            Created: null,
            Deleted: null
        };
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/extendedPropertyGroup.html',
            controller: 'extendedPropertyGroupModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {

        }, function () {
            $scope.getAllPropertyGroups();
        });
    };

    $scope.getAllPropertyGroups = function () {
        var promise = ExtendedPropertyService.getAllPropertyGroups();
        promise.then(function (response) {
            $scope.allPropertyGroups = response.data;
        });
    };

    $scope.init = function () {
        $scope.getAllPropertyGroups();
    };

    $scope.init();
});
app.controller('extendedPropertyController', function ($scope, ExtendedPropertyService) {
    $scope.organizationId;
    $scope.propertyGroups;

    $scope.getPropertyGroups = function () {
        var promise = ExtendedPropertyService.getPropertyGroups($scope.organizationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.propertyGroups = data;
        });
    };

    $scope.init = function () {
        $scope.getPropertyGroups();
    };

    $scope.init();
});
app.controller('extendedPropertyDetailAdminController', function ($scope, $log, $uibModal, ExtendedPropertyService) {
    $scope.propertyGroupId;
    $scope.extendedProperties;

    var $ctrl = this;

    $scope.removeProperty = function (property) {
        $ctrl.varList = 'Extended Property';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = ExtendedPropertyService.removeProperty(property);
                promise.then(function (response) {
                    $scope.getExtendedPropertyDetail($scope.propertyGroupId);
                });
            }
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.editProperty = function (property) {
        $ctrl.varList = property;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/sysExtendedProperty.html',
            controller: 'sysExtendedPropertyModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {

        }, function () {
            $log.info('Modal dismissed');
            $scope.getExtendedPropertyDetail($scope.propertyGroupId);
        });
    };

    $scope.createExtendedProperty = function () {
        $ctrl.varList = {
            ExtendedPropertyId: 0,
            PropertyGroupId: $scope.propertyGroupId,
            PropertyName: null,
            PropertyDisplayName: null,
            PropertyType: 0,
            PossibleValues: null,
            DefaultValue: null,
            DateAdded: null,
            DateDeleted: null
        };
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/sysExtendedProperty.html',
            controller: 'sysExtendedPropertyModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {

        }, function () {
            $log.info('Modal dismissed');
            $scope.getExtendedPropertyDetail($scope.propertyGroupId);
        });
    };

    $scope.getExtendedPropertyDetail = function (propertyGroupId) {
        var promise = ExtendedPropertyService.getExtendedPropertyDetail(propertyGroupId);
        promise.then(function (response) {
            $scope.extendedProperties = response.data;
        });
    };

    $scope.init = function (propertyGroupId) {
        $scope.propertyGroupId = propertyGroupId;
        $scope.getExtendedPropertyDetail(propertyGroupId);
    };

});;
app.controller('extendedPropertyDetailController', function ($scope, ExtendedPropertyService) {
    $scope.organizationId;
    $scope.propertyGroupId;
    $scope.extendedProperties;
    $scope.status = 0;

    $scope.saveProperties = function () {
        var promise = ExtendedPropertyService.saveProperties($scope.extendedProperties, $scope.organizationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.status = data;
            if ($scope.status === 1)
            {
                $scope.getExtendedProperties();
            }
            $scope.propertiesForm.$setPristine();

        });
    };

    $scope.getExtendedProperties = function () {
        var promise = ExtendedPropertyService.getExtendedProperties($scope.organizationId, $scope.propertyGroupId);
        promise.then(function (response) {
            var data = response.data;
            $scope.extendedProperties = data;
        });
    };

    $scope.init = function () {
        $scope.getExtendedProperties();
    };

    $scope.init();
}).filter('commaspliter', function () {
    return function (input) {
        return input.split(',');
    }
});;
app.controller('extendedPropertyRegistrationController', function ($scope, ExtendedPropertyService) {
    $scope.registrationId;
    $scope.propertyGroups;

    $scope.saveProperties = function () {
        var promise = ExtendedPropertyService.saveExtendedPropertyGroups($scope.propertyGroups, $scope.registrationId);
        promise.then(function (response) {
            var data = response.data;
            if (data === 1) {
                url = (window.location.protocol) + '//' + window.location.host + '/Register/Default/Review/' + $scope.registrationId;
                window.location = url;
            }
        });
    };

    $scope.getExtendedPropertyGroups = function () {
        var promise = ExtendedPropertyService.getExtendedPropertyGroups($scope.registrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.propertyGroups = data;
        });
    };

    $scope.init = function () {
        $scope.getExtendedPropertyGroups();
    };

    $scope.init();

}).filter('commaspliter', function () {
    return function (input) {
        return input.split(',');
    }
});;
app.controller('adminMemberController', function ($scope, OrganizationMemberService, $uibModal, $log) {
    $scope.organizationId;

    var $ctrl = this;
    $scope.members = [];

    $scope.changeStatus = function () {
        $ctrl.varList = $scope.organizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/bulkChangeMemberStatus.html?c=' + (new Date()).getTime(),
            controller: 'bulkChangeMemberStatusController',
            controllerAs: '$ctrl',
            size: 'lg',
            backdrop: true,
            keyboard: true,
            resolve: {
                varList2: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                location.reload();
            }
        }, function () {

        });
    };

    $scope.addMembers = function () {
        $ctrl.varList = $scope.organizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/addOrganizationMembers.html?c=' + (new Date()).getTime(),
            controller: 'addOrganizationMemberModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                location.reload();
            }
        }, function () {

        });
    };

    $scope.editMember = function (member) {
        $ctrl.varList = member;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/organizationMember.html?c=' + (new Date()).getTime(),
            controller: 'organizationMemberModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1)
            {
                location.reload();
            }
        }, function () {
            
        });
    };

    

}).filter('commaspliter', function () {
    return function (input) {
        return input.split(',');
    }
});;
app.controller('bulkChangeMemberStatusController', function ($scope, $uibModal, OrganizationMemberService, OrgOfficerService, varList2, $uibModalInstance) {

    $scope.currentPage = 1;
    $scope.itemsPerPage = 12;
    $scope.itemsOptions = [12, 24, 48, 96];
    $scope.delayTime = 700;

    $scope.members = [];
    $scope.originalMembers = [];

    $scope.isPresident = false;
    var $ctrl = this;

    $scope.cancel = function () { $uibModalInstance.close(1); };

    $scope.selectedMembers = [];
    $scope.calculateSelectedMembers = function () {
        var tempMembers = [];
        angular.forEach($scope.filteredMembers, function (member) {
            if (member.Checked) {
                tempMembers.push(member);
            }
        });
        $scope.selectedMembers = tempMembers;
        return $scope.selectedMembers.length;
    };

    $scope.changeMemberStatus = function () {
        var memberIds = '';
        angular.forEach($scope.selectedMembers, function (member) {
            memberIds = memberIds + member.MemberId + ',';
        });
        $ctrl.varList = [varList2, memberIds];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/changeMemberStatus.html?c=' + (new Date()).getTime(),
            controller: 'changeMemberStatusModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'md',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.getFilteredMembers();
            }
        }, function () {

        });
    };

    $scope.addMembers = function () {
        $ctrl.varList = $routeParams.organizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/addOrganizationMembers.html?c=' + (new Date()).getTime(),
            controller: 'addOrganizationMemberModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.getFilteredMembers();
            }
        }, function () {

        });
    };

    $scope.checkIfUserIsPresident = function () {
        //OrgOfficerService.checkIfUserIsPresident($routeParams.organizationId).then(function (response) {
        //    $scope.isPresident = response.data;
        //});
        $scope.isPresident = true;
    };

    $scope.getFilteredMembers = function () {
        var promise = OrganizationMemberService.getAllOrganizationMembers(varList2);
        promise.then(function (response) {
            $scope.members = response.data;
            $scope.originalMembers = $scope.members;
        });
    };

    $scope.init = function () {
        $scope.getFilteredMembers();
        $scope.checkIfUserIsPresident();
    };

    $scope.init();
});;
app.controller('orgMemberListController', function ($scope, $filter,$uibModal) {
    // BEGIN scope LEVEL VARIABLES
  

   $scope.addMemberClicked = function () {
       showAddMemberTemplateModal();
   }


   function showAddMemberTemplateModal() {
       var modalInstance = $uibModal.open({
           animation: true,
           ariaLabelledBy: 'modal-title',
           ariaDescribedBy: 'modal-body',
           templateUrl: 'addMemberTemplate.html',
           scope: $scope,
           controller: 'AddMemberTemplateCtrl',
           controllerAs: '$ctrl',
           size: ''
       });
   }


});

app.controller('AddMemberTemplateCtrl', function ($scope, $uibModalInstance, AdminOfficerService,AdminOrgMemberService) {
    var $ctrl = this;
    $ctrl.isDeleted = false;
    $ctrl.studentId = 0;
    $ctrl.memberExistsAlready = 0;
   
    $ctrl.close = function () {
        $uibModalInstance.dismiss('cancel');

       
    };

    
    

    $scope.getUserInfo = function (userInput) {
        $scope.isValid = null;
        $scope.loading = true;
        $scope.status = 0;
        $ctrl.memberExistsAlready = 0;
      

        var promise = AdminOfficerService.getUserInfo(userInput);

        promise.then(function (response) {
            var data = response.data;

            $scope.firstName = data.FirstName;
            $scope.lastName = data.LastName;
            $scope.studentId = data.StudentId;
            $scope.email = data.Email;
            $scope.userId = data.UserProfileId;
            $ctrl.studentId = data.StudentId;
            $ctrl.userProfileId = data.UserProfileId;

            if ($scope.studentId > 0) {
                $scope.isValid = 1;
            }
            else {
                $scope.isValid = 0;
            }
            $scope.loading = false;

        });
    };


    $ctrl.addClicked = function () {
       
        var temp = window.location.pathname.split('/');
        var organizationId = temp[3];

        var member = {
            OrganizationId: organizationId,
            UserProfileId: this.userProfileId
        }

        AdminOrgMemberService.updateMember(member).then(function (response) {
            if (response.data.MemberId <= 0) {
                $ctrl.memberExistsAlready = 1;
            }
            else {
                window.location.reload();
            }
        });
    }



});;
app.controller('sysOrganizationMembershipStatusController', function ($scope, SysOrganizationMembershipStatusService, $uibModal) {
    $scope.organizationTypeId;
    $scope.membershipStatusList;

    var $ctrl = this;

    $scope.editMembershipStatus = function (membershipStatus) {
        $ctrl.varList = membershipStatus;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/membershipStatus.html',
            controller: 'membershipStatusModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
            $scope.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId();
        });
    };

    $scope.removeMembershipStatus = function (membershipStatus) {
        $ctrl.varList = 'Membership Status';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = SysOrganizationMembershipStatusService.removeMembershipStatus(membershipStatus);
                promise.then(function (response) {
                    $scope.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId();
                });
            }
        }, function () {

        });
    };

    $scope.createMembershipStatus = function () {
        $ctrl.varList = {
            MembershipStatusId: 0,
            OrganizationTypeId: $scope.organizationTypeId,
            StatusName: '',
            StatusType: 0,
            DefaultStatus: 0,
            PublicStatus: 0,
            Created: null,
            Deleted: null
        };
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/membershipStatus.html',
            controller: 'membershipStatusModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $scope.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId();
        });
    };

    $scope.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId = function () {
        var promise = SysOrganizationMembershipStatusService.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId($scope.organizationTypeId);
        promise.then(function (response) {
            $scope.membershipStatusList = response.data;
        });
    };

    $scope.init = function () {
        $scope.getSystemOrganizationMembershipStatusOverviewByOrganizationTypeId();
    };

    $scope.init();
});

app.controller('adminOfficerController', function ($scope, AdminOfficerService) {

    $scope.userInput;
    $scope.orgId;
    $scope.firstName;
    $scope.lastName;
    $scope.studentId;
    $scope.email;
    $scope.isValid = 0;
    $scope.userId;
    $scope.positionId;
    $scope.status = 0;
    $scope.duplicate = false;
    $scope.loading = false;
    $scope.profileIssueMessage = false;
    $scope.notEligible = false;

    $scope.getUserInfo = function (userInput) {
        $scope.profileIssueMessage = false;
        $scope.loading = true;
        $scope.status = 0;
        var promise = AdminOfficerService.getUserInfo(userInput);
        promise.then(function (response) {
            var data = response.data;
            $scope.firstName = data.FirstName;
            $scope.lastName = data.LastName;
            $scope.studentId = data.StudentId;
            $scope.email = data.Email;
            $scope.userId = data.UserProfileId;

            //rare cases, but sometimes users don't have a uf email in the system and need to update in myUFL
            if ((!data.Email && data.StudentId) || (data.Email && !data.StudentId)) {
                $scope.profileIssueMessage = true;
            }

            if ($scope.studentId > 0) {
                $scope.isValid = 1;
            }
            else {
                $scope.isValid = 0;
            }
            $scope.loading = false;
            $scope.duplicate = false;
        });
    };

    $scope.assignOfficer = function (userInput) {
        $scope.profileIssueMessage = false;
        $scope.duplicate = false;
        $scope.notEligible = false;
        var promise = AdminOfficerService.assignOfficer(userInput, $scope.positionId, $scope.orgId);

        promise.then(function(response) {
            var data = response.data;
            //console.log(response.data);
            if (data === undefined || data === null) {
                $scope.isValid = false;

            } else if (data === 2) {
                //console.log("I get here");
                $scope.notEligible = true;
            }
            else if (data.OfficerId === 0) {
                $scope.duplicate = true;
            } else if (data.StudentId !== undefined && data.StudentId !== '') {
                var url = (window.location.protocol) +
                    '//' +
                    window.location.host +
                    '/Admin/Organization/' +
                    $scope.orgId +
                    '/Officers/Index';
                window.location = url;
            } else {
                $scope.status = 1;
            }
        });
    }

    $scope.overrideOfficer = function (userInput) {
        $scope.profileIssueMessage = false;
        $scope.duplicate = false;
        $scope.notEligible = false;
        var promise = AdminOfficerService.overrideOfficer(userInput, $scope.positionId, $scope.orgId);

        promise.then(function (response) {
            var data = response.data;
            //console.log(response.data);
            if (data === undefined || data === null) {
                $scope.isValid = false;

            } else if (data === 2) {
                //console.log("I get here");
                $scope.notEligible = true;
            }
            else if (data.OfficerId === 0) {
                $scope.duplicate = true;
            } else if (data.StudentId !== undefined && data.StudentId !== '') {
                var url = (window.location.protocol) +
                    '//' +
                    window.location.host +
                    '/Admin/Organization/' +
                    $scope.orgId +
                    '/Officers/Index';
                window.location = url;
            } else {
                $scope.status = 1;
            }
        });
    }

});
app.controller('manageFollowersController',
    function ($scope, $routeParams, $uibModal, OrgOfficerService, OrgService) {

        $scope.loadingUsers = false;
        $scope.itemsPerPage = 10;
        $scope.currentPage = 1;
        $scope.alerts = [];
        $scope.selectedPermissionType = { PermissionTypeId: 0 };

        $scope.composeEmail = function (officer) {
            var modalInstance = $uibModal.open({
                animation: true,
                templateUrl: '/app/views/officers/composeOfficerEmail.html?c=' + (new Date()).getTime(),
                controller: function ($scope, $uibModal, $uibModalInstance, alerts, officer, OrgOfficerService) {
                    $scope.officer = officer;
                    $scope.message = {};
                    $scope.cancel = function () {
                        $uibModalInstance.close();
                    }
                    $scope.sendEmail = function () {
                        var promise = OrgOfficerService.sendEmailToOfficer($scope.message);
                        promise.then(function (response) {
                            $uibModalInstance.close();
                            alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                        }, function (data) {  });
                    };
                    $scope.init = function () {
                        $scope.message = {
                            officerId: officer.UserId,
                            subject: '',
                            message: ''
                        }
                    };
                    $scope.init();
                },
                resolve: {
                    alerts: function () {
                        return $scope.alerts;
                    },
                    officer: function () { return officer; }
                }
            });
            modalInstance.result.then(function () { }, function () { });
        };

        $scope.closeAlert = function (index) {
            $scope.alerts.splice(index, 1);
        };

        $scope.loadFollowers = function () {
            OrgService.getOrgFollowers($scope.organizationId).then(function (response) {
            $scope.followers = response.data;
            });
        }

        $scope.propertyName = '-FriendlyPermitNumber';
        $scope.reverse = false;

        $scope.changeOrderByProperty = function (newPropertyName) {
            $scope.propertyName = '-' + newPropertyName;
            $scope.reverse = !$scope.reverse;
        };

        $scope.init = function() {
            if ($routeParams.organizationId) {
                $scope.organizationId = $routeParams.organizationId;
                $scope.loadFollowers();   
            }
        };

        $scope.init();
    });;
app.controller('manageOrganizationOfficerPermissionController',
    function ($scope, $routeParams, OrganizationPermissionService, $uibModal, OrgOfficerService) {

        $scope.itemsPerPage = 10;
        $scope.currentPage = 1;
        $scope.loadingUsers = false;

        $scope.organizationId;

        $scope.organizationPermission = {};

        $scope.orgOfficerPermissionOverview = [];

        $scope.alerts = [];

        // For Future Use, if there will be more than just Events Reservation Permission
        $scope.permissionTypes = [
            {
                PermissionTypeId: 0,
                PermissionTypeName: 'Events Reservation'
            }
        ];

        $scope.selectedPermissionType = { PermissionTypeId: 0 };

        $scope.composeEmail = function (officer) {
            
            var modalInstance = $uibModal.open({
                animation: true,
                templateUrl: '/app/views/officers/composeOfficerEmail.html?c=' + (new Date()).getTime(),
                controller: function ($scope, $uibModal, $uibModalInstance, alerts, officer, OrgOfficerService) {
                    $scope.officer = officer;
                    $scope.message = {};
                    $scope.cancel = function () {
                        $uibModalInstance.close();
                    }
                    $scope.sendEmail = function () {
                        var promise = OrgOfficerService.sendEmailToOfficer($scope.message);
                        promise.then(function (response) {
                            $uibModalInstance.close();
                            alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                        }, function (data) {  });
                    };
                    $scope.init = function () {
                        $scope.message = {
                            officerId: officer.OfficerId,
                            subject: '',
                            message: ''
                        }
                    };
                    $scope.init();
                },
                resolve: {
                    alerts: function () {
                        return $scope.alerts;
                    },
                    officer: function () { return officer; }
                }
            });
            modalInstance.result.then(function () { }, function () { });
        };

        $scope.closeAlert = function (index) {
            $scope.alerts.splice(index, 1);
        };

        $scope.togglePermission = function(officerPermissionOverview, index) {
            var promise = OrganizationPermissionService.togglePermission(officerPermissionOverview,
                $scope.organizationId,
                $scope.selectedPermissionType.PermissionTypeId);
            promise.then(function(response) {
                $scope.orgOfficerPermissionOverview[index] = response.data;
            });
        };

        $scope.getOfficerPermissionOverview = function () {
            var promise = OrganizationPermissionService.getOfficerPermissionOverview($scope.organizationId, $scope.selectedPermissionType.PermissionTypeId);
            promise.then(function(response) {
                $scope.orgOfficerPermissionOverview = response.data;
            });
        };

        $scope.init = function() {
            if ($routeParams.organizationId) {
                $scope.organizationId = $routeParams.organizationId;
                
                $scope.getOfficerPermissionOverview();
            }
            else {
               
                $scope.getOfficerPermissionOverview();
            }
           
        };

        $scope.init();
    });;
app.controller('officerController', function ($scope, OfficerService, $uibModal, $log, RegistrationDetailService) {
    $scope.loading = false;
    $scope.organizationRegistrationId;
    $scope.selectedPosition = 0;
    $scope.varList = [];
    $scope.allPositionsView = {};
    $scope.hasDuplicates = false;
    $scope.notEligible = false;

    var $ctrl = this;

    $scope.isUndefinedOrNull = function (val) {
        return angular.isUndefined(val) || val === null
    };

    $scope.check = function (position) {
        if (!position.IsAdded && !position.IsRequired)
        {
            return true;
        }
        return false;
    };

    $scope.createNewPosition = function () {
        $scope.varList = [];
        for (var i = 0; i < $scope.allPositionsView.Positions.length; i++)
        {
            $scope.varList.push($scope.allPositionsView.Positions[i].PositionTitle);
        }

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'newPosition.html',
            controller: 'ModalNewPositionCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $scope.varList;
                }
            }
        });

        modalInstance.result.then(function (varList) {
            $scope.varList = varList;
            $scope.allPositionsView.Positions = $scope.allPositionsView.Positions.concat([{FullName: null, IsAdded: true, IsRequired: false, IsValid: false, PositionId: 0, PositionTitle: $scope.varList, StudentId: null, Email: null}]);
            $scope.allPositionsView.RequiredPositionsValid = false;
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.updateUserInfo = function () {
        var promise = OfficerService.updateUserInfo($scope.allPositionsView);
        promise.then(function (response) {
            var data = response.data;
            var invalidCount = 0;
            $scope.allPositionsView = data;
            //console.log(data);
            var valueArr = data.Positions.map(function (item) {
                if (!item.IsValid)
                    return { Email: item.Email, StudentId: item.StudentId, UserId: item.UserId };
            });

            for (var i=0; i < data.Positions.length; i++)
            {
                if (!data.Positions[i].IsValid && data.Positions[i].IsAdded)
                {
                    invalidCount++;
                }
            }

            

           // $scope.allPositionsView.DuplicateExist = (invalidCount > 0);

        });
    };

    $scope.addPosition = function () {
        if (!$scope.isUndefinedOrNull($scope.selectedPosition.PositionId)) {
            for(var i = 0; i < $scope.allPositionsView.Positions.length; i++)
            {
                if ($scope.allPositionsView.Positions[i].PositionId === $scope.selectedPosition.PositionId && $scope.selectedPosition.PositionId > 0)
                {
                    $scope.allPositionsView.Positions[i].IsAdded = true;
                    $scope.allPositionsView.RequiredPositionsValid = false;
                    break;
                } else if ($scope.selectedPosition.PositionId === 0 && $scope.allPositionsView.Positions[i].PositionTitle.toUpperCase() === $scope.selectedPosition.PositionTitle.toUpperCase())
                {
                    $scope.allPositionsView.Positions[i].IsAdded = true;
                    $scope.allPositionsView.RequiredPositionsValid = false;
                    break;
                }
            }
        }
    };

    $scope.removePosition = function (positionId, positionTitle) {
        if (!$scope.isUndefinedOrNull(positionId)) {
            $scope.allPositionsView.RequiredPositionsValid = true;
            for (var i = 0; i < $scope.allPositionsView.Positions.length; i++) {
                if ($scope.allPositionsView.Positions[i].PositionId === positionId && positionId > 0) {
                    $scope.allPositionsView.Positions[i].IsAdded = false;
                    continue;
                } else if (positionId === 0 && $scope.allPositionsView.Positions[i].PositionTitle.toUpperCase() === positionTitle.toUpperCase())
                {
                    $scope.allPositionsView.Positions[i].IsAdded = false;
                    continue;
                } else if (($scope.allPositionsView.Positions[i].IsRequired || $scope.allPositionsView.Positions[i].IsAdded) && !$scope.allPositionsView.Positions[i].IsValid)
                {
                    $scope.allPositionsView.RequiredPositionsValid = false;
                    continue;
                }
            }
        }
    };

    $scope.getAllPositions = function () {
        var promise = OfficerService.getAllPositions($scope.organizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.allPositionsView = data;
            console.log($scope.allPositionsView);
        });
    };

    $scope.updateAllPositions = function () {

        //Check if the form is private and if the user is still logged in or if they timed out and need to login again
        var appAccessWUserLoginStatusPromise = RegistrationDetailService.appAccessWUserLoginStatus(null, $scope.organizationRegistrationId);

        appAccessWUserLoginStatusPromise.then(function (response) {
            var isApplicationPublic = response.data.appPublic;
            var loggedIn = response.data.userIsLoggedIn;

            if (!isApplicationPublic && !loggedIn) {

                var url = (window.location.protocol) + '//' + window.location.host + '/auth/login/';
                window.location = url;

            } else {
                var promise = OfficerService.updateAllPositions($scope.allPositionsView);
                promise.then(function (response) {
                    var data = response.data;
                    console.log(data);
                    if (data.IsValid) {
                        var url = (window.location.protocol) +
                            '//' +
                            window.location.host +
                            '/Register/Advisor/Index/' +
                            $scope.organizationRegistrationId;
                        window.location = url;
                    } else {
                        if (!data.IsEligible) {
                            $scope.notEligible = true;
                        }
                        $scope.allPositionsView = data;
                    }
                });
            }
        });
    };

    $scope.init = function () {
        $scope.getAllPositions();
    };

    $scope.init();

});

app.controller('ModalNewPositionCtrl', function ($scope, $uibModalInstance, OfficerService, varList) {
    var $ctrl = this;
    $scope.pTitle;
    $scope.duplicatePosition = false;

    $ctrl.newPosition = function () {
        $scope.duplicatePosition = false;

        for (var i = 0; i < varList.length; i++) {
            if ($scope.pTitle.toUpperCase() === varList[i].toUpperCase()) {
                $scope.duplicatePosition = true;
            }
        }
        if (!$scope.duplicatePosition) {
            $uibModalInstance.close($scope.pTitle);
        }
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});

app.controller('officerPermitDetailController', function ($scope, PermitService, NoteTemplatesService) {

    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.permitCategories = {};
    $scope.associatedApplications = {};
    $scope.loading = true;
    $scope.permitDates = {};

    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    };

    $scope.submitPermit = function () {
        var promise = PermitService.userSubmitPermit($scope.permitVersion);
        promise.then(function (response) {
            self.advancedUrl = self.advancedUrl.format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
            window.location.href = self.advancedUrl;
        });
    };

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            self.loadPermitDates();
            self.loadPermitCategories();
            $scope.getPermitNotes(false);
        });
    };

    self.loadPermitDates = function () {
        var promise = PermitService.userGetPermitDates($scope.permitVersionId);
        promise.then(function (response) {
            var data = JSON.parse(response.data);
            $scope.permitDates = data.map(function (x) {
                return { PermitVersionId: x.PermitVersionId, Start: (new Date(x.Start)).formatDateTime(), End: (new Date(x.End)).formatDateTime(), Location: x.Location, PermitDateId: x.PermitDateId, Status: x.Status };
            });
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getSelectedPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = PermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    $scope.init = function (permitVersionId) {
        $scope.permitVersionId = permitVersionId;
        self.loadPermitVersion();
        $scope.getNoteTemplates();   
    };

    

    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };


    //notes section

    $scope.getPermitNotes = function (includeDeleted) {
        PermitService.getPermitNotes($scope.permitVersionId, includeDeleted).then(function (response) {
            $scope.currentPermitNotes = response.data;
        });
    };

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };


    $scope.newPermitNote = function (parentNoteId, IsPrivate) {



  
        PermitService.newPermitNote($scope.permitVersionId, parentNoteId).then(function (response) {
                    var note = response.data;
                    response.data.Note = $scope.newNoteText;
                    $scope.makeNotePublic(note);
                    // $scope.updatePermitNote(response.data);
                    //$scope.currentPermitNotes.push(response.data);
                    $scope.newNoteText = "";
                

            });
        
    };
    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };
    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes(false);
        });
    };

    $scope.getNoteTemplates = function (zoneId) {
        NoteTemplatesService.getNoteTemplates(zoneId).then(function (response) {

            $scope.noteTemplates = response.data;
        });
    };
    $scope.noteTemplateSelected = function (isPrivate) {

       
            $scope.newNoteText = this.noteTemplate;
        
    };
    //notes section ends

});

app.controller('officerComposeEmailController', function($scope, $uibModal, $uibModalInstance, alerts, officer, OrgOfficerService) {
        $scope.officer = officer;
        $scope.message = {};
        $scope.cancel = function() {
            $uibModalInstance.close();
        }
        $scope.sendEmail = function() {

            var promise = OrgOfficerService.sendEmailToOfficer($scope.message);
            promise.then(function(response) {
                    $uibModalInstance.close();
                    if (alerts !== undefined)
                        alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                },
                function(data) {  });
        };
        $scope.init = function() {
            $scope.message = {
                officerId: officer.OfficerId,
                subject: '',
                message: ''
            }
        };
        $scope.init();
})


app.controller('officerPermitDetailControllerSPA', function ($routeParams, $scope, PermitService, NoteTemplatesService, VendorPermitService, WorkflowService) {

    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.permitCategories = {};
    $scope.associatedApplications = {};
    $scope.loading = true;
    $scope.permitDates = {};
    $scope.permitPermissions = {};
    $scope.noteContent;

    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    };

    $scope.submitPermit = function () {
        var promise = PermitService.userSubmitPermit($scope.permitVersion);
        promise.then(function (response) {
            self.advancedUrl = self.advancedUrl.format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
            window.location.href = self.advancedUrl;
        });
    };

    //**Tracker V1 START (multicolor version of V2)**
    //$scope.statusStep = 0;
    //var pendingReviewPercentage = 10;
    //var generalReviewPercentage = 0;
    //var finalReviewPercentage = 0;

    //$scope.getPermitApprovalsNeededCount = function (processId) {
        

    //    var promise = WorkflowService.getPermitApprovalsNeededCount(processId);
    //    promise.then(function (resp) {

    //        $scope.CurrentTotalApprovals = resp.data.CurrentTotalApprovals;
    //        $scope.TotalApproversNeeded = resp.data.TotalApproversNeeded;
    //        $scope.FinalReview = resp.data.FinalReview === 1 ? true : false;

    //        if ($scope.permitVersion.Status === 0) {
    //            $scope.displayText = `${$scope.CurrentTotalApprovals} of ${$scope.TotalApproversNeeded}`;

    //            $scope.calculatePercents();

    //        } else {
    //            $scope.displayText = '';
    //            $scope.statusStep = 4;

    //            generalReviewPercentage = 65;
    //            finalReviewPercentage = 25;
    //        }

    //        $scope.buildProgressBar(pendingReviewPercentage, generalReviewPercentage, finalReviewPercentage);
    //    });
    //}

    //$scope.calculatePercents = function () {
        
    //    //Pending review
    //    if ($scope.permitVersion.Status === 0 && $scope.TotalApproversNeeded < 0) {
    //        $scope.statusStep = 1;

    //    //Final review
    //    } else if ($scope.permitVersion.Status === 0 && $scope.FinalReview) {
    //        $scope.statusStep = 3;
    //        generalReviewPercentage = 65;

    //        if ($scope.CurrentTotalApprovals === 0) {
    //            finalReviewPercentage = 3;

    //        } else {
    //            finalReviewPercentage = ($scope.CurrentTotalApprovals * 25) / $scope.TotalApproversNeeded;
    //        }

    //    //General Review
    //    } else if ($scope.permitVersion.Status === 0 && $scope.TotalApproversNeeded > 0 && !$scope.FinalReview) {

    //        if ($scope.CurrentTotalApprovals > 0) {
    //            $scope.statusStep = 2;
    //            generalReviewPercentage = ($scope.CurrentTotalApprovals * 65) / $scope.TotalApproversNeeded;

    //        } else {
    //            $scope.statusStep = 1;
    //            $scope.displayText = '';
    //        }
    //    }
    //}

    //$scope.buildProgressBar = function (pendingPercent, generalPercent, finalPercent) {

    //    $scope.progressBar = [
    //        { value: 'Submitted', type: 'warning', length: pendingPercent },
    //        { value: 'General Review', type: null, length: generalPercent },
    //        { value: 'Final Review', type: 'success', length: finalPercent }
    //    ];

    //    switch ($scope.permitVersion.Status) {
    //        //case 0:
    //        //    $scope.progressBar[2].type = 'success';
    //        //    break;
    //        case 2:
    //            $scope.progressBar[2].type = 'danger';
    //            break;
    //        case 3:
    //            $scope.progressBar[2].type = 'warning';
    //            break;
    //        case 4:
    //            $scope.progressBar[2].type = 'warning';
    //            break;
    //        case 5:
    //            $scope.progressBar[2].type = 'success';
    //            break;
    //    }
    //}
    //**Tracker V1 END (multicolor version of V2)**

    //**Tracker V2 START (current version)**
    $scope.statusStep = 0; //Used to help hide or show things based on where in the process the permit is
    var pendingReviewPercentage = 10;
    var generalReviewPercentage = 0;
    var finalReviewPercentage = 0;

    //Percentages of the progress bar filled by the review sections
    var maxGenReviewPercent = 65;
    var maxFinalReviewPercent = 25;

    $scope.getPermitApprovalsNeededCount = function (processId) {
        var promise = WorkflowService.getPermitApprovalsNeededCount(processId);
        promise.then(function (resp) {

            $scope.CurrentTotalApprovals = resp.data.CurrentTotalApprovals;
            $scope.TotalApproversNeeded = resp.data.TotalApproversNeeded;
            $scope.FinalReview = resp.data.FinalReview === 1 ? true : false;

            if ($scope.permitVersion.Status === 0) {
                $scope.displayText = `${$scope.CurrentTotalApprovals} of ${$scope.TotalApproversNeeded}`;

                $scope.calculatePercents();//Progress bar section percents

            } else {
                $scope.displayText = '';
                $scope.statusStep = 4;

                generalReviewPercentage = maxGenReviewPercent;
                finalReviewPercentage = maxFinalReviewPercent;
            }

            $scope.buildProgressBar(pendingReviewPercentage, generalReviewPercentage, finalReviewPercentage);
        });
    }

    $scope.calculatePercents = function () {

        //Pending review
        if ($scope.permitVersion.Status === 0 && $scope.TotalApproversNeeded < 0) {
            $scope.statusStep = 1;

        //Final review
        } else if ($scope.permitVersion.Status === 0 && $scope.FinalReview) {
            $scope.statusStep = 3;
            generalReviewPercentage = maxGenReviewPercent;

            if ($scope.CurrentTotalApprovals > 0) {
                finalReviewPercentage = ($scope.CurrentTotalApprovals * maxFinalReviewPercent) / $scope.TotalApproversNeeded;
            }

        //General Review
        } else if ($scope.permitVersion.Status === 0 && $scope.TotalApproversNeeded > 0 && !$scope.FinalReview) {

            if ($scope.CurrentTotalApprovals > 0) {
                $scope.statusStep = 2;
                generalReviewPercentage = ($scope.CurrentTotalApprovals * maxGenReviewPercent) / $scope.TotalApproversNeeded;

            } else {
                $scope.statusStep = 1;
                $scope.displayText = '';
            }
        }
    }

    $scope.buildProgressBar = function (pendingPercent, generalPercent, finalPercent) {

        $scope.progressBar = [
            { value: 'Submitted', type: null, length: pendingPercent },
            { value: 'General Review', type: null, length: generalPercent },
            { value: 'Final Review', type: null, length: finalPercent }
        ];

        //Change color of entire bar to red, yellow, or green based on final status of denied, held/cancelled, or approved
        switch ($scope.permitVersion.Status) {
            case 2:
                $scope.progressBar.forEach(section => section.type = 'danger');
                break;

            case 3:
                $scope.progressBar.forEach(section => section.type = 'warning');
                break;

            case 4:
                $scope.progressBar.forEach(section => section.type = 'warning');
                break;

            case 5:
                $scope.progressBar.forEach(section => section.type = 'success');
                break;
        }
    };
    //**Tracker V2 END (current version)**

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            self.loadPermitDates();
            self.loadPermitCategories();
            self.loadPermitPermissions();
            $scope.getPermitNotes(false);
            $scope.getPermitApprovalsNeededCount($scope.permitVersion.ProcessId)
        });
    };

    self.loadPermitPermissions = function() {
        var promise = PermitService.getPermitPermissions($scope.permitVersionId);
        promise.then(function (response) {
            
            $scope.permitPermissions = response.data;
        });
    };

    self.loadPermitDates = function () {
        var promise = PermitService.userGetPermitDates($scope.permitVersionId);
        promise.then(function (response) {
            var data = JSON.parse(response.data);
            $scope.permitDates = data.map(function (x) {
                return { PermitVersionId: x.PermitVersionId, Start: (new Date(x.Start)).formatDateTime(), End: (new Date(x.End)).formatDateTime(), Location: x.Location, PermitDateId: x.PermitDateId, Status: x.Status };
            });
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getSelectedPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = PermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    $scope.init = function () {
        $scope.permitVersionId = $routeParams.permitVersionId;
        self.loadPermitVersion();
        $scope.getNoteTemplates();

    };



    $scope.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };


    //notes section

    $scope.getPermitNotes = function (includeDeleted) {
        PermitService.getPermitNotes($scope.permitVersionId, includeDeleted).then(function (response) {
            $scope.currentPermitNotes = response.data;
        });
    };

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };


    $scope.newPermitNote = function (parentNoteId, IsPrivate) {


        var noteContent = this.noteContent;
        this.noteContent = "";
        PermitService.newPermitNote($scope.permitVersionId, parentNoteId).then(function (response) {
            var note = response.data;
            response.data.Note = noteContent;
            $scope.makeNotePublic(note);
            // $scope.updatePermitNote(response.data);
            //$scope.currentPermitNotes.push(response.data);
            $scope.noteContent = "";

            var statusInfo = {
                IsPublicNote: true,
                NoteUnseen: true
            };

            //Mark public note as unread for admins
            //If organization is Business Affairs (1617), use VendorPermitService instead of the PermitService
            if ($scope.permitVersion.OrganizationId === 1617) {
                VendorPermitService.updateNoteStatusInfo($scope.permitVersionId, statusInfo);

            } else {
                PermitService.updateNoteStatusInfo($scope.permitVersionId, statusInfo);
            }
        });

    };
    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };
    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes(false);
        });
    };

    $scope.getNoteTemplates = function (zoneId) {
        NoteTemplatesService.getNoteTemplates(zoneId).then(function (response) {

            $scope.noteTemplates = response.data;
        });
    };
    $scope.noteTemplateSelected = function (isPrivate) {


        $scope.noteContent = this.noteTemplate;

    };
    //notes section ends

});;
app.controller('orgPositionController', function ($scope, OrgPositionService) {
    $scope.organizationId;
    $scope.isPublic = false;
    $scope.isRequired = false;
    $scope.positionTitle;
    $scope.duplicatePosition = false;

    $scope.addNewPosition = function () {
        $scope.duplicatePosition = false;

        var promise = OrgPositionService.addNewPosition($scope.organizationId, $scope.positionTitle, $scope.isPublic, $scope.isRequired);
        promise.then(function (response) {
            var data = response.data;

            if (data.PositionId > 0)
            {
                var url = (window.location.protocol) + '//' + window.location.host + '/Admin/Organization/' + $scope.organizationId + '/Officers/Index';
                window.location = url;
            }
            else
            {
                $scope.duplicatePosition = true;
            }
        });
    };
});;
app.controller('organizationStateController', function ($scope, OrganizationStateService) {
    $scope.organizationState;
    $scope.systemStates;
    $scope.stateHistory;
    $scope.organizationId;
    $scope.orgStateId;
    $scope.currentState;

    $scope.changed = false;

    $scope.updateOrganizationState = function () {
        var promise = OrganizationStateService.updateOrganizationState($scope.orgStateId, $scope.organizationState.OrganizationStateId);
        promise.then(function (response) {
            location.reload();
        });
    };

    $scope.getStateHistory = function () {
        var promise = OrganizationStateService.getStateHistory($scope.organizationId);
        promise.then(function (response) {
            $scope.stateHistory = response.data;
        });
    };

    $scope.getOrganizationState = function () {
        var promise = OrganizationStateService.getAdminOrganizationState($scope.organizationId);
        promise.then(function (response) {
            $scope.organizationState = response.data;
            $scope.orgStateId = $scope.organizationState.OrgStateId;
            $scope.getSystemState();
            $scope.getStateHistory();
            
        });
    };

    $scope.getSystemState = function () {
        var promise = OrganizationStateService.getSystemState();
        promise.then(function (response) {
            $scope.systemStates = response.data;
            $scope.currentState = $scope.systemStates.filter(function (state) {
                return (state.OrganizationStateId == $scope.organizationState.OrganizationStateId);
            });
        });
    };

    $scope.init = function (organizationId) {
        $scope.organizationId = organizationId;
        $scope.getOrganizationState();
    };

});;
app.controller('orgStateBulkUpdateController', function ($scope, OrganizationStateService, OrganizationTypeService, $timeout, $rootScope) {

    $scope.historicalOrgTypes;
    $scope.selectedHistoricalType;
    $scope.primaryOrgTypes;
    $scope.selectedPrimaryType;
    $scope.systemStates;
    $scope.selectedState;
    $scope.updateStateMode = true;
    $scope.orgList
    $scope.orgsSelected = [];
    $scope.showSuccess = false;
    $scope.showFailure = true;
    $scope.noMatchingOrgs = false;
    $scope.selectDeselectAllText = 'Select all';

    $scope.currentPrimaryTypes;
    $scope.newPrimaryTypes;
    $scope.selectedCurrentPrimaryType;
    $scope.selectedNewPrimaryType;
    $scope.orgListToChangePrimaryType = [];
    $scope.orgsSelectedForPrimaryTypeChange = [];
    $scope.selectAllTextForPrimaryTypeChange = 'Select all';
    $scope.showSuccessForPrimaryChange = false;
    $scope.showFailureForPrimaryChange = false;
    $scope.noMatchingOrgsForPrimaryChange = false;
    $scope.updateInProgress = false;
    
    //$scope.itemsOptions = [10, 20, 40, 80];
    $scope.itemsPerPage = 10;
    $scope.currentPage = 1;
    $scope.loading = false;

    $scope.mode = {
        statuses: true,
        types: false,
        advisors: false
    };

    $scope.updateMode = function (modeOption) {

        $scope.mode.statuses = false;
        $scope.mode.types = false;
        $scope.mode.advisors = false;

        $scope.mode[modeOption] = true

        //If user was working in the advisor tab, but selects another tab, reset the advisor tab. See end of orgAdvisorsBulkUpdateCtrl.js file
        $rootScope.$emit("resetTab", $scope.mode);
    };

    $scope.sortOrderOptions = [
        //sortOrder is the option seen by the user in the dropdown,
        //propertyName is the name of the property that angular should sort the list by
        {sortOrder: 'A-Z', propertyName: 'OrganizationName'},
        {sortOrder: 'Status', propertyName: 'StateName'}
    ]

    $scope.selectedSortOrder = $scope.sortOrderOptions[0];

    $scope.clearUpdateMessage = function () {

        if ($scope.updateStateMode) {
            $scope.showSuccess = false;
            $scope.showFailure = false;
            $scope.noMatchingOrgs = false;

        } else {
            $scope.showSuccessForPrimaryChange = false;
            $scope.showFailureForPrimaryChange = false;
            $scope.noMatchingOrgsForPrimaryChange = false;
        }
    };

    $scope.returnStateNameFromId = function (organizationStateId) {
        if (organizationStateId === 1) {
            return 'Active';

        } else if (organizationStateId === 2) {
            return 'Inactive';

        } else {
            return 'Locked';
        }
    };

    $scope.getAllSystemOrganizationType = function () {
        var promise = OrganizationTypeService.getAllSystemOrganizationType();
        promise.then(function (response) {
            $scope.historicalOrgTypes = response.data;
            $scope.primaryOrgTypes = response.data;

            $scope.currentPrimaryTypes = response.data;
            $scope.newPrimaryTypes = response.data;
        });
    };

    $scope.getSystemState = function () {
        var promise = OrganizationStateService.getSystemState();
        promise.then(function (response) {
            $scope.systemStates = response.data;
        });
    };

    $scope.findMatchingOrgs = function () {
        $scope.clearUpdateMessage();
        $scope.selectDeselectAllText = 'Select all';

        if ($scope.selectedPrimaryType != undefined && $scope.selectedHistoricalType != undefined) {

            var promise = OrganizationStateService.getOrgsByTypesCombo($scope.selectedHistoricalType.OrganizationTypeId,
                $scope.selectedPrimaryType.OrganizationTypeId);

            promise.then(function (response) {
                $scope.orgList = response.data;

                if ($scope.orgList.length <= 0) {
                    $scope.noMatchingOrgs = true;
                };

                for (var i = 0; i < $scope.orgList.length; i++) {
                    $scope.orgList[i].StateName = $scope.returnStateNameFromId($scope.orgList[i].OrganizationStateId);
                };
            });
        }
    }

    $scope.selectDeselectAll = function (currentButtonText) {

        if ($scope.updateStateMode) {

            for (var i = 0; i < $scope.orgList.length; i++) {

                if (currentButtonText === 'Select all') {
                    $scope.orgList[i].Selected = true;
                } else {
                    $scope.orgList[i].Selected = false;
                }
            };
            $scope.selectDeselectAllText = ($scope.selectDeselectAllText === 'Select all' ? 'Deselect all' : 'Select all');

        } else {

            for (var i = 0; i < $scope.orgListToChangePrimaryType.length; i++) {

                if (currentButtonText === 'Select all') {
                    $scope.orgListToChangePrimaryType[i].Selected = true;
                } else {
                    $scope.orgListToChangePrimaryType[i].Selected = false;
                }
            };
            $scope.selectAllTextForPrimaryTypeChange = ($scope.selectAllTextForPrimaryTypeChange === 'Select all' ? 'Deselect all' : 'Select all');
        }
    };

    $scope.updateOrgs = function () {

        //If user already updated orgs, remove update success or failure message so they know when it shows again it is for the most recent update
        $scope.clearUpdateMessage();

        for (var i = 0; i < $scope.orgList.length; i++) {
            if ($scope.orgList[i].Selected === true) {
                $scope.orgsSelected.push($scope.orgList[i]);
                //Change the StateId in each org selected for update, to match the user selected state
                $scope.orgsSelected[$scope.orgsSelected.length - 1].OrganizationStateId = $scope.selectedState.StateType;
            }
        };

        if ($scope.selectedState != undefined && $scope.orgsSelected.length > 0) {
            var promise = OrganizationStateService.bulkUpdateOrganizationStates($scope.orgsSelected);
            promise.then(function (response) {
                $scope.findMatchingOrgs(); //reload updated orgs
                $scope.showSuccess = response.data === 1 ? true : false;
                $scope.showFailure = response.data === 0 ? true : false;

            });
        }  
        //Empty out after sending otherwise if they click the update button again it will just add duplicates before submitting
        $scope.orgsSelected = [];
    }

    $scope.findOrgsForCurrentType = function () {
        $scope.clearUpdateMessage();
        $scope.selectAllTextForPrimaryTypeChange = 'Select all';

        if ($scope.selectedCurrentPrimaryType != undefined) {
            var promise = OrganizationTypeService.getOrgsByPrimaryType($scope.selectedCurrentPrimaryType.OrganizationTypeId)

            promise.then(function (response) {
                $scope.orgListToChangePrimaryType = response.data;

                if ($scope.orgListToChangePrimaryType.length <= 0) {
                    $scope.noMatchingOrgsForPrimaryChange = true;
                };
            });
        }
    };

    $scope.updatePrimaryTypes = function () {

        //If user already updated orgs, remove update success or failure message so they know when it shows again it is for the most recent update
        $scope.clearUpdateMessage();

        for (var i = 0; i < $scope.orgListToChangePrimaryType.length; i++) {

            if ($scope.orgListToChangePrimaryType[i].Selected === true) {
                $scope.orgsSelectedForPrimaryTypeChange.push($scope.orgListToChangePrimaryType[i]);
            }
        };

        if ($scope.selectedNewPrimaryType != undefined && $scope.orgsSelectedForPrimaryTypeChange.length > 0) {

            var promise = OrganizationTypeService.BulkUpdateOrgPrimaryTypes($scope.orgsSelectedForPrimaryTypeChange, $scope.selectedNewPrimaryType.OrganizationTypeId);

            //Update taking longer than expected
            $timeout(function () {
                if ($scope.showSuccessForPrimaryChange === false && $scope.showFailureForPrimaryChange === false) {
                    $scope.updateInProgress = true;
                };
            }, 1000);
            

            promise.then(function (response) {
                $scope.findOrgsForCurrentType(); //reload updated orgs
                $scope.updateInProgress = false;
                $scope.showSuccessForPrimaryChange = response.data === 1 ? true : false;
                $scope.showFailureForPrimaryChange = response.data === 0 ? true : false;
            });
        }
        //Empty out after sending otherwise if they click the update button again it will just add duplicates before submitting
        $scope.orgsSelectedForPrimaryTypeChange = [];
    }

    $scope.init = function () {
        $scope.getAllSystemOrganizationType();
        $scope.getSystemState();
    };

    $scope.init();
});;
app.controller('orgDashboardController', function ($rootScope, $scope, $filter, PermitService, OrgDashboardService, OrganizationStateService, EventService, OrganizationMemberService, OrgOfficerService, OrgService, OrgAdvisorService, OrgSocialMediaService, $uibModal) {
    var self = this;
    $scope.recentPermits = {};
    $scope.isAuthorized = true;
    $scope.memberTotals = {};
    $scope.officers = {};
    $scope.upcomingEvents = {};
    $scope.currentState = {};
    $scope.allowEmail = false;
    $scope.alerts = [];
    $scope.advisors = [];
    $scope.constitutionExist = true;
    $scope.isPresident = false;
    $scope.isTreasurer = false;
   
    self.currentOrganizationId = 0;

    var $ctrl = this;

    $scope.manageMember = function (membershipStatus) {
        $ctrl.varList = [membershipStatus, self.currentOrganizationId];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/manageMember.html',
            controller: 'manageMemberModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
            $scope.loadCurrentOrganizationInfo(self.currentOrganizationId);
        });
    };

    $scope.managePermissions = function () {
        $ctrl.varList = self.currentOrganizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/manageOrganizationPermission.html',
            controller: 'manageOrganizationPermissionModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {

        });
    };

    $scope.reRegistration = function (organizationId, userId) {
        $scope.isAuthorized = true;
        var promise = OrgDashboardService.reRegistration(organizationId, userId);
        promise.then(function (response) {
            var data = response.data;
            if (data > -1) {
                var url = (window.location.protocol) + '//' + window.location.host + '/Register/Default/Index?organizationId=' + organizationId;
                window.location = url;
            }
            else {
                $scope.isAuthorized = false;
            }
        });
    };

    $scope.closeAlert = function (index) {
        $scope.alerts.splice(index, 1);
    };

    $scope.loadCurrentOrganizationInfo = function (organizationId) {
        var promise = OrgDashboardService.loadCurrentOrganizationInfo(organizationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.organizationInfo = data;

        });
    };

    $scope.composeEmail = function (officer) {
        if ($scope.allowEmail && officer.OfficerId > 0) {
            var modalInstance = $uibModal.open({
                animation: true,
                templateUrl: '/app/views/officers/composeOfficerEmail.html?c=' + (new Date()).getTime(),
                controller: function ($scope, $uibModal, $uibModalInstance, alerts, officer, OrgOfficerService) {
                    $scope.officer = officer;
                    $scope.message = {};
                    $scope.cancel = function () {
                        $uibModalInstance.close();
                    }
                    $scope.sendEmail = function () {

                        var promise = OrgOfficerService.sendEmailToOfficer($scope.message);
                        promise.then(function (response) {
                            $uibModalInstance.close();
                            alerts.push({ type: 'success', msg: 'Your email was sent successfully.' });
                        },
                            function (data) { });
                    };
                    $scope.init = function () {
                        $scope.message = {
                            officerId: officer.OfficerId,
                            subject: '',
                            message: ''
                        }
                    };
                    $scope.init();
                },
                resolve: {
                    alerts: function () {
                        return $scope.alerts;
                    },
                    officer: function () { return officer; }
                }
            });
            modalInstance.result.then(function () { }, function () { });
        }
    };

    $scope.checkIfUserIsPresident = function () {
        OrgOfficerService.checkIfUserIsPresident($rootScope.orgID).then(function (response) {
            $scope.isPresident = response.data;
        });
    };

    $scope.checkIfUserIsTreas = function () {
        OrgOfficerService.checkIfUserIsTreas($rootScope.orgID).then(function (response) {
            $scope.isTreasurer = response.data;
        });
    };

    $scope.initDashboard = function (organizationId, permitDetailsUrl) {
        $rootScope.orgID = organizationId;
        $rootScope.permitDetailsUrl = permitDetailsUrl;
        self.currentOrganizationId = organizationId;
        self.loadRecentPermits();
        self.loadOfficers();
        self.loadUpcomingEvents();
        self.loadOrganizationState();
        self.loadConstitution();
        self.loadAdvisors();
        self.loadSocialMedia($rootScope.orgID);
        $scope.loadCurrentOrganizationInfo(organizationId);
        $scope.checkIfUserIsPresident();
        $scope.checkIfUserIsTreas();
    };

    $scope.renderURL = function (permit) {
        return $rootScope.permitDetailsUrl.replace("PVID", permit.PermitVersionId);
    }

    // PRIVATE MTEHODS


    self.loadAdvisors = function () {
        var promise = OrgAdvisorService.getAdvisors(self.currentOrganizationId, false);
        promise.then(function (response) {
            var data = response.data;
            $scope.advisors = data;
        });
    }

    self.loadConstitution = function () {
        OrgService.getConstitution(self.currentOrganizationId).then(function (response) {
            $scope.constitutionExist = response.data.OrgConstitutionId > 0;
        });
    };

    self.loadOrganizationState = function () {
        var promise = OrganizationStateService.getOrganizationState(self.currentOrganizationId);
        promise.then(function (response) {
            $scope.currentState = response.data;
        });
    };

    self.loadRecentPermits = function () {
        PermitService.getPermitListingByOrg(self.currentOrganizationId, '', 10, 1, false, true, true, true, true, true, false).then(function (result) {
            $scope.recentPermits = result.data;
        });
    };

    self.loadOfficers = function () {
        $scope.officersLoading = true;
        var promise = OrgOfficerService.getPublicOfficers(self.currentOrganizationId);
        promise.then(function (response) {
            $scope.officersLoading = false;
            $scope.allowEmail = response.data.CanEmail;
            $scope.officers = response.data.List;
        });
    };

    self.loadUpcomingEvents = function () {
        var promise = EventService.getOrganizationEvents(self.currentOrganizationId, 30);
        promise.then(function (response) {
            $scope.upcomingEvents = response.data;
        });
    };

    self.loadSocialMedia = function (orgId) {
        OrgSocialMediaService.getAvailableSocialMedia(orgId).then(function (response) {
            $scope.socialMedias = response.data;
        });
    }
});


app.controller('organizationDashboardAnnouncementsController', function ($rootScope, $scope, $filter, $uibModal, AnnouncementsService, OrgId) {
    // BEGIN scope LEVEL VARIABLES
   
    $scope.futureAnnouncements = [];
    $scope.pastAnnouncements = [];  
    $scope.systemAnnouncements = [];
    $scope.orgAnnouncements = [];
    $scope.orgAnnouncementsLoaded = false;
    $scope.sysAnnouncementsLoaded = false;
    $scope.pastAnnouncementsLoaded = false;
    $scope.orgId = 0;
    var self = this;
    // END

    $scope.getAnnouncements = function () {
        AnnouncementsService.getSystem().then(function (response) {
            $scope.systemAnnouncements = response.data;
            $scope.sysAnnouncementsLoaded = true;
        });
        AnnouncementsService.getOrganization($scope.orgId).then(function (response) {
            $scope.orgAnnouncements = response.data;
            AnnouncementsService.getOrganizationFutureAnnouncements($scope.orgId).then(function (response) {
                $scope.futureAnnouncements = response.data;
                $scope.orgAnnouncements = $scope.orgAnnouncements.concat($scope.futureAnnouncements);
            });
            $scope.orgAnnouncementsLoaded = true;
        });

        AnnouncementsService.getOrganizationPastAnnouncements($scope.orgId).then(function (response) {
            $scope.pastAnnouncements = response.data;
            $scope.pastAnnouncementsLoaded = true;
        });
    };

    $scope.newAnnouncement = function () {
        $scope.editAnnouncement(null);
    };
    $scope.editAnnouncement = function (ann) {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/addOrgAnnouncement.html',
            controller: 'addAnnouncementController',
            size: '',
            resolve: {
                announcement: function () {
                    return ann;
                },
                OrgId: function () {
                    return OrgId;
                },
                Callback: function () {
                    return self;
                }
            }
        });

        modalInstance.result.then(function (result) {

        }, function () {
        });
    };

    $scope.deleteAnnouncement = function (announcement) {
        if (confirm('Hey, are you sure you want to delete this announcement?\n\nThis cannot be undone.')) {
            var promise = AnnouncementsService.deleteAnnouncement(announcement.AnnouncementId);
            promise.then(function (result) {
                $scope.getAnnouncements();
            });
        }
    };

    $scope.init = function () {
        $scope.orgId = OrgId;
        $scope.getAnnouncements();
        $rootScope.$on('reloadAnnouncements', function (event, args) {
            $scope.getAnnouncements();
        });
    };

    $scope.init();
});


app.controller('addAnnouncementController',
    function ($rootScope, $scope, $filter, $uibModalInstance, AnnouncementsService, announcement, OrgId, Callback) {
        $scope.announcement = {};
        $scope.processingNewRequest = false;
        var self = this;
        var cb = null;

        self.createNewAnnouncement = function () {
            return {
                AnnouncmentId: 0,
                OrganizationId: OrgId,
                OrganizationName: 'Untitled',
                Title: '',
                Description: '',
                Priority: 0,
                PostStart: '',
                PostEnd: ''

            };
        };


        $scope.submitAnnouncement = function () {
            $scope.processingNewRequest = true;
            var promise = AnnouncementsService.updateAnnouncement($scope.announcement);
            promise.then(function (response) {
                $uibModalInstance.close();
                $rootScope.$emit('reloadAnnouncements', null);
            });
        };


        $scope.cancelAnnouncement = function () {
            $uibModalInstance.close();
        };

        $scope.init = function () {
            $scope.processingNewRequest = false;
            if (announcement === null) {
                $scope.announcement = self.createNewAnnouncement();
            } else {
                $scope.announcement = announcement;
                $scope.announcement.PostStart = $filter('date')($scope.announcement.PostStart, 'M/d/yyyy h:mm a');
                $scope.announcement.PostEnd = $filter('date')($scope.announcement.PostEnd, 'M/d/yyyy h:mm a');
            }
        };


        $scope.init();
    });

app.controller('organizationDashboardCategoriesController', function ($rootScope, $scope, $routeParams, $filter, $uibModal, OrganizationCategoryService, CategoryServices, OrgId) {

    $scope.organizationId = 0;
    $scope.categories = {};

    $scope.systemCategories = {};
    $scope.selectedCategory = {};

    $scope.removeDashboardCategory = function (orgCategory) {
        var promise = OrganizationCategoryService.removeDashboardCategory(orgCategory);
        promise.then(function (response) {
            $scope.init();
        });
    };

    $scope.addDashboardCategory = function () {
        var promise = OrganizationCategoryService.addDashboardCategory($scope.selectedCategory, $scope.organizationId);
        promise.then(function (response) {
            $scope.init();
        });
    };

    $scope.getDashboardOrgCategories = function (organizationId) {
        var promise = OrganizationCategoryService.getDashboardOrgCategories(organizationId);
        promise.then(function (response) {
            $scope.categories = response.data;
        });
    };

    $scope.getDashboardSystemCategoriesByOrgId = function (organizationId) {
        var promise = CategoryServices.getDashboardSystemCategoriesByOrgId(organizationId);
        promise.then(function (response) {
            $scope.systemCategories = response.data;
        });

    };

    $scope.init = function () {
        $scope.organizationId = OrgId;

        $scope.getDashboardOrgCategories($scope.organizationId);
        $scope.getDashboardSystemCategoriesByOrgId($scope.organizationId);


    };

    $scope.init();
});

app.controller('officerDashboardRegistrationController', function ($scope, $routeParams, RegistrationDetailService, RegistrationService, ExtendedPropertyService) {

    //notes variables
    $scope.includeDeletedNotes = false;

    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentProcessNoteId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";


    //note variable declaration ends

    $scope.init = function () {
        $scope.getLatestRegistrationDetails($routeParams.organizationId);

    }

    $scope.getLatestRegistrationDetails = function (organizationId) {
        RegistrationService.getLatestRegistrationDetails(organizationId).then(function (response) {
            $scope.registration = response.data;
            $scope.getProcessNotes(0);
            $scope.getExtendedPropertyGroups($scope.registration.registrationView.OrganizationRegistrationId);
        });
    }

    $scope.getExtendedPropertyGroups = function (OrganizationRegistrationId) {
        var promise = ExtendedPropertyService.getExtendedPropertyGroups(OrganizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.propertyGroups = data;
            $scope.activeAdditionalInfoEdit = false;
        });
    };

    $scope.getProcessNotes = function () {
        var promise = RegistrationDetailService.getPublicWorkflowNotes($scope.registration.registrationView.ProcessId);
        promise.then(function (response) {
            $scope.currentProcessNotes = response.data;
        });
    };

    $scope.newProcessNote = function (parentNoteId, IsPrivate) {
        if ($scope.currentProcessNoteId === 0) {
            RegistrationDetailService.newWorkflowNote($scope.registration.registrationView.ProcessId).then(function (response) {
                var note = response.data;
                response.data.Note = $scope.newNoteText;
                $scope.makeNotePublic(note);
                $scope.newNoteText = "";
            });
        }
        else {
            var note = getNote($scope.currentProcessNoteId);
            note.Note = $scope.newNoteText;
            RegistrationDetailService.editNote(note).then(function (response) {
                $scope.getProcessNotes($scope.includeDeletedNotes);
                $scope.currentProcessNoteId = 0;
                $scope.newNoteText = "";
                $scope.buttonText = "Post";
                note.customStyle = "";
            });
        }
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        var promise = RegistrationDetailService.editNote(note);
        promise.then(function (response) {
            $scope.getProcessNotes(1);
        });
    };

    function getNote(processNoteId) {
        var len = $scope.currentProcessNotes.length;
        for (var i = 0 ; i < len; i++) {
            if ($scope.currentProcessNotes[i].WorkflowNoteId === processNoteId) {
                return $scope.currentProcessNotes[i];
            }
        }
        return null;
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }

    //note function ends


    $scope.init();
});

app.controller('manageOrganizationMemberController', function ($scope, $routeParams, $uibModal, OrganizationMemberService, OrgOfficerService) {

    $scope.currentPage = 1;
    $scope.itemsPerPage = 12;
    $scope.itemsOptions = [12, 24, 48, 96];
    $scope.delayTime = 700;

    $scope.members = [];
    $scope.originalMembers = [];

    $scope.isPresident = false;
    var $ctrl = this;

    $scope.selectedMembers = [];
    $scope.calculateSelectedMembers = function() {
        var tempMembers = [];
        angular.forEach($scope.filteredMembers, function(member){
            if (member.Checked){
                tempMembers.push(member);
            }
        });
        $scope.selectedMembers = tempMembers;
        return $scope.selectedMembers.length;
    };

    $scope.changeMemberStatus = function () {
        var memberIds = '';
        angular.forEach($scope.selectedMembers, function(member){
            memberIds = memberIds + member.MemberId + ',';
        });
        $ctrl.varList = [$routeParams.organizationId, memberIds];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/changeMemberStatus.html?c=' + (new Date()).getTime(),
            controller: 'changeMemberStatusModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'md',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.getFilteredMembers();
            }
        }, function () {

        });
    };

    $scope.addMembers = function () {
        $ctrl.varList = $routeParams.organizationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/addOrganizationMembers.html?c=' + (new Date()).getTime(),
            controller: 'addOrganizationMemberModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            backdrop: 'static',
            keyboard: false,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.getFilteredMembers();
            }
        }, function () {

        });
    };

    $scope.checkIfUserIsPresident = function(){
        OrgOfficerService.checkIfUserIsPresident($routeParams.organizationId).then(function(response){
            $scope.isPresident = response.data;
        });
    };

    $scope.getFilteredMembers = function () {
        var promise = OrganizationMemberService.getAllOrganizationMembers($routeParams.organizationId);
        promise.then(function (response) {
            $scope.members = response.data;
            $scope.originalMembers = $scope.members;
        });
    };

    $scope.init = function () {
        $scope.getFilteredMembers();
        $scope.checkIfUserIsPresident();
    };

    $scope.init();
});

app.filter('memberSearchFilter', function () {
    return function (objects, criteria) {
        var filterResult = new Array();
        if (!criteria)
            return objects;
        for (index in objects) {
            if (objects[index].FirstName.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].LastName.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].MembershipStatusName.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].FullName.toLowerCase().indexOf(criteria.toLowerCase()) !== -1
                || objects[index].Email.toLowerCase().indexOf(criteria.toLowerCase()) !== -1)
                filterResult.push(objects[index]);
        }
        return filterResult;
    }
});;
app.controller('orgOfficerLoginController', function ($scope, OrgOfficerLoginService) {
    $scope.activeOrgList = [];

    $scope.loadActiveOrgList = function () {
        var promise = OrgOfficerLoginService.getActiveOrgList();
        promise.then(function (response) {
            $scope.activeOrgList = response.data;
        },function (response) {
            
        });
    };

    $scope.init = function () {
        $scope.loadActiveOrgList();
    };

    $scope.init();
});
app.controller('permitDashboardController', function ($scope, $filter, PermitService, WorkflowService, $uibModal, $q) {
    // SCOPE-LEVEL VARIABLES
    $scope.permitListings = {};
    $scope.maxPerPage = 10;
    $scope.currentPage = 1;
    $scope.maxPages = 1;
    $scope.numberOfResults = 0;
    $scope.searchKeywords = "";
    $scope.loading = true;
    $scope.sortBy = 'permitNo';
    $scope.orderBy = true;
    $scope.pageNumbers = [{
        text: "Page 1 of 1",
        value: 1
    }];
    $scope.includePending = true;
    $scope.includeCompleted = false;
    $scope.includeIncomplete = false;
    $scope.includeCancelled = false;
    $scope.includeHeld = false;
    $scope.includeDenied = false;
    $scope.includeDeleted = false;
    $scope.includeMineOnly = true;

    var $ctrl = this;

    $scope.checkboxClicked = function (model) {

        switch (model) {

            case 'pending':
                $scope.includePending = !$scope.includePending;
                break;
            case 'completed':
                $scope.includeCompleted = !$scope.includeCompleted;
                break;
            case 'denied':
                $scope.includeDenied = !$scope.includeDenied;
                break;
            case 'held':
                $scope.includeHeld = !$scope.includeHeld;
                break;
            case 'canceled':
                $scope.includeCancelled = !$scope.includeCancelled;
                break;
            case 'incomplete':
                $scope.includeIncomplete = !$scope.includeIncomplete;
                break;
            case 'deleted':
                $scope.includeDeleted = !$scope.includeDeleted;
                break;
        }
    }

    $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];

    $scope.selectedPage = $scope.pageNumbers[0];

    $scope.changePage = function () {
        $scope.currentPage = $scope.selectedPage.value;
        $scope.getPermitListings();
    };

    $scope.updateApprovalStatus = function (stepItemId, stepItemApprovalStatusId, processId) {
        var promise = PermitService.updateApprovalStatus(stepItemId, stepItemApprovalStatusId, processId);
        promise.then(function (response) {
            $scope.getPermitListings();
        });
    };

    $scope.remove = function (permitVersionId) {
        var promise = PermitService.remove(permitVersionId);
        promise.then(function (response) {
            $scope.getPermitListings();
        });
    };

    $scope.restore = function (permitVersionId) {
        var promise = PermitService.restore(permitVersionId);
        promise.then(function (response) {
            $scope.getPermitListings();
        });
    };

    $scope.getOrderedPermitListing = function (sortBy, columnNumber) {
        if ($scope.sortBy === sortBy) {
            $scope.orderBy = !$scope.orderBy;

        }
        else {
            $scope.sortBy = sortBy;
            $scope.orderBy = true;
        }
        $scope.selectedColumn = columnNumber;
        $scope.getPermitListings();

    }

    $scope.superApprove = function (processId) {
        $ctrl.varList = 'SUPER Approve this Permit(This can NOT be UNDONE)';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = WorkflowService.superApprove(processId);
                promise.then(function (response) {
                    $scope.init();
                });
            }
        }, function () {

        });
    };

    $scope.superDeny = function (processId) {
        $ctrl.varList = 'SUPER Deny this Permit(This can NOT be UNDONE)';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = WorkflowService.superDeny(processId);
                promise.then(function (response) {
                    $scope.init();
                });
            }
        });
    };

    $scope.getPermitListings = function () {
        $scope.loading = true;

        var promise = PermitService.getPermitListing(encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, $scope.includeCompleted, $scope.includeIncomplete,
            $scope.includeCancelled, $scope.includeHeld, $scope.includePending, $scope.includeDenied, $scope.includeDeleted, $scope.includeMineOnly, $scope.orderBy, encodeURI($scope.sortBy));
        promise.then(function (response) {
            var data = response.data;
            
            $scope.numberOfResults = data.NumResults;
            $scope.permitListings = data.Permits;
            $scope.currentPage = data.CurrentPage;
            $scope.maxPages = data.PageCount;
            $scope.loading = false;
            $scope.pageNumbers = [];
            for (var i = 1; i <= data.PageCount; i++) {
                $scope.pageNumbers.push({
                    text: "Page " + i.toString() + " of " + data.PageCount.toString(),
                    value: i
                }
                );
            }

            $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];
        });
    };

    $scope.init = function () {
        $scope.getPermitListings();
    };
    $scope.init();
});



app.controller('adminPermitDetailsController', function ($scope, $filter, $uibModal, PermitService, NoteTemplatesService, $location, $anchorScroll, $log, $rootScope) {
    var self = this;
    $scope.currentPermitVersionId = 0;
    $scope.currentPermitInfo = {};
    $scope.currentPermitDates = {};
    $scope.currentPermitNotes = {};
    $scope.currentWorkingPermitNote = {};
    $scope.permitCategories = {};
    $scope.workingPermitDate = {};
    $scope.showWorkflow = false;
    $scope.includeDeletedNotes = false;
    $scope.parent = { workingPermitDate: {} };
    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentPermitId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";
    $scope.permitTyes = [];
    $scope.includeDeletedDates = true;
    $scope.selectedPermitType = {
        PermitTypeId: 1
    };
    $scope.rootProcessId;
    $scope.id;
    $scope.publicNoteStatusInfo = {};
    $scope.publicNotesSeenText;
    $scope.publicNotesUnSeen;
    $scope.checkingFiles = true;

    var $ctrl = this;


    $scope.moveToPublicNotes = function () {
        $location.hash('publicNotes');

        $anchorScroll();

        $scope.markNoteAsSeenOrUnseen();
    }

    $scope.markNoteAsSeenOrUnseen = function () {
        $scope.publicNotesUnSeen = !$scope.publicNotesUnSeen;

        var statusInfo = {
            IsPublicNote: true,
            NoteUnseen: $scope.publicNotesUnSeen
        };

        var promise = PermitService.updateNoteStatusInfo($scope.currentPermitVersionId, statusInfo);

        $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread';
    }

    $scope.getNoteTemplates = function (zoneId) {
        NoteTemplatesService.getNoteTemplates(zoneId).then(function (response) {

            $scope.noteTemplates = response.data;
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getPermitCategories($scope.id);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    $scope.workflowHistory = function (rootProcessId) {
        $ctrl.varList = rootProcessId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/workflowHistory.html',
            controller: 'workflowHistoryInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
    };

    function setSelectedPermitType(permitTypeId) {

        var len = $scope.permitTyes.length;
        for (var i = 0; i < len; i++) {
            var pType = $scope.permitTyes[i];
            if (pType.PermitTypeId === permitTypeId) {
                $scope.selectedPermitType = pType;
                return;
            }
        }
    }
    $scope.permitTypeSelected = function () {
        $scope.currentPermitInfo.PermitType = $scope.selectedPermitType.PermitTypeId;
    }

    $scope.noteTemplateSelected = function (isPrivate) {

        if (isPrivate) {
            $scope.newPrivateNoteText = this.notePrivateTemplate;
        }
        else {
            $scope.newNoteText = this.noteTemplate;
        }
    };

    $scope.getSystemPermitTypes = function () {
        PermitService.getSystemPermitTypes().then(function (response) {
            $scope.permitTyes = response.data;
        });
    }

    $scope.getNoteStatusInfo = function (permitVersionId, isPublicNote) {
        PermitService.getNoteStatusInfo(permitVersionId, isPublicNote).then(function (response) {
            $scope.publicNotesUnSeen = response.data;
            $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread'
        });
    }

    $scope.dateEditModal;
    $scope.loadPermitDetails = function () {

        $scope.getNoteStatusInfo($scope.currentPermitVersionId, true);//"true" gets public note status info

        PermitService.getAdminPermitDetails($scope.currentPermitVersionId).then(function (response) {
            $scope.currentPermitInfo = response.data;
            $scope.rootProcessId = $scope.currentPermitInfo.ProcessId;
            // $scope.selectedPermitType = $scope.currentPermitInfo.PermitType;
            setSelectedPermitType($scope.currentPermitInfo.PermitType);
        });
    };

    $scope.loadPermitDates = function () {
        PermitService.getPermitDates($scope.currentPermitVersionId, $scope.includeDeletedDates).then(function (response) {
            $scope.currentPermitDates = JSON.parse(response.data);
        });
    };

    $scope.updatePermitInfo = function () {

        PermitService.updatePermitInfo($scope.currentPermitInfo).then(function (response) {
            $scope.currentPermitInfo = response.data;
           // showPermitInfoModelUpdated();
        });
    };

    $scope.deletePermitDate = function (date) {
        if (confirm('Are you sure you want to delete this event?')) {
            var promise = PermitService.deletePermitDate($scope.id, date);
            promise.then(function (response) {
                $scope.loadPermitDates();
            });
        }
    };

    $scope.restorePermitDate = function (date) {
        if (confirm('Are you sure you want to restore this event?')) {
            var promise = PermitService.restorePermitDate($scope.id, date);
            promise.then(function (response) {
                $scope.loadPermitDates();
            });
        }
    };

    function showPermitInfoModelUpdated() {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'abc.html',
            controller: 'ModalCtrl',
            controllerAs: '$ctrl',
            size: ''
        });

        /* modalInstance.result.then(function (varList) {
             $scope.varList = varList;
             $scope.allPositionsView.Positions = $scope.allPositionsView.Positions.concat([{ FullName: null, IsAdded: true, IsRequired: false, IsValid: false, PositionId: 0, PositionTitle: $scope.varList, StudentId: null, Email: null }]);
         }, function () {
             $log.info('Modal dismissed');
         });*/
    }

    $scope.newPermitDate = function () {
        if ($scope.currentPermitVersionId > 0) {
            PermitService.newPermitDate($scope.currentPermitVersionId).then(function (response) {

                $scope.editPermitDate(response.data);
            })
        }
    };

    $scope.editPermitDateOld = function (permitDate) {
        $scope.workingPermitDate = angular.copy(permitDate);
        $scope.parent.workingPermitDate = $scope.workingPermitDate;
        $scope.workingPermitDate.Start = permitDate.Start.formatDateTime();
        $scope.workingPermitDate.End = permitDate.End.formatDateTime();
        $scope.rootProcessId = $scope.workingPermitDate.ProcessId;

        $scope.dateEditModal = $uibModal.open({
            templateUrl: '/app/views/permit/edit_date.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'lg',

        });
        $scope.dateEditModal.result.then(function () {
            $scope.rootProcessId = $scope.currentPermitInfo.ProcessId;
        }, function () {
            $scope.rootProcessId = $scope.currentPermitInfo.ProcessId;
        });

    };

    $scope.editPermitDate = function (data) {
        var p = angular.copy(data);
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/permit/edit_date.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: AdminPermitDateModalInstanceController,
            resolve: {
                sourcePermitDate: function () { return p; },
                showApprovalStatus: function () { return false; },
                permitVersionId: function () { return $scope.id; }
            }
        });

        modalInstance.result.then(function (result) {
            var promise = PermitService.userUpdatePermitDate($scope.id, result);
            promise.then(function (response) {

                $scope.loadPermitDates();

            });

        });
    };

    $scope.getChangeHistory = function () {
        var promise = PermitService.getDateAndLocationHistoryByPermitVersionId($scope.currentPermitVersionId);

        promise.then(function (resp) {
            var varList = {};

            varList.history = angular.copy(resp.data);
            varList.permitVersionId = $scope.currentPermitVersionId;

            //Before making correction below (read comments above next for loop), save the full name of person who deleted the previous record/line of data
            for (var i = 0; i < varList.history.length; i++) {
                varList.history[i].previousRecordChangedBy = varList.history[i].FirstName + ' ' + varList.history[i].LastName;
            }

            //This is to correct the user being shown as the person to caused a change within the history popup. 
            //Example: the current event info is "Reitz Union" on XXDate at XXTime set by Bob. Joe changes it to "Union Lawn" on YYDate at YYTime.
            //In the db the archive table will show the previous info as "Reitz Union" on XXDate at XXTime set by JOE. That's because Joe was the one who deleted/updated the previous info
            //The for loop allows the info to be next to the name of the person who set it, not deleted it.
            for (var i = varList.history.length - 1; i > 0; i--) {

                if (i > 0) {
                    varList.history[i].FirstName = varList.history[i - 1].FirstName;
                    varList.history[i].LastName = varList.history[i - 1].LastName;
                }
            }

            $uibModal.open({
                animation: true,
                templateUrl: '/app/views/modalViews/permitDateAndLocHistory.html',
                size: 'lg',
                controller: 'permitDateAndLocHistoryModalCtrl',
                resolve: {
                    varList: function () {
                        return varList;
                    }
                }
            });

        });
    };

    $scope.closeEditDate = function () {
        if ($scope.dateEditModal !== undefined) {
            $scope.dateEditModal.close();
        }
    };

    $scope.commitPermitDate = function () {

        PermitService.updatePermitDate($scope.workingPermitDate).then(function (response) {
            $scope.closeEditDate();
            $scope.loadPermitDates();
        });

    };

    function setDefaultStyle() {
        var len = $scope.currentPermitNotes.length;
        for (var i = 0; i < len; i++) {
            $scope.currentPermitNotes[i].customStyle = $scope.normalNoteStyle;
        }
    }

    $scope.getPermitNotes = function (includeDeleted) {
        PermitService.getPermitNotes($scope.currentPermitVersionId, includeDeleted).then(function (response) {
            $scope.currentPermitNotes = response.data;
        });
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.makeNotePrivate = function (note) {
        $scope.changeNoteType(note, 1);
    };

    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });
    };

    $scope.newPermitNote = function (parentNoteId, IsPrivate) {
     
        if ($scope.currentPermitId === 0) {
            PermitService.newPermitNote($scope.currentPermitVersionId, parentNoteId).then(function (response) {

                var note = response.data;
                if (IsPrivate) {
                    note.Type = 1;
                    if ($scope.newPrivateNoteText.trim() === "") {
                        alert("");
                    }
                    response.data.Note = $scope.newPrivateNoteText;
                    $scope.makeNotePrivate(note);
                    $scope.newPrivateNoteText = "";

                }
                else {
                    response.data.Note = $scope.newNoteText;
                    $scope.makeNotePublic(note);
                    // $scope.updatePermitNote(response.data);
                    //$scope.currentPermitNotes.push(response.data);
                    $scope.newNoteText = "";

                    //show notification of new messages
                    $scope.publicNotesUnSeen = true;

                    //change text of button to mark as "read" or "unread"
                    $scope.publicNotesSeenText = 'Read';
                }



            });
        }
        else {

            var note = getNote($scope.currentPermitId);
            if (IsPrivate) {
                note.Note = $scope.newPrivateNoteText;
            }
            else {
                note.Note = $scope.newNoteText;
            }
            PermitService.updatePermitNote(note).then(function (response) {
                $scope.getPermitNotes($scope.includeDeletedNotes);
                $scope.currentPermitId = 0;
                if (IsPrivate) {
                    $scope.newPrivateNoteText = "";
                    $scope.buttonPrivateText = "Post";
                }
                else {
                    $scope.newNoteText = "";
                    $scope.buttonText = "Post";
                }

                note.customStyle = "";

                //show notification of new messages
                $scope.publicNotesUnSeen = true;

                //change text of button to mark as "read" or "unread"
                $scope.publicNotesSeenText = 'Read';
            });

        }
    };
    function getNote(PermitId) {
        var len = $scope.currentPermitNotes.length;
        var note;
        for (var i = 0; i < len; i++) {
            if ($scope.currentPermitNotes[i].PermitNoteId === PermitId) {
                return $scope.currentPermitNotes[i];
            }
        }

    }
    $scope.updatePermitNote = function (note) {
        PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
            $scope.buttonText = "Post";
        });
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentPermitId = note.PermitNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentPermitId = note.PermitNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }

    $scope.deleteNote = function (note) {
        PermitService.deletePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });
    };

    $scope.restoreNote = function (note) {
        PermitService.restorePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });
    };

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };


    $scope.changePermitCategory = function (category) {
        angular.forEach($scope.permitCategories, function (value, key) {
            if ($scope.permitCategories[key].CategoryId === category.CategoryId) {
                $scope.permitCategories[key].Selected = !$scope.permitCategories[key].Selected;
            }
        });
    };

    $scope.savePermitCategories = function () {

        var categoryPromise = PermitService.updatePermitCategories($scope.id, $scope.permitCategories);
        categoryPromise.then(function (response) {
         //   console.log($scope.permitCategories);
         //   console.log("save permit categories function");
         //   console.log(response.data);
           // showPermitInfoModelUpdated();
        });
    };

    $scope.editTaggedAdmin = function () {
        $scope.edit = true;
        $ctrl.varList = $scope.currentPermitVersionId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/createTaggedAdmins.html',
           // scope: $scope,
            controller: 'taggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                    edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
               // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
               // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.viewTaggedAdmins = function () {
        $scope.edit = false;
        $ctrl.varList = $scope.currentPermitVersionId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/updateTaggedAdmins.html',
           // scope: $scope,
            controller: 'taggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
               // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
               // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.closeModal = function () {
        $scope.modalInstance.close();
        $scope.currentUser = {};
    }

    $scope.getNumberOfUploadedFiles = function (permitVersionId) {
        var promise = PermitService.getNumberOfUploadedFiles(permitVersionId);

        promise.then(function (resp) {
            $scope.NumberOfUploadedFiles = resp.data;
        })
    }

    $scope.openModal = function (templateUrl, controller, varList) {
        $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl,
            controller,
            controllerAs: '$ctrl',
            size: 'med',
            resolve: {
                varList: function () {
                    return varList;
                }
            }
        });
    };

    $scope.handleModalResult = function (resultObj, modalType) {

        if (modalType === 'main modal') {

            //User selected the "remove selected" button of file viewing modal
            if (resultObj.result === 'remove') {

                $scope.selectedFilesList = resultObj.selectedFilesList;

                var varList = {
                    message: "Are you sure you want to remove the selected files?",
                    confirmButtonText: 'Yes',
                    cancelButtonText: 'Cancel'
                }

                //Open confirmation modal
                $scope.openModal('/app/views/confirmedDialog/confirmCustomizable.html', 'confirmCustomizableCtrl', varList);

                //Used anonymous function to call the handlwModalResult method bc without it the method gets called right away and not when a modal gets closed
                $scope.modalInstance.result.then(function (result) {

                    $scope.handleModalResult(result, 'confirm modal')

                }, function () { });

                //User clicked the "close" button on the modal to view files
            } else {
                $scope.modalInstance.close();
            }

            //Decide what will happen when the user chooses to "confirm" or "cancel" on the confirmation modal
        } else {

            if (resultObj === 'confirm') {
                var promise = PermitService.deleteFiles($scope.currentPermitInfo.PermitVersionId, $scope.selectedFilesList);

                promise.then(function () {
                    $scope.selectedFilesList = [];
                    $scope.getListOfFiles($scope.currentPermitInfo.PermitVersionId);
                });

                //User clicked cancel, so bring back the file viewing modal
            } else {
                $scope.getListOfFiles($scope.currentPermitInfo.PermitVersionId);
            }
        }
    };

    $scope.getListOfFiles = function (permitVersionId) {

        var promise = PermitService.getListOfFiles(permitVersionId);

        promise.then(function (resp) {
            $scope.selectedFilesList = [];// modal will update this value, but it's stored here so there is still access to it when modal closes
            $scope.fileList = resp.data;
            $scope.NumberOfUploadedFiles = $scope.fileList.length;

            $ctrl.varList = {
                fileList: $scope.fileList,
                header: "Uploaded Files",
                permitVersionId
            };

            $scope.openModal('/app/views/modalViews/UploadedFilesModal.html', 'uploadedPermitDetailFilesModalCtrl', $ctrl.varList);

            $scope.modalInstance.result.then(function (resultObj) {

                $scope.handleModalResult(resultObj, 'main modal')

            }, function () { });
        })
    }
    
    $scope.init = function (permitVersionId) {
        $scope.id = permitVersionId;
        $scope.currentPermitVersionId = permitVersionId;
        $scope.getSystemPermitTypes();
        $scope.loadPermitDetails();
        $scope.loadPermitDates();
        $scope.getPermitNotes($scope.includeDeletedNotes);
        $scope.getNoteTemplates(1);
        self.loadPermitCategories();
        $scope.getNumberOfUploadedFiles(permitVersionId);
    };
});

app.controller('ModalCtrl', function ($scope, $uibModalInstance) {
    var $ctrl = this;

    $ctrl.close = function () {
        $uibModalInstance.dismiss('cancel');
    };
});

app.controller('officerPermitDashboardController', function ($rootScope, $scope, $filter, $uibModal, PermitService) {
    var self = this;
    var $ctrl = this;
    // SCOPE-LEVEL VARIABLES
    $scope.permitListings = [];
    $scope.maxPerPage = 10;
    $scope.currentPage = 1;
    $scope.maxPages = 1;
    $scope.numberOfResults = 0;
    $scope.searchKeywords = "";
    $scope.loading = true;
    $scope.includeIncomplete = false;
    $scope.pageNumbers = [{
        text: "Page 1 of 1",
        value: 1
    }];
    $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];
    $scope.detailsUrl = '';

    $scope.selectedPage = $scope.pageNumbers[0];

    // SELF VARIABLES
    self.currentOrganizationId = 0;

    $scope.changePage = function () {
        $scope.currentPage = $scope.selectedPage.value;
        $scope.getPermitListings();
    };

    $scope.officerPermitDetail = function (permitId) {
        $ctrl.varList = permitId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/officerPermitDetail.html',
            controller: 'officerPermitDetailModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
        });
    };

    $scope.getPermitListings = function () {
        self.loadPermitListings();
    };

    $scope.renderURL = function (permit) {
        return $scope.detailsUrl.replace("PVID", permit.PermitVersionId);
    }

    $scope.init = function (organizationId) {
        self.currentOrganizationId = organizationId;
        $scope.detailsUrl = $rootScope.permitDetailsUrl;
        self.loadPermitListings();
    };

    $scope.init = function () {
        $scope.detailsUrl = $rootScope.permitDetailsUrl;
        self.currentOrganizationId = $rootScope.orgID;
        self.loadPermitListings();
    };

    $scope.propertyName = '-FriendlyPermitNumber';
    $scope.reverse = false;

    $scope.changeOrderByProperty = function (newPropertyName) {
        $scope.propertyName = '-' + newPropertyName;
        $scope.reverse = !$scope.reverse;
    };

    self.loadPermitListings = function () {
        $scope.loading = true;
        var completed = document.getElementById('completed');
        var incomplete = document.getElementById('incomplete');
        var canceled = document.getElementById('canceled');
        var held = document.getElementById('held');
        var pending = document.getElementById('pending');
        var denied = document.getElementById('denied');
        var promise = PermitService.getPermitListingByOrg(self.currentOrganizationId, encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, completed.checked, incomplete.checked, canceled.checked, held.checked, pending.checked, denied.checked, false);
        promise.then(function (response) {
            var data = response.data;

            $scope.numberOfResults = data.NumResults;
            $scope.permitListings = data.Permits;
            $scope.currentPage = data.CurrentPage;
            $scope.maxPages = data.PageCount;
            $scope.loading = false;
            $scope.pageNumbers = [];
            for (var i = 1; i <= data.PageCount; i++) {
                $scope.pageNumbers.push({
                    text: "Page " + i.toString() + " of " + data.PageCount.toString(),
                    value: i
                }
                );
            }

            $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];
        });
    };

});


app.controller('permitWizardStep1Controller', function ($scope, $filter, PermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitTypes = {};
    $scope.permitVersion = {};
    $scope.loading = true;
    $scope.step1Ready = false;
    self.advancedUrl = '';


    $scope.changePermitType = function (type) {
        $scope.permitVersion.PermitType = type.PermitTypeId;
        for (var i = 0; i < $scope.permitTypes.length; i++) {
            //if ($scope.permitTypes[i].Selected && )
        }
        angular.forEach($scope.permitTypes, function (value, key) {
            if (value.Selected && value.PermitTypeId !== type.PermitTypeId) {
                $scope.permitTypes[key].Selected = false;
            }
        });
        type.Selected = true;
        $scope.step1Ready = ($scope.permitVersion.PermitType > 0);
    };

    $scope.goToNextStep = function (registrationNotOpenUrl) {
        var promise = PermitService.userUpdatePermitInfo($scope.permitVersion);
      //  console.log(registrationNotOpenUrl);
        promise.then(function (response) {
            var newPermitInfo = response.data;

            if (!newPermitInfo.SubmissionAllowed) {
                window.location.href = registrationNotOpenUrl;

            } else if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {

                self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                window.location.href = self.advancedUrl;
            }
        });
    }

    self.loadPermitTypes = function () {
        var promise = PermitService.getPermitTypes($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitTypes = response.data;

            $scope.loading = false;
        });
    };

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.step1Ready = (response.data.PermitType > 0);
        });
    };

    $scope.init = function (permitVersionId, url) {
        $scope.permitVersionId = permitVersionId;
        self.advancedUrl = url;
        self.loadPermitVersion();
        self.loadPermitTypes();

    };
});

app.controller('permitWizardStep2Controller', function ($scope, $filter, PermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitTypes = {};
    $scope.permitCategories = {};
    $scope.permitCategoriesIds = [];
    $scope.permitVersion = {};
    $scope.loading = true;
    $scope.step1Ready = false;


    self.advancedUrl = '';
    self.categoryCount = 0;
    $scope.minimumCategoryCount = 1;
    $scope.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        errorCount += (self.categoryCount < $scope.minimumCategoryCount) ? 1 : 0;
        errorCount += (self.categoryCount > $scope.maximumCategoryCount) ? 1 : 0;
        return (errorCount === 0);
    }

    $scope.changePermitCategory = function (category) {
        //$scope.permitVersion.PermitType = type.PermitTypeId;
        //console.log(category);

        angular.forEach($scope.permitCategories, function (value, key) {
            //if (value.) {
            //    $scope.permitCategories[key].Selected = false;
            //}
            if ($scope.permitCategories[key].CategoryId === category.CategoryId) {
                $scope.permitCategories[key].Selected = !$scope.permitCategories[key].Selected;
                $scope.permitCategoriesIds.push(category.CategoryId);
            }
        });
        //console.log($scope.permitCategories);
        //type.Selected = true;
        //$scope.step1Ready = ($scope.permitVersion.PermitType > 0);
        self.getPermitCategoryCount();

    };

    $scope.goToNextStep = function (registrationNotOpenUrl) {
        var promise = PermitService.userUpdatePermitInfo($scope.permitVersion);
        promise.then(function (response) {
            var newPermitInfo = response.data;

            if (!newPermitInfo.SubmissionAllowed) {
                window.location.href = registrationNotOpenUrl;

            } else if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {
                //console.log($scope.permitCategories);
                //console.log($scope.permitCategoriesIds);
                //var updatedPermitCategories = {};
                //angular.forEach($scope.permitCategories, function (value, key) {
                //    updatedPermitCategories[key].Selected = $scope.permitCategories[key].Selected;
                //});
                //Object.defineProperties(updatedPermitCategories, {Selected = false, PermitVersionId = 0, PermitCategoryId = 0});
                //angular.forEach($scope.permitCategories, function (value, key) {
                //    updatedPermitCategories[key].Selected = $scope.permitCategories[key].Selected;
                //    updatedPermitCategories[key].PermitVersionId = $scope.permitCategories[key].PermitVersionId;
                //    updatedPermitCategories[key].PermitCategoryId = $scope.permitCategories[key].PermitCategoryId;
                //    updatedPermitCategories[key].PermitCategory = $scope.permitCategories[key].PermitCategory;

                //});
                //console.log(JSON.stringify(updatedPermitCategories));
                //console.log(updatedPermitCategories);


                

                var categoryPromise = PermitService.updatePermitCategories(newPermitInfo.PermitVersionId, $scope.permitCategoriesIds);
                categoryPromise.then(function (response) {
                    self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                    window.location.href = self.advancedUrl;
                });


            }
        });
    }

    self.getPermitCategoryCount = function () {
        self.categoryCount = 0;
        angular.forEach($scope.permitCategories, function (value, key) {
            if (value.Selected) {
                self.categoryCount += 1;
            }
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
           // console.log(response.data);
            $scope.permitCategories = response.data;
            $scope.loading = false;
            self.getPermitCategoryCount();
        });
    };

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.step1Ready = (response.data.PermitType > 0);

        });
    };

    $scope.init = function (permitVersionId, url) {
        $scope.permitVersionId = permitVersionId;
        self.advancedUrl = url;
        self.loadPermitVersion();
        self.loadPermitCategories();
        self.getPermitCategoryCount();
    };
});

app.controller('permitWizardStep3Controller', function ($scope, $filter, $uibModal, uiCalendarConfig, PermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitTypes = {};
    $scope.permitDates = {};
    $scope.permitVersion = {};
    $scope.loading = true;
    $scope.eventSources = [];
    $scope.calendarLoading = true;


    self.advancedUrl = '';
    self.categoryCount = 0;
    self.minimumEventCount = 1;
    self.maximumEventCount = 10;
    self.permitId = 0;
    self.permitVersion = 0;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        //errorCount += $scope.basicInfo.$valid ? 0 : 1;
        errorCount += ($scope.events.length < self.minimumEventCount) ? 1 : 0;
        errorCount += ($scope.events.length > self.maximumEventCount) ? 1 : 0;
        return (errorCount === 0);
    }

    $scope.changePermitCategory = function (category) {
        angular.forEach($scope.permitCategories, function (value, key) {
            if ($scope.permitCategories[key].CategoryId === category.CategoryId) {
                $scope.permitCategories[key].Selected = !$scope.permitCategories[key].Selected;
            }
        });
        self.getPermitCategoryCount();

    };

    $scope.goToNextStep = function () {

        self.advancedUrl = self.advancedUrl.toString().format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
        window.location.href = self.advancedUrl;
    }

    self.getPermitCategoryCount = function () {
        self.categoryCount = 0;
        angular.forEach($scope.permitCategories, function (value, key) {
            if (value.Selected) {
                self.categoryCount += 1;
            }
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
            self.getPermitCategoryCount();
        });
    };

    self.digestPermitDates = function () {

        $scope.events = $scope.permitDates.map(function (item) {
            var eventVersion = {
                id: item.PermitDateId,
                title: item.Location,
                start: new Date(item.Start),
                end: new Date(item.End),
                editable: item.CanEdit,
                permitDate: item
            };
            return eventVersion;
        });
        $scope.eventSources.push({ events: $scope.events });
        uiCalendarConfig.calendars['myCalendar'].fullCalendar('refetchEvents');
        uiCalendarConfig.calendars['myCalendar'].fullCalendar('rerenderEvents');
    };

    self.loadPermitDates = function () {
        //        $scope.eventSources = [];
        $scope.eventSources.splice(0, $scope.eventSources.length)
        var promise = PermitService.userGetPermitDates($scope.permitVersionId);
        promise.then(function (response) {

            $scope.permitDates = JSON.parse(response.data);
            $scope.loading = false;
            self.digestPermitDates();
            self.getPermitCategoryCount();
            $scope.calendarLoading = false;
        });
    };

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.step1Ready = (response.data.PermitType > 0);

        });
    };

    $scope.newPermitDate = function () {
        try {
            var promise = PermitService.userNewPermitDate($scope.permitVersionId);
            promise.then(function (response) {
              $scope.editPermitDate(response.data);

            });
        } catch (ex) {
            console.log("ERROR");
        }
    };

    $scope.editPermitDate = function (data) {
        var p = angular.copy(data);

        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/permit/user_edit_date.html?c=' + (new Date()).getTime(),
            backdrop: 'static',
            size: 'sm',
            controller: PermitDateModalInstanceController,
            resolve: {
                sourcePermitDate: function () { return p; },
                showApprovalStatus: function () { return false; },
                permitVersionId: function () {
                    return $scope.permitVersionId;
                }
            }
        });

        modalInstance.result.then(function (result) {

            var promise = PermitService.userUpdatePermitDate($scope.permitVersionId, result);
            promise.then(function (response) {

                self.loadPermitDates();

            });

        });
    };



    $scope.uiConfig = {
        calendar: {
            editable: false,
            //displayEventTime: false,
            header: {
                left: 'monthly weekly daily',
                center: 'title',
                right: 'prev,next'
            },
            eventClick: function (event) {

                $scope.editPermitDate(event.permitDate);

            },
            viewRender: $scope.viewRender,
            timezone: 'UTC',
            views: {
                monthly: {
                    type: 'month',
                    buttonText: 'Month',

                    displayEventTime: true
                },
                weekly: {
                    type: 'basicWeek',
                    buttonText: 'Weekly'
                },
                daily: {
                    type: 'basicDay',
                    buttonText: 'Daily'
                }
            },

            displayEventTime: true,
            displayEventEnd: true
        }
    };

    //$scope.eventSources = [$scope.events];

    $scope.init = function (permitVersionId, url) {
        $scope.permitVersionId = permitVersionId;
        self.advancedUrl = url;
        self.loadPermitVersion();
        self.loadPermitDates();
    };


});

// Wizard Permit Date Modal
function PermitDateModalInstanceController($scope, $uibModalInstance, PermitService, permitVersionId, sourcePermitDate, showApprovalStatus) {
    var self = this;
    self.permitVersionId = permitVersionId;
    $scope.currentPermitDate = sourcePermitDate;
    $scope.showApprovalStatus = showApprovalStatus;
    $scope.currentPermitDate.Start = new Date($scope.currentPermitDate.Start).formatDateTime();
    $scope.currentPermitDate.End = new Date($scope.currentPermitDate.End).formatDateTime();
    $scope.permitLocationTemplates = {};


    $scope.initPermitDateModal = function () {

        var templatePromise = PermitService.getPermitLocationTemplatesByPermitVersion(self.permitVersionId, false);
        templatePromise.then(function (response) {
            $scope.permitLocationTemplates = response.data.map(function (val) {
                return {
                    ApplicationId: val.ApplicationId,
                    ApplicationName: val.ApplicationName,
                    CanEdit: val.CanEdit,
                    CreatedBy: val.CreatedBy,
                    CreatedByFirstName: val.CreatedByFirstName,
                    CreatedByLastName: val.CreatedByLastName,
                    DateCreated: val.DateCreated,
                    DateDeleted: val.DateDeleted,
                    LastUpdated: val.LastUpdated,
                    Name: (val.ParentLocationId > 0 ? '.....' : '') + val.Name,
                    ParentLocationId: val.ParentLocationId,
                    PermitLocationId: val.PermitLocationId,
                    PermitType: val.PermitType
                };
            });
            for (var i = 0; i < response.data.length; i++) {
                if (response.data[i].PermitLocationId === sourcePermitDate.LocationTemplateId) {
                    $scope.selectedLocation = response.data[i];
                    break;
                }
            }
        });
    };

    $scope.setEndDate = function () {

        //Set end date to five days after start date
        //$scope.currentPermitDate.End = new Date($scope.currentPermitDate.Start.getTime() + (1000 * 60 * 60 * 24 * 5)).formatDateTime(); 
        var datetemp = new Date($scope.currentPermitDate.Start);
        datetemp.setDate(datetemp.getDate() + 5);
        //console.log(datetemp);
        $scope.currentPermitDate.End = datetemp.formatDateTime();
    }

    $scope.delete = function () {
        if (confirm('Are you sure you want to delete this event date?')) {
            var promise = PermitService.userDeletePermitDate(self.permitVersionId, $scope.currentPermitDate);
            promise.then(function (response) {
                $uibModalInstance.close(response.data);
            });
        }
    };

    $scope.cancel = function () {
        var proceed = true;
        if ($scope.permitDateEdit.$dirty)
            proceed = confirm('Are you sure you want to cancel modifying this event? Your unsaved changes will be lost.');
        if (proceed)
            $uibModalInstance.dismiss('cancel');
    };

    $scope.commit = function () {
        $uibModalInstance.close($scope.currentPermitDate);
    };

    $scope.initPermitDateModal();
};

// Admin Permit Date Modal
function AdminPermitDateModalInstanceController($scope, $uibModalInstance, PermitService, permitVersionId, sourcePermitDate, showApprovalStatus, $uibModal) {
    var self = this;
    self.permitVersionId = permitVersionId;
    $scope.currentPermitDate = sourcePermitDate;
    $scope.showApprovalStatus = showApprovalStatus;
    $scope.rootProcessId = sourcePermitDate.ProcessId;
    $scope.previousStartDate = sourcePermitDate.Start;
    $scope.currentPermitDate.Start = new Date($scope.currentPermitDate.Start).formatDateTime();
    $scope.currentPermitDate.End = new Date($scope.currentPermitDate.End).formatDateTime();
    $scope.permitLocationTemplates = {};

    var $ctrl = this;

    $scope.checkEndDate = function () {

        //*Notes: 

        //- sourcePermitDate.Start and sourcePermitDate.End are passed to this controller in two forms.sourcePermitDate.Start is in the Date object form 
        //Sat Mar 06 2021 11: 00: 00 GMT - 0500(Eastern Standard Time), but that time is 5 hours behind the value in the db (16:00:00). This is corrected by using
        //formatDateTime() (which is actually for UTC time), not sure how that time was messed up after pulling from db. sourcePermitDate.End is in string form 
        //"3/8/2021 5:00 PM" and DOES match the database. When formatDateTime() is used above to set $scope.currentPermitDate.End, the date/time doesn't change for 
        //sourcePermitDate.End because that method accepts a Date type not string. If a date/time is a Date type, and matches the db value, formatNormalDateTime() is the correct formatter

        //- Although $scope.currentPermitDate.Start/End are the ng-models, they are in string form of the date/time. Use sourcePermitDate.Start/End instead when working with the values.


        //Use formatDateTime() to correct and match time to value in db, then make that a "new Date" to turn it back to a Date type for comparison with end date
        var newStartDate = new Date(sourcePermitDate.Start.formatDateTime());
        var endDate;

        //When controller is passed sourcePermitDate.End it is a string value, but if user changes it in UI it then becomes a Date type and is changed to the incorrect eastern time.
        //Need to endDate based on this in order to have the correct date of type Date to work with and display.
        if (typeof (sourcePermitDate.End) === "string") {
            endDate = new Date(sourcePermitDate.End);

        } else {
            endDate = new Date(sourcePermitDate.End.formatDateTime());
        }

        //*Don't remove this if statement, if start date is invalid, and isn't corrected then the user will see an error for the end date.
        //If the start date/time is invalid because it is beyond the end date, reverse the start and end dates to fix, then skip the rest of the code in the method.
        //This method is triggered as soon user clicks start date, so this fixes the dates before user even changes the start date. Hence skipping the rest of code
        if ((new Date($scope.previousStartDate.formatDateTime())) > new Date(sourcePermitDate.End.formatDateTime())) {

            var temp = new Date($scope.previousStartDate.formatDateTime());

            $scope.currentPermitDate.Start = new Date(endDate).formatNormalDateTime();
            $scope.previousStartDate = new Date(endDate);
            $scope.currentPermitDate.End = new Date(temp).formatNormalDateTime();

            return;
        }

        //If start date is updated to past the end date, then change the end date by the same amount of time that the start date was increased
        if (newStartDate >= endDate) {

            //Find the difference in milliseconds
            var diff = newStartDate - $scope.previousStartDate;

            //Add the difference to the current end date
            endDate.setMilliseconds(diff);
        }

        //Update end date shown in UI
        $scope.currentPermitDate.End = endDate.formatNormalDateTime();

        //Reset the previous date that is stored to the new start date in case user changes the start date again
        $scope.previousStartDate = newStartDate;
    }

    $scope.workflowHistory = function (rootProcessId) {
        $ctrl.varList = rootProcessId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/workflowHistory.html',
            controller: 'workflowHistoryInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
    };

    $scope.initPermitDateModal = function () {

        var templatePromise = PermitService.getPermitLocationTemplatesByPermitVersion(self.permitVersionId, false);
        templatePromise.then(function (response) {

            $scope.permitLocationTemplates = response.data;
            for (var i = 0; i < response.data.length; i++) {
                if (response.data[i].PermitLocationId === sourcePermitDate.LocationTemplateId) {
                    $scope.selectedLocation = response.data[i];
                    break;
                }
            }
        });
    };

    $scope.delete = function () {
        if (confirm('Are you sure you want to delete this event date?')) {
            var promise = PermitService.userDeletePermitDate(self.permitVersionId, $scope.currentPermitDate);
            promise.then(function (response) {
                $uibModalInstance.close(response.data);
            });
        }
    };

    $scope.cancel = function () {
        var proceed = true;
        if ($scope.permitDateEdit.$dirty)
            proceed = confirm('Are you sure you want to cancel modifying this event? Your unsaved changes will be lost.');
        if (proceed)
            $uibModalInstance.dismiss('cancel');
    };

    $scope.commit = function () {
        $uibModalInstance.close($scope.currentPermitDate);
    };

    $scope.initPermitDateModal();
};


app.controller('permitWizardStep4Controller', function ($scope, $filter, PermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.associatedApplications = {};
    $scope.loading = true;


    self.advancedUrl = '';
    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    }

    $scope.goToNextStep = function () {
        var promise = PermitService.userUpdatePermitInfo($scope.permitVersion);
        promise.then(function (response) {
            var newPermitInfo = response.data;
            if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {

                var categoryPromise = PermitService.updatePermitCategories(newPermitInfo.PermitVersionId, $scope.permitCategories);
                categoryPromise.then(function (response) {
                    self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                    window.location.href = self.advancedUrl;
                });


            }
        });

    };



    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            self.loadAssociatedApplications();
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = PermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    $scope.init = function (permitVersionId, url) {
        $scope.permitVersionId = permitVersionId;
        self.advancedUrl = url;
        self.loadPermitVersion();
    };
});


app.controller('permitWizardReviewController', function ($scope, $filter, PermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.permitCategories = {};
    $scope.associatedApplications = {};
    $scope.loading = true;
    $scope.permitDates = {};
    $scope.submitting = false;
    $scope.registrationOpen = false;


    self.advancedUrl = '';
    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    }

    $scope.goToNextStep = function () {
        var promise = PermitService.userUpdatePermitInfo($scope.permitVersion);
        promise.then(function (response) {
            var newPermitInfo = response.data;
            if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {

                var categoryPromise = PermitService.updatePermitCategories(newPermitInfo.PermitVersionId, $scope.permitCategories);
                categoryPromise.then(function (response) {
                    self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                    window.location.href = self.advancedUrl;
                });


            }
        });

    };

    $scope.submitPermit = function (registrationNotOpenUrl) {
        $scope.submitting = true;
        var promise = PermitService.userSubmitPermit($scope.permitVersion);
        promise.then(function (response) {

            if (!$scope.registrationOpen) {
                window.location.href = registrationNotOpenUrl;

            }
            else {
                self.advancedUrl = self.advancedUrl.format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
                window.location.href = self.advancedUrl;
                $scope.submitting = false;
            }
            });
    };

    self.loadPermitVersion = function () {
        var promise = PermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
           // console.log($scope.permitVersion);
            $scope.registrationOpen = $scope.permitVersion.SubmissionAllowed;
            //console.log($scope.registrationOpen);
            self.loadPermitDates();
            self.loadPermitCategories();
        });
    };

    self.loadPermitDates = function () {
        var promise = PermitService.userGetPermitDates($scope.permitVersionId);
        promise.then(function (response) {

            $scope.permitDates = JSON.parse(response.data).map(function (x) {
                return { PermitVersionId: x.PermitVersionId, Start: (new Date(x.Start)).formatDateTime(), End: (new Date(x.End)).formatDateTime(), Location: x.Location, PermitDateId: x.PermitDateId };
            });
        });
    };

    self.loadPermitCategories = function () {
        var promise = PermitService.getSelectedPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = PermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    $scope.init = function (permitVersionId, url) {
        $scope.permitVersionId = permitVersionId;
        self.advancedUrl = url;
        self.loadPermitVersion();
    };
});


app.controller('adminPermitTypesController', function ($scope, $filter, $uibModal, PermitService) {

    $scope.editPermitTypeLocations = function (permitTypeId) {
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/system/edit_permit_locations.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: PermitLocationModalInstanceController,
            resolve: {
                permitTypeId: function () { return permitTypeId; }
            }
        });
    };

    $scope.editPermitAssociationOrgTypes = function (permitTypeId) {
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/permit/edit_org_types.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: PermitBindingModalInstanceController,
            resolve: {
                permitTypeId: function () { return permitTypeId; }
            }
        });
    };

});


function PermitBindingModalInstanceController($scope, $uibModal, $uibModalInstance, PermitService, OrganizationTypeService, permitTypeId) {
    var self = this;
    $scope.permitTypeId = permitTypeId;
    $scope.orgTypes = {};
    $scope.newOrgType = {};
    $scope.availableTypes = {};
    $scope.selectedType = {
        OrganizationTypeId: -1
    };


    $scope.bindTypes = function () {

        var promise = PermitService.getMappedOrganizationTypesToPermitType($scope.permitTypeId);
        promise.then(function (response) {
            $scope.orgTypes = response.data;
            $scope.requestNewOrgType();
        });
    };

    $scope.removeOrgType = function (orgType) {
        if (confirm('Are you sure you want to remove this organization type?')) {
            var promise = PermitService.deleteMappedOrganizationType($scope.permitTypeId, orgType);
            promise.then(function (response) {
                $scope.bindTypes();
            });
        }
    };

    $scope.addOrgType = function () {
        var promise = PermitService.addMappedOrganizationType($scope.permitTypeId, $scope.newOrgType);
        promise.then(function (response) {
            $scope.bindTypes();
        });
    };

    $scope.requestNewOrgType = function () {
        $scope.newOrgType = PermitService.newMappedOrganizationType($scope.permitTypeId);
        var promise = OrganizationTypeService.getAllSystemOrganizationType();
        promise.then(function (response) {
            var list = response.data.map(function (val) {
                return {
                    OrganizationTypeId: val.OrganizationTypeId,
                    Name: val.OrganizationTypeName
                };
            });
            list.unshift({
                OrganizationTypeId: -1,
                Name: "- ALL ORGANIZATION TYPES -"
            });
            $scope.availableTypes = list;
        });
    };

    $scope.commit = function () {
        $uibModalInstance.close();
    };

    $scope.init = function () {
        $scope.bindTypes();
    };
    $scope.init();
}

// Permit Type Location Modal Dialog
function PermitLocationModalInstanceController($scope, $uibModal, $uibModalInstance, PermitLocationService, permitTypeId) {
    var self = this;
    $scope.permitTypeId = permitTypeId;
    $scope.locationTemplates = {};
    $scope.rootTemplates = {};
    $scope.currentTemplate = {};
    $scope.editing = false;

    $scope.initPermitTypeLocationModal = function () {
        var templatePromise = PermitLocationService.getLocationTemplatesByPermitTypeId($scope.permitTypeId, false);
        templatePromise.then(function (response) {
            $scope.locationTemplates = response.data;
        });

    };

    $scope.deleteLocation = function (objLocation) {
        if (confirm('Are you sure you want to delete this location?')) {
            var templatePromise = PermitLocationService.deletePermitLocationTemplate(objLocation);
            templatePromise.then(function (response) {
                $scope.initPermitTypeLocationModal();
            });
        }
    };

    $scope.requestAddLocation = function (objLocation) {
        var templatePromise = PermitLocationService.newLocationTemplate($scope.permitTypeId, objLocation.PermitLocationId);
        templatePromise.then(function (response) {

            $scope.editLocation(response.data);
        });
    };

    $scope.newLocation = function (parentId) {
        var templatePromise = PermitLocationService.newLocationTemplate($scope.permitTypeId, parentId);
        templatePromise.then(function (response) {

            $scope.editLocation(response.data);
        });
    };

    $scope.editLocation = function (location) {
        var loc = angular.copy(location);
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/system/add_edit_permit_locations.html?c=' + (new Date()).getTime(),
            size: 'md',
            controller: PermitLocationAddModalInstanceController,
            resolve: {
                locationModel: function () { return loc; }
            }
        });
        modalInstance.result.then(function (result) {

            var promise = PermitLocationService.updatePermitLocationTemplate(result);
            promise.then(function (response) {

                $scope.initPermitTypeLocationModal();

            });

        });
    };


    $scope.commit = function () {
        $uibModalInstance.close($scope.currentPermitDate);
    };

    $scope.initPermitTypeLocationModal();
};


function PermitLocationAddModalInstanceController($scope, $uibModalInstance, PermitLocationService, locationModel) {
    var self = this;
    $scope.currentTemplate = locationModel;
    $scope.editing = false;
    $scope.rootPermitLocationTemplates = {};

    $scope.initPermitTypeLocationAddModal = function () {
        var promise = PermitLocationService.getRootLocationTemplatesByPermitTypeId(locationModel.PermitType);
        promise.then(function (response) {
            var list = response.data.map(function (obj) {
                var r = { Name: obj.Name, PermitLocationId: obj.PermitLocationId };
                return r;
            });
            list.unshift({ Name: "- Not Applicable -", PermitLocationId: 0 });
            var finalList = [];
            $scope.rootPermitLocationTemplates = list;
            if (list.length > 0 && $scope.selectedLocation === undefined) {
                var foundIt = false;
                for (var i = 0; i < list.length; i++) {
                    if (list[i].PermitLocationId === locationModel.ParentLocationId) {
                        $scope.selectedLocation = list[i];
                        foundIt = true;
                    } else {
                        finalList.push(list[i]);
                    }
                }
                if (!foundIt)
                    $scope.selectedLocation = finalList[0];
            }
        });

    };

    $scope.cancel = function (objLocation) {
        $uibModalInstance.dismiss();
    };


    $scope.commit = function () {
        $uibModalInstance.close($scope.currentTemplate);
    };

    $scope.initPermitTypeLocationAddModal();
};


/* Individual Component Controllers */
app.controller('permitWidgetDashboardController', function ($rootScope, $scope, $filter, $uibModal, $route, PermitService, mode, detailsUrl) {
    var self = this;
    var $ctrl = this;
    // SCOPE-LEVEL VARIABLES
    $scope.permitListings = [];
    $scope.maxPerPage = 10;
    $scope.currentPage = 1;
    $scope.maxPages = 1;
    $scope.numberOfResults = 0;
    $scope.searchKeywords = "";
    $scope.loading = true;
    $scope.includeIncomplete = false;
    self.mode = 1;
    $scope.pageNumbers = [{
        text: "Page 1 of 1",
        value: 1
    }];
    $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];
    $scope.detailsUrl = '';

    $scope.selectedPage = $scope.pageNumbers[0];

    // SELF VARIABLES
    self.currentOrganizationId = 0;

    $scope.changePage = function () {
        $scope.currentPage = $scope.selectedPage.value;
        $scope.getPermitListings();
    };

    $scope.officerPermitDetail = function (permitId) {
        $ctrl.varList = permitId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/officerPermitDetail.html',
            controller: 'officerPermitDetailModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
        });
    };

    $scope.getPermitListings = function () {
        self.loadPermitListings();
    };

    $scope.renderURL = function (permit) {
        return $scope.detailsUrl.replace("PVID", permit.PermitVersionId);
    }

    $scope.init = function (organizationId) {
        self.currentOrganizationId = organizationId;
        $scope.detailsUrl = detailsUrl;
        
        self.loadPermitListings();
    };

    $scope.init = function () {
        $scope.detailsUrl = $rootScope.permitDetailsUrl;
        self.currentOrganizationId = $rootScope.orgID;
        $scope.detailsUrl = detailsUrl;
        self.loadPermitListings();
    };

    $scope.propertyName = '-FriendlyPermitNumber';
    $scope.reverse = false;

    $scope.changeOrderByProperty = function (newPropertyName) {
        $scope.propertyName = '-' + newPropertyName;
        $scope.reverse = !$scope.reverse;
    };

    self.loadPermitListings = function () {
        $scope.loading = true;
        var completed = document.getElementById('completed');
        var incomplete = document.getElementById('incomplete');
        var canceled = document.getElementById('canceled');
        var held = document.getElementById('held');
        var pending = document.getElementById('pending');
        var denied = document.getElementById('denied');
        if (self.mode == 1)
            var promise = PermitService.getPermitListingByUserId(encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, completed.checked, incomplete.checked, canceled.checked, held.checked, pending.checked, denied.checked, false);
        else
            var promise = PermitService.getPermitListingByOrg(self.currentOrganizationId,encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, completed.checked, incomplete.checked, canceled.checked, held.checked, pending.checked, denied.checked, false);
        promise.then(function (response) {
            var data = response.data;

            $scope.numberOfResults = data.NumResults;
            $scope.permitListings = data.Permits;
            $scope.currentPage = data.CurrentPage;
            $scope.maxPages = data.PageCount;
            $scope.loading = false;
            $scope.pageNumbers = [];
            for (var i = 1; i <= data.PageCount; i++) {
                $scope.pageNumbers.push({
                    text: "Page " + i.toString() + " of " + data.PageCount.toString(),
                    value: i
                }
                );
            }

            $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];
        });
    };

});


;
app.controller('permitDashboardController',
    function ($scope, $filter, PermitService, WorkflowService, $uibModal) {

        var $ctrl = this;

        $scope.itemsOptions = [15, 30, 60, 120];

        $scope.itemsPerPage = 15;
        $scope.currentPage = 1;
        $scope.loading = false;

        $scope.permitView = [];
        $scope.permitPeriods = [];
        $scope.permitTypeNames = [];

        $scope.permitType = "";
        $scope.MinDBDate = new Date(0001, 01, 01);
        $scope.DateEnteredMin = new Date();
        $scope.minSubmitDateSet = false;
        $scope.DateEnteredMax = new Date();
        $scope.maxSubmitDateSet = false;
        $scope.DateEnteredMinEvent = new Date();
        $scope.minEventDateSet = false;
        $scope.DateEnteredMaxEvent = new Date();
        $scope.maxEventDateSet = false;

        $scope.onlyMine = true;
        $scope.pending = true;
        $scope.denied = false;
        $scope.held = false;
        $scope.incomplete = false;
        $scope.completed = false;
        $scope.cancelled = false;
        $scope.deleted = false;

        $scope.propertyName = '-MinStartDate';
        $scope.reverse = false;

        $scope.approvalCount = {};
        $scope.showApprovalCount = false;
        $scope.showNAtext = false;

        $scope.changeOrderByProperty = function (newPropertyName) {
            $scope.propertyName = '-' + newPropertyName;
            $scope.reverse = !$scope.reverse;
        };

        $scope.filter = function (value) {
            $scope[value] = !$scope[value];
            $scope.filteredPermitView = $filter('permitStatusFilter')($scope.permitView, $scope);
            $scope.permitTypeNames = $scope.getPermitTypeNames($scope.filteredPermitView);
        };

        //$scope.getNoteStatusInfo = function (permitVersionId) {
        //    PermitService.getNoteStatusInfo(permitVersionId, true).then(function (response) {
        //        $scope.publicNotesUnSeen = response.data;
        //        $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread'
        //        console.log($scope.publicNotesUnSeen);
        //    });
        //}

        $scope.updateApprovalStatus = function (stepItemId, processId) {
            WorkflowService.updateApprovalStatus(stepItemId, processId).then(function (response) {
                $scope.getPermitDashboardView();
            });
        };

        $scope.superApprove = function (processId) {
            $ctrl.varList = 'SUPER Approve this Permit(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.superApprove(processId);
                    promise.then(function (response) {
                        $scope.getPermitDashboardView();
                    });
                }
            });
        };

        $scope.superDeny = function (processId) {
            $ctrl.varList = 'SUPER Deny this Permit(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    WorkflowService.superDeny(processId).then(function (response) {
                        $scope.getPermitDashboardView();
                    });
                }
            });
        };

        $scope.remove = function (permitVersionId) {
            PermitService.remove(permitVersionId).then(function (response) {
                $scope.getPermitDashboardView();
            });
        };

        $scope.restore = function (permitVersionId) {
            PermitService.restore(permitVersionId).then(function (response) {
                $scope.getPermitDashboardView();
            });
        };

        $scope.getPermitDashboardView = function () {
            $scope.loading = true;

            PermitService.getPermitDashboardView(0).then(function (response) {
                $scope.permitView = response.data.Permits;
                $scope.filteredPermitView = $scope.permitView;
                $scope.permitTypeNames = $scope.getPermitTypeNames($scope.filteredPermitView);
                $scope.reFilteredPermitView = $scope.filteredPermitView;
                $scope.filter('none');
                $scope.loading = false;
                
            });
        };

        $scope.getPermitTypeNames = function (permits) {
            var listOfPermitTypeNames = [];

            angular.forEach(permits, function (permit) {
                var isDuplicate = false;
                var value = permit.PermitTypeName;

                for (var i = 0; i < listOfPermitTypeNames.length; i++) {
                    if (permit.PermitTypeName === listOfPermitTypeNames[i]) {
                        isDuplicate = true;
                        break;
                    }
                }

                if (!isDuplicate) {
                    listOfPermitTypeNames.push(permit.PermitTypeName)
                }
            });
            return listOfPermitTypeNames;

        };

        $scope.changeDateEnteredMinEvent = function (minDate) {
            $scope.MinEventDate = minDate;
            $scope.minEventDateSet = true;
           
            return true;
        };

        $scope.filterStartDateEvent = function () {
            if ($scope.minEventDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) >= jwru.constellation.utils.formatShortDate($scope.MinSubmitDate)
                    return Date.parse(item['MinStartDate']) >= Date.parse($scope.MinEventDate);
                };
            }

        }

        $scope.changeDateEnteredMaxEvent = function (maxDate) {
            $scope.MaxEventDate = maxDate;
            $scope.maxEventDateSet = true;           
             
            return true;
        };

        $scope.filterEndDateEvent = function () {
            if ($scope.maxEventDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) <= jwru.constellation.utils.formatShortDate($scope.MaxSubmitDate)
                    return Date.parse(item['MinStartDate']) <= Date.parse($scope.MaxEventDate);
                
                };
            }

        }
        $scope.changeDateEnteredMin = function (minDate) {
            $scope.MinSubmitDate = minDate;
            $scope.minSubmitDateSet = true;
                   
            return true;
        };

        $scope.filterStartDate = function () {
            if ($scope.minSubmitDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) >= jwru.constellation.utils.formatShortDate($scope.MinSubmitDate)
                    return Date.parse(item['Submitted']) >= Date.parse($scope.MinSubmitDate);
                };
            }

        }

        $scope.changeDateEnteredMax = function (maxDate) {
            $scope.MaxSubmitDate = maxDate;
            $scope.maxSubmitDateSet = true;           
                     
            return true;
        };

        $scope.filterEndDate = function () {
            if ($scope.maxSubmitDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) <= jwru.constellation.utils.formatShortDate($scope.MaxSubmitDate)
                    return Date.parse(item['Submitted']) <= Date.parse($scope.MaxSubmitDate);
                
                };
            }

        }

        $scope.reset = function () {
           // console.log("reset function");
            $scope.TypeOfPermit = "";           
            $scope.MinSubmitDate = new Date();
            $scope.minSubmitDateSet = false;
            $scope.MaxSubmitDate = new Date();
            $scope.maxSubmitDateSet = false;
            $scope.MinEventDate = new Date();
            $scope.minEventDateSet = false;
            $scope.MaxEventDate = new Date();
            $scope.maxEventDateSet = false;

            return true;
        }

        $scope.getPermitApprovalsNeededCount = function (processId, permitVersionId) {

            //If approvalCount.ProcessId exists from a previous call and the same "approval count" element was clicked a second time, hide or show it
            if ($scope.approvalCount.PermitVersionId != undefined && permitVersionId === $scope.approvalCount.PermitVersionId) {
                $scope.showApprovalCount = !$scope.showApprovalCount;

            } else {

                //If a differenet permit "approval count" is clicked then make call for new count
                var promise = WorkflowService.getPermitApprovalsNeededCount(processId);
                promise.then(function (resp) {

                    $scope.approvalCount = resp.data
                    $scope.approvalCount.PermitVersionId = permitVersionId

                    //Show N/A message for permits that don't require approvals
                    if ($scope.approvalCount.CurrentTotalApprovals === -1) {
                        $scope.showNAtext = true;
                    } else {
                        $scope.showNAtext = false;
                    }

                    $scope.showApprovalCount = true;
                });
            }
        };
        
        $scope.init = function () {

            $scope.getPermitDashboardView();
        };

        $scope.init();

    }).filter('permitStatusFilter',
    function () {
        return function (permits, $scope) {
            var filteredPermits = [];
            if (permits.length > 0) {
                for (var i = 0; i < permits.length; i++) {
                    if ((permits[i].AvailableStepItems && permits[i].AvailableStepItems.length > 0 || !$scope.onlyMine) &&
                        (permits[i].Status === 0 && $scope.pending ||
                        permits[i].Status === 2 && $scope.denied ||
                        permits[i].Status === 3 && $scope.held ||
                        permits[i].Status === 99 && $scope.incomplete ||
                        permits[i].Status === 5 && $scope.completed ||
                        permits[i].Status === 4 && $scope.cancelled) &&
                        (permits[i].Deleted < permits[i].Created || $scope.deleted)) {
                        filteredPermits.push(permits[i]);
                    }
                }
            }
            return filteredPermits;
        }
    });;
app.controller('permitTypeController', function ($scope, $filter, PermitService, $uibModal) {

    //***THIS CONTROLLER IS DESIGNED TO ALLOW THE USER TO CHOOSE A SINGLE SUBMISSION DATE (end or start date) IF DESIRED.
    // HOWEVER, IT HAS BEEN DISABLED BY A CONDITION ON THE SAVE BUTTON. REMOVE THAT CONDITION IF ABILITY 
    // FOR A SINGLE SUBMISSION DATE IS NEEDED. YOU WILL ALSO NEED TO UPDATE HOW THE STORED PROCEDURE [Permit].[Dates_CheckPermitSubmissionDates]
    // CHECKS SUBMISSION DATES

    //Utils for dateTime formatting
    $scope.utils = jwru.constellation.utils;
    $scope.useSubmissionDates = false;
    $scope.startDate;
    $scope.endDate;
    $scope.submissionDates = {};

    $scope.getSubmissionDates = function (permitTypeId) {

        //-1 is passed for the permitVersionId that will be expected at the API layer and eventually be converted to a null before being passed to the db
        var promise = PermitService.getSubmissionDates(-1, permitTypeId);

        promise.then(function (resp) {
            $scope.submissionDates = resp.data;

            //If either date is the C# min date, set it to an empty string (for user to see a blank input field), otherwise set it to a reader friendly format
            $scope.submissionDates.SubmissionStartDate = resp.data.SubmissionStartDate === "0001-01-01T00:00:00" ? '' : $scope.utils.formatNormalDateTime(resp.data.SubmissionStartDate);
            $scope.submissionDates.SubmissionEndDate = resp.data.SubmissionEndDate === "0001-01-01T00:00:00" ? '' : $scope.utils.formatNormalDateTime(resp.data.SubmissionEndDate);
            
            //Save the dates in case the user toggles the option to use submission dates a few times. Prevents making another call to db for each toggle
            $scope.startDate = angular.copy($scope.submissionDates.SubmissionStartDate);
            $scope.endDate = angular.copy($scope.submissionDates.SubmissionEndDate);

            if ($scope.submissionDates.SubmissionStartDate != '' || $scope.submissionDates.SubmissionEndDate != '') {
                $scope.useSubmissionDates = true;
            }
        });
    }

    $scope.toggleUseSubmissionDates = function () {

        $scope.useSubmissionDates = !$scope.useSubmissionDates;

        //If they toggled useSubmissionDates on and a startDate or endDate already existed use those dates. If they toggled it off, set the dates they see to blank space
        if ($scope.useSubmissionDates && ($scope.startDate || $scope.endDate)) {
            $scope.submissionDates.SubmissionStartDate = angular.copy($scope.startDate);
            $scope.submissionDates.SubmissionEndDate = angular.copy($scope.endDate);

        } else {
            $scope.submissionDates.SubmissionStartDate = '';
            $scope.submissionDates.SubmissionEndDate = '';
        }
    }

    $scope.updateSubmissionDates = function () {

        //If user doesn't want submission dates, remove them from the object going to the API layer so that the dates become the C# min date, then they will be entered into the db as NULL
        if (!$scope.useSubmissionDates) {
            delete $scope.submissionDates.SubmissionStartDate;
            delete $scope.submissionDates.SubmissionEndDate;
        }
        var promise = PermitService.createOrUpdateSubmissionDates($scope.submissionDates);
    }
});;
app.controller('taggedAdminsModalCtrl', function ($scope, $filter, $uibModalInstance, PermitService, varList, edit) {

    $scope.userInput = '';
    $scope.itemsPerPage = 10;
    $scope.query = '';
    $scope.currentPage = 1;
    $scope.loadingUsers = false;
    $scope.itemsPerAccodionModalPage = 10;
    $scope.currentAccordionModalPage = 1;
    $scope.userInput = '';
    $scope.showingAllUsers = false;
    $scope.noUsersAvailable = false;
    $scope.selectedUserIDs = [];
   

    var $ctrl = this;

    $scope.addAdmins = function () {

        var promise = PermitService.createTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.loadAvailableAdmins();

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereAdded = true;
        });

    };

    $scope.getTaggedAdmins = function (varList) {
        //console.log('getTaggedAdmins');
        $scope.loadingUsers = true;
        var promise = PermitService.getTaggedAdmins(varList);
        promise.then(function (response) {
          //  console.log(response.data);
            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        });
    };

    $scope.removeTaggedAdmins = function () {
        //console.log('remove tagged admins');

        var promise = PermitService.removeTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.getTaggedAdmins(varList);

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereRemoved = true;
        });

    };

    $scope.selectUser = function (user) {

        //if user was selected and the ID is not already in the array, then add the ID
        if (user.Selected && !$scope.selectedUserIDs.includes(user.UserId)) {
            $scope.selectedUserIDs.push(user.UserId)
        }

        //if user was deselected and the ID is in the array, then remove the ID
        if (!user.Selected && $scope.selectedUserIDs.includes(user.UserId)) {
            var index;
            index = $scope.selectedUserIDs.indexOf(user.UserId);
            $scope.selectedUserIDs.splice(index, 1);
        }
    }

    $scope.loadAvailableAdmins = function () {
        $scope.loadingUsers = true;
        var promise = PermitService.getAvailableTaggedAdmins()
        promise.then(function (response) {
            
            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        })

    };

    $scope.init = function () {
        if (edit) {
            $scope.loadAvailableAdmins();
        }
        else {
            $scope.getTaggedAdmins(varList);
        }
        
    };

    $scope.init();

    $ctrl.cancel = function () {

        if ($scope.usersWereAdded) {
            $uibModalInstance.close(1);

        } else {
            $uibModalInstance.dismiss('cancel');
        }
    };
});
//app.controller('vendorPermitDashboardController', function ($scope, $filter, VendorPermitService, WorkflowService, $uibModal, $q) {
//    // SCOPE-LEVEL VARIABLES
//    $scope.permitListings = {};
//    $scope.maxPerPage = 10;
//    $scope.currentPage = 1;
//    $scope.maxPages = 1;
//    $scope.numberOfResults = 0;
//    $scope.searchKeywords = "";
//    $scope.loading = true;
//    $scope.sortBy = 'permitNo';
//    $scope.orderBy = true;
//    $scope.pageNumbers = [{
//        text: "Page 1 of 1",
//        value: 1
//    }];
//    $scope.includePending = true;
//    $scope.includeCompleted = false;
//    $scope.includeIncomplete = false;
//    $scope.includeCancelled = false;
//    $scope.includeHeld = false;
//    $scope.includeDenied = false;
//    $scope.includeDeleted = false;
//    $scope.includeMineOnly = true;

//    var $ctrl = this;

//    $scope.checkboxClicked = function (model) {

//        switch (model) {

//            case 'pending':
//                $scope.includePending = !$scope.includePending;
//                break;
//            case 'completed':
//                $scope.includeCompleted = !$scope.includeCompleted;
//                break;
//            case 'denied':
//                $scope.includeDenied = !$scope.includeDenied;
//                break;
//            case 'held':
//                $scope.includeHeld = !$scope.includeHeld;
//                break;
//            case 'canceled':
//                $scope.includeCancelled = !$scope.includeCancelled;
//                break;
//            case 'incomplete':
//                $scope.includeIncomplete = !$scope.includeIncomplete;
//                break;
//            case 'deleted':
//                $scope.includeDeleted = !$scope.includeDeleted;
//                break;
//        }
//    }

//    $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];

//    $scope.selectedPage = $scope.pageNumbers[0];

//    $scope.changePage = function () {
//        $scope.currentPage = $scope.selectedPage.value;
//        $scope.getPermitListings();
//    };

//    $scope.updateApprovalStatus = function (stepItemId, stepItemApprovalStatusId, processId) {
//        var promise = VendorPermitService.updateApprovalStatus(stepItemId, stepItemApprovalStatusId, processId);
//        promise.then(function (response) {
//            $scope.getPermitListings();
//        });
//    };

//    $scope.remove = function (permitVersionId) {
//        var promise = VendorPermitService.remove(permitVersionId);
//        promise.then(function (response) {
//            $scope.getPermitListings();
//        });
//    };

//    $scope.restore = function (permitVersionId) {
//        var promise = VendorPermitService.restore(permitVersionId);
//        promise.then(function (response) {
//            $scope.getPermitListings();
//        });
//    };

//    $scope.getOrderedPermitListing = function (sortBy, columnNumber) {
//        if ($scope.sortBy === sortBy) {
//            $scope.orderBy = !$scope.orderBy;

//        }
//        else {
//            $scope.sortBy = sortBy;
//            $scope.orderBy = true;
//        }
//        $scope.selectedColumn = columnNumber;
//        $scope.getPermitListings();

//    }

//    $scope.superApprove = function (processId) {
//        $ctrl.varList = 'SUPER Approve this Permit(This can NOT be UNDONE)';
//        var modalInstance = $uibModal.open({
//            animation: true,
//            ariaLabelledBy: 'modal-title',
//            ariaDescribedBy: 'modal-body',
//            templateUrl: '/app/views/confirmedDialog/confirm.html',
//            controller: 'confirmedModalInstanceCtrl',
//            controllerAs: '$ctrl',
//            size: '',
//            resolve: {
//                varList: function () {
//                    return $ctrl.varList;
//                }
//            }
//        });
//        modalInstance.result.then(function (result) {
//            if (result === 1) {
//                var promise = WorkflowService.superApprove(processId);
//                promise.then(function (response) {
//                    $scope.init();
//                });
//            }
//        }, function () {

//        });
//    };

//    $scope.superDeny = function (processId) {
//        $ctrl.varList = 'SUPER Deny this Permit(This can NOT be UNDONE)';
//        var modalInstance = $uibModal.open({
//            animation: true,
//            ariaLabelledBy: 'modal-title',
//            ariaDescribedBy: 'modal-body',
//            templateUrl: '/app/views/confirmedDialog/confirm.html',
//            controller: 'confirmedModalInstanceCtrl',
//            controllerAs: '$ctrl',
//            size: '',
//            resolve: {
//                varList: function () {
//                    return $ctrl.varList;
//                }
//            }
//        });
//        modalInstance.result.then(function (result) {
//            if (result === 1) {
//                var promise = WorkflowService.superDeny(processId);
//                promise.then(function (response) {
//                    $scope.init();
//                });
//            }
//        });
//    };

//    $scope.getPermitListings = function () {
//        $scope.loading = true;

//        var promise = VendorPermitService.getPermitListing(encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, $scope.includeCompleted, $scope.includeIncomplete,
//            $scope.includeCancelled, $scope.includeHeld, $scope.includePending, $scope.includeDenied, $scope.includeDeleted, $scope.includeMineOnly, $scope.orderBy, encodeURI($scope.sortBy));
//        promise.then(function (response) {
//            var data = response.data;
//            console.log(response.data);
//            $scope.numberOfResults = data.NumResults;
//            console.log($scope.numberOfResults);
//            $scope.permitListings = data.Permits;
//            $scope.currentPage = data.CurrentPage;
//            $scope.maxPages = data.PageCount;
//            $scope.loading = false;
//            $scope.pageNumbers = [];
//            for (var i = 1; i <= data.PageCount; i++) {
//                $scope.pageNumbers.push({
//                    text: "Page " + i.toString() + " of " + data.PageCount.toString(),
//                    value: i
//                }
//                );
//            }

//            $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];
//        });
//    };

//    $scope.init = function () {
//        $scope.getPermitListings();
//    };
//    $scope.init();
//});


app.controller('vendorPermitDashboardController',
    function ($scope, $filter, VendorPermitService, WorkflowService, $uibModal) {

        var $ctrl = this;

        $scope.itemsOptions = [15, 30, 60, 120];

        $scope.itemsPerPage = 15;
        $scope.currentPage = 1;
        $scope.loading = false;

        $scope.permitView = [];
        $scope.permitPeriods = [];

        $scope.permitType = "";
        $scope.MinDBDate = new Date(0001, 01, 01);
        $scope.DateEnteredMin = new Date();
        $scope.minSubmitDateSet = false;
        $scope.DateEnteredMax = new Date();
        $scope.maxSubmitDateSet = false;
        $scope.DateEnteredMinEvent = new Date();
        $scope.minEventDateSet = false;
        $scope.DateEnteredMaxEvent = new Date();
        $scope.maxEventDateSet = false;

        $scope.onlyMine = true;
        //$scope.onlyMine = false;

        $scope.pending = true;
        $scope.denied = false;
        $scope.held = false;
        $scope.incomplete = false;
        $scope.completed = false;
        $scope.cancelled = false;
        $scope.deleted = false;

        $scope.propertyName = '-MinStartDate';
        $scope.reverse = false;

        $scope.approvalCount = {};
        $scope.showApprovalCount = false;
        $scope.showNAtext = false;

        $scope.changeOrderByProperty = function (newPropertyName) {
            $scope.propertyName = '-' + newPropertyName;
            $scope.reverse = !$scope.reverse;
        };

        $scope.filter = function (value) {
            $scope[value] = !$scope[value];
            $scope.filteredPermitView = $filter('permitStatusFilter')($scope.permitView, $scope);
            $scope.permitTypeNames = $scope.getPermitTypeNames($scope.filteredPermitView);
        };

        $scope.updateApprovalStatus = function (stepItemId, processId) {
            WorkflowService.updateApprovalStatus(stepItemId, processId).then(function (response) {
                $scope.getPermitDashboardView();
            });
        };

        $scope.superApprove = function (processId) {
            $ctrl.varList = 'SUPER Approve this Permit(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.superApprove(processId);
                    promise.then(function (response) {
                        $scope.getPermitDashboardView();
                    });
                }
            });
        };

        $scope.superDeny = function (processId) {
            $ctrl.varList = 'SUPER Deny this Permit(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    WorkflowService.superDeny(processId).then(function (response) {
                        $scope.getPermitDashboardView();
                    });
                }
            });
        };

        $scope.remove = function (permitVersionId) {
            PermitService.remove(permitVersionId).then(function (response) {
                $scope.getPermitDashboardView();
            });
        };

        $scope.restore = function (permitVersionId) {
            PermitService.restore(permitVersionId).then(function (response) {
                $scope.getPermitDashboardView();
            });
        };

        $scope.getPermitDashboardView = function () {
            $scope.loading = true;

            VendorPermitService.getPermitDashboardView(0).then(function (response) {

                $scope.permitView = response.data.Permits;
                $scope.filteredPermitView = $scope.permitView;
                $scope.permitTypeNames = $scope.getPermitTypeNames($scope.filteredPermitView);
                $scope.reFilteredPermitView = $scope.filteredPermitView;
                //console.log($scope.filteredPermitView);
               
                $scope.filter('none');
                $scope.loading = false;
            });
        };

        $scope.getPermitTypeNames = function (permits) {
            var listOfPermitTypeNames = [];

            angular.forEach(permits, function (permit) {
                var isDuplicate = false;
                var value = permit.PermitTypeName;
                //console.log(value);

                for (var i = 0; i < listOfPermitTypeNames.length; i++) {
                    if (permit.PermitTypeName === listOfPermitTypeNames[i]) {
                        isDuplicate = true;
                        break;
                    }
                }

                if (!isDuplicate) {
                    listOfPermitTypeNames.push(permit.PermitTypeName)
                }
            });
           // console.log(listOfPermitTypeNames);
            return listOfPermitTypeNames;

        };

        $scope.changeDateEnteredMinEvent = function (minDate) {
            $scope.MinEventDate = minDate;
            $scope.minEventDateSet = true;

            return true;
        };

        $scope.filterStartDateEvent = function () {
            if ($scope.minEventDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) >= jwru.constellation.utils.formatShortDate($scope.MinSubmitDate)
                    return Date.parse(item['MinStartDate']) >= Date.parse($scope.MinEventDate);
                };
            }

        }

        $scope.changeDateEnteredMaxEvent = function (maxDate) {
            $scope.MaxEventDate = maxDate;
            $scope.maxEventDateSet = true;

            return true;
        };

        $scope.filterEndDateEvent = function () {
            if ($scope.maxEventDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) <= jwru.constellation.utils.formatShortDate($scope.MaxSubmitDate)
                    return Date.parse(item['MinStartDate']) <= Date.parse($scope.MaxEventDate);

                };
            }

        }
        $scope.changeDateEnteredMin = function (minDate) {
            $scope.MinSubmitDate = minDate;
            $scope.minSubmitDateSet = true;

            return true;
        };

        $scope.filterStartDate = function () {
            if ($scope.minSubmitDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) >= jwru.constellation.utils.formatShortDate($scope.MinSubmitDate)
                    return Date.parse(item['Submitted']) >= Date.parse($scope.MinSubmitDate);
                };
            }

        }

        $scope.changeDateEnteredMax = function (maxDate) {
            $scope.MaxSubmitDate = maxDate;
            $scope.maxSubmitDateSet = true;

            return true;
        };

        $scope.filterEndDate = function () {
            if ($scope.maxSubmitDateSet) {
                return function (item) {
                    //return jwru.constellation.utils.formatShortDate((item['Submitted'])) <= jwru.constellation.utils.formatShortDate($scope.MaxSubmitDate)
                    return Date.parse(item['Submitted']) <= Date.parse($scope.MaxSubmitDate);

                };
            }

        }

        $scope.getPermitApprovalsNeededCount = function (processId, permitVersionId) {

            //If approvalCount.ProcessId exists from a previous call and the same "approval count" element was clicked a second time, hide or show it
            if ($scope.approvalCount.PermitVersionId != undefined && permitVersionId === $scope.approvalCount.PermitVersionId) {
                $scope.showApprovalCount = !$scope.showApprovalCount;

            } else {

                //If a differenet permit "approval count" is clicked then make call for new count
                var promise = WorkflowService.getPermitApprovalsNeededCount(processId);
                promise.then(function (resp) {

                    $scope.approvalCount = resp.data
                    $scope.approvalCount.PermitVersionId = permitVersionId

                    //Show N/A message for permits that don't require approvals
                    if ($scope.approvalCount.CurrentTotalApprovals === -1) {
                        $scope.showNAtext = true;
                    } else {
                        $scope.showNAtext = false;
                    }

                    $scope.showApprovalCount = true;
                });
            }
        };

        $scope.reset = function () {
           // console.log("reset function");
            $scope.TypeOfPermit = "";
            $scope.MinSubmitDate = new Date();
            $scope.minSubmitDateSet = false;
            $scope.MaxSubmitDate = new Date();
            $scope.maxSubmitDateSet = false;
            $scope.MinEventDate = new Date();
            $scope.minEventDateSet = false;
            $scope.MaxEventDate = new Date();
            $scope.maxEventDateSet = false;

            return true;
        }

        $scope.init = function () {

            $scope.getPermitDashboardView();
        };

        $scope.init();

    }).filter('permitStatusFilter',
        function () {
            return function (permits, $scope) {
                var filteredPermits = [];
                if (permits.length > 0) {
                    for (var i = 0; i < permits.length; i++) {

                    // If (
                    //          (availableStepItems exist || !onlyMine)
                    //                        &&
                    //          ( status = 0 && pending ||
                    //            status = 2 && denied ||
                    //            status = 3 && held ||
                    //            status = 99 && incomplete ||
                    //            status = 5 && completed ||
                    //            status = 4 && cancelled
                    //          )
                    //                        &&
                    //          ( permit !deleted || showDeleted is true )
                    //    )
                    //                  then
                    //      add permit to filteredPermits
                        if ((permits[i].AvailableStepItems && permits[i].AvailableStepItems.length > 0 || !$scope.onlyMine) &&
                            (permits[i].Status === 0 && $scope.pending ||
                                permits[i].Status === 2 && $scope.denied ||
                                permits[i].Status === 3 && $scope.held ||
                                permits[i].Status === 99 && $scope.incomplete ||
                                permits[i].Status === 5 && $scope.completed ||
                                permits[i].Status === 4 && $scope.cancelled) &&
                            (permits[i].Deleted < permits[i].Created || $scope.deleted)) {
                            filteredPermits.push(permits[i]);
                        }
                    }
                }
                //console.log($scope.onlyMine);
                //console.log(filteredPermits);
                return filteredPermits;
            }
        });


app.controller('adminVendorPermitDetailsController', function ($scope, $filter, $uibModal, VendorPermitService, NoteTemplatesService, $location, $anchorScroll, $log, $rootScope) {
    var self = this;
    $scope.currentPermitVersionId = 0;
    $scope.currentPermitInfo = {};
    $scope.currentPermitDates = {};
    $scope.currentPermitNotes = {};
    $scope.currentWorkingPermitNote = {};
    $scope.permitCategories = {};
    $scope.workingPermitDate = {};
    $scope.showWorkflow = false;
    $scope.includeDeletedNotes = false;
    $scope.parent = { workingPermitDate: {} };
    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentPermitId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";
    $scope.permitTyes = [];
    $scope.includeDeletedDates = true;
    $scope.modalInstance = undefined;
    $scope.currentUser = {};
    $scope.coApplicants = [];
    $scope.selectedPermitType = {
        PermitTypeId: 1
    };
    $scope.rootProcessId;
    $scope.id;

    $scope.publicNoteStatusInfo = {};
    $scope.publicNotesSeenText;
    $scope.publicNotesUnSeen;

    var $ctrl = this;

    $scope.moveToPublicNotes = function () {
        $location.hash('publicNotes');

        $anchorScroll();

        $scope.markNoteAsSeenOrUnseen();
    }

    $scope.markNoteAsSeenOrUnseen = function () {
        $scope.publicNotesUnSeen = !$scope.publicNotesUnSeen;

        var statusInfo = {
            IsPublicNote: true,
            NoteUnseen: $scope.publicNotesUnSeen
        };

        var promise = VendorPermitService.updateNoteStatusInfo($scope.currentPermitVersionId, statusInfo);

        $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread';
    }

    $scope.editCoApplicant = function () {
        $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/permit/update_applicants.html?c=' + (new Date()).getTime(),
            scope: $scope,           
            size: 'lg',
        });


    }

    $scope.closeModal = function () {
        $scope.modalInstance.close();
        $scope.currentUser = {};
    }

    $scope.updateCoApplicant = function () {
        var promise = VendorPermitService.updateCoApplicants($scope.currentPermitVersionId, $scope.currentUser.Email);
        promise.then(function (response) {
            $scope.closeModal();
            $scope.getCoApplicant();
        });
    };

    $scope.getCoApplicant = function () {
        var promise = VendorPermitService.getCoApplicant($scope.currentPermitVersionId);
        promise.then(function (response) {
            $scope.coApplicants = response.data;
           
        });
    };

    $scope.viewCoApplicants = function () {
        $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/permit/view_coApplicants.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'sm',
        });
       
    }

    $scope.getNoteTemplates = function (zoneId) {
        NoteTemplatesService.getNoteTemplates(zoneId).then(function (response) {

            $scope.noteTemplates = response.data;
        });
    };

    self.loadPermitCategories = function () {
        var promise = VendorPermitService.getPermitCategories($scope.id);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    $scope.workflowHistory = function (rootProcessId) {
        $ctrl.varList = rootProcessId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/workflowHistory.html',
            controller: 'workflowHistoryInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
    };

    function setSelectedPermitType(permitTypeId) {

        var len = $scope.permitTyes.length;
        for (var i = 0; i < len; i++) {
            var pType = $scope.permitTyes[i];
            if (pType.PermitTypeId === permitTypeId) {
                $scope.selectedPermitType = pType;
                return;
            }
        }
    }
    $scope.permitTypeSelected = function () {
        $scope.currentPermitInfo.PermitType = $scope.selectedPermitType.PermitTypeId;
    }

    $scope.noteTemplateSelected = function (isPrivate) {

        if (isPrivate) {
            $scope.newPrivateNoteText = this.notePrivateTemplate;
        }
        else {
            $scope.newNoteText = this.noteTemplate;
        }
    };

    $scope.getSystemPermitTypes = function () {
        VendorPermitService.getSystemPermitTypes().then(function (response) {
            $scope.permitTyes = response.data;
        });
    }

    $scope.getNoteStatusInfo = function (permitVersionId, isPublicNote) {
        VendorPermitService.getNoteStatusInfo(permitVersionId, isPublicNote).then(function (response) {
            $scope.publicNotesUnSeen = response.data;
            $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread'
        });
    }

    $scope.dateEditModal;
    $scope.loadPermitDetails = function () {
        
        $scope.getNoteStatusInfo($scope.currentPermitVersionId, true);//"true" gets public note status info

        VendorPermitService.getAdminPermitDetails($scope.currentPermitVersionId).then(function (response) {
            $scope.currentPermitInfo = response.data;
            $scope.rootProcessId = $scope.currentPermitInfo.ProcessId;
            // $scope.selectedPermitType = $scope.currentPermitInfo.PermitType;
            setSelectedPermitType($scope.currentPermitInfo.PermitType);
        });
    };

    $scope.loadPermitDates = function () {
        VendorPermitService.getPermitDates($scope.currentPermitVersionId, $scope.includeDeletedDates).then(function (response) {
            $scope.currentPermitDates = JSON.parse(response.data);
        });
    };

    $scope.updatePermitInfo = function () {

        VendorPermitService.updatePermitInfo($scope.currentPermitInfo).then(function (response) {
            $scope.currentPermitInfo = response.data;
            showPermitInfoModelUpdated();
        });
    };

    $scope.deletePermitDate = function (date) {
        if (confirm('Are you sure you want to delete this event?')) {
            var promise = VendorPermitService.deletePermitDate($scope.id, date);
            promise.then(function (response) {
                $scope.loadPermitDates();
            });
        }
    };

    $scope.restorePermitDate = function (date) {
        if (confirm('Are you sure you want to restore this event?')) {
            var promise = VendorPermitService.restorePermitDate($scope.id, date);
            promise.then(function (response) {
                $scope.loadPermitDates();
            });
        }
    };

    function showPermitInfoModelUpdated() {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'abc.html',
            controller: 'ModalCtrl',
            controllerAs: '$ctrl',
            size: ''
        });

        /* modalInstance.result.then(function (varList) {
             $scope.varList = varList;
             $scope.allPositionsView.Positions = $scope.allPositionsView.Positions.concat([{ FullName: null, IsAdded: true, IsRequired: false, IsValid: false, PositionId: 0, PositionTitle: $scope.varList, StudentId: null, Email: null }]);
         }, function () {
             $log.info('Modal dismissed');
         });*/
    }

    $scope.newPermitDate = function () {
        if ($scope.currentPermitVersionId > 0) {
            VendorPermitService.newPermitDate($scope.currentPermitVersionId).then(function (response) {

                $scope.editPermitDate(response.data);
            })
        }
    };

    $scope.editPermitDateOld = function (permitDate) {
        $scope.workingPermitDate = angular.copy(permitDate);
        $scope.parent.workingPermitDate = $scope.workingPermitDate;
        $scope.workingPermitDate.Start = permitDate.Start.formatDateTime();
        $scope.workingPermitDate.End = permitDate.End.formatDateTime();
        $scope.rootProcessId = $scope.workingPermitDate.ProcessId;

        $scope.dateEditModal = $uibModal.open({
            templateUrl: '/app/views/permit/edit_date.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'lg',

        });
        $scope.dateEditModal.result.then(function () {
            $scope.rootProcessId = $scope.currentPermitInfo.ProcessId;
        }, function () {
            $scope.rootProcessId = $scope.currentPermitInfo.ProcessId;
        });

    };

    $scope.editPermitDate = function (data, token) {
        var p = angular.copy(data);
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/permit/edit_date.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: AdminVendorVendorPermitDateModalInstanceController,
            resolve: {
                sourcePermitDate: function () { return p; },
                showApprovalStatus: function () { return false; },
                permitVersionId: function () { return $scope.id; }
            }
        });

        modalInstance.result.then(function (result) {
           // var promise = VendorPermitService.userUpdatePermitDate($scope.id, result, token);
            var promise = VendorPermitService.updatePermitDate(result);
            promise.then(function (response) {

                $scope.loadPermitDates();

            });

        });
    };

    $scope.closeEditDate = function () {
        if ($scope.dateEditModal !== undefined) {
            $scope.dateEditModal.close();
        }
    };

    $scope.getChangeHistory = function () {
        var promise = VendorPermitService.getDateAndLocationHistoryByPermitVersionId($scope.currentPermitVersionId);

        promise.then(function (resp) {
            var varList = {};

            varList.history = angular.copy(resp.data);
            varList.permitVersionId = $scope.currentPermitVersionId;

            //Before making correction below (read comments above next for loop), save the full name of person who deleted the previous record/line of data
            for (var i = 0; i < varList.history.length; i++) {
                varList.history[i].previousRecordChangedBy = varList.history[i].FirstName + ' ' + varList.history[i].LastName;
            }

            //This is to correct the user being shown as the person to caused a change within the history popup. 
            //Example: the current event info is "Reitz Union" on XXDate at XXTime set by Bob. Joe changes it to "Union Lawn" on YYDate at YYTime.
            //In the db the archive table will show the previous info as "Reitz Union" on XXDate at XXTime set by JOE. That's because Joe was the one who deleted/updated the previous info
            //The for loop allows the info to be next to the name of the person who set it, not deleted it.
            for (var i = varList.history.length - 1; i > 0; i--) {

                if (i > 0) {
                    varList.history[i].FirstName = varList.history[i - 1].FirstName;
                    varList.history[i].LastName = varList.history[i - 1].LastName;
                }
            }

            $uibModal.open({
                animation: true,
                templateUrl: '/app/views/modalViews/permitDateAndLocHistory.html',
                size: 'lg',
                controller: 'permitDateAndLocHistoryModalCtrl',
                resolve: {
                    varList: function () {
                        return varList;
                    }
                }
            });

        });
    };

    $scope.commitPermitDate = function () {

        VendorPermitService.updatePermitDate($scope.workingPermitDate).then(function (response) {
            $scope.closeEditDate();
            $scope.loadPermitDates();
        });

    };

    function setDefaultStyle() {
        var len = $scope.currentPermitNotes.length;
        for (var i = 0; i < len; i++) {
            $scope.currentPermitNotes[i].customStyle = $scope.normalNoteStyle;
        }
    }

    $scope.getPermitNotes = function (includeDeleted) {
        VendorPermitService.getPermitNotes($scope.currentPermitVersionId, includeDeleted).then(function (response) {
            $scope.currentPermitNotes = response.data;
        });
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.makeNotePrivate = function (note) {
        $scope.changeNoteType(note, 1);
    };

    $scope.changeNoteType = function (note, type) {
        note.Type = type;
        VendorPermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });
    };

    $scope.newPermitNote = function (parentNoteId, IsPrivate) {

        if ($scope.currentPermitId === 0) {
            VendorPermitService.newPermitNote($scope.currentPermitVersionId, parentNoteId).then(function (response) {

                var note = response.data;
                if (IsPrivate) {
                    note.Type = 1;
                    if ($scope.newPrivateNoteText.trim() === "") {
                        alert("");
                    }
                    response.data.Note = $scope.newPrivateNoteText;
                    $scope.makeNotePrivate(note);
                    $scope.newPrivateNoteText = "";

                }
                else {
                    response.data.Note = $scope.newNoteText;
                    $scope.makeNotePublic(note);
                    // $scope.updatePermitNote(response.data);
                    //$scope.currentPermitNotes.push(response.data);
                    $scope.newNoteText = "";

                    //show notification of new messages
                    $scope.publicNotesUnSeen = true;

                    //change text of button to mark as "read" or "unread"
                    $scope.publicNotesSeenText = 'Read';
                }



            });
        }
        else {

            var note = getNote($scope.currentPermitId);
            if (IsPrivate) {
                note.Note = $scope.newPrivateNoteText;
            }
            else {
                note.Note = $scope.newNoteText;
            }
            VendorPermitService.updatePermitNote(note).then(function (response) {
                $scope.getPermitNotes($scope.includeDeletedNotes);
                $scope.currentPermitId = 0;
                if (IsPrivate) {
                    $scope.newPrivateNoteText = "";
                    $scope.buttonPrivateText = "Post";
                }
                else {
                    $scope.newNoteText = "";
                    $scope.buttonText = "Post";
                }

                note.customStyle = "";

                //show notification of new messages
                $scope.publicNotesUnSeen = true;

                //change text of button to mark as "read" or "unread"
                $scope.publicNotesSeenText = 'Read';
            });

        }
    };
    function getNote(PermitId) {
        var len = $scope.currentPermitNotes.length;
        var note;
        for (var i = 0; i < len; i++) {
            if ($scope.currentPermitNotes[i].PermitNoteId === PermitId) {
                return $scope.currentPermitNotes[i];
            }
        }

    }
    $scope.updatePermitNote = function (note) {
        VendorPermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
            $scope.buttonText = "Post";
        });
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentPermitId = note.PermitNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentPermitId = note.PermitNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }

    $scope.deleteNote = function (note) {
        VendorPermitService.deletePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });
    };

    $scope.restoreNote = function (note) {
        VendorPermitService.restorePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
        });
    };

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };


    $scope.changePermitCategory = function (category) {
        angular.forEach($scope.permitCategories, function (value, key) {
            if ($scope.permitCategories[key].CategoryId === category.CategoryId) {
                $scope.permitCategories[key].Selected = !$scope.permitCategories[key].Selected;
            }
        });
    };

    $scope.savePermitCategories = function () {

        var categoryPromise = VendorPermitService.updatePermitCategories($scope.id, $scope.permitCategories);
        categoryPromise.then(function (response) {
            showPermitInfoModelUpdated();
        });
    };

    $scope.editTaggedAdmin = function () {
        $scope.edit = true;
        $ctrl.varList = $scope.currentPermitVersionId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/createTaggedAdmins.html',
            // scope: $scope,
            controller: 'vendorTaggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
                // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
                // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.viewTaggedAdmins = function () {
        $scope.edit = false;
        $ctrl.varList = $scope.currentPermitVersionId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/updateTaggedAdmins.html',
            // scope: $scope,
            controller: 'vendorTaggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
                // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
                // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.getNumberOfUploadedFiles = function (permitVersionId) {
        var promise = VendorPermitService.getNumberOfUploadedFiles(permitVersionId);

        promise.then(function (resp) {
            $scope.NumberOfUploadedFiles = resp.data;
        })
    }

    $scope.openModal = function (templateUrl, controller, varList) {
        $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl,
            controller,
            controllerAs: '$ctrl',
            size: 'med',
            resolve: {
                varList: function () {
                    return varList;
                }
            }
        });
    };

    $scope.handleModalResult = function (resultObj, modalType) {
        
        if (modalType === 'main modal') {

            //User selected the "remove selected" button of file viewing modal
            if (resultObj.result === 'remove') {

                $scope.selectedFilesList = resultObj.selectedFilesList;

                var varList = {
                    message: "Are you sure you want to remove the selected files?",
                    confirmButtonText: 'Yes',
                    cancelButtonText: 'Cancel'
                }

                //Open confirmation modal
                $scope.openModal('/app/views/confirmedDialog/confirmCustomizable.html', 'confirmCustomizableCtrl', varList);

                //Used anonymous function to call the handlwModalResult method bc without it the method gets called right away and not when a modal gets closed
                $scope.modalInstance.result.then(function (result) {

                    $scope.handleModalResult(result, 'confirm modal')

                }, function () { });

                //User clicked the "close" button on the modal to view files
            } else {
                $scope.modalInstance.close();
            }

        //Decide what will happen when the user chooses to "confirm" or "cancel" on the confirmation modal
        } else {
            
            if (resultObj === 'confirm') {
                var promise = VendorPermitService.deleteFiles($scope.currentPermitInfo.PermitVersionId, $scope.selectedFilesList);

                promise.then(function () {
                    $scope.selectedFilesList = [];
                    $scope.getListOfFiles($scope.currentPermitInfo.PermitVersionId);
                });

            //User clicked cancel, so bring back the file viewing modal
            } else {
                $scope.getListOfFiles($scope.currentPermitInfo.PermitVersionId);
            }
        }
    };

    $scope.getListOfFiles = function (permitVersionId) {

        var promise = VendorPermitService.getListOfFiles(permitVersionId);

        promise.then(function (resp) {
            $scope.selectedFilesList = [];// modal will update this value, but it's stored here so there is still access to it when modal closes
            $scope.fileList = resp.data;
            $scope.NumberOfUploadedFiles = $scope.fileList.length;

            $ctrl.varList = {
                fileList: $scope.fileList,
                header: "Uploaded Files",
                permitVersionId
            };

            $scope.openModal('/app/views/modalViews/UploadedFilesModal.html', 'uploadedPermitDetailFilesModalCtrl', $ctrl.varList);

            $scope.modalInstance.result.then(function (resultObj) {

                $scope.handleModalResult(resultObj, 'main modal')

            }, function () { });
        })
    }

    $scope.init = function (permitVersionId) {
        $scope.id = permitVersionId;
        $scope.currentPermitVersionId = permitVersionId;
        $scope.getSystemPermitTypes();
        $scope.loadPermitDetails();
        $scope.loadPermitDates();
        $scope.getPermitNotes($scope.includeDeletedNotes);
        $scope.getNoteTemplates(1);
        self.loadPermitCategories();
        $scope.getCoApplicant();
        $scope.getNumberOfUploadedFiles(permitVersionId);
    };
});

app.controller('ModalCtrl', function ($scope, $uibModalInstance) {
    var $ctrl = this;

    $ctrl.close = function () {
        $uibModalInstance.dismiss('cancel');
    };
});

app.controller('officerVendorPermitDashboardController', function ($rootScope, $scope, $filter, $uibModal, VendorPermitService) {
    var self = this;
    var $ctrl = this;
    // SCOPE-LEVEL VARIABLES
    $scope.permitListings = [];
    $scope.maxPerPage = 10;
    $scope.currentPage = 1;
    $scope.maxPages = 1;
    $scope.numberOfResults = 0;
    $scope.searchKeywords = "";
    $scope.loading = true;
    $scope.includeIncomplete = false;
    $scope.pageNumbers = [{
        text: "Page 1 of 1",
        value: 1
    }];
    $scope.maxPageOptions = [5, 10, 25, 50, 100, 200];
    $scope.detailsUrl = '';

    $scope.selectedPage = $scope.pageNumbers[0];

    // SELF VARIABLES
    self.currentOrganizationId = 0;

    $scope.changePage = function () {
        $scope.currentPage = $scope.selectedPage.value;
        $scope.getPermitListings();
    };

    $scope.officerPermitDetail = function (permitId) {
        $ctrl.varList = permitId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/officerPermitDetail.html',
            controller: 'officerPermitDetailModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
        });
    };

    $scope.getPermitListings = function () {
        self.loadPermitListings();
    };

    $scope.renderURL = function (permit) {
        return $scope.detailsUrl.replace("PVID", permit.PermitVersionId);
    }

    $scope.init = function (organizationId) {
        self.currentOrganizationId = organizationId;
        $scope.detailsUrl = $rootScope.permitDetailsUrl;
        self.loadPermitListings();
    };

    $scope.init = function () {
        $scope.detailsUrl = $rootScope.permitDetailsUrl;
        self.currentOrganizationId = $rootScope.orgID;
        self.loadPermitListings();
    };

    $scope.propertyName = '-FriendlyPermitNumber';
    $scope.reverse = false;

    $scope.changeOrderByProperty = function (newPropertyName) {
        $scope.propertyName = '-' + newPropertyName;
        $scope.reverse = !$scope.reverse;
    };

    self.loadPermitListings = function () {
        $scope.loading = true;
        var completed = document.getElementById('completed');
        var incomplete = document.getElementById('incomplete');
        var canceled = document.getElementById('canceled');
        var held = document.getElementById('held');
        var pending = document.getElementById('pending');
        var denied = document.getElementById('denied');
        var promise = VendorPermitService.getPermitListingByOrg(self.currentOrganizationId, encodeURIComponent($scope.searchKeywords.replace("/", "|")), $scope.maxPerPage, $scope.currentPage, completed.checked, incomplete.checked, canceled.checked, held.checked, pending.checked, denied.checked, false);
        promise.then(function (response) {
            var data = response.data;

            $scope.numberOfResults = data.NumResults;
            $scope.permitListings = data.Permits;
            $scope.currentPage = data.CurrentPage;
            $scope.maxPages = data.PageCount;
            $scope.loading = false;
            $scope.pageNumbers = [];
            for (var i = 1; i <= data.PageCount; i++) {
                $scope.pageNumbers.push({
                    text: "Page " + i.toString() + " of " + data.PageCount.toString(),
                    value: i
                }
                );
            }

            $scope.selectedPage = $scope.pageNumbers[data.CurrentPage - 1];
        });
    };

});


app.controller('vendorPermitWizardStep1Controller', function ($scope, $filter, VendorPermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.orgId = 0;
    $scope.permitTypes = {};
    $scope.permitVersion = {};
    $scope.loading = true;
    $scope.step1Ready = false;
    self.token = '';
    self.advancedUrl = '';


    $scope.changePermitType = function (type) {
        $scope.permitVersion.PermitType = type.PermitTypeId;
        for (var i = 0; i < $scope.permitTypes.length; i++) {
            //if ($scope.permitTypes[i].Selected && )
        }
        angular.forEach($scope.permitTypes, function (value, key) {
            if (value.Selected && value.PermitTypeId !== type.PermitTypeId) {
                $scope.permitTypes[key].Selected = false;
            }
        });
        type.Selected = true;
        $scope.step1Ready = ($scope.permitVersion.PermitType > 0);
    };

    $scope.goToNextStep = function (registrationNotOpenUrl) {
        if ($scope.permitVersion.PermitVersionId <= 0)
            $scope.permitVersion.OrganizationId = $scope.orgId;
        var promise = VendorPermitService.userUpdatePermitInfo($scope.permitVersion, self.token);
        promise.then(function (response) {
            var newPermitInfo = response.data;
            //console.log(newPermitInfo);
            if (!newPermitInfo.SubmissionAllowed) {
                window.location.href = registrationNotOpenUrl;

            } else if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {
                self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                window.location.href = self.advancedUrl;
            }
        });
    }

    self.loadPermitTypes = function () {
        var promise = VendorPermitService.getPermitTypes($scope.orgId,$scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitTypes = response.data;

            $scope.loading = false;
        });
    };

    self.loadPermitVersion = function () {
        var promise = VendorPermitService.getPermitInfo($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.step1Ready = (response.data.PermitType > 0);
        });
    };

    $scope.init = function (orgId, permitVersionId, url, token) {
        $scope.permitVersionId = permitVersionId;
        $scope.orgId = orgId;
        self.token = token;
        self.advancedUrl = url;
        self.loadPermitVersion();
        self.loadPermitTypes();
        
    };
});

app.controller('vendorPermitWizardStep2Controller', function ($scope, $filter, VendorPermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitTypes = {};
    $scope.permitCategories = {};
    $scope.permitVersion = {};
    $scope.loading = true;
    $scope.step1Ready = false;
    self.token = '';

    self.advancedUrl = '';
    self.categoryCount = 0;
    $scope.minimumCategoryCount = 1;
    $scope.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        errorCount += (self.categoryCount < $scope.minimumCategoryCount) ? 1 : 0;
        errorCount += (self.categoryCount > $scope.maximumCategoryCount) ? 1 : 0;
        return (errorCount === 0);
    }

    $scope.changePermitCategory = function (category) {
        //$scope.permitVersion.PermitType = type.PermitTypeId;
        angular.forEach($scope.permitCategories, function (value, key) {
            //if (value.) {
            //    $scope.permitCategories[key].Selected = false;
            //}
            if ($scope.permitCategories[key].CategoryId === category.CategoryId) {
                $scope.permitCategories[key].Selected = !$scope.permitCategories[key].Selected;
            }
        });
        //type.Selected = true;
        //$scope.step1Ready = ($scope.permitVersion.PermitType > 0);
        self.getPermitCategoryCount();

    };

    $scope.goToNextStep = function () {
        var promise = VendorPermitService.userUpdatePermitInfo($scope.permitVersion, self.token);
        promise.then(function (response) {
            var newPermitInfo = response.data;
            if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {

                var categoryPromise = VendorPermitService.updatePermitCategories(newPermitInfo.PermitVersionId, $scope.permitCategories, self.token);
                categoryPromise.then(function (response) {
                    self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                    window.location.href = self.advancedUrl;
                });


            }
        });
    }

    self.getPermitCategoryCount = function () {
        self.categoryCount = 0;
        angular.forEach($scope.permitCategories, function (value, key) {
            if (value.Selected) {
                self.categoryCount += 1;
            }
        });
    };

    self.loadPermitCategories = function () {
        var promise = VendorPermitService.getPermitCategories($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
            self.getPermitCategoryCount();
        });
    };

    self.loadPermitVersion = function () {
        var promise = VendorPermitService.getPermitInfo($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.step1Ready = (response.data.PermitType > 0);

        });
    };

    $scope.init = function (permitVersionId, url, token) {
        $scope.permitVersionId = permitVersionId;
        self.token = token;
        self.advancedUrl = url;
        self.loadPermitVersion();
        self.loadPermitCategories();
        self.getPermitCategoryCount();

    };
});

app.controller('vendorPermitWizardStep3Controller', function ($scope, $filter, $uibModal, uiCalendarConfig, VendorPermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitTypes = {};
    $scope.permitDates = {};
    $scope.permitVersion = {};
    $scope.loading = true;
    $scope.eventSources = [];
    $scope.calendarLoading = true;


    self.advancedUrl = '';
    self.categoryCount = 0;
    self.minimumEventCount = 1;
    self.maximumEventCount = 10;
    self.permitId = 0;
    self.permitVersion = 0;
    self.token = '';

    $scope.everythingValidated = function () {
        var errorCount = 0;
        //errorCount += $scope.basicInfo.$valid ? 0 : 1;
        errorCount += ($scope.events.length < self.minimumEventCount) ? 1 : 0;
        errorCount += ($scope.events.length > self.maximumEventCount) ? 1 : 0;
        return (errorCount === 0);
    }

    $scope.changePermitCategory = function (category) {
        angular.forEach($scope.permitCategories, function (value, key) {
            if ($scope.permitCategories[key].CategoryId === category.CategoryId) {
                $scope.permitCategories[key].Selected = !$scope.permitCategories[key].Selected;
            }
        });
        self.getPermitCategoryCount();

    };

    $scope.goToNextStep = function () {

        self.advancedUrl = self.advancedUrl.toString().format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
        window.location.href = self.advancedUrl;
    }

    self.getPermitCategoryCount = function () {
        self.categoryCount = 0;
        angular.forEach($scope.permitCategories, function (value, key) {
            if (value.Selected) {
                self.categoryCount += 1;
            }
        });
    };

    self.loadPermitCategories = function () {
        var promise = VendorPermitService.getPermitCategories($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
            self.getPermitCategoryCount();
        });
    };

    self.digestPermitDates = function () {

        $scope.events = $scope.permitDates.map(function (item) {
            var eventVersion = {
                id: item.PermitDateId,
                title: item.Location,
                start: new Date(item.Start),
                end: new Date(item.End),
                editable: item.CanEdit,
                permitDate: item
            };
            return eventVersion;
        });
        $scope.eventSources.push({ events: $scope.events });
        uiCalendarConfig.calendars['myCalendar'].fullCalendar('refetchEvents');
        uiCalendarConfig.calendars['myCalendar'].fullCalendar('rerenderEvents');
    };

    self.loadPermitDates = function () {
        //        $scope.eventSources = [];
        $scope.eventSources.splice(0, $scope.eventSources.length)
        var promise = VendorPermitService.userGetPermitDates($scope.permitVersionId, self.token);
        promise.then(function (response) {

            $scope.permitDates = JSON.parse(response.data);
            $scope.loading = false;
            self.digestPermitDates();
            self.getPermitCategoryCount();
            $scope.calendarLoading = false;
        });
    };

    self.loadPermitVersion = function () {
        var promise = VendorPermitService.getPermitInfo($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.step1Ready = (response.data.PermitType > 0);

        });
    };

    $scope.newPermitDate = function () {
        var promise = VendorPermitService.userNewPermitDate($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.editPermitDate(response.data);

        });
    };

    $scope.editPermitDate = function (data) {
        var p = angular.copy(data);
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/permit/user_edit_date.html?c=' + (new Date()).getTime(),
            backdrop: 'static',
            size: 'sm',
            controller: VendorPermitDateModalInstanceController,
            resolve: {
                sourcePermitDate: function () { return p; },
                showApprovalStatus: function () { return false; },
                permitVersionId: function () {
                    return $scope.permitVersionId;
                },
                token: function () {
                    return self.token;
                }
            }
        });

        modalInstance.result.then(function (result) {
            
            var promise = VendorPermitService.userUpdatePermitDate($scope.permitVersionId, result, self.token);
            promise.then(function (response) {

                self.loadPermitDates();

            });

        });
    };



    $scope.uiConfig = {
        calendar: {
            editable: false,
            //displayEventTime: false,
            header: {
                left: 'monthly weekly daily',
                center: 'title',
                right: 'prev,next'
            },
            eventClick: function (event) {

                $scope.editPermitDate(event.permitDate);

            },
            viewRender: $scope.viewRender,
            timezone: 'UTC',
            views: {
                monthly: {
                    type: 'month',
                    buttonText: 'Month',

                    displayEventTime: true
                },
                weekly: {
                    type: 'basicWeek',
                    buttonText: 'Weekly'
                },
                daily: {
                    type: 'basicDay',
                    buttonText: 'Daily'
                }
            },

            displayEventTime: true,
            displayEventEnd: true
        }
    };

    //$scope.eventSources = [$scope.events];

    $scope.init = function (permitVersionId, url, token) {
        $scope.permitVersionId = permitVersionId;
        self.token = token;
        self.advancedUrl = url;
        self.loadPermitVersion();
        self.loadPermitDates();
    };


});

// Wizard Permit Date Modal
function VendorPermitDateModalInstanceController($scope, $uibModalInstance, VendorPermitService, permitVersionId, sourcePermitDate, showApprovalStatus, token) {
    var self = this;
    self.permitVersionId = permitVersionId;
    self.token = '';
    $scope.currentPermitDate = sourcePermitDate;
    $scope.showApprovalStatus = showApprovalStatus;
    $scope.currentPermitDate.Start = new Date($scope.currentPermitDate.Start).formatDateTime();
    $scope.currentPermitDate.End = new Date($scope.currentPermitDate.End).formatDateTime();
    $scope.permitLocationTemplates = {};


    $scope.initPermitDateModal = function () {

        var templatePromise = VendorPermitService.getPermitLocationTemplatesByPermitVersion(self.permitVersionId, false, token);
        templatePromise.then(function (response) {
            $scope.permitLocationTemplates = response.data.map(function (val) {
                return {
                    ApplicationId: val.ApplicationId,
                    ApplicationName: val.ApplicationName,
                    CanEdit: val.CanEdit,
                    CreatedBy: val.CreatedBy,
                    CreatedByFirstName: val.CreatedByFirstName,
                    CreatedByLastName: val.CreatedByLastName,
                    DateCreated: val.DateCreated,
                    DateDeleted: val.DateDeleted,
                    LastUpdated: val.LastUpdated,
                    Name: (val.ParentLocationId > 0 ? '.....' : '') + val.Name,
                    ParentLocationId: val.ParentLocationId,
                    PermitLocationId: val.PermitLocationId,
                    PermitType: val.PermitType
                };
            });
            for (var i = 0; i < response.data.length; i++) {
                if (response.data[i].PermitLocationId === sourcePermitDate.LocationTemplateId) {
                    $scope.selectedLocation = response.data[i];
                    break;
                }
            }
        });
    };

    $scope.setEndDate = function () {

        //Set end date to five days after start date
       // console.log($scope.currentPermitDate);
       // $scope.currentPermitDate.End = new Date($scope.currentPermitDate.Start.getTime() + (1000 * 60 * 60 * 24 * 5)).formatDateTime();
        var datetemp = new Date($scope.currentPermitDate.Start);
        datetemp.setDate(datetemp.getDate() + 5);
        //console.log(datetemp);
        $scope.currentPermitDate.End = datetemp.formatDateTime();
      
    }

    $scope.delete = function () {
        if (confirm('Are you sure you want to delete this event date?')) {
            console.log(self.permitVersionId, $scope.currentPermitDate, token);
            var promise = VendorPermitService.userDeletePermitDatev2(self.permitVersionId, $scope.currentPermitDate, token);
            promise.then(function (response) {
                $uibModalInstance.close(response.data);
            });
        }
    };

    $scope.cancel = function () {
        var proceed = true;
        if ($scope.permitDateEdit.$dirty)
            proceed = confirm('Are you sure you want to cancel modifying this event? Your unsaved changes will be lost.');
        if (proceed)
            $uibModalInstance.dismiss('cancel');
    };

    $scope.commit = function () {
        $uibModalInstance.close($scope.currentPermitDate);
    };

    $scope.initPermitDateModal();
};

// Admin Permit Date Modal
function AdminVendorVendorPermitDateModalInstanceController($scope, $uibModalInstance, VendorPermitService, permitVersionId, sourcePermitDate, showApprovalStatus, $uibModal) {
    var self = this;
    self.permitVersionId = permitVersionId;
    $scope.currentPermitDate = sourcePermitDate;
    $scope.showApprovalStatus = showApprovalStatus;
    $scope.rootProcessId = sourcePermitDate.ProcessId;
    $scope.previousStartDate = sourcePermitDate.Start;
    $scope.currentPermitDate.Start = new Date($scope.currentPermitDate.Start).formatDateTime();
    $scope.currentPermitDate.End = new Date($scope.currentPermitDate.End).formatDateTime();
    $scope.permitLocationTemplates = {};

    var $ctrl = this;

    $scope.checkEndDate = function () {

        //*Notes: 

        //- sourcePermitDate.Start and sourcePermitDate.End are passed to this controller in two forms.sourcePermitDate.Start is in the Date object form 
        //Sat Mar 06 2021 11: 00: 00 GMT - 0500(Eastern Standard Time), but that time is 5 hours behind the value in the db (16:00:00). This is corrected by using
        //formatDateTime() (which is actually for UTC time), not sure how that time was messed up after pulling from db. sourcePermitDate.End is in string form 
        //"3/8/2021 5:00 PM" and DOES match the database. When formatDateTime() is used above to set $scope.currentPermitDate.End, the date/time doesn't change for 
        //sourcePermitDate.End because that method accepts a Date type not string. If a date/time is a Date type, and matches the db value, formatNormalDateTime() is the correct formatter

        //- Although $scope.currentPermitDate.Start/End are the ng-models, they are in string form of the date/time. Use sourcePermitDate.Start/End instead when working with the values.

        //Use formatDateTime() to correct and match time to value in db, then make that a "new Date" to turn it back to a Date type for comparison with end date
        var newStartDate = new Date(sourcePermitDate.Start.formatDateTime());
        var endDate;

        //When controller is passed sourcePermitDate.End it is a string value, but if user changes it in UI it then becomes a Date type and is changed to the incorrect eastern time.
        //Need to endDate based on this in order to have the correct date of type Date to work with and display.
        if (typeof (sourcePermitDate.End) === "string") {
            endDate = new Date(sourcePermitDate.End);

        } else {
            endDate = new Date(sourcePermitDate.End.formatDateTime());
        }

        //*Don't remove this if statement, if start date is invalid, and isn't corrected then the user will see an error for the end date.
        //If the start date/time is invalid because it is beyond the end date, reverse the start and end dates to fix, then skip the rest of the code in the method.
        //This method is triggered as soon user clicks start date, so this fixes the dates before user even changes the start date. Hence skipping the rest of code
        //if ((new Date($scope.previousStartDate)) - sourcePermitDate.Start === 0) {
        if ((new Date($scope.previousStartDate.formatDateTime())) > new Date(sourcePermitDate.End.formatDateTime())) {

            var temp = new Date($scope.previousStartDate.formatDateTime());

            $scope.currentPermitDate.Start = new Date(endDate).formatNormalDateTime();
            $scope.previousStartDate = new Date(endDate);
            $scope.currentPermitDate.End = new Date(temp).formatNormalDateTime();

            return;
        }
        
        //If start date is updated to past the end date, then change the end date by the same amount of time that the start date was increased
        if (newStartDate >= endDate) {
            
            //Find the difference in milliseconds
            var diff = newStartDate - $scope.previousStartDate;

            //Add the difference to the current end date
            endDate.setMilliseconds(diff);
        }

        //Update end date shown in UI
        $scope.currentPermitDate.End = endDate.formatNormalDateTime();

        //Reset the previous date that is stored to the new start date in case user changes the start date again
        $scope.previousStartDate = newStartDate;
    }

    $scope.workflowHistory = function (rootProcessId) {
        $ctrl.varList = rootProcessId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/workflowHistory.html',
            controller: 'workflowHistoryInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
    };

    $scope.initPermitDateModal = function () {

        var templatePromise = VendorPermitService.getPermitLocationTemplatesByPermitVersion(self.permitVersionId, false);
        templatePromise.then(function (response) {

            $scope.permitLocationTemplates = response.data;
            for (var i = 0; i < response.data.length; i++) {
                if (response.data[i].PermitLocationId === sourcePermitDate.LocationTemplateId) {
                    $scope.selectedLocation = response.data[i];
                    break;
                }
            }
        });
    };

    $scope.delete = function () {
        if (confirm('Are you sure you want to delete this event date?')) {
            var promise = VendorPermitService.userDeletePermitDate(self.permitVersionId, $scope.currentPermitDate);
            promise.then(function (response) {
                $uibModalInstance.close(response.data);
            });
        }
    };

    $scope.cancel = function () {
        var proceed = true;
        if ($scope.permitDateEdit.$dirty)
            proceed = confirm('Are you sure you want to cancel modifying this event? Your unsaved changes will be lost.');
        if (proceed)
            $uibModalInstance.dismiss('cancel');
    };

    $scope.commit = function () {
        $uibModalInstance.close($scope.currentPermitDate);
    };

    $scope.initPermitDateModal();
};


app.controller('vendorPermitWizardStep4Controller', function ($scope, $filter, VendorPermitService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.associatedApplications = {};
    $scope.loading = true;


    self.advancedUrl = '';
    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3;


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    }

    $scope.goToNextStep = function () {
        var promise = VendorPermitService.userUpdatePermitInfo($scope.permitVersion);
        promise.then(function (response) {
            var newPermitInfo = response.data;
            if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {

                var categoryPromise = VendorPermitService.updatePermitCategories(newPermitInfo.PermitVersionId, $scope.permitCategories);
                categoryPromise.then(function (response) {
                    self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                    window.location.href = self.advancedUrl;
                });


            }
        });

    };



    self.loadPermitVersion = function () {
        var promise = VendorPermitService.getPermitInfo($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            self.loadAssociatedApplications();
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = VendorPermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    $scope.init = function (permitVersionId, url) {
        $scope.permitVersionId = permitVersionId;
        self.advancedUrl = url;
        self.loadPermitVersion();
    };
});


app.controller('vendorPermitWizardReviewController', function ($scope, $filter, $uibModal, VendorPermitService, constellationAuthFactory, LoginService) {
    var self = this;
    $scope.permitVersionId = 0;
    $scope.permitVersion = {};
    $scope.permitCategories = {};
    $scope.associatedApplications = {};
    $scope.loading = true;
    $scope.permitDates = {};
    $scope.submitting = false;
    $scope.loggedIn = false;
    $scope.showAuthQuestion = true;
    $scope.showLoginForm = false;
    $scope.registrationOpen = false;


    self.advancedUrl = '';
    self.currentUrl = '/';
    self.categoryCount = 0;
    self.minimumCategoryCount = 1;
    self.maximumCategoryCount = 3
    self.token = '';


    $scope.everythingValidated = function () {
        var errorCount = 0;
        errorCount += $scope.basicInfo.$valid ? 0 : 1;
        return (errorCount === 0);
    }

    $scope.standardLogin = function () {
        $scope.showAuthQuestion = false;
        $scope.showLoginForm = true;
    };

    $scope.goToNextStep = function () {
        var promise = VendorPermitService.userUpdatePermitInfo($scope.permitVersion);
        promise.then(function (response) {
            var newPermitInfo = response.data;
            if (newPermitInfo.PermitId > 0 && newPermitInfo.Version > 0) {

                var categoryPromise = VendorPermitService.updatePermitCategories(newPermitInfo.PermitVersionId, $scope.permitCategories);
                categoryPromise.then(function (response) {
                    self.advancedUrl = self.advancedUrl.format(newPermitInfo.PermitId, newPermitInfo.Version);
                    window.location.href = self.advancedUrl;
                });


            }
        });

    };

    $scope.initRegistration = function () {
        showUserRegistrationDialog($uibModal, self.currentUrl);
    };

    $scope.submitPermit = function (registrationNotOpenUrl) {
        $scope.submitting = true;
        var promise = VendorPermitService.userSubmitPermit($scope.permitVersion, self.token);
        promise.then(function (response) {
            if (!$scope.registrationOpen) {
                window.location.href = registrationNotOpenUrl;

            }
            else {

                self.advancedUrl = self.advancedUrl.format($scope.permitVersion.PermitId, $scope.permitVersion.Version);
                window.location.href = self.advancedUrl;
                $scope.submitting = false;
            }
        });
    };

    self.loadPermitVersion = function () {
        var promise = VendorPermitService.getPermitInfo($scope.permitVersionId, self.token);
        promise.then(function (response) {
            $scope.permitVersion = response.data;
            $scope.registrationOpen = $scope.permitVersion.SubmissionAllowed;
           // console.log($scope.registrationOpen);
            self.loadPermitDates();
            self.loadPermitCategories();
        });
    };

    self.loadPermitDates = function () {
        var promise = VendorPermitService.userGetPermitDates($scope.permitVersionId, self.token);
        promise.then(function (response) {

            $scope.permitDates = JSON.parse(response.data).map(function (x) {
                return { PermitVersionId: x.PermitVersionId, Start: (new Date(x.Start)).formatDateTime(), End: (new Date(x.End)).formatDateTime(), Location: x.Location, PermitDateId: x.PermitDateId };
            });
        });
    };

    self.loadPermitCategories = function () {
        var promise = VendorPermitService.getSelectedPermitCategories($scope.permitVersionId);
        promise.then(function (response) {
            $scope.permitCategories = response.data;
            $scope.loading = false;
        });
    };

    self.loadAssociatedApplications = function () {
        var promise = VendorPermitService.userGetApplicationList($scope.permitVersionId);
        promise.then(function (response) {
            $scope.associatedApplications = response.data;
            $scope.loading = false;
        });
    };

    self.loadAuth = function () {
        var promise = LoginService.ehlo();
        promise.then(function (response) {
            $scope.loggedIn = response.data == 'true';
        });
        $scope.loggedIn = false;
    };

    $scope.init = function (permitVersionId, url, currentUrl, token) {
        $scope.permitVersionId = permitVersionId;
        self.token = token;
        self.advancedUrl = url;
        self.currentUrl = currentUrl;
        self.loadPermitVersion();
        self.loadAuth();
    };
});


app.controller('adminVendorPermitTypesController', function ($scope, $filter, $uibModal, VendorPermitService) {

    $scope.editPermitTypeLocations = function (permitTypeId) {
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/system/edit_permit_locations.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: VendorPermitLocationModalInstanceController,
            resolve: {
                permitTypeId: function () { return permitTypeId; }
            }
        });
    };

    $scope.editPermitAssociationOrgTypes = function (permitTypeId) {
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/permit/edit_org_types.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: VendorPermitBindingModalInstanceController,
            resolve: {
                permitTypeId: function () { return permitTypeId; }
            }
        });
    };

});


function VendorPermitBindingModalInstanceController($scope, $uibModal, $uibModalInstance, VendorPermitService, OrganizationTypeService, permitTypeId) {
    var self = this;
    $scope.permitTypeId = permitTypeId;
    $scope.orgTypes = {};
    $scope.newOrgType = {};
    $scope.availableTypes = {};
    $scope.selectedType = {
        OrganizationTypeId: -1
    };


    $scope.bindTypes = function () {

        var promise = VendorPermitService.getMappedOrganizationTypesToPermitType($scope.permitTypeId);
        promise.then(function (response) {
            $scope.orgTypes = response.data;
            $scope.requestNewOrgType();
        });
    };

    $scope.removeOrgType = function (orgType) {
        if (confirm('Are you sure you want to remove this organization type?')) {
            var promise = VendorPermitService.deleteMappedOrganizationType($scope.permitTypeId, orgType);
            promise.then(function (response) {
                $scope.bindTypes();
            });
        }
    };

    $scope.addOrgType = function () {
        var promise = VendorPermitService.addMappedOrganizationType($scope.permitTypeId, $scope.newOrgType);
        promise.then(function (response) {
            $scope.bindTypes();
        });
    };

    $scope.requestNewOrgType = function () {
        $scope.newOrgType = VendorPermitService.newMappedOrganizationType($scope.permitTypeId);
        var promise = OrganizationTypeService.getAllSystemOrganizationType();
        promise.then(function (response) {
            var list = response.data.map(function (val) {
                return {
                    OrganizationTypeId: val.OrganizationTypeId,
                    Name: val.OrganizationTypeName
                };
            });
            list.unshift({
                OrganizationTypeId: -1,
                Name: "- ALL ORGANIZATION TYPES -"
            });
            $scope.availableTypes = list;
        });
    };

    $scope.commit = function () {
        $uibModalInstance.close();
    };

    $scope.init = function () {
        $scope.bindTypes();
    };
    $scope.init();
}

// Permit Type Location Modal Dialog
function VendorPermitLocationModalInstanceController($scope, $uibModal, $uibModalInstance, PermitLocationService, permitTypeId) {
    var self = this;
    $scope.permitTypeId = permitTypeId;
    $scope.locationTemplates = {};
    $scope.rootTemplates = {};
    $scope.currentTemplate = {};
    $scope.editing = false;

    $scope.initPermitTypeLocationModal = function () {
        var templatePromise = PermitLocationService.getLocationTemplatesByPermitTypeId($scope.permitTypeId, false);
        templatePromise.then(function (response) {
            $scope.locationTemplates = response.data;
        });

    };

    $scope.deleteLocation = function (objLocation) {
        if (confirm('Are you sure you want to delete this location?')) {
            var templatePromise = PermitLocationService.deletePermitLocationTemplate(objLocation);
            templatePromise.then(function (response) {
                $scope.initPermitTypeLocationModal();
            });
        }
    };

    $scope.requestAddLocation = function (objLocation) {
        var templatePromise = PermitLocationService.newLocationTemplate($scope.permitTypeId, objLocation.PermitLocationId);
        templatePromise.then(function (response) {

            $scope.editLocation(response.data);
        });
    };

    $scope.newLocation = function (parentId) {
        var templatePromise = PermitLocationService.newLocationTemplate($scope.permitTypeId, parentId);
        templatePromise.then(function (response) {

            $scope.editLocation(response.data);
        });
    };

    $scope.editLocation = function (location) {
        var loc = angular.copy(location);
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/system/add_edit_permit_locations.html?c=' + (new Date()).getTime(),
            size: 'md',
            controller: VendorPermitLocationAddModalInstanceController,
            resolve: {
                locationModel: function () { return loc; }
            }
        });
        modalInstance.result.then(function (result) {

            var promise = PermitLocationService.updatePermitLocationTemplate(result);
            promise.then(function (response) {

                $scope.initPermitTypeLocationModal();

            });

        });
    };


    $scope.commit = function () {
        $uibModalInstance.close($scope.currentPermitDate);
    };

    $scope.initPermitTypeLocationModal();
};


function VendorPermitLocationAddModalInstanceController($scope, $uibModalInstance, PermitLocationService, locationModel) {
    var self = this;
    $scope.currentTemplate = locationModel;
    $scope.editing = false;
    $scope.rootPermitLocationTemplates = {};

    $scope.initPermitTypeLocationAddModal = function () {
        var promise = PermitLocationService.getRootLocationTemplatesByPermitTypeId(locationModel.PermitType);
        promise.then(function (response) {
            var list = response.data.map(function (obj) {
                var r = { Name: obj.Name, PermitLocationId: obj.PermitLocationId };
                return r;
            });
            list.unshift({ Name: "- Not Applicable -", PermitLocationId: 0 });
            var finalList = [];
            $scope.rootPermitLocationTemplates = list;
            if (list.length > 0 && $scope.selectedLocation === undefined) {
                var foundIt = false;
                for (var i = 0; i < list.length; i++) {
                    if (list[i].PermitLocationId === locationModel.ParentLocationId) {
                        $scope.selectedLocation = list[i];
                        foundIt = true;
                    } else {
                        finalList.push(list[i]);
                    }
                }
                if (!foundIt)
                    $scope.selectedLocation = finalList[0];
            }
        });

    };

    $scope.cancel = function (objLocation) {
        $uibModalInstance.dismiss();
    };


    $scope.commit = function () {
        $uibModalInstance.close($scope.currentTemplate);
    };

    $scope.initPermitTypeLocationAddModal();
};


;
app.controller('vendorTaggedAdminsModalCtrl', function ($scope, $filter, $uibModalInstance, VendorPermitService, varList, edit) {

    $scope.userInput = '';
    $scope.itemsPerPage = 10;
    $scope.query = '';
    $scope.currentPage = 1;
    $scope.loadingUsers = false;
    $scope.itemsPerAccodionModalPage = 10;
    $scope.currentAccordionModalPage = 1;
    $scope.userInput = '';
    $scope.showingAllUsers = false;
    $scope.noUsersAvailable = false;
    $scope.selectedUserIDs = [];


    var $ctrl = this;

    $scope.addAdmins = function () {

        var promise = VendorPermitService.createTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.loadAvailableAdmins();

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereAdded = true;
        });

    };

    $scope.getTaggedAdmins = function (permitVersionId) {
        //console.log('getTaggedAdmins');
        $scope.loadingUsers = true;
        var promise = VendorPermitService.getTaggedAdmins(varList);
        promise.then(function (response) {
            //  console.log(response.data);
            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        });
    };

    $scope.removeTaggedAdmins = function () {
        //console.log('remove tagged admins');

        var promise = VendorPermitService.removeTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.getTaggedAdmins(varList);

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereRemoved = true;
        });

    };

    $scope.selectUser = function (user) {

        //if user was selected and the ID is not already in the array, then add the ID
        if (user.Selected && !$scope.selectedUserIDs.includes(user.UserId)) {
            $scope.selectedUserIDs.push(user.UserId)
        }

        //if user was deselected and the ID is in the array, then remove the ID
        if (!user.Selected && $scope.selectedUserIDs.includes(user.UserId)) {
            var index;
            index = $scope.selectedUserIDs.indexOf(user.UserId);
            $scope.selectedUserIDs.splice(index, 1);
        }
    }

    $scope.loadAvailableAdmins = function () {
        $scope.loadingUsers = true;
        var promise = VendorPermitService.getAvailableTaggedAdmins()
        promise.then(function (response) {

            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        })

    };

    $scope.init = function () {
        if (edit) {
            $scope.loadAvailableAdmins();
        }
        else {
            $scope.getTaggedAdmins(varList);
        }

    };

    $scope.init();

    $ctrl.cancel = function () {

        if ($scope.usersWereAdded) {
            $uibModalInstance.close(1);

        } else {
            $uibModalInstance.dismiss('cancel');
        }
    };
});
app.controller('positionTemplateController', function ($scope, PositionTemplateService, $uibModal) {

    $scope.positionTemplates;

    var $ctrl = this;

    $scope.editPositionTemplate = function (template) {
        $ctrl.varList = template;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/positionTemplate.html',
            controller: 'positionTemplateModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
            $scope.getPositionTemplates();
        });
    };

    $scope.removePositionTemplate = function (template) {
        $ctrl.varList = 'Position Template';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = PositionTemplateService.removePositionTemplate(template);
                promise.then(function (response) {
                    $scope.getPositionTemplates();
                });
            }
        }, function () {

        });
    };

    $scope.createPositionTemplate = function () {
        $ctrl.varList = {
            ID: 0,
            PositionTemplateId: 0,
            OrgTypeId: 0,
            ViewOrder: 0,
            Public: true,
            Required: false,
            Created: null,
            Deleted: null
        };
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/positionTemplate.html',
            controller: 'positionTemplateModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $scope.getPositionTemplates();
        });
    };

    $scope.getPositionTemplates = function () {
        var promise = PositionTemplateService.getPositionTemplates();
        promise.then(function (response) {
            $scope.positionTemplates = response.data;
        });
    };

    $scope.init = function () {
        $scope.getPositionTemplates();
    };
    
    $scope.init();
});
app.controller('positionTemplateDetailController', function ($scope, $uibModal, PositionTemplateService) {
    $scope.positions;
    $scope.positionTemplateId;

    var $ctrl = this;

    $scope.editPosition = function (position) {
        $ctrl.varList = position;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/position.html',
            controller: 'positionModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
        }, function () {
            $scope.getPositionsByPositionTemplateId();
        });
    };

    $scope.removePosition = function (position) {
        $ctrl.varList = 'Position Template';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = PositionTemplateService.removePosition(position);
                promise.then(function (response) {
                    $scope.getPositionsByPositionTemplateId();
                });
            }
        }, function () {

        });
    };

    $scope.createPosition = function () {
        $ctrl.varList = {
            ID: 0,
            PositionId: 0,
            OrganizationId: 0,
            PositionTitle: '',
            AccessLevel: 0,
            PositionTemplateId: $scope.positionTemplateId,
            ViewOrder: 0,
            Public: true,
            Required: true,
            Created: null,
            Deleted: null
        };
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/position.html',
            controller: 'positionModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $scope.getPositionsByPositionTemplateId();
        });
    };

    $scope.getPositionsByPositionTemplateId = function () {
        var promise = PositionTemplateService.getPositionsByPositionTemplateId($scope.positionTemplateId);
        promise.then(function (response) {
            $scope.positions = response.data;
        });
    };

    $scope.init = function (positionTemplateId) {
        $scope.positionTemplateId = positionTemplateId;
        $scope.getPositionsByPositionTemplateId();
    };
});
app.controller('multipleOneTimeApproversModalCtrl', function ($scope, WorkflowService, ProcessStatusService, $uibModalInstance, varList) {

    var $ctrl = this;

    //workflowRoles default value to prevent error when angular tries to order the list before the list is pulled
    $scope.workflowRoles = [{ Name: '' }];
    $scope.required = false;
    $scope.workflowUserRolesOverview = {};
    $scope.showSuccessMessage = false;
    $scope.selectedUserIDs = [];
    $scope.userRoles = {};
    $scope.processingMessage = false;
    $scope.usersWereAdded = false;

    $scope.oneAtATime = true;
    $scope.itemsPerPage = 10;
    $scope.currentPage = 1;

    $scope.resetSuccessMessage = function () {
        $scope.showSuccessMessage = false;
        $scope.usersWereAdded = false;
    };

    $scope.addApprovers = function () {
        $scope.processingMessage = true;

        var promise = ProcessStatusService.createMultipleOneTimeApprovers($scope.selectedUserIDs, varList.workflowStepItemIds, varList.processId, $scope.required);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            //Simply resetting instead of nested for loop to reset all "Selected" properties to false.
            $scope.userRoles = {};

            //Reloads the groups so that bootstrap closes whichever accordion section is open and clears the selected users in that group
            $scope.loadWorkflowRoles();

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereAdded = true;
        });
    };

    $scope.loadWorkflowUserRoleOverview = function (workflowRoleId) {

        //Check if has already been called for that workflowRoleId, if it has been called before then look for results in the userRoles object. 
        //Trying to avoid making same call twice(creates a momentary duplicate list of approvers under current list and makes unnecessary call)
        if (!Object.keys($scope.userRoles).includes(`${workflowRoleId}`)) {

            var promise = WorkflowService.getWorkflowUserRolesOverview(workflowRoleId);
            promise.then(function (response) {

                $scope.workflowUserRolesOverview = response.data;
                $scope.userRoles[`${workflowRoleId}`] = $scope.workflowUserRolesOverview;
            });

        } else {
            $scope.workflowUserRolesOverview = $scope.userRoles[`${workflowRoleId}`];
        } 
    };

    $scope.selectUser = function (user) {

        //if user was selected and the ID is not already in the array, then add the ID
        if (user.Selected && !$scope.selectedUserIDs.includes(user.UserId)) {
            $scope.selectedUserIDs.push(user.UserId)
        }

        //if user was deselected and the ID is in the array, then remove the ID
        if (!user.Selected && $scope.selectedUserIDs.includes(user.UserId)) {
            var index;
            index = $scope.selectedUserIDs.indexOf(user.UserId);
            $scope.selectedUserIDs.splice(index, 1);
        }
    }

    $scope.loadWorkflowRoles = function () {
        var promise = WorkflowService.getWorkflowRoles();
        promise.then(function (response) {
            $scope.workflowRoles = response.data;
        }, function (response) {

        });
    };

    $scope.init = function () {
        $scope.loadWorkflowRoles();
    };

    $scope.init();

    $ctrl.cancel = function () {

        if ($scope.usersWereAdded) {
            $uibModalInstance.close(1);

        } else {
            $uibModalInstance.dismiss('cancel');
        }
    };
});
app.controller('processStatusController', function ($scope, $location, ProcessStatusService, $uibModal, $route, $log, WorkflowService) {
    $scope.processStatusOverview;
    $scope.stepViews;
    $scope.id;

    $scope.getApprovalStatusDates = function (processId, approvers, workflowStepItemId) {

        var userIds = [];
        var approvalTypes = [];

        //If the UserId == 0 then that is the group approvers, so ignore it
        approvers.forEach(approver => {

            if (approver.UserId > 0) {

                userIds.push(approver.UserId);
            }
        });

        approvers.forEach(approver => {

                approvalTypes.push(approver.ApproverType);
        });

        var promise = ProcessStatusService.getApprovalStatusDates(processId, workflowStepItemId, userIds, approvalTypes);

        promise.then(function (resp) {
            var userApprovalStatusDates = resp.data;
            var minDate = '0001-01-01T00:00:00';
           // console.log(userApprovalStatusDates);
            //If dates come back for any user, add the date as a new property to the approver object
            approvers.forEach(approver => {

                for (var i = 0; i < userApprovalStatusDates.length; i++) {

                    if (approver.UserId === userApprovalStatusDates[i].UserId) {

                        if (minDate == userApprovalStatusDates[i].Updated) {
                            approver.ApprovalStatusDate = '';
                        }
                        else {
                            approver.ApprovalStatusDate = userApprovalStatusDates[i].Updated.formatNormalDateTime();
                        }
                        console.log(approver.ApprovalStatusDate);
                    }
                }
            });
        });
    }



    var $ctrl = this;

    $scope.groupDetail = function (rootProcessId, approverType, stepId) {
        $ctrl.varList = [rootProcessId, approverType, stepId];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/groupDetail.html',
            controller: 'groupDetailInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
            }
        }, function () {

        });
    };

    $scope.updateApproval = function (stepItemId, processId) {
        $ctrl.varList = 'Move Your Approval Status To This Step Item?';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = ProcessStatusService.updateApproval(stepItemId, processId, $scope.processStatusOverview[0].CurrentUserId);
                promise.then(function (response) {
                    location.reload();
                });
            }
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.removeOneTimeApprover = function (approverId, processId) {
        $ctrl.varList = 'One-Time approver';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = ProcessStatusService.removeOneTimeApprover(approverId, processId);
                promise.then(function (response) {
                    location.reload();
                });
            }
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.createOneTimeApprover = function (workflowStepItemId) {
        $ctrl.varList = [workflowStepItemId, $scope.processStatusOverview[0].ProcessStatus.ProcessId];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/newApprover.html',
            controller: 'oneTimeApproverModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
            }
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.createMultipleOneTimeApprovers = function (stepItems) {

        var workflowStepItemIds = [];
        stepItems.forEach((item) => workflowStepItemIds.push(item.WorkflowStepItemId));

        $ctrl.varList = { workflowStepItemIds, processId: $scope.processStatusOverview[0].ProcessStatus.ProcessId };
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/multipleNewApprover.html',
            controller: 'multipleOneTimeApproversModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
            }
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.getStepViews = function (processId) {
        var promise = ProcessStatusService.getStepViews(processId);
        promise.then(function (response) {
            var data = response.data;
            $scope.stepViews = data;
        });
    };

    $scope.getProcessStatusOverview = function (processId, id) {
        if (processId !== undefined) {
            $scope.id = angular.copy(id);
            var promise = ProcessStatusService.getProcessStatusOverview(processId);
            promise.then(function (response) {
                var data = response.data;
                $scope.processStatusOverview = data;
                $scope.getStepViews(processId);
            });
        }
    };

    $scope.superApprove = function (processId) {
        $ctrl.varList = 'SUPER Approve this Workflow(This can NOT be UNDONE)';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = WorkflowService.superApprove(processId);
                promise.then(function (response) {
                    location.reload();
                });
            }
        });
    };

    $scope.superDeny = function (processId) {
        $ctrl.varList = 'SUPER Deny this Workflow(This can NOT be UNDONE)';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = WorkflowService.superDeny(processId);
                promise.then(function (response) {
                    location.reload();
                });
            }
        });
    };
});

app.controller('oneTimeApproverModalInstanceCtrl', function ($scope, WorkflowService, ProcessStatusService, $uibModalInstance, varList) {

    var $ctrl = this;

    $scope.showErrorMessageApprover = false;
    $scope.showErrorMessageDuplicateApprover = false;
    $scope.isGroupApprover = false;
    $scope.minimumApprovalCount = 0;
    $scope.required = false;

    $scope.workflowRoles = {};
    $scope.selectedRole = {};
    $scope.workflowUserRolesOverview = {};
    $scope.selectedUserRoles = { UserId: 0 };

    $scope.oneTimeApprover = true;

    $scope.isValid = false;

    $scope.setValid = function () {
        $scope.isValid = true;
    };

    $scope.addApprover = function () {
        $scope.showErrorMessageDuplicateApprover = false;
        var promise = ProcessStatusService.createNewOneTimeApprover($scope.selectedUserRoles.UserId, varList[0], varList[1], $scope.required);
        promise.then(function (response) {
            if (response.data >= 1) {
                $uibModalInstance.close(1);
            }
            else {
                $scope.showErrorMessageDuplicateApprover = true;
            }
        });
    };

    $scope.loadWorkflowUserRoleOverview = function (workflowRoleId) {
        var promise = WorkflowService.getWorkflowUserRolesOverview(workflowRoleId);
        promise.then(function (response) {
            $scope.workflowUserRolesOverview = response.data;
        });
    };

    $scope.loadWorkflowRoles = function () {
        var promise = WorkflowService.getWorkflowRoles();
        promise.then(function (response) {
            $scope.workflowRoles = response.data;
        }, function (response) {

        });
    };

    $scope.init = function () {
        $scope.loadWorkflowRoles();
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});
app.controller('adminManageUsersDashboardController', function ($scope, $filter, $uibModal, UserProfileService) {
    $scope.users = [];
    $scope.currentPage = 1;
    $scope.itemsPerPage = 25;
    $scope.currentUser = {};
    $scope.currentUserSource = {};
    $scope.currentUserPreviousSettings = {}
    $scope.currentUsersRoles = {};
    $scope.availableSystemRoles = {};
    $scope.selectRoleToAdd = {};
    $scope.currentUsersTypes = {};
    $scope.availableSystemUserTypes = {};
    $scope.selectUserTypeToAdd = {};
    $scope.includeDeleted = false;
    $scope.loadingUsers = true;
    $scope.addUserWizardModal = undefined;
    $scope.userEditModal = undefined;
    $scope.editMode = 0;

    $scope.loadUserManagement = function (hideTable) {
        if (hideTable === undefined)
            hideTable = true;
        if (hideTable === true)
            $scope.loadingUsers = true;
        var promise = UserProfileService.getUsers($scope.includeDeleted);
        promise.then(function (response) {
            $scope.users = response.data;
            
            $scope.loadingUsers = false;
        });
    };

    $scope.loadUsersRoles = function (currentUser, loadDialog) {
        $scope.currentUser = currentUser;
        var promise = UserProfileService.getUsersRoles(currentUser.UserId);
        promise.then(function (response) {
            $scope.currentUsersRoles = response.data;

            $scope.loadSystemRoles();
            
            if (loadDialog) {
                $scope.dateEditModal = $uibModal.open({
                    templateUrl: '/app/views/userManagement/manage_userroles.html?c=' + (new Date()).getTime(),
                    scope: $scope,
                    size: 'lg',

                });
            }

        });
    };

    $scope.loadSystemRoles = function () {
        var promise = UserProfileService.getSystemRoles();

        promise.then(function (response) {

            $scope.availableSystemRoles = response.data; 
            if ($scope.availableSystemRoles.length > 0)
                $scope.selectRoleToAdd = $scope.availableSystemRoles[0];
        });
    };


    $scope.removeRole = function (role) {
        var promise = UserProfileService.removeRole($scope.currentUser.UserId, role);
        promise.then(function (response) {
            $scope.loadUsersRoles($scope.currentUser, false);
        }).catch(function (data, status, headers, config) {
            if (status === 401)
                jwru.constellation.widgets.confirmationDialog.open($uibModal, 'Access Denied', 'ACCESS IS DENIED. You are not authorized to add or remove roles.');
        });
    };

    $scope.assignRole = function () {
        var promise = UserProfileService.assignRole($scope.currentUser.UserId, $scope.selectRoleToAdd);
        promise.then(function (response) {
            $scope.loadUsersRoles($scope.currentUser, false);
        }).catch(function (data, status, headers,config) {
           if (status === 401)
                jwru.constellation.widgets.confirmationDialog.open($uibModal, 'Access Denied', 'ACCESS IS DENIED. You are not authorized to add or remove roles.');
        });
    };

    $scope.loadUsersTypes = function (currentUser, loadDialog) {
        $scope.currentUser = currentUser;
        var promise = UserProfileService.getUsersTypes(currentUser.UserId);
        promise.then(function (response) {
            $scope.currentUsersTypes = response.data;

            $scope.loadSystemUserTypes();

            if (loadDialog) {
                $scope.dateEditModal = $uibModal.open({
                    templateUrl: '/app/views/userManagement/manage_usertypes.html?c=' + (new Date()).getTime(),
                    scope: $scope,
                    size: 'lg',

                });
            }

        });

           $scope.loadUserManagement();
    };

    $scope.loadSystemUserTypes = function () {
        var promise = UserProfileService.getSystemUserTypes();

        promise.then(function (response) {

            $scope.availableSystemUserTypes = response.data;
            if ($scope.availableSystemUserTypes.length > 0)
                //console.log($scope.availableSystemUserTypes);
                $scope.selectUserTypeToAdd = $scope.availableSystemUserTypes[0];
        });
    };

    $scope.log = function (systemUserType) {
        //console.log(systemUserType);
        $scope.selectUserTypeToAdd = systemUserType;
    };

    $scope.removeUserType = function (userType) {
        var promise = UserProfileService.removeUserType($scope.currentUser.UserId, userType);
        promise.then(function (response) {
            $scope.loadUsersTypes($scope.currentUser, false);
         
        }).catch(function (data, status, headers, config) {
            if (status === 401)
                jwru.constellation.widgets.confirmationDialog.open($uibModal, 'Access Denied', 'ACCESS IS DENIED. You are not authorized to add or remove user types.');
        });

           //$scope.loadUserManagement();
    };

    $scope.assignUserType = function () {
        var promise = UserProfileService.assignUserType($scope.currentUser.UserId, $scope.selectUserTypeToAdd);
        promise.then(function (response) {
            $scope.loadUsersTypes($scope.currentUser, false);
            //$scope.loadUserManagement();
        }).catch(function (data, status, headers, config) {
            if (status === 401)
                jwru.constellation.widgets.confirmationDialog.open($uibModal, 'Access Denied', 'ACCESS IS DENIED. You are not authorized to add or remove user types.');
        });

          //$scope.loadUserManagement();
    };


    $scope.restoreUser = function (user) {
        if (confirm('Are you sure you want to restore this user?')) {
            var promise = UserProfileService.restoreUser(user);
            promise.then(function (response) {
                $scope.loadUserManagement(false);
            });
        }
    };

    $scope.deleteUser = function (user) {
        if (confirm('Are you sure you want to delete this user?')) {
            var promise = UserProfileService.deleteUser(user);
            
            promise.then(function (response) {
                $scope.loadUserManagement(false);
            });
        }
    };

    $scope.editUser = function (currentUser, loadDialog) {
        if (loadDialog === undefined)
            loadDialog = true;
        $scope.currentUser = angular.copy(currentUser);
        $scope.currentUserSource = angular.copy(currentUser);
        $scope.currentUserPreviousSettings = angular.copy(currentUser);
        $scope.editMode = 0;

        if (loadDialog) {
            $scope.userEditModal = $uibModal.open({
                templateUrl: '/app/views/userManagement/edit_user.html?c=' + (new Date()).getTime(),
                scope: $scope,
                size: 'lg',

            });
        }

    };

    $scope.updateUserProfile = function(addAnother)
    {
        if (addAnother === undefined)
            addAnother = false;
        var currentUser = $scope.currentUser;
        var promise = UserProfileService.updateUser(currentUser);
        promise.then(function (response) {
            $scope.userEditModal.close();
            $scope.loadUserManagement(false);
            if (addAnother)
                $scope.createNewUser();
        });
    };

    $scope.launchAddUserWizard = function () {
        $scope.addUserWizardModal = $uibModal.open({
            templateUrl: '/app/views/userManagement/add_user_select.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'md',

        });
    };

    $scope.createNewUser = function () {
        var promise = UserProfileService.requestNewUser();
        promise.then(function (response) {
           
            $scope.editUser(response.data, true);
            $scope.editMode = 1;
            //$scope.loadUserManagement(false);
        });
    };

    $scope.closeUserEditDialog = function (isDirty) {
        var close = true;
        if (isDirty)
        {
            close = confirm('Are you sure you want to close this? Your UNSAVED WORK WILL BE LOST.');
        }
        if (close)
            $scope.userEditModal.close();
    };
});

;
app.controller('userProfileController', function ($scope, $filter, $uibModal, UserProfileService) {
    $scope.showLoader = true;
    $scope.currentUserProfile = {};

    $scope.updateUserProfile = function () {
        var promise = UserProfileService.updateUserProfile($scope.currentUserProfile);
        promise.then(function (response) {
            $scope.currentUserProfile = response.data;
            jwru.constellation.widgets.confirmationDialog.open($uibModal, 'Your User Profile Was Updated', 'Awesome! Your user profile was updated successfully.');
            //$uibModal.open({
            //    animation: true,
            //    templateUrl: '/app/views/confirmedDialog/confirmation.html?c=' + (new Date()).getTime(),
            //    controller: confirmationMessageModalController,
            //    resolve: {
            //        messageHeader: function () { return 'Profile Updated Successfully'; },
            //        message: function () { return 'Your profile was saved successfully!';}
            //    }
            //});
        });
    }

    $scope.loadUserProfile = function () {
        var promise = UserProfileService.getUserProfile();
        promise.then(function (response) {
            $scope.currentUserProfile = response.data;
            $scope.currentUserProfile.Password = '';
            $scope.currentUserProfile.ConfirmPassword = '';
            $scope.showLoader = false;
        });
    };

    $scope.init = function () {
        $scope.loadUserProfile();
    };

    $scope.init();
});

app.controller('userRegistrationController', function ($scope, $filter, UserProfileService) {
    $scope.currentUser = {
        UserId: 0,
        UserProfileId: 0,
        StudentId: null,
        Username: '',
        FirstName: '',
        LastName: '',
        Email: '',
        Phone: ''
    };

    $scope.returnUrl = '';
    $scope.disableShibFields = false;

    $scope.updateUserProfile = function () {
        if ($scope.profileForm.$valid) {
            var promise = UserProfileService.createUserProfile($scope.currentUser, true);
            promise.then(function (response) {
                if (response.data.UserId > 0)
                    window.location.href = $scope.returnUrl;
            });
        }
    }

    $scope.initRegistration = function (firstName, lastName, email, studentId, returnUrl) {
        if (studentId === undefined)
            studentId = null;
        else
            $scope.disableShibFields = true;
        if (firstName !== undefined)
            $scope.currentUser.FirstName = firstName;
        if (lastName !== undefined)
            $scope.currentUser.LastName = lastName;
        if (email !== undefined)
            $scope.currentUser.Email = email;
        $scope.returnUrl = (returnUrl.length > 0 ? returnUrl : '/');
        $scope.currentUser.StudentId = studentId;
    };
});


app.controller('userPasswordController', function ($scope, $filter, UserProfileService) {
    $scope.showLoader = true;
    $scope.currentUserProfile = {};

    $scope.updateUserProfile = function () {
        var promise = UserProfileService.updateUserProfile($scope.currentUserProfile);
        promise.then(function (response) {
            $scope.currentUserProfile = response.data;
        });
    }

    $scope.loadUserProfile = function () {
        var promise = UserProfileService.getUserProfile();
        promise.then(function (response) {
            $scope.currentUserProfile = response.data;
            $scope.currentUserProfile.Password = '';
            $scope.currentUserProfile.ConfirmPassword = '';
            $scope.showLoader = false;
        });
    };

    $scope.init = function () {
        $scope.loadUserProfile();
    };

    $scope.init();
});

app.controller('profileInvolvementController', function ($scope, $filter, $uibModal, $window, OrgService, EventService, AnnouncementsService) {

    $scope.showFollowingOptions = true;
    $scope.followingStatus;
    $scope.selectedOrganization = { OrganizationId: 0 };
    $scope.organizations = [];
    $scope.collapseOrgs = $window.innerWidth < 992 ? true : false;
    $scope.unfollowOrgbtn = false;
    $scope.eligible = false;
    $scope.notEligible = true;
    $scope.reason = 0;
    $scope.reasonText = '';

    $scope.scrollTo = function (id) {
        $location.hash(id);
        $anchorScroll();
    };

    $scope.toggleOrganization = function (index) {
        $scope.selectedOrganization = $scope.organizations[index];
        $scope.filterOrganizations();
    };

    $scope.filterOrganizations = function () {
        // Filter Events
        $scope.filteredEvents = [];
        angular.forEach($scope.upcomingEvents, function (event) {
            if (event.OrganizationId === $scope.selectedOrganization.OrganizationId || $scope.selectedOrganization.OrganizationId === 0) {
                $scope.filteredEvents.push(event);
            }
        });

        // Filter Announcements
        $scope.filteredAnnouncements = [];
        angular.forEach($scope.announcements, function (announcement) {
            if (announcement.OrganizationId === $scope.selectedOrganization.OrganizationId || $scope.selectedOrganization.OrganizationId === 0) {
                $scope.filteredAnnouncements.push(announcement);
            }
        });
    };

    $scope.removeOrganization = function (index) {

        $scope.selectedOrganization = $scope.organizations[index];

        $scope.confirmationMsg = 'UNFOLLOW this organization';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $scope.confirmationMsg;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                if (index !== 0) {
                    OrgService.unfollowOrganization(index).then(function (resp) {
                        $scope.selectedOrganization = { OrganizationId: 0 };
                        $scope.init();
                    });
                }
            }
        });
    }

    $scope.getFollowedOrgUpcomingEvents = function () {
        EventService.getFollowedOrgUpcomingEvents().then(function (response) {
            $scope.upcomingEvents = response.data;
            $scope.filteredEvents = response.data;
        });
    };

    $scope.getFollowedOrgAnnouncements = function () {
        var promise = AnnouncementsService.getFollowedOrgAnnouncements();
        promise.then(function (response) {
            $scope.announcements = response.data;
            $scope.filteredAnnouncements = response.data;
        });
    }

    $scope.getFollowedOrganizations = function () {
        OrgService.getFollowedOrganizations().then(function (response) {
            $scope.organizations = response.data;
            $scope.organizations.splice(0, 0, { OrganizationId: 0, OrganizationName: 'All Organizations' });
        });
    }

    $scope.closeEventDetails = function () {
        $scope.eventDetailDialog.close();
    };

    $scope.followEvent = function (notify) {
        if ($scope.followingStatus !== undefined) {
            var promise = EventService.followEvent($scope.followingStatus, notify);
            promise.then(function (response) {
                $scope.followingStatus = response.data;
            });
        }
    };

    $scope.unfollowEvent = function () {
        if ($scope.followingStatus !== undefined) {
            var promise = EventService.unfollowEvent($scope.followingStatus);
            promise.then(function (response) {
                $scope.followingStatus = response.data;
            });
        }
    };

    $scope.getEventDetails = function (event) {
        $scope.currentEventDetails = angular.copy(event);

        var promise = EventService.getFollowingStatus(event.id);
        promise.then(function success(response) {
            $scope.showFollowingOptions = true;
            $scope.followingStatus = response.data;
        }, function () { });

        $scope.eventDetailDialog = $uibModal.open({
            templateUrl: '/app/views/events/user_event_details_dialog.html?c=' + (new Date()).getTime(),
            scope: $scope,
            size: 'lg',
        });
        $scope.eventDetailDialog.result.then(function () {

        }, function () {

        });
    };

    $scope.checkIfUserIsOfficerEligible = function () {
        //$scope.eligible = false;
       // $scope.noteligible = true;
        

        var promise = OrgService.checkIsUserOfficerEligible();
        promise.then(function (response) {
           // console.log("response: " + JSON.stringify(response.data));
            
            $scope.eligible = response.data.m_Item1;
            $scope.reason = response.data.m_Item2;
           // console.log($scope.reason);
           // console.log($scope.reason);
          //  console.log($scope.eligible);
            $scope.getReasonInfo($scope.reason);
            $scope.notEligible = !$scope.eligible;
        //}, function () { });
        });

      
    };

    $scope.getReasonInfo = function (reasonNum) {
        if (reasonNum === 1) {
            $scope.reasonText = "(Not Currently Registered)";
        }
        if (reasonNum === 2) {
            $scope.reasonText = "(GPA Requirement Not Met)";
        }
        if (reasonNum === 3) {
            $scope.reasonText = "(Credit Hour Requirement Not Met)";
        }
        if (reasonNum === 4) {
            $scope.reasonText = "(Non Degree Program)";
        }
        
    };

    $scope.showOfficerElgInfo = function () {
        showOfficerModal();
    }

    function showOfficerModal() {
        $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/officerEligibility.html?c=' + (new Date()).getTime(),
            scope: $scope,
            controller: 'profileInvolvementController',
            controllerAs: '$ctrl',
            size: ''
        });
    }

    $scope.cancel = function () {
        $scope.modalInstance.close('cancel');
    };

    $scope.init = function () {
        $scope.getFollowedOrganizations();
        $scope.getFollowedOrgUpcomingEvents();
        $scope.getFollowedOrgAnnouncements();
        //$scope.checkIfUserIsOfficerEligible();
    };

    $scope.init();
});;



function showUserRegistrationDialog($modal, returnUrl) {
    if (returnUrl === undefined) {
        returnUrl = '/';
    }
    $modal.open({
        animation: true,
        templateUrl: '/app/views/modalViews/userRegistration.html?c=' + (new Date()).getTime(),
        size: 'md',
        controller: 'UserRegistrationDialogController',
        resolve: {
            returnUrl: function () { return returnUrl; }
        }
    }).result.catch(function (res) {
        if (!(res === 'cancel' || res === 'escape key press')) {
       
        }
    });
}

app.controller('UserRegistrationDialogController', function ($scope, $uibModalInstance, UserProfileService, returnUrl) {
    var self = this;
    self.ReturnUrl = returnUrl;
    $scope.currentUser = {};

    $scope.registerUser = function () {
        var currentUser = $scope.currentUser;
        var profile = {
            Passowrd: currentUser.Password,
            ConfirmPassword: currentUser.ConfirmPassword,
            FirstName: currentUser.FirstName,
            LastName: currentUser.LastName,
            StudentId: currentUser.StudentId,
            Username: currentUser.Username,
            Phone: currentUser.Phone
        }



        if ($scope.profileForm.$valid) {
            var promise = UserProfileService.registerUser($scope.currentUser, true);
            promise.then(function (response) {

                    window.location.href = self.ReturnUrl;
            });
        }
    };

    $scope.init = function () {
      
    };

    $scope.cancelRegistration = function () {
        $uibModalInstance.dismiss('cancel');
    }

    $scope.init();
});;
app.controller('orgRegistrationDashboardController',
    function ($scope, $filter, RegistrationService, WorkflowService, $uibModal) {

        var $ctrl = this;

        $scope.itemsOptions = [15, 30, 60, 120];

        $scope.itemsPerPage = 15;
        $scope.currentPage = 1;
        $scope.loading = false;

        $scope.registrationView = [];
        $scope.registrationPeriods = [];

        $scope.propertyName = '-MinStartDate';
        $scope.reverse = false;

        $scope.changeOrderByProperty = function (newPropertyName) {
            $scope.propertyName = '-' + newPropertyName;
            $scope.reverse = !$scope.reverse;
        };

        // true: currently open; false: currently closed
        $scope.registrationPeriodType = true;
        $scope.selectedRegistrationPeriod = {
            RegisrationPeriodId: 0,
            RegistrationName: 'All Registration Periods'
        };

        $scope.currentlyOpenRegistrationPeriods = [$scope.selectedRegistrationPeriod];
        $scope.currentlyClosedRegistrationPeriods = [$scope.selectedRegistrationPeriod];

        $scope.onlyMine = true;
        $scope.pending = true;
        $scope.denied = false;
        $scope.held = false;
        $scope.incomplete = false;
        $scope.completed = false;
        $scope.cancelled = false;
        $scope.deleted = false;

        $scope.filter = function (value) {
            $scope[value] = !$scope[value];
            $scope.filteredRegistrationView = $filter('statusFilter')($scope.registrationView, $scope);
        };

        $scope.updateApprovalStatus = function (stepItemId, processId) {
            WorkflowService.updateApprovalStatus(stepItemId, processId).then(function (response) {
                $scope.getOrgRegistrationDashboardView();
            });
        };

        $scope.superApprove = function (processId) {
            $ctrl.varList = 'SUPER Approve this Registration(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = WorkflowService.superApprove(processId);
                    promise.then(function (response) {
                        $scope.getOrgRegistrationDashboardView();
                    });
                }
            });
        };

        $scope.superDeny = function (processId) {
            $ctrl.varList = 'SUPER Deny this Registration(This can NOT be UNDONE)';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });
            modalInstance.result.then(function (result) {
                if (result === 1) {
                    WorkflowService.superDeny(processId).then(function (response) {
                        $scope.getOrgRegistrationDashboardView();
                    });
                }
            });
        };

        $scope.remove = function (organizationRegistrationId) {
            RegistrationService.remove(organizationRegistrationId).then(function (response) {
                $scope.getOrgRegistrationDashboardView();
            });
        };

        $scope.restore = function (organizationRegistrationId) {
            RegistrationService.restore(organizationRegistrationId).then(function (response) {
                $scope.getOrgRegistrationDashboardView();
            });
        };

        $scope.sortRegistrationPeriod = function (periods) {
            $scope.currentlyOpenRegistrationPeriods = [$scope.selectedRegistrationPeriod];
            $scope.currentlyClosedRegistrationPeriods = [$scope.selectedRegistrationPeriod];
            for (var i = 0; i < periods.length; i++) {
                if (periods[i].DateDeleted >= periods[i].DateCreated || (new Date(periods[i].EndDate) <= new Date() && new Date(periods[i].EndDate) > new Date(0))) {
                    $scope.currentlyClosedRegistrationPeriods.push(periods[i]);
                } else {
                    $scope.currentlyOpenRegistrationPeriods.push(periods[i]);
                }
            }
        };

        $scope.getOrgRegistrationDashboardView = function () {
            $scope.loading = true;
            RegistrationService.getOrgRegistrationDashboardView().then(function (response) {
                $scope.registrationView = response.data.Registrations;
                $scope.sortRegistrationPeriod(response.data.RegistrationPeriods);
                $scope.filteredRegistrationView = $scope.registrationView;
                $scope.reFilteredRegistrationView = $scope.filteredRegistrationView;
                $scope.filter('none');
                $scope.loading = false;
            });
        };

        $scope.init = function () {
            $scope.getOrgRegistrationDashboardView();
        };

        $scope.init();


        $scope.filterRegistrationPeriod = function (registrationPeriodId) {
            if ($scope.selectedRegistrationPeriod.RegisrationPeriodId !== 0) {
                return $scope.selectedRegistrationPeriod.RegistrationPeriodId === registrationPeriodId;
            }

            if ($scope.registrationPeriodType) {
                for (var i = 0; i < $scope.currentlyOpenRegistrationPeriods.length; i++) {
                    if (registrationPeriodId === $scope.currentlyOpenRegistrationPeriods[i].RegistrationPeriodId)
                        return true;
                }
            } else {
                for (var j = 0; j < $scope.currentlyClosedRegistrationPeriods.length; j++) {
                    if (registrationPeriodId === $scope.currentlyClosedRegistrationPeriods[j].RegistrationPeriodId)
                        return true;
                }
            }
            return false;
        };

    }).filter('statusFilter',
    function () {
        return function (registrations, $scope) {
            var filteredRegistrations = [];
            if (registrations.length > 0) {
                for (var i = 0; i < registrations.length; i++) {
                    if ($scope.filterRegistrationPeriod(registrations[i].RegistrationPeriodId) &&
                        (registrations[i].AvailableStepItems && registrations[i].AvailableStepItems.length > 0 || !$scope.onlyMine) &&
                        (registrations[i].Status === 0 && $scope.pending ||
                        registrations[i].Status === 2 && $scope.denied ||
                        registrations[i].Status === 3 && $scope.held ||
                        registrations[i].Status === 99 && $scope.incomplete ||
                        registrations[i].Status === 5 && $scope.completed ||
                        registrations[i].Status === 4 && $scope.cancelled) &&
                        (registrations[i].DateDeleted < registrations[i].DateCreated || $scope.deleted)) {
                        filteredRegistrations.push(registrations[i]);
                    }
                }
            }
            return filteredRegistrations;
        }
    });;
app.controller('orgRegistrationTaggedAdminsModalCtrl', function ($scope, $uibModalInstance, RegistrationDetailService, varList, edit) {

    $scope.userInput = '';
    $scope.itemsPerPage = 10;
    $scope.query = '';
    $scope.currentPage = 1;
    $scope.loadingUsers = false;
    $scope.itemsPerAccodionModalPage = 10;
    $scope.currentAccordionModalPage = 1;
    $scope.userInput = '';
    $scope.showingAllUsers = false;
    $scope.noUsersAvailable = false;
    $scope.selectedUserIDs = [];


    var $ctrl = this;

    $scope.addAdmins = function () {

        var promise = RegistrationDetailService.createTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.loadAvailableAdmins();

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereAdded = true;
        });

    };

    $scope.getTaggedAdmins = function (varList) {
        //console.log('getTaggedAdmins');
        $scope.loadingUsers = true;
        var promise = RegistrationDetailService.getTaggedAdmins(varList);
        promise.then(function (response) {
            //  console.log(response.data);
            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        });
    };

    $scope.removeTaggedAdmins = function () {
        //console.log('remove tagged admins');

        var promise = RegistrationDetailService.removeTaggedAdmins($scope.selectedUserIDs, varList);
        promise.then(function (response) {

            //reset the list of selected users
            $scope.selectedUserIDs = [];

            $scope.getTaggedAdmins(varList);

            $scope.processingMessage = false;
            $scope.showSuccessMessage = true;
            $scope.usersWereRemoved = true;
        });

    };

    $scope.selectUser = function (user) {

        //if user was selected and the ID is not already in the array, then add the ID
        if (user.Selected && !$scope.selectedUserIDs.includes(user.UserId)) {
            $scope.selectedUserIDs.push(user.UserId)
        }

        //if user was deselected and the ID is in the array, then remove the ID
        if (!user.Selected && $scope.selectedUserIDs.includes(user.UserId)) {
            var index;
            index = $scope.selectedUserIDs.indexOf(user.UserId);
            $scope.selectedUserIDs.splice(index, 1);
        }
    }

    $scope.loadAvailableAdmins = function () {
        $scope.loadingUsers = true;
        var promise = RegistrationDetailService.getAvailableTaggedAdmins()
        promise.then(function (response) {
            //console.log(response.data);

            $scope.filteredUsers = response.data;
            $scope.loadingUsers = false;
        })

    };

    $scope.init = function () {
        if (edit) {
            $scope.loadAvailableAdmins();
        }
        else {
            $scope.getTaggedAdmins(varList);
        }

    };

    $scope.init();

    $ctrl.cancel = function () {

        if ($scope.usersWereAdded) {
            $uibModalInstance.close(1);

        } else {
            $uibModalInstance.dismiss('cancel');
        }
    };
});
app.controller('registrationDetailController', function ($scope, $rootScope, $uibModal, $log, RegistrationDetailService, AdminOfficerService, OfficerService, ExtendedPropertyService, NoteTemplatesService, OrgSocialMediaService, $location, $anchorScroll) {

    $scope.organizationRegistrationId;
    $scope.registration;
    $scope.positionTitle;
    $scope.showSuccessMessage = false;
    $scope.userEligible = true;
    $scope.ineligibleEmail;

    $scope.showSavedMessage = false;
    $scope.showAdvisorSavedMessage = false;
    $scope.showExtendPropertySavedMessage = false;
    $scope.invalidAdvisorMessage = false;
    $scope.allPositionsView = {};

    $scope.advisorFirstName;
    $scope.advisorLastName;
    $scope.advisorEmail;
    $scope.advisorStudentId;
    $scope.advisorIsValid = true;
    $scope.duplicateOfficer = false;
    $scope.tooManyAdvisor = false;

    $scope.propertyGroups;

    $scope.activateGeneralInfoEdit = false;
    $scope.activeOfficersEdit = false;
    $scope.activeAdditionalInfoEdit = false;
    $scope.activeAdvisorEdit = false;

    $scope.rootProcessId;
    $scope.id;

    $scope.publicNoteStatusInfo = {};
    $scope.publicNotesSeenText;
    $scope.publicNotesUnSeen;

    var $ctrl = this;

    $scope.moveToPublicNotes = function () {
        $location.hash('publicNotes');

        $anchorScroll();

        $scope.markNoteAsSeenOrUnseen();
    }

    $scope.markNoteAsSeenOrUnseen = function () {
        $scope.publicNotesUnSeen = !$scope.publicNotesUnSeen;

        var statusInfo = {
            IsPublicNote: true,
            NoteUnseen: $scope.publicNotesUnSeen
        };

        var promise = RegistrationDetailService.updateNoteStatusInfo($scope.organizationRegistrationId, statusInfo);

        $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread';
    }

    $scope.getNoteStatusInfo = function (orgRegistrationId, isPublicNote) {
        RegistrationDetailService.getNoteStatusInfo(orgRegistrationId, isPublicNote).then(function (response) {
            $scope.publicNotesUnSeen = response.data;
            $scope.publicNotesSeenText = $scope.publicNotesUnSeen ? 'Read' : 'Unread'
        });
    }

    $scope.getSocialMediaPlatforms = function () {
        OrgSocialMediaService.getSocialMediaPlatforms().then(function (response) {
            $scope.socialPlatforms = response.data;
            $scope.socialPlatforms.map(function (m) {
                m.hide = false;
                switch (m.SocialMediaId) {
                    case 1: m.className = "fa-twitter-square";
                        break;
                    case 2: m.className = "fa-facebook-official";
                        break;
                    case 3:
                        m.className = "fa-instagram"
                        break;
                }
                return m;
            });
            $scope.setSocialMediaName();
        });
    }


    $scope.setSocialMediaName = function () {
        $scope.registration.registrationDataOverview.OrganizationSocialMedias.map(function (m) {
            m.SocialMediaName = $scope.getSocialMediaObj(m.SocialMediaId).SocialMediaName;
            return m;
        });
    }
    $scope.getSocialMediaObj = function (mediaId) {

        if ($scope.socialPlatforms) {
            var len = $scope.socialPlatforms.length;
            for (var i = 0; i < len; i++) {
                var socialMedia = $scope.socialPlatforms[i];
                if (mediaId == socialMedia.SocialMediaId) {
                    return socialMedia;
                }
            }
        }
    }

    //notes section




    $scope.includeDeletedNotes = false;

    $scope.noteTemplates = [];
    $scope.noteTemplate = "";
    $scope.newNoteText = "";
    $scope.currentProcessNoteId = 0;
    $scope.buttonText = "Post";
    $scope.buttonPrivateText = "Post";
    $scope.editNoteStyle = { 'color': "red" }
    $scope.newNoteText = "";
    $scope.newPrivateNoteText = "";


    //note variable declaration ends


    //note functions
    $scope.getNoteTemplates = function (zoneId) {
        NoteTemplatesService.getNoteTemplates(zoneId).then(function (response) {

            $scope.noteTemplates = response.data;
        });
    };

    $scope.noteTemplateSelected = function (isPrivate) {

        if (isPrivate) {
            $scope.newPrivateNoteText = this.notePrivateTemplate;
        }
        else {
            $scope.newNoteText = this.noteTemplate;
        }
    };

    $scope.getProcessNotes = function (includeDeleted) {
        var promise = RegistrationDetailService.getWorkflowNotes(includeDeleted == 0 ? 'false' : 'true', $scope.registration.registrationView.ProcessId);
        promise.then(function (response) {
            $scope.currentProcessNotes = response.data;

        });
    };

    $scope.makeNotePublic = function (note) {
        $scope.changeNoteType(note, 0);
    };

    $scope.makeNotePrivate = function (note) {
        $scope.changeNoteType(note, 1);
    };

    $scope.changeNoteType = function (note, type) {
        note.Type = type;

        var promise = RegistrationDetailService.editNote(note);
        promise.then(function (response) {
            $scope.getProcessNotes(1);
        });
    };

    $scope.newProcessNote = function (parentNoteId, IsPrivate) {



        if ($scope.currentProcessNoteId === 0) {
            RegistrationDetailService.newWorkflowNote($scope.registration.registrationView.ProcessId).then(function (response) {
                var note = response.data;
                if (IsPrivate) {
                    note.Type = 1;
                    if ($scope.newPrivateNoteText.trim() === "") {
                        alert("");
                    }
                    response.data.Note = $scope.newPrivateNoteText;
                    $scope.makeNotePrivate(note);
                    $scope.newPrivateNoteText = "";

                }
                else {
                    response.data.Note = $scope.newNoteText;
                    $scope.makeNotePublic(note);
                    $scope.newNoteText = "";

                    //show notification of new messages
                    $scope.publicNotesUnSeen = true;

                    var statusInfo = {
                        IsPublicNote: true,
                        NoteUnseen: $scope.publicNotesUnSeen
                    };

                    //mark unread
                    if (note.Type == 0) //if note is public
                    {
                        RegistrationDetailService.updateNoteStatusInfo($scope.organizationRegistrationId, statusInfo);
                    }
                    else if (note.Type == 1) //if note is private
                    {
                        statusInfo.IsPublicNote = false;
                        RegistrationDetailService.updateNoteStatusInfo($scope.organizationRegistrationId, statusInfo);
                    }

                    //change text of button to mark as "read" or "unread"
                    $scope.publicNotesSeenText = 'Read';
                }



            });
        }
        else {

            var note = getNote($scope.currentProcessNoteId);
            if (IsPrivate) {
                note.Note = $scope.newPrivateNoteText;
            }
            else {
                note.Note = $scope.newNoteText;
            }
            RegistrationDetailService.editNote(note).then(function (response) {
                $scope.getProcessNotes($scope.includeDeletedNotes);
                $scope.currentProcessNoteId = 0;
                if (IsPrivate) {
                    $scope.newPrivateNoteText = "";
                    $scope.buttonPrivateText = "Post";
                }
                else {
                    $scope.newNoteText = "";
                    $scope.buttonText = "Post";
                }

                note.customStyle = "";

                //show notification of new messages
                $scope.publicNotesUnSeen = true;

                var statusInfo = {
                    IsPublicNote: true,
                    NoteUnseen: $scope.publicNotesUnSeen
                };

                //mark unread
                if (note.Type == 0) //if note is public
                {
                    RegistrationDetailService.updateNoteStatusInfo($scope.organizationRegistrationId, statusInfo);
                }
                else if (note.Type == 1) //if note is private
                {
                    statusInfo.IsPublicNote = false;
                    RegistrationDetailService.updateNoteStatusInfo($scope.organizationRegistrationId, statusInfo);
                }

                //change text of button to mark as "read" or "unread"
                $scope.publicNotesSeenText = 'Read';
            });

        }
    };
    function getNote(processNoteId) {
        var len = $scope.currentProcessNotes.length;
        var note;
        for (var i = 0 ; i < len; i++) {
            if ($scope.currentProcessNotes[i].WorkflowNoteId == processNoteId) {
                return $scope.currentProcessNotes[i];
            }
        }

    }
    $scope.updatePermitNote = function (note) {
        PermitService.updatePermitNote(note).then(function (response) {
            $scope.getPermitNotes($scope.includeDeletedNotes);
            $scope.buttonText = "Post";
        });
    };

    $scope.editNote = function (note, isPrivate) {

        if (isPrivate) {
            $scope.buttonPrivateText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newPrivateNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }
        else {
            $scope.buttonText = "Update";
            $scope.currentProcessNoteId = note.WorkflowNoteId;
            $scope.newNoteText = note.Note;
            note.customStyle = $scope.editNoteStyle;
        }

    }

    $scope.deleteNote = function (note) {
        RegistrationDetailService.deleteNote(note).then(function (response) {
            $scope.getProcessNotes($scope.includeDeletedNotes);
        });
    };

    $scope.restoreNote = function (note) {
        RegistrationDetailService.restoreNote(note).then(function (response) {
            $scope.getProcessNotes($scope.includeDeletedNotes);
        });
    };

    $scope.formatDateTime = function (dateTime) {
        return jwru.constellation.utils.formatDateTime(dateTime);
    };

    //note function ends

    $ctrl.varList = [$scope.organizationRegistrationId, $scope.positionTitle];

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.toggleEdit = function (value) {
        if ($scope[value] !== true) {
            $scope[value] = true;
        }
    };

    $scope.getAdvisorDetail = function (userInput, index) {

        //reset if previous user searched was ineligible
        $scope.userEligible = true;
        $scope.ineligibleEmail = '';

        var promise = RegistrationDetailService.getAdvisorDetail(userInput);
        promise.then(function (response) {
            if (response.data && Object.prototype.toString.call(response.data) === '[object Array]') {
                if (response.data.length > 1) {
                    $scope.registration.registrationDataOverview.Advisors[index].HaveMoreThanOneResult = true;
                    $scope.registration.registrationDataOverview.Advisors[index].possibleUsers = response.data;
                    $scope.registration.registrationDataOverview.Advisors[index].possibleUsers.unshift({ UserId: -1, FullName: '- Please Select the User -' });
                    if ($scope.registration.registrationDataOverview.Advisors[index].UserProfileId <= 0) {
                        $scope.registration.registrationDataOverview.Advisors[index].UserProfileId = -1;
                    } else {
                        $scope.registration.registrationDataOverview.Advisors[index].selectedUser = {
                            UserProfileId: $scope.registration.registrationDataOverview.Advisors[index].UserProfileId,
                            FullName: $scope.registration.registrationDataOverview.Advisors[index].FullName,
                            Email: $scope.registration.registrationDataOverview.Advisors[index].Email
                        };
                    }
                } else {
                    if (response.data.length <= 0 || !response.data[0].FullName) {
                        response.data.push({ FullName: 'Invalid User', UserProfileId: 0 });
                    }
                    $scope.registration.registrationDataOverview.Advisors[index].FullName = response.data[0].FullName;
                    $scope.registration.registrationDataOverview.Advisors[index].UserProfileId = response.data[0].UserProfileId;
                }
            } else {
                $scope.registration.registrationDataOverview.Advisors[index].FullName = 'Invalid Email';
                $scope.registration.registrationDataOverview.Advisors[index].UserProfileId = 0;
            }
        });
    };

    $scope.workflowHistory = function (rootProcessId) {
        $ctrl.varList = rootProcessId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/workflowHistory.html',
            controller: 'workflowHistoryInstanceCtrl',
            controllerAs: '$ctrl',
            size: 'lg',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
    };

    $scope.saveProperties = function () {
        $scope.showExtendPropertySavedMessage = false;
        var promise = ExtendedPropertyService.saveExtendedPropertyGroups($scope.propertyGroups, $scope.organizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            if (data === 1) {
                $scope.showExtendPropertySavedMessage = true;
            }
            $scope.propertiesForm.$setPristine();
            $scope.getExtendedPropertyGroups();
        });
    };

    $scope.getExtendedPropertyGroups = function () {
        var promise = ExtendedPropertyService.getExtendedPropertyGroups($scope.organizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.propertyGroups = data;
            $scope.activeAdditionalInfoEdit = false;
        });
    };

    $scope.updateAdvisorInfo = function () {
        angular.forEach($scope.registration.registrationDataOverview.Advisors, function (advisor) {
            if (advisor.HaveMoreThanOneResult) {
                delete advisor.HaveMoreThanOneResult;
            }
            if (advisor.possibleUsers) {
                delete advisor.possibleUsers;
            }
            if (advisor.selectedUser) {
                advisor.UserProfileId = advisor.selectedUser.UserProfileId;
                advisor.FirstName = advisor.selectedUser.FirstName;
                advisor.LastName = advisor.selectedUser.LastName;
                advisor.FullName = advisor.selectedUser.FullName;
                advisor.StudentId = advisor.selectedUser.StudentId;
                advisor.Email = advisor.selectedUser.Email;
                delete advisor.selectedUser;
            }
        });

        $scope.invalidAdvisorMessage = false;
        $scope.duplicateOfficer = false;
        $scope.showAdvisorSavedMessage = false;

        var promise = RegistrationDetailService.updateAdvisorInfo($scope.registration.registrationView.OrganizationRegistrationId, $scope.registration.registrationDataOverview.Advisors);

        promise.then(function (response) {
            var data = response.data;

            $scope.advisorInfo.$setPristine();

            if (typeof data === 'string' && data.includes('@')) {
                $scope.userEligible = false;
                $scope.ineligibleEmail = data;
            }
            else if (data === -1) {
                $scope.duplicateOfficer = true;
                $scope.advisorIsValid = false;
            } else if (data === 0) {
                $scope.invalidAdvisorMessage = true;
                $scope.advisorIsValid = false;
            } else {
                $scope.showAdvisorSavedMessage = true;
                $scope.advisorIsValid = true;
                $scope.getAllAdvisors();
            }
        });
    };

    $scope.addAdvisor = function () {
        if ($scope.registration.registrationDataOverview.Advisors.length < 5) {
            var promise = RegistrationDetailService.addAdvisor();
            promise.then(function (response) {
                var data = response.data;
                $scope.registration.registrationDataOverview.Advisors.push(data);
            });
        }
    };

    $scope.removeAdvisor = function (index) {
        if ($scope.registration.registrationDataOverview.Advisors.length > 1) {
            var promise = RegistrationDetailService
                .removeAdvisor($scope.registration.registrationDataOverview.Advisors,
                    index,
                    $scope.registration.registrationView.OrganizationRegistrationId);
            promise.then(function (response) {
                var data = response.data;
                $scope.registration.registrationDataOverview.Advisors = data;
                $scope.advisorInfo.$setPristine();
                $scope.updateAdvisorInfo();
            });
        }
    };

    $scope.getAllAdvisors = function () {
        var promise = RegistrationDetailService.getAllAdvisors($scope.registration.registrationView.OrganizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.registration.registrationDataOverview.Advisors = data;
            for (var i = 0; i < $scope.registration.registrationDataOverview.Advisors.length; i++) {
                $scope.getAdvisorDetail($scope.registration.registrationDataOverview.Advisors[i].UserInput, i);
            }
        });
    };

    $scope.updateUserInfo = function () {
        var promise = OfficerService.updateUserInfo($scope.allPositionsView);
        promise.then(function (response) {
            var data = response.data;
            $scope.allPositionsView = data;
        });
    };

    $scope.getAllPositionViewWithOfficers = function () {
        var promise = OfficerService.getAllPositionViewWithOfficers($scope.organizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.allPositionsView = data;
            $scope.activeOfficersEdit = false;
            if ($scope.officerForm !== undefined) {
                $scope.officerForm.$setPristine();
            }
        });
    };

    $scope.updateAllPositions = function () {
        $scope.showSavedMessage = false;
        var promise = OfficerService.updateAllPositions($scope.allPositionsView);
        promise.then(function (response) {
            var data = response.data;
            $scope.officerForm.$setPristine();

            if (data.IsValid === true) {
                $scope.showSavedMessage = true;
                $scope.getAllPositionViewWithOfficers();
            }
            else {
                $scope.allPositionsView = data;
                $scope.showSavedMessage = false;
            }
        });
    };

    $scope.submitRegistration = function () {
        if ($scope.allPositionsView.IsValid === true) {
            var url = (window.location.protocol) + '//' + window.location.host + '/Register/Default/SubmitRegistration?organizationRegistrationId=' + $scope.organizationRegistrationId;
            window.location = url;
        }
    };

    $scope.cancelRegistration = function () {
        $ctrl.varList = 'You want to Cancel your registration';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirm.html',
            controller: 'confirmedModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });
        modalInstance.result.then(function (result) {
            if (result === 1) {
                var url = (window.location.protocol) + '//' + window.location.host + '/Register/Default/CancelRegistration?registrationId=' + $scope.organizationRegistrationId;
                window.location = url;
            }
        });
    };

    $scope.setPositionTitle = function (positionTitle) {
        $scope.positionTitle = positionTitle;
        $ctrl.varList[0] = $scope.organizationRegistrationId;
        $ctrl.varList[1] = positionTitle;

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'assignOfficer.html',
            controller: 'ModalInstanceCtrlOfficer',
            controllerAs: '$ctrl',
            size: '',
            scope: $scope,
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (selectedItem) {
            $ctrl.selected = selectedItem;
        }, function () {
            $log.info('Modal dismissed');
        });
    };

    $scope.updateRegistrationData = function () {
        var promise = RegistrationDetailService.updateRegistrationData($scope.registration.registrationDataOverview);
        promise.then(function (response) {
            $scope.getRegistration($scope.organizationRegistrationId);
            $scope.showSuccessMessage = true;
        });
    };

    $scope.getRegistration = function () {
        $scope.$broadcast("refresh");

        $scope.getNoteStatusInfo($scope.organizationRegistrationId, true);//"true" gets public note status info

        var promise = RegistrationDetailService.getRegistration($scope.organizationRegistrationId);
        promise.then(function (response) {
            var data = response.data;
            $scope.registration = data;
            $scope.organizationInfo.$setPristine();
            $scope.rootProcessId = $scope.registration.registrationView.ProcessId;
            $scope.activateGeneralInfoEdit = false;
            $scope.getProcessNotes(0);
            $scope.getAllAdvisors($scope.organizationRegistrationId);
            $scope.getSocialMediaPlatforms();
        });
    };

    $scope.editTaggedAdmin = function () {
        $scope.edit = true;
        $ctrl.varList = $scope.organizationRegistrationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/createTaggedAdmins.html',
            // scope: $scope,
            controller: 'orgRegistrationTaggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
                // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
                // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.viewTaggedAdmins = function () {
        $scope.edit = false;
        $ctrl.varList = $scope.organizationRegistrationId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/updateTaggedAdmins.html',
            // scope: $scope,
            controller: 'orgRegistrationTaggedAdminsModalCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                },
                edit: function () { return $scope.edit; }
            }
        });

        modalInstance.result.then(function () {
            if (true) {
                // $scope.getStepViews($scope.processStatusOverview[0].ProcessStatus.ProcessId);
                // console.log('true step');
            }
        }, function () {
            $log.info('Modal dismissed');
        });

    };

    $scope.getNumberOfUploadedFiles = function (orgRegistrationId) {
        
        var promise = RegistrationDetailService.getNumberOfUploadedFiles(orgRegistrationId);

        promise.then(function (resp) {
            $scope.NumberOfUploadedFiles = resp.data;
        })
    }

    $scope.openModal = function (templateUrl, controller, varList) {
        $scope.modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl,
            controller,
            controllerAs: '$ctrl',
            size: 'med',
            resolve: {
                varList: function () {
                    return varList;
                }
            }
        });
    };

    $scope.handleModalResult = function (resultObj, modalType) {

        if (modalType === 'main modal') {

            //User selected the "remove selected" button of file viewing modal
            if (resultObj.result === 'remove') {

                $scope.selectedFilesList = resultObj.selectedFilesList;

                var varList = {
                    message: "Are you sure you want to remove the selected files?",
                    confirmButtonText: 'Yes',
                    cancelButtonText: 'Cancel'
                }

                //Open confirmation modal
                $scope.openModal('/app/views/confirmedDialog/confirmCustomizable.html', 'confirmCustomizableCtrl', varList);

                //Used anonymous function to call the handlwModalResult method bc without it the method gets called right away and not when a modal gets closed
                $scope.modalInstance.result.then(function (result) {

                    $scope.handleModalResult(result, 'confirm modal')

                }, function () { });

                //User clicked the "close" button on the modal to view files
            } else {
                $scope.modalInstance.close();
            }

            //Decide what will happen when the user chooses to "confirm" or "cancel" on the confirmation modal
        } else {

            if (resultObj === 'confirm') {
                var promise = RegistrationDetailService.deleteFiles($scope.organizationRegistrationId, $scope.selectedFilesList);

                promise.then(function () {
                    $scope.selectedFilesList = [];
                    $scope.getListOfFiles($scope.organizationRegistrationId);
                });

                //User clicked cancel, so bring back the file viewing modal
            } else {
                $scope.getListOfFiles($scope.organizationRegistrationId);
            }
        }
    };

    $scope.getListOfFiles = function (orgRegistrationId) {

        var promise = RegistrationDetailService.getListOfFiles(orgRegistrationId);

        promise.then(function (resp) {
            $scope.selectedFilesList = [];// modal will update this value, but it's stored here so there is still access to it when modal closes
            $scope.fileList = resp.data;
            $scope.NumberOfUploadedFiles = $scope.fileList.length;

            $ctrl.varList = {
                fileList: $scope.fileList,
                header: "Uploaded Files",
                orgRegistrationId
            };

            $scope.openModal('/app/views/modalViews/UploadedFilesModal.html', 'uploadOrgRegistFilesModalCtrl', $ctrl.varList);

            $scope.modalInstance.result.then(function (resultObj) {

                $scope.handleModalResult(resultObj, 'main modal')

            }, function () { });
        })
    }

    $scope.closeModal = function () {
        $scope.modalInstance.close();
        $scope.currentUser = {};
    }

    $rootScope.$on('GetRegistration', function () {
        $scope.getRegistration();
    });

    $scope.init = function (orgRegId) {
        $scope.organizationRegistrationId = orgRegId;
        $scope.id = orgRegId;
        $scope.getRegistration();
        $scope.getExtendedPropertyGroups();
        $scope.getAllPositionViewWithOfficers(); //for registration review page
        $scope.getNoteTemplates(1);
        $scope.getNumberOfUploadedFiles($scope.organizationRegistrationId);
    };

    $scope.initPage = function (orgRegId) {
        $scope.init(orgRegId);
    };

}).filter('commaspliter', function () {
    return function (input) {
        return input.split(',');
    }
}).directive('convertToNumber', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            ngModel.$parsers.push(function (val) {
                return parseInt(val, 10);
            });
            ngModel.$formatters.push(function (val) {
                return '' + val;
            });
        }
    };
});


app.controller('ModalInstanceCtrlOfficer',
    function($scope, $rootScope, AdminOfficerService, $uibModalInstance, RegistrationDetailService, varList) {
        $scope.varList = varList;

        $scope.firstName;
        $scope.lastName;
        $scope.studentId;
        $scope.email;
        $scope.positionId;
        $scope.isValid = 0;
        $scope.status = 0;
        $scope.loading = false;
        $scope.duplicate = false;
        $scope.notEligible = false;

        $scope.replaceOfficer = function(userInput) {
            $scope.duplicate = false;
            var promise = RegistrationDetailService.replaceOfficer(userInput, $scope.varList[1], $scope.varList[0]);
            promise.then(function(response) {
                if (response.data.StudentId === 'duplicate') {
                    $scope.duplicate = true;
                }
                if (response.data.StudentId === 'noteligible') {
                    $scope.notEligible = true;
                }else {
                    $rootScope.$emit('GetRegistration', {});

                    if ($scope.studentId !== null) {
                        $scope.cancel();
                    } else {
                        $scope.status = 1;
                    }
                }
            });
        };

        $scope.overrideOfficer = function (userInput) {
            $scope.duplicate = false;
            var promise = RegistrationDetailService.overrideOfficer(userInput, $scope.varList[1], $scope.varList[0]);
            promise.then(function (response) {
                if (response.data.StudentId === 'duplicate') {
                    $scope.duplicate = true;
                }
                if (response.data.StudentId === 'noteligible') {
                    $scope.notEligible = true;
                } else {
                    $rootScope.$emit('GetRegistration', {});

                    if ($scope.studentId !== null) {
                        $scope.cancel();
                    } else {
                        $scope.status = 1;
                    }
                }
            });
        };

        $scope.cancel = function() {
            $uibModalInstance.dismiss('cancel');
        };

        $scope.getUserInfo = function(userInput) {
            $scope.loading = true;
            $scope.status = 0;
            var promise = AdminOfficerService.getUserInfo(userInput);
            promise.then(function(response) {
                var data = response.data;
                $scope.firstName = data.FirstName;
                $scope.lastName = data.LastName;
                $scope.studentId = data.StudentId;
                $scope.email = data.Email;

                if ($scope.studentId > 0) {
                    $scope.isValid = 1;
                } else {
                    $scope.isValid = 0;
                }
                $scope.loading = false;

            });
        };
    });;
app.controller('registrationDataController', function ($scope, RegistrationDataService, OrgSocialMediaService, RegistrationDetailService) {
    $scope.registrationInstanceId;
    $scope.registrationPeriodId;
    $scope.GUID;
   
    $scope.registrationData = {};
    $scope.showErrorMessage = false;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.saveRegistrationData = function () {

        //Check if the form is private and if the user is still logged in or if they timed out and need to login again
        var appAccessWUserLoginStatusPromise = RegistrationDetailService.appAccessWUserLoginStatus($scope.registrationPeriodId, null);

        appAccessWUserLoginStatusPromise.then(function (response) {
            var isApplicationPublic = response.data.appPublic;
            var loggedIn = response.data.userIsLoggedIn;

            if (!isApplicationPublic && !loggedIn) {

                var url = (window.location.protocol) + '//' + window.location.host + '/auth/login/';
                window.location = url;

            } else {
                $scope.showErrorMessage = false;
                $scope.registrationData.GUID = $scope.GUID;
                var promise = RegistrationDataService.saveRegistrationData($scope.registrationData, $scope.registrationInstanceId, $scope.registrationPeriodId);

                promise.then(function (response) {

                    var data = response.data;
                    if (data.OrganizationRegistrationId > 0) {
                        var url = (window.location.protocol) + '//' + window.location.host + '/Register/Officer/AssignOfficer/' + data.OrganizationRegistrationId;
                        window.location = url;
                    }
                    else {
                        $scope.showErrorMessage = true;
                    }
                }, function (response) {
                    if (response.status === 409) {
                        $scope.showErrorMessage = true;
                        return;
                    }
                });
            }
        });
    };


    $scope.getRegistrationData = function () {
        var promise = RegistrationDataService.getRegistrationData($scope.registrationInstanceId, $scope.registrationPeriodId, $scope.GUID);
        promise.then(function (response) {
            var data = response.data;
            $scope.registrationData = data;
            if ($scope.registrationData.OrganizationSocialMedias == null) {
                $scope.registrationData.OrganizationSocialMedias = [];
            }
            //$scope.getSocialMediaPlatforms();
        });
    };

  
  

   

    $scope.initRegistration = function (registrationInstanceId, registrationPeriodId, GUID) {
        $scope.registrationInstanceId = registrationInstanceId;
        $scope.registrationPeriodId = registrationPeriodId;
        $scope.GUID = GUID;       
        $scope.getRegistrationData();
       
    };

   
});;
app.controller('reportController', function ($scope, ReportService) {
    $scope.getReportList = function () {
        ReportService.getReportList().then(function (response) {
           
            $scope.reports = response.data.map(function (r) {
                r.selected = false;
                return r;
            });
           
         });
    }
    $scope.init = function () {
        $scope.getReportList();
    }
    $scope.viewReport = function (report) {
        $scope.reports.forEach(function (r) {
            r.selected = false;
        });
        report.selected = true;
        var reportUrl = "/ReportTemplate.aspx?ReportName=" + report.ReportName + "&Height=750";
        $scope.reportURL = reportUrl;
       
    }
});;
app.controller('adminManageSystemAnnouncementsController', function ($scope, $uibModal, AnnouncementsService) {
    // BEGIN scope LEVEL VARIABLES
    $scope.announcements = [];
    $scope.currentPage = 1;
    $scope.itemsPerPage = 25;
    $scope.includeDeleted = false;
    $scope.loadingAnnouncements = true;
    $scope.selectedAnnouncement;
 
    //function formatDateTime() {
    //    var len = $scope.announcements.length;
    //    var obj;
    //    for (var i = 0; i < len; i++) {
    //        obj = $scope.announcements[i];

    //        obj.PostStart = jwru.constellation.utils.formatNormalDateTime(obj.PostStart);
    //        obj.PostEnd = jwru.constellation.utils.formatNormalDateTime(obj.PostEnd);
    //        //obj.EndDate = jwru.constellation.utils.formatNormalDateTime(obj.EndDate);
    //    }
    //}

    function loadSystemAnnouncements() {
        var promise = AnnouncementsService.getAllAdmin();
        $scope.loadingAnnouncements = true;
        promise.then(function (response) {
            $scope.announcements = response.data;
            //formatDateTime();
            $scope.loadingAnnouncements = false;
        });
    };

    $scope.editAnnouncement = function (announcement) {
        $scope.selectedAnnouncement = announcement;
        showAnnouncementModal();
    }
   
    
     $scope.deleteAnnouncement = function (announcement) {
        $scope.selectedAnnouncement = announcement;
        showDeleteAnnouncementModal();
    }

    $scope.loadAnnouncements = function () {
        loadSystemAnnouncements();
        //Fix for solving css conflict of datepicker3.css and angular strap datetimepicker css
        //$("link[href$='datepicker3.css']").remove();
    };

    $scope.addNewAnnouncement = function () {
        showAnnouncementModal();
    }

    function showAnnouncementModal() {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'announcementModal.html',
            scope: $scope,
            controller: 'AnnouncementCtrl',
            controllerAs: '$ctrl',
            size: ''
        });
    }

    function showDeleteAnnouncementModal() {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'deleteAnnouncementCtrl.html',
            scope: $scope,
            controller: 'DeleteAnnouncementCtrl',
            controllerAs: '$ctrl',
            size: ''
        });
    }

    
    
});

app.controller('DeleteAnnouncementCtrl', function ($scope, $uibModalInstance, AnnouncementsService) {
    var $ctrl = this;
    $ctrl.isDeleted = false;
    $ctrl.scope = $scope.$parent;

    $ctrl.close = function () {
        $uibModalInstance.dismiss('cancel');

        //this.scope;
    };

    $ctrl.announcement = $scope.$parent.selectedAnnouncement;
    $scope.$parent.selectedAnnouncement = null;

   

    function deleteAnnouncement() {

        var announcementId = $ctrl.announcement.AnnouncementId;

        var promise = AnnouncementsService.deleteAnnouncement(announcementId).then(function (response) {
            $ctrl.isDeleted = true;
            
            $ctrl.scope.loadAnnouncements();
           

        });
    }

    $ctrl.okClicked = function ($scope) {
        if ($ctrl.isDeleted) {
            $ctrl.close();
        }
        else {
            deleteAnnouncement();
        }
    }
   

    
});

app.controller('AnnouncementCtrl', function ($scope, $uibModalInstance, AnnouncementsService) {
    var $ctrl = this;
    $ctrl.scope = $scope;
    $ctrl.regTargetTypes = [];
    $ctrl.isEndDateValid = true;

    $ctrl.announcement = jQuery.extend({}, $scope.$parent.selectedAnnouncement);
   
    $scope.$parent.selectedAnnouncement = null;
    if (jQuery.isEmptyObject($ctrl.announcement)) {
        //new announcemnt
        $ctrl.isNew = true;
        $ctrl.announcement = getEmptyAnnouncement();
    }
    else {

        $ctrl.isNew = false;
        $ctrl.announcement.Priority = $ctrl.announcement.Priority.toString();
        if ($ctrl.announcement.PostStart !== null)
            $ctrl.announcement.PostStart = $ctrl.announcement.PostStart.formatDateTime();
        if ($ctrl.announcement.PostEnd !== null)
            $ctrl.announcement.PostEnd = $ctrl.announcement.PostEnd.formatDateTime();
    }



    function getEmptyAnnouncement() {
        announcement = {
            AnnouncementId: null,
            OrganizationId: null,
            OrganizationName: null,
            Title: null,
            Description: null,
            Priority: null,
            PostStart: null,
            PostEnd: null,
            CreatedBy: null,
            DateCreated: null,
            DateUpdated: null,
            DateDeleted: null,
            FirstName: null,
            LastName: null,
            Email: null,
            Phone: null

        }
        return announcement;
    }

    $ctrl.close = function () {
        $ctrl.announcement = null;
    $uibModalInstance.dismiss('cancel');

        //this.scope;
    };
   
    //$ctrl.endDateValidatorFunction = function () {
    //    var endDate = Date.parse(this.announcement.PostEnd);
    //    var startDate = Date.parse(this.announcement.PostStart);
    //    if (isNaN(endDate) || (endDate > startDate)) {
    //        $scope.basicInfo.$setValidity('endDate', true);
    //        $ctrl.isEndDateValid = true;
    //    }
    //    else {
    //        $scope.basicInfo.$setValidity('endDate', false);
    //        $ctrl.isEndDateValid = false;
    //    }
       
    //}

    $ctrl.updateAnnouncement = function () {
       

        AnnouncementsService.updateAnnouncement($ctrl.announcement).then(function (response) {

            //$ctrl.scope.orgRegistrationPeriods.add(response.data);
            $ctrl.scope.loadAnnouncements();
            $ctrl.close();

        });
    }

    $ctrl.prioritySelected = function () {
        
    }

    
});

;
app.controller('adminManageSystemNoteTemplatesController', function ($scope, $uibModal, NoteTemplatesService) {
    // BEGIN scope LEVEL VARIABLES
    $scope.noteTemplates = [];
    $scope.currentPage = 1;
    $scope.itemsPerPage = 25;
    $scope.includeDeleted = false;
    $scope.loadingTemplates = true;
 
    function formatDateTime() {
        var len = $scope.noteTemplates.length;
        var obj;
        for (var i = 0; i < len; i++) {
            obj = $scope.noteTemplates[i];

            obj.DateAdded = jwru.constellation.utils.formatDateTime(obj.DateAdded);
        }
    }
    function addZoneDescription() {
        var len = $scope.noteTemplates.length;
        var obj;
         for (var i = 0; i < len; i++) {
            obj = $scope.noteTemplates[i];

            switch (obj.ZoneId.toString()) {
                case "1": {obj.Zone = "Organization"; break;}
                case "2": { obj.Zone = "Workflow"; break;}
                case "3": { obj.Zone = "Permit"; break;}
            }
            
        }
    }

    $scope.loadNoteTemplates = function () {
        var promise = NoteTemplatesService.getNoteTemplates();
        $scope.loadingTemplates = true;
        promise.then(function (response) {
            $scope.noteTemplates = response.data;
            formatDateTime();
            addZoneDescription();
          
            $scope.loadingTemplates = false;
        });
    };

    $scope.editNoteTemplate = function (noteTemplate) {
        $scope.selectedNoteTemplate = angular.copy(noteTemplate);
        
        showNoteTemplateModal();
    }

    $scope.deleteNoteTemplate = function (noteTemplate) {
        $scope.selectedNoteTemplate = noteTemplate;
        showDeleteNoteTemplateModal();
    }



    $scope.addNewNoteTemplateClicked = function () {
        showNoteTemplateModal();
    }

    function showNoteTemplateModal() {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'addNoteTemplate.html',
            scope: $scope,
            controller: 'AddNoteTemplateCtrl',
            controllerAs: '$ctrl',
            size: ''
        });
    }

    function showDeleteNoteTemplateModal() {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'deleteNoteTemplate.html',
            scope: $scope,
            controller: 'DeleteNoteTemplateCtrl',
            controllerAs: '$ctrl',
            size: ''
        });
    }
    
});

app.controller('DeleteNoteTemplateCtrl', function ($scope, $uibModalInstance, NoteTemplatesService) {
    var $ctrl = this;
    $ctrl.isDeleted = false;
    $ctrl.scope = $scope.$parent;

    $ctrl.close = function () {
        $uibModalInstance.dismiss('cancel');

        //this.scope;
    };

    $ctrl.noteTemplate = $scope.$parent.selectedNoteTemplate;
    $scope.$parent.selectedNoteTemplate = null;

   

    function deleteNoteTemplate() {

        var noteTemplateId = $ctrl.noteTemplate.NoteId;

        var promise = NoteTemplatesService.deleteNoteTemplate(noteTemplateId).then(function (response) {
            $ctrl.isDeleted = true;
            //$ctrl.scope.orgRegistrationPeriods.add(response.data);
            $ctrl.scope.loadNoteTemplates();
           

        });
    }

    $ctrl.okClicked = function ($scope) {
        if ($ctrl.isDeleted) {
            $ctrl.close();
        }
        else {
            deleteNoteTemplate();
        }
    }
   

    
});

app.controller('AddNoteTemplateCtrl', function ($scope, $uibModalInstance, NoteTemplatesService) {
    var $ctrl = this;
    $ctrl.scope = $scope;
     
    $ctrl.close = function () {
    $uibModalInstance.dismiss('cancel');

        //this.scope;
    };

    $ctrl.noteTemplate = $scope.$parent.selectedNoteTemplate;
    $scope.$parent.selectedNoteTemplate = null;

    if ($ctrl.noteTemplate == undefined || $ctrl.noteTemplate == null) {
        $ctrl.isNew = true;
    }
    else {
        $ctrl.noteTemplate.ZoneId = $ctrl.noteTemplate.ZoneId.toString();
        $ctrl.isNew = false;
    }

    $ctrl.updateNoteTemplate = function () {
        if ($ctrl.noteTemplate.NoteId === undefined)
            $ctrl.noteTemplate.NoteId = 0;

        var noteTemplate = createNoteTemplateObject($ctrl.noteTemplate.NoteId, $ctrl.noteTemplate.NoteTitle, $ctrl.noteTemplate.ZoneId, $ctrl.noteTemplate.NoteTemplate);

        NoteTemplatesService.updateNoteTemplates(noteTemplate).then(function (response) {
            
            //$ctrl.scope.orgRegistrationPeriods.add(response.data);
            $ctrl.scope.loadNoteTemplates();
            $ctrl.close();

        });
    }
    $ctrl.getRegistrationTargetTypes = function () {
        $ctrl.regTargetTypes = TypesService.getRegistrationTargetTypes();
    }
    

    function createNoteTemplateObject(NoteId,NoteTitle, ZoneId, NoteTemplate) {
        var obj = {
            NoteId : NoteId,
            NoteTitle: NoteTitle,
            ZoneId: ZoneId,
            NoteTemplate: NoteTemplate
        }
        return obj;
    }
    

   // $ctrl.getRegistrationTargetTypes();
});

;
app.controller('adminManageSystemPeriodsController', function ($scope, $uibModal, SystemPeriodsService) {
    // BEGIN scope LEVEL VARIABLES
    $scope.orgRegistrationPeriods = [];
    $scope.currentPage = 1;
    $scope.itemsPerPage = 25;
    $scope.loadingPeriods = true;

    var $ctrl = this;

    $scope.editSystemPeriod = function (period) {
        var promise = SystemPeriodsService.getApplicationBySystemPeriodId(period.RegistrationPeriodId);
        promise.then(function (response) {
            $ctrl.varList = [period, response.data];

            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/modalViews/systemPeriod.html?c=' + (new Date()).getTime(),
                controller: 'systemPeriodModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function (result) {
            }, function () {
                $scope.getOrganizationRegistrationPeriods();
            });
        });
    };

    $scope.removeSystemPeriod = function (period) {
        $ctrl.varList = 'System Period';
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
            controller: 'confirmedRemoveModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function (result) {
            if (result === 1) {
                var promise = SystemPeriodsService.removeSystemPeriod(period);
                promise.then(function (response) {
                    $scope.getOrganizationRegistrationPeriods();
                });
            }
        }, function () {

        });
    };

    $scope.createSystemPeriod = function () {
        $ctrl.varList = [{
            RegistrationPeriodId: 0,
            RegistrationName: '',
            RegistrationDescription: '',
            RegistrationTargetType: 0,
            RegistrationTargetId: '',
            StartDate: null,
            EndDate: null,
            DateCreated: null,
            DateDeleted: null
        }, 0];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/systemPeriod.html?c=' + (new Date()).getTime(),
            controller: 'systemPeriodModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $scope.getOrganizationRegistrationPeriods();
        });
    };

    $scope.getOrganizationRegistrationPeriods = function () {
        var promise = SystemPeriodsService.getOrganizationRegistrationPeriods();
        $scope.loadingPeriods = true;
        promise.then(function (response) {
            $scope.orgRegistrationPeriods = response.data;
            $scope.loadingPeriods = false;
        });
    };

    $scope.init = function () {
        $scope.getOrganizationRegistrationPeriods();
    };

    $scope.init();
});;
app.controller('adminSystemCategoriesController', function ($scope, $filter, $uibModal, CategoryServices) {
    // BEGIN scope LEVEL VARIABLES
    $scope.categories = [];
    $scope.currentCategory = {};
 
    // END

    $scope.getCategories = function () {
        var promise = CategoryServices.getCategories();
        promise.then(function (response) {
            $scope.categories = response.data;

        });
    };

    $scope.newCategory = function () {
        var promise = CategoryServices.newCategory();
        promise.then(function (response) {
            $scope.currentCategory = response.data;
            $scope.editCategory($scope.currentCategory);
        });
    };

    $scope.deleteCategory = function (category) {
        if (confirm('Are you sure you want to delete this category?'))
        {
            var promise = CategoryServices.deleteCategory(category);
            promise.then(function (response) {
                $scope.getCategories();
            });
        }
    };

    $scope.editCategory = function (category) {
        var p = angular.copy(category);
        
        const modalInstance = $uibModal.open({
            animation: true,
            templateUrl: '/app/views/system/edit_category.html?c=' + (new Date()).getTime(),
            size: 'lg',
            controller: EditCategoryController,
            resolve: {
                category: function() {
                    return category;
                }
            }
        });

        modalInstance.result.then(function (result) {
          
           

            var promise = CategoryServices.updateCategory(result);
            promise.then(function (response) {

                $scope.getCategories();

            });

        });
    };

    //function getAllSystemOrganizationType() {
    //    OrganizationTypeService.getAllSystemOrganizationType().then(function (response) {
    //        $scope.zoneTypes.push({ OrganizationTypeId: -1, OrganizationTypeName: 'None' });
    //        $scope.zoneTypes = $scope.zoneTypes.concat(response.data);
    //        mapZoneType();
    //    });


    //}

    //function mapZoneType() {
    //  //  for(var i=0;i<)
    //    $scope.categories.ZoneType = getZoneType();
    //}

    //function getZoneType() {

    //}

    $scope.init = function () {
        $scope.getCategories();
      
    };

   

});


// Wizard Permit Date Modal
function EditCategoryController($scope, $uibModalInstance, CategoryServices, OrganizationTypeService, PermitService, category) {
    var self = this;
    $scope.currentCategory = category;
    $scope.currentCategory.SelectedPermitType = { PermitTypeId: category.ZoneTypeId==0?-1:category.ZoneTypeId };
    $scope.currentCategory.SelectedOrgType = { OrganizationTypeId: category.ZoneTypeId == 0 ? -1 : category.ZoneTypeId };
    $scope.zoneTypes = [];
    $scope.orgTypes = [];
    $scope.permitTypes = [];


    function getAllSystemOrganizationType() {
        OrganizationTypeService.getAllSystemOrganizationType().then(function (response) {
            $scope.orgTypes.push({ OrganizationTypeId: -1, OrganizationTypeName: 'All' });
            $scope.orgTypes = $scope.orgTypes.concat(response.data);
            
        });


    }

    function getPermitCategories(){
        var promise = PermitService.getAdminSystemPermitTypes();
        promise.then(function (response) {
            $scope.permitTypes.push({ PermitTypeId: -1, Name: 'All' });
            $scope.permitTypes = $scope.permitTypes.concat(response.data);
           
        });
    }

    $scope.cancel = function () {
        var proceed = true;
        if ($scope.editType.$dirty)
            proceed = confirm('Are you sure you want to cancel modifying this type? Your unsaved changes will be lost.');
        if (proceed)
            $uibModalInstance.dismiss('cancel');
    };

    $scope.commit = function () {

        if ($scope.currentCategory.Zone == 0) {
            $scope.currentCategory.ZoneTypeId = $scope.currentCategory.SelectedOrgType != undefined ? $scope.currentCategory.SelectedOrgType.OrganizationTypeId : -1;
        }
        else if ($scope.currentCategory.Zone == 1) {
            $scope.currentCategory.ZoneTypeId = $scope.currentCategory.SelectedPermitType != undefined ? $scope.currentCategory.SelectedPermitType.PermitTypeId : -1;
        }
        else if ($scope.currentCategory.Zone == 1) {
            $scope.currentCategory.ZoneTypeId = -1;
        }
        $uibModalInstance.close($scope.currentCategory);
    };

    getAllSystemOrganizationType();
    getPermitCategories();
};
;
app.controller('announcementsController', function ($scope, $filter, AnnouncementsService) {
    // BEGIN scope LEVEL VARIABLES
    $scope.announcements = [];

    // END

    $scope.getAnnouncements = function () {
        var promise = AnnouncementsService.getSystem();
        promise.then(function (response) {
            $scope.announcements = response.data;
        });
    };

    $scope.init = function () {
        $scope.getAnnouncements();
    };

    $scope.init();
});

;
app.controller('systemRolesController', function ($scope, $rootScope, $uibModal, SystemRolesService, UserProfileService) { //importing UserProfileService because it is where the load system roles service is contained

    $scope.availableSystemRoles = [];
    $scope.varObject = {};
    $scope.numberOfOriginalRoles = 9
    $scope.systemRole;
    $scope.editRoleModalTitle = 'Edit Role';
    $scope.addNewRoleModalTitle = 'Add New Role';
    $scope.currentPage = 1;
    $scope.itemsPerPage = 16; // original roles + 16 = 25 per page
    $scope.loadingRoles = false;
    $scope.assignUsersText = "Manage Users"; // Also used as modal title
    var $ctrl = this;


    $rootScope.$on('reloadPageAndCloseModal',
        function () {
            $scope.loadSystemRoles();

            $rootScope.$broadcast('closeModal');
        });

    $scope.loadSystemRoles = function () {
        $scope.loadingRoles = true;
        var promise = UserProfileService.getSystemRoles();

        promise.then(function (response) {

            $scope.availableSystemRoles = response.data;
            if ($scope.availableSystemRoles.length > 0) {
                $scope.selectRoleToAdd = $scope.availableSystemRoles[0];
            }
            $scope.loadingRoles = false;
        });
    };

    $scope.init = function () {
        $scope.loadSystemRoles();
    }

    $scope.openModal = function () {

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'System roles pop up title',
            ariaDescribedBy: 'System roles pop up form',
            templateUrl: '/app/views/modalViews/updateSysRolesModal.html',
            controller: 'updateSysRolesModalCtrlr',
            size: '',
            resolve: {
                varObject: function () {
                    return $scope.varObject;
                }
            }
        });
    }

    $scope.addSystemRole = function () {

        $scope.varObject = {
            editMode: false,
            modalTitle: $scope.addNewRoleModalTitle,
            selectedRole: {
                SystemRolesId: 0,
                RoleName: '',
                RoleLevel: null //place holder value, in database the value is not currently used for updating roleLevel
            }
        }

        $scope.openModal();
    }

    $scope.editSystemRole = function (itemIndex) {

        $scope.varObject = {
            editMode: true,
            modalTitle: $scope.editRoleModalTitle,
            selectedRole: $scope.availableSystemRoles[itemIndex]
        }

        $scope.openModal();
    }

    $scope.deleteSystemRole = function (itemIndex) {

        $scope.systemRole = $scope.availableSystemRoles[itemIndex];

        $scope.removeSystemRole = function (systemRole) {
            $ctrl.varList = 'System Role';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                controller: 'confirmedRemoveModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = SystemRolesService.deleteSystemRole(systemRole.SystemRoleId, systemRole)

                    promise.then(function (response) {

                        $scope.loadSystemRoles();
                    });
                }
            },
                function () {

                });
        }

        $scope.removeSystemRole($scope.systemRole);
    };

    $scope.previewUsersInRole = function (systemRole) {

        $scope.valsList = {
            roleLevel: systemRole.RoleLevel, //Using roleLevel instead of systemRoleId because in stored procedure the roleLevel is used to find users in a role
            previewingForRoleManagement: true

        }
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: "modal-title",
                ariaDescribedBy: "modal-body",
                templateUrl: '/app/views/modalViews/previewUsersInRole.html',
                controller: 'previewUsersInRoleModalInstanceCtrl', // if searching for file search previewUsersInRole.js
                controllerAs: "$ctrl",
                size: " ",
                resolve: {
                    valsList: function () {
                        return $scope.valsList;
                    }
                }
            });
    };

    $scope.assignUsers = function (itemIndex) {

        var varsObject = {
            systemRolesId: $scope.availableSystemRoles[itemIndex].SystemRolesId,
            roleLevel: $scope.availableSystemRoles[itemIndex].RoleLevel,
            modalTitle: $scope.assignUsersText
        }

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "Assign users to a role pop up title",
            ariaDescribedBy: "Assign users to a role pop up body",
            templateUrl: '/app/views/modalViews/addUserToSysRoleModal.html',
            controller: 'addUserToSysRoleModalCtrlr',
            controllerAs: "$ctrl",
            size: " ",
            resolve: {
                varsObject: function () {
                    return varsObject;
                }
            }
        });

    }

    

});
app.controller('systemUserTypesController', function ($scope, $rootScope, $uibModal, SystemUserTypesService, UserProfileService) { //importing UserProfileService because it is where the load system roles service is contained

    $scope.availableSystemUserTypes = [];
    $scope.varObject = {};
    $scope.numberOfOriginalUserTypes = 9
    $scope.systemUserType;
    $scope.editUserTypeModalTitle = 'Edit User Type';
    $scope.addNewUserTypeModalTitle = 'Add New User Type';
    $scope.currentPage = 1;
    $scope.itemsPerPage = 16; // original roles + 16 = 25 per page
    $scope.loadingRoles = false;
    $scope.assignUsersText = "Manage Users"; // Also used as modal title
    $scope.waitingIcon = false;
    var $ctrl = this;


    $rootScope.$on('reloadPageAndCloseModal',
        function () {
            $scope.loadSystemUserTypes();

            $rootScope.$broadcast('closeModal');
        });

    $scope.loadSystemUserTypes = function () {
        $scope.loadingUserTypes = true;
        var promise = UserProfileService.getSystemUserTypes();

        promise.then(function (response) {

            $scope.availableSystemUserTypes = response.data;
            if ($scope.availableSystemUserTypes.length > 0) {
                $scope.selectUserTypeToAdd = $scope.availableSystemUserTypes[0];
            }
            $scope.loadingUserTypes = false;
        });
    };

    $scope.init = function () {
        $scope.loadSystemUserTypes();
    }

    $scope.openModal = function () {

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'System roles pop up title',
            ariaDescribedBy: 'System roles pop up form',
            templateUrl: '/app/views/modalViews/updateSysUserTypesModal.html',
            controller: 'updateSysUserTypesModalCtrlr',
            size: '',
            resolve: {
                varObject: function () {
                    return $scope.varObject;
                }
            }
        });
    }

    $scope.addSystemUserType = function () {

        $scope.varObject = {
            editMode: false,
            modalTitle: $scope.addNewUserTypeModalTitle,
            selectedUserType: {
                SystemUserTypesId: 0,
                UserTypeName: '',
               UserTypeLevel: null 
            }
        }

        $scope.openModal();
    }

    $scope.editSystemUserType = function (itemIndex) {

        $scope.varObject = {
            editMode: true,
            modalTitle: $scope.editUserTypeModalTitle,
            selectedUserType: $scope.availableSystemUserTypes[itemIndex]
        }

        $scope.openModal();
    }

    $scope.deleteSystemUserType = function (itemIndex) {

        $scope.systemUserType = $scope.availableSystemUserTypes[itemIndex];

        $scope.removeSystemUserType = function (systemUserType) {
            $ctrl.varList = 'System User Type';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirmRemove.html',
                controller: 'confirmedRemoveModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function (result) {
                if (result === 1) {
                    var promise = SystemUserTypesService.deleteSystemUserType(systemUserType.SystemUserTypesId, systemUserType)

                    promise.then(function (response) {

                        $scope.loadSystemUserTypes();
                    });
                }
            },
                function () {

                });
        }

        $scope.removeSystemUserType($scope.systemUserType);
    };

    $scope.addSystemUserTypeToAllUsers = function () {

        $scope.addAllUsersToSystemUserType = function () {
            $ctrl.varList = 'Add All Users';
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: '/app/views/confirmedDialog/confirm.html',
                controller: 'confirmedModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function (result) {
                if (result === 1) {
                    $scope.waitingIcon = true;
                    var promise = SystemUserTypesService.addAllUserstoSystemUserType()

                    promise.then(function (response) {
                        console.log("I got here");
                        $scope.waitingIcon = false;
                        //$scope.loadSystemUserTypes();
                    });
                }
            },
                function () {

                });
        }

        $scope.addAllUsersToSystemUserType();
    };


    $scope.previewUsersInUserType = function (systemUserType) {

        $scope.valsList = {
            userTypeLevel: systemUserType.UserTypeLevel, //Using roleLevel instead of systemRoleId because in stored procedure the roleLevel is used to find users in a role
            previewingForUserTypeManagement: true

        }
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "modal-title",
            ariaDescribedBy: "modal-body",
            templateUrl: '/app/views/modalViews/previewUsersInUserType.html',
            controller: 'previewUsersInUserTypeModalInstanceCtrl', // if searching for file search previewUsersInRole.js
            controllerAs: "$ctrl",
            size: " ",
            resolve: {
                valsList: function () {
                    return $scope.valsList;
                }
            }
        });
    };
    
    $scope.assignUsers = function (itemIndex) {

        var varsObject = {
            systemUserTypesId: $scope.availableSystemUserTypes[itemIndex].SystemUserTypesId,
            userTypeLevel: $scope.availableSystemUserTypes[itemIndex].UserTypeLevel,
            modalTitle: $scope.assignUsersText
        }

        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: "Assign users to a user type pop up title",
            ariaDescribedBy: "Assign users to a user type pop up body",
            templateUrl: '/app/views/modalViews/addUserToSysUserTypeModal.html',
            controller: 'addUserToSysUserTypeModalCtrlr',
            controllerAs: "$ctrl",
            size: " ",
            resolve: {
                varsObject: function () {
                    return varsObject;
                }
            }
        });

    }
    


});
app.controller('permitWizardController', function ($scope, $timeout, PermitWizardService) {

    // BEGIN scope LEVEL VARIABLES
    $scope.permitVersionId = 0;
    $scope.selectedCategories = {};
    $scope.systemCategories = {};
    $scope.showLoader = false;
    // END

    $scope.deletePermitCategory = function (permitCategoryId) {
        $scope.showLoader = true;
        var promiseDelete = PermitWizardService.deletePermitCategory(permitCategoryId);

        promiseDelete.then(function (response) {
            $scope.getSelectedCategories($scope.permitVersionId);

        });
    };

    $scope.getSelectedCategories = function () {
        $scope.showLoader = true;
        var promiseGet = PermitWizardService.getPermitCategories($scope.permitVersionId);
        
        promiseGet.then(function (response) {
            
            $scope.showLoader = false;
            $scope.selectedCategories = response.data;

        });
    };

    $scope.getSystemCategories = function () {
        $scope.showLoader = true;
        var promiseGet = PermitWizardService.getSystemPermitCategories($scope.permitVersionId);

        promiseGet.then(function (response) {

            $scope.showLoader = false;
            $scope.systemCategories = response.data;

        });
    };

    $scope.addPermitCategory = function (systemCategoryId) {
        $scope.showLoader = true;
        var promise = PermitWizardService.updateCategory($scope.permitVersionId, systemCategoryId);
        promise.then(function (response) {
            $scope.getSelectedCategories($scope.permitVersionId);
        });
    };

    $scope.init = function (permitVersionId) {
        
        $scope.permitVersionId = permitVersionId;
        $scope.getSystemCategories();
        $scope.getSelectedCategories($scope.permitVersionId);
    };


});;
app.controller('adminWorkflowHomeController', function ($scope, $filter, $log, $uibModal, WorkflowService) {

    $scope.loadedWorkflows = {};
    $scope.designations = {};
    $scope.workflowRoles = {};

    $scope.showWorkflowRoleRemoveError = false;

    $scope.showWorkflowRemoveError = false;
    var $ctrl = this;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.createWorkflow = function () {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'newWorkflow.html',
            controller: 'ModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
            
        }, function () {
            $log.info('Modal dismissed');
            $scope.loadWorkflows();
        });
    };

    $scope.assignWorkflow = function (workflowDesignationId, workflowId) {
        var selectedWorkflow;
        for (var i = 0; i < $scope.loadedWorkflows.length; i ++)
        {
            if ($scope.loadedWorkflows[i].WorkflowId === workflowId)
            {
                selectedWorkflow = $scope.loadedWorkflows[i];
                break;
            }
        }
        $ctrl.varList = [workflowDesignationId, selectedWorkflow, $scope.loadedWorkflows];
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'assignWorkflow.html',
            controller: 'ModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {

        }, function () {
            $log.info('Modal dismissed');
            $scope.loadWorkflows();
        });
    };

    $scope.createWorkflowRoles = function () {
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'newWorkflowRoles.html',
            controller: 'ModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {

        }, function () {
            $log.info('Modal dismissed');
            $scope.loadWorkflowRoles();
        });
    };

    $scope.removeWorkflowRoles = function (workflowRolesId) {
        $scope.showWorkflowRoleRemoveError = false;
        var promise = WorkflowService.removeWorkflowRoles(workflowRolesId);
        promise.then(function (response) {
            if (response.data === -1) {
                $scope.showWorkflowRoleRemoveError = true;
            }
            else {
                $scope.loadWorkflowRoles();
            }
        });
    };

    $scope.removeWorkflow = function (workflowId) {
        $scope.showWorkflowRemoveError = false;
        var promise = WorkflowService.removeWorkflow(workflowId);
        promise.then(function (response) {
            if (response.data === -1) {
                $scope.showWorkflowRemoveError = true;
            }
            else {
                $scope.init();
            }
        });
    };

    $scope.loadWorkflowRoles = function () {
        var promise = WorkflowService.getWorkflowRoles();
        promise.then(function (response) {
            $scope.workflowRoles = response.data;
        }, function (response) {

        });
    };

    $scope.loadWorkflowDesignations = function () {
        var promise = WorkflowService.getWorkflowDesignations();
        promise.then(function (response) {
            $scope.designations = response.data;
        }, function (response) {
        });
    };

    $scope.loadWorkflows = function () {
        var promise = WorkflowService.getWorkflows();
        promise.then(function (response) {
            $scope.loadedWorkflows = response.data;
            $scope.loadWorkflowDesignations();
            $scope.loadWorkflowRoles();
        }, function (response) {
        });
    };

    $scope.init = function () {
        $scope.loadWorkflows();
    };
    $scope.init();

});


app.controller('ModalInstanceCtrl', function ($scope, WorkflowService, AdminOfficerService, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.showErrorMessage = false;
    $scope.workflow = {};
    $scope.step = {};
    $scope.stepItem = {};
    $scope.approver = {};

    $scope.workflowDesignationId;
    $scope.selectedWorkflow;
    $scope.workflows;

    $scope.workflowRoles = {};
    $scope.showErrorMessageRoles = false;


    $scope.init = function () {
        if (varList !== null && varList !== undefined && varList.length === 3)
        {
            $scope.workflowDesignationId = varList[0];
            $scope.selectedWorkflow = varList[1];
            $scope.workflows = varList[2];
        }
    };

    $scope.init();

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.assignWorkflow = function (selectedWorkflowId, workflowDesignationId) {
        $scope.showErrorMessage = false;
        var promise = WorkflowService.assignWorkflow(selectedWorkflowId, workflowDesignationId);
        promise.then(function (response) {
            if (response.data === 1) {
                $ctrl.cancel();
            }
            else {
                $scope.showErrorMessage = true;
            }
        });
    };

    $scope.createWorkflow = function () {
        $scope.showErrorMessage = false;
        var promise = WorkflowService.createNewWorkflow($scope.workflow);
        promise.then(function (response) {
            if (response.data === 1) {
                $ctrl.cancel();
            }
            else
            {
                $scope.showErrorMessage = true;
            }
        });
    };

    $scope.createWorkflowRoles = function () {
        $scope.showErrorMessageRoles = false;
        var promise = WorkflowService.createNewWorkflowRoles($scope.workflowRoles);
        promise.then(function (response) {
            if (response.data === 1) {
                $ctrl.cancel();
            }
            else {
                $scope.showErrorMessageRoles = true;
            }
        });
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('adminWorkflowDetailController', function ($scope, $log, $uibModal, WorkflowService) {

    $scope.workflowId;
    $scope.workflow = {};

    var $ctrl = this;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.createStep = function () {
        $ctrl.varList = $scope.workflowId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'newStep.html',
            controller: 'WorkflowDetailModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $log.info('Modal dismissed');
            $scope.init();
        });
    };

    $scope.removeStep = function () {
        var promise = WorkflowService.removeLastStep($scope.workflowId);
        promise.then(function (response) {
            $scope.init();
        });
    };

    $scope.loadWorkflowDetail = function () {
        var promise = WorkflowService.getWorkflowDetail($scope.workflowId);
        promise.then(function (response) {
            $scope.workflow = response.data;
        });
    };

    $scope.init = function () {
        $scope.loadWorkflowDetail();
    };

    $scope.init();

});

app.controller('WorkflowDetailModalInstanceCtrl', function ($scope, WorkflowService, AdminOfficerService, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.showErrorMessage = false;
    $scope.step = {};

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.createStep = function () {
        $scope.showErrorMessage = false;
        var promise = WorkflowService.createNewStep($scope.step, varList);
        promise.then(function (response) {
            if (response.data === 1) {
                $ctrl.cancel();
            }
            else {
                $scope.showErrorMessage = true;
            }
        });
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };
});;
app.controller('adminWorkflowRoleDetailController', function ($scope, $log, $uibModal, WorkflowService) {

    $scope.workflowRoleId;
    $scope.workflowRole = {};
    $scope.showErrorMessage = false;
    $scope.showSaveMessage = false;
    $scope.showRemoveErrorMessage = false;

    $scope.workflowUserRolesOverview = {};

    var $ctrl = this;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.createWorkflowUserRole = function () {
        $ctrl.varList = $scope.workflowRoleId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: 'addNewUserRole.html',
            controller: 'WorkflowUserRoleModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $scope.getWorkflowUserRolesOverview();
        });
    };

    $scope.removeWorkflowUserRoles = function (workflowUserRoleId) {
        $scope.showRemoveErrorMessage = false;
        var promise = WorkflowService.removeWorkflowUserRoles(workflowUserRoleId);
        promise.then(function (response) {
            if (response.data !== 1) {
                $scope.showRemoveErrorMessage = true;
            }
            else {
                $scope.getWorkflowUserRolesOverview();
            }
        });
    };

    $scope.updateWorkflowRoles = function () {
        $scope.showErrorMessage = false;
        $scope.showSaveMessage = false;
        var promise = WorkflowService.updateWorkflowRole($scope.workflowRole);
        promise.then(function (response) {
            if (response.data === 1) {
                $scope.showSaveMessage = true;
                $scope.getWorkflowRoleDetail();
            }
            else {
                $scope.showErrorMessage = true;
            }
        });
    };

    $scope.toggleEmailNotification = function(workflowUserRoleId) {
        var promise = WorkflowService.toggleEmailNotification(workflowUserRoleId);
        promise.then(function(response) {
            $scope.getWorkflowRoleDetail();
        });
    };

    $scope.getWorkflowUserRolesOverview = function () {
        var promise = WorkflowService.getWorkflowUserRolesOverview($scope.workflowRoleId);
        promise.then(function (response) {
            $scope.workflowUserRolesOverview = response.data;
        });
    };

    $scope.getWorkflowRoleDetail = function () {
        var promise = WorkflowService.getWorkflowRoleDetail($scope.workflowRoleId);
        promise.then(function (response) {
            $scope.workflowRole = response.data;
            $scope.getWorkflowUserRolesOverview();
        });
    };

    $scope.init = function () {
        $scope.getWorkflowRoleDetail();
    };

    $scope.init();
})

app.controller('WorkflowUserRoleModalInstanceCtrl', function ($scope, WorkflowService, AdminOfficerService, $uibModalInstance, varList) {

    $scope.showErrorMessage = false;
    $scope.showErrorMessageDuplicate = false;

    $scope.firstName;
    $scope.lastName;
    $scope.studentId;
    $scope.email;
    $scope.isValid = 0;
    $scope.status = 0;
    $scope.loading = false;
    $scope.duplicate = false;

    $scope.emailNotify = false;

    $scope.createNewWorkflowUserRole = function (userInput) {
        $scope.showErrorMessage = false;
        $scope.showErrorMessageDuplicate = false;

        var promise = WorkflowService.createNewWorkflowUserRole(userInput, varList, $scope.emailNotify);
        promise.then(function (response) {
            var data = response.data;
            if (data === 0)
            {
                $scope.showErrorMessage = true;
            } else if (data === -1)
            {
                $scope.showErrorMessageDuplicate = true;
            } else {
                $scope.cancel();
            }
        });
    };

    $scope.getUserInfo = function (userInput) {
        $scope.loading = true;
        $scope.status = 0;
        $scope.showErrorMessage = false;
        $scope.showErrorMessageDuplicate = false;

        var promise = AdminOfficerService.getUserInfo(userInput);
        promise.then(function (response) {
            var data = response.data;
            $scope.firstName = data.FirstName;
            $scope.lastName = data.LastName;
            $scope.studentId = data.StudentId;
            $scope.email = data.Email;

            if ($scope.studentId > 0) {
                $scope.isValid = 1;
            }
            else {
                $scope.isValid = 0;
            }
            $scope.loading = false;
        });
    };

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.cancel = function () {
        $scope.showErrorMessage = false;
        $scope.showErrorMessageDuplicate = false;
        $uibModalInstance.dismiss('cancel');
    };

});;
app.controller('adminWorkflowStepDetailController', function ($scope, $log, $uibModal, WorkflowService) {
    $scope.ID;
    $scope.approverList = {};
    $scope.step = {};
    $scope.stepItemList = {};

    $scope.showSuccessMessageStep = false;
    $scope.showErrorMessageStep = false;
    $scope.showSuccessMessageStepItem = false;
    $scope.showErrorMessageStepItem = false;

    var $ctrl = this;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $scope.createStepItem = function () {
        var steps = {};
        WorkflowService.getWorkflowDetail($scope.step.WorkflowId).then(function (response) {
            steps = response.data;
            $ctrl.varList = [$scope.ID, steps];
            var modalInstance = $uibModal.open({
                animation: true,
                ariaLabelledBy: 'modal-title',
                ariaDescribedBy: 'modal-body',
                templateUrl: 'newStepItem.html',
                controller: 'StepDetailModalInstanceCtrl',
                controllerAs: '$ctrl',
                size: '',
                resolve: {
                    varList: function () {
                        return $ctrl.varList;
                    }
                }
            });

            modalInstance.result.then(function () {
            }, function () {
                $scope.getStepItemList();
                $log.info('Modal dismissed');
            });
        });

    };

    $scope.removeStepItem = function (workflowStepItemId) {
        var promise = WorkflowService.removeStepItem(workflowStepItemId);
        promise.then(function (response) {
            $scope.getStepItemList();
        });
    };

    $scope.updateStep = function () {
        $scope.showSuccessMessageStep = false;
        $scope.showErrorMessageStep = false;
        var promise = WorkflowService.updateStep($scope.step);
        promise.then(function (response) {
            $scope.stepForm.$setPristine();
            if (response.data === 1) {
                $scope.showSuccessMessageStep = true;
                $scope.getStepDetail();
            }
            else {
                $scope.showErrorMessageStep = true;
            }
        });
    };

    $scope.getStepItemList = function () {
        var promise = WorkflowService.getStepItemList($scope.ID);
        promise.then(function (response) {
            $scope.stepItemList = response.data;
        });
    };

    $scope.getStepDetail = function () {
        var promise = WorkflowService.getStepDetail($scope.ID);
        promise.then(function (response) {
            $scope.step = response.data;
            $scope.getStepItemList();
        });
    };

    $scope.init = function () {
        $scope.getStepDetail();
    };

    $scope.init();
});

app.controller('StepDetailModalInstanceCtrl', function ($scope, WorkflowService, $uibModalInstance, varList) {
    var $ctrl = this;
    $scope.showErrorMessage = false;
    $scope.stepId = varList[0];
    $scope.steps = varList[1];

    $scope.statusList = {};

    $scope.stepItemName;
    $scope.status;
    $scope.stepItemDescription;
    $scope.changeMasterStatus;
    $scope.pause;
    $scope.superUserOnly;
    $scope.defaultItem;
    $scope.redirect;
    $scope.redirectStepId;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };

    $ctrl.cancel = function () {
        $uibModalInstance.dismiss('cancel');
    };

    $scope.getStatusList = function () {
        var promise = WorkflowService.getStatusList();
        promise.then(function (response) {
            $scope.statusList = response.data;
        }); 
    };

    $scope.createStepItem = function () {
        $scope.showErrorMessage = false;
        var rsId = 0;
        if ($scope.redirect && $scope.redirectStepId !== null && $scope.redirectStepId !== undefined)
        {
            rsId = $scope.redirectStepId.ID;
        }
        if ($scope.stepItemDescription === undefined)
        {
            $scope.stepItemDescription = '';
        }
        var promise = WorkflowService.createNewStepItem($scope.stepId, $scope.stepItemName, $scope.stepItemDescription, $scope.status.Key, $scope.changeMasterStatus, $scope.pause, $scope.superUserOnly, $scope.defaultItem, $scope.redirect, rsId);
        promise.then(function (response) {
            if (response.data === 1) {
                $ctrl.cancel();
            }
            else {
                $scope.showErrorMessage = true;
            }
        });
    };

    $scope.init = function () {
        $scope.getStatusList();
    };

    $scope.init();
});;
app.controller('adminWorkflowStepItemDetailController', function ($scope, $log, $uibModal, WorkflowService) {

    $scope.workflowStepItemId;
    $scope.workflowStepItem;
    $scope.steps;
    $scope.selectedStep;
    $scope.statusList;
    $scope.selectedStatus;
    $scope.approverList;
    $scope.showErrorMessage = false;
    $scope.showSuccessMessage = false;

    var $ctrl = this;

    $scope.switchBool = function (value) {
        $scope[value] = !$scope[value];
    };


    $scope.createApprover = function () {
        $ctrl.varList = $scope.workflowStepItemId;
        var modalInstance = $uibModal.open({
            animation: true,
            ariaLabelledBy: 'modal-title',
            ariaDescribedBy: 'modal-body',
            templateUrl: '/app/views/modalViews/newApprover.html',
            controller: 'newApproverModalInstanceCtrl',
            controllerAs: '$ctrl',
            size: '',
            resolve: {
                varList: function () {
                    return $ctrl.varList;
                }
            }
        });

        modalInstance.result.then(function () {
        }, function () {
            $scope.getApproverList();
        });
    };

    $scope.updateStepItem = function () {
        $scope.showErrorMessage = false;
        $scope.showSuccessMessage = false;
        if ($scope.selectedStep !== null && $scope.selectedStep !== undefined) {
            $scope.workflowStepItem.RedirectStepId = $scope.selectedStep.ID;
        }
        if ($scope.selectedStatus !== null && $scope.selectedStatus !== undefined) {
            $scope.workflowStepItem.StatusType = $scope.selectedStatus.Key;
        }

        var promise = WorkflowService.updateStepItem($scope.workflowStepItem);
        promise.then(function (response) {
            $scope.stepItemForm.$setPristine();
            if (response.data === 1) {
                $scope.showSuccessMessage = true;
                $scope.getStepItemDetail();
            }
            else {
                $scope.showErrorMessage = true;
            }
        });
    };

    $scope.removeApprover = function (stepItemApproverId) {
        var promise = WorkflowService.removeApprover(stepItemApproverId);
        promise.then(function (response) {
            $scope.getApproverList();
        });
    };

    $scope.getApproverList = function () {
        var promise = WorkflowService.getApproverList($scope.workflowStepItemId);
        promise.then(function (response) {
            $scope.approverList = response.data;
        });
    };

    $scope.getStatusList = function () {
        var promise = WorkflowService.getStatusList();
        promise.then(function (response) {
            $scope.statusList = response.data;
            for (var i = 0; i < $scope.statusList.length; i ++)
            {
                if ($scope.statusList[i].Key === $scope.workflowStepItem.StatusType)
                {
                    $scope.selectedStatus = $scope.statusList[i];
                    break;
                }
            }
        });
    };

    $scope.getWorkflowSteps = function () {
        var promise = WorkflowService.getWorkflowSteps($scope.workflowStepItem.WorkflowStepItemId);
        promise.then(function (response) {
            $scope.steps = response.data;
            for (var i = 0; i < $scope.steps.length; i++) {
                if ($scope.steps[i].ID === $scope.workflowStepItem.RedirectStepId) {
                    $scope.selectedStep = $scope.steps[i];
                }
            }
        });
    };

    $scope.getStepItemDetail = function () {
        var promise = WorkflowService.getStepItemDetail($scope.workflowStepItemId);
        promise.then(function (response) {
            $scope.workflowStepItem = response.data;
            $scope.getWorkflowSteps();
            $scope.getStatusList();
            $scope.getApproverList();
        });
    };

    $scope.init = function () {
        $scope.getStepItemDetail();
    };

    $scope.init();
});;

//app.directive('icheck', function () {
//    return {
//        restrict: 'C',
//        link: function (scope, element, attrs) {
//            element.iCheck({
//                checkboxClass: 'icheckbox_square-blue',
//                radioClass: 'iradio_square-blue',
//                increaseArea: '20%' // optional
//            });
//        }
//    };
//});
app.directive('focusChildren', function () {
    return {
        link: function (scope, element, attrs) {
            var element = angular.element(element);
            var fin = false;

            function postpone() {
                window.setTimeout(function () {
                    if (!fin) {
                        element.removeClass('open');
                    }
                }, 0);
                fin = false;
            }

            element.focusout(function (event) {
                postpone();
            });

            element.focusin(function (event) {
                fin = true;
                if (!element.hasClass('open')) {
                    element.addClass('open');
                }
            });


        }
    }
});

app.directive('reflowColumns', ['$window', '$filter', function ($window, $filter) {
    return {
        scope: {
            xs: '@',
            sm: '@',
            md: '@',
            lg: '@',
            list: '=',
            filter: '@?',
            filterString: '=',
            start: '=?', // NOTE: Requires custom filter startFrom
            end: '=?',
            filteredListLength: '=?'
        },
        templateUrl: function (element, attrs) {
            return attrs.template;
        },
        link: function (scope, element, attrs) {
            if (angular.isUndefined(scope.filter)) scope.filter = 'filter';
            if (angular.isUndefined(scope.xs)) scope.xs = 1;
            if (angular.isUndefined(scope.sm)) scope.sm = scope.xs;
            if (angular.isUndefined(scope.md)) scope.md = scope.sm;
            if (angular.isUndefined(scope.lg)) scope.lg = scope.md;
            scope.filteredListLength = 0;

            function reflow(list, num) {
                var new_list = [];
                var len = list.length;
                for (var i = 0; i != len; ++i) {
                    if (i < num) {
                        new_list.push([]);
                    }
                    new_list[i % num].push(list[i]);
                }
                return new_list;
            };

            function check_size() {
                var width = $window.innerWidth;
                var num = 0;
                if (width > 1199) {
                    num = scope.lg;
                } else if (width > 991) {
                    num = scope.md;
                } else if (width > 767) {
                    num = scope.sm;
                } else {
                    num = scope.xs;
                }

                return parseInt(num);
            }

            function change() {
                if(angular.isUndefined(scope.paginated_list)){
                    scope.paginated_list = scope.formatted_list;
                }
                var num = check_size();
                if (scope.formatted_list.length != num) {
                    scope.formatted_list = reflow(scope.paginated_list, num);
                    setTimeout(function () {
                        // wait until initial digest cycle finishes before applying
                        scope.$apply();
                    });
                }
            };

            function update(){
                scope.formatted_list = [];
                scope.filtered_list = $filter(scope.filter)(scope.list,scope.filterString);
                scope.filteredListLength = scope.filtered_list.length;
                if(!angular.isUndefined(scope.start) && !angular.isUndefined(scope.end)){
                    scope.paginated_list = $filter('limitTo')($filter('startFrom')(scope.filtered_list,scope.start), scope.end);
                } else{ 
                    scope.paginated_list = scope.filtered_list;
                }
                change();
            };

            angular.element($window).on('resize', change);
            scope.$watchGroup(['list','filterString', 'start', 'end'], function(){
               if(!angular.isUndefined(scope.list)){
                    update();
                }
            });
        }
    }
}]);;
app.directive('simpleModal', function ($uibModal) {
    return {
        restrict: "EA",
        scope: {
            modalHtml: "@",
            title: "@"
        },
        link: function (scope, element, attrs, ngModel) {

            

            /*modalInstance.result.then(function () {
            }, function () {
                $scope.getAllEvents();
            });*/

            scope.openModal = function () {
                scope.modalInstance = $uibModal.open({
                    animation: true,
                    ariaLabelledBy: 'modal-title',
                    ariaDescribedBy: 'modal-body',
                    templateUrl: '/app/views/modalViews/simpleModal.html?c=' + (new Date()).getTime(),
                    scope: scope,
                    size: ''                    
                }).result.then(function(result){}, function(){})
            }
            scope.close = function () {
                scope.modalInstance.dismiss('cancel');
            }

            //scope.init();
        },
        template: '<i ng-if="modalHtml.length>0" ng-click="openModal()" class="fa fa-eye" aria-hidden="true"></i>'
    };
});;
app.directive('socialMedia', function (OrgSocialMediaService) {
    return {
        restrict: "EA",
        scope: {
            medias: "=",
            disabled: "=",
            listOnly: "=",
            updateOnClick: "=",
            organizationId: "="
        },
        link: function (scope, element, attrs, ngModel) {

            scope.socialPlatforms = [];

            scope.$on('refresh', function (event, args) {
                scope.username = "";
                scope.selectedSocialMedia = null;
            });

            //watchers
            scope.$watch('username', function (newValue, oldValue, s) {
               // scope.SocialMediaUsername = +newValue;
                //scope.validUrl = scope.checkValidUrl(newValue);
                if (newValue) {
                    scope.validUrl = newValue.length > 0 ? true : false;
                }
                else {
                    scope.validUrl = false;
                }

            });
            scope.$watchCollection('medias', function (newValue, oldValue, s) {
                //if()
                scope.addVisibilityToSocialMedia();

            });



            //methods

            scope.checkValidUrl = function (url) {
                var re = new RegExp("(?:(?:http|https):\/\/)?(?:www.)?[^\w]+.com\/[^\w]+\/?");
                var m = re.exec(url);
                if (m == null) {
                    return false;
                }
                else {

                    return true;
                }
            }

            scope.update = function () {
                OrgSocialMediaService.updateAvailableSocialMedia(scope.organizationId, scope.medias).then(function (resp) {
                    
                });
            }

            scope.addSocialMedia = function () {
                if (scope.selectedSocialMedia == null) return;
                //scope.hideSocialMedia(scope.selectedSocialMedia.SocialMediaId);
                scope.medias.push({
                    SocialMediaId: scope.selectedSocialMedia.SocialMediaId,
                    SocialMediaUsername: scope.username,
                    SocialMediaName: scope.selectedSocialMedia.SocialMediaName
                });
                scope.username = "";
                scope.addVisibilityToSocialMedia();
                if (scope.updateOnClick) {
                    scope.update();
                }
            }

            scope.removeSocialMedia = function (socialMedia) {
                scope.removeFromOrgSocialMedia(socialMedia.SocialMediaId);
                if (scope.updateOnClick) {
                    scope.update();
                }
                //scope.showSocialMedia(socialMedia.SocialMediaId);
            }


            scope.removeFromOrgSocialMedia = function (socialMediaId) {
                scope.medias = scope.medias.filter(function (m) {
                    if (m.SocialMediaId != socialMediaId) {
                        return true;
                    }
                });
            }

            scope.addVisibilityToSocialMedia = function () {

                scope.socialPlatforms.map(function (m) {
                    m.hide = false;
                    return m;
                });

                var i = 0;
                var orgMedias = scope.medias;
                if (scope.medias != null) {
                    for (i = 0; i < orgMedias.length; i++) {
                        var mediaId = orgMedias[i].SocialMediaId;
                        scope.hideSocialMedia(mediaId);
                    }
                }
            }
            scope.hideSocialMedia = function (socialMediaId) {
                scope.socialPlatforms.map(function (m) {
                    if (m.SocialMediaId == socialMediaId) {
                        m.hide = true;
                    }
                    return m;
                });
            }
            scope.showSocialMedia = function (socialMediaId) {
                scope.socialPlatforms.map(function (m) {
                    if (m.SocialMediaId == socialMediaId) {
                        m.hide = false;
                    }
                    return m;
                });
            }

            scope.getSocialMediaObj = function (mediaId) {

                if (scope.socialPlatforms) {
                    var len = scope.socialPlatforms.length;
                    for (var i = 0; i < len; i++) {
                        var socialMedia = scope.socialPlatforms[i];
                        if (mediaId == socialMedia.SocialMediaId) {
                            return socialMedia;
                        }
                    }
                }
            }


            scope.getSocialMediaPlatforms = function () {
                OrgSocialMediaService.getSocialMediaPlatforms().then(function (response) {
                    scope.socialPlatforms = response.data;
                    scope.socialPlatforms.map(function (m) {
                        m.hide = false;
                        switch (m.SocialMediaId) {
                            case 1: m.className = "fa-twitter-square";
                                   
                                break;
                            case 2: m.className = "fa-facebook-official";
                               // m.URLPrefix = "https://www.facebook.com/";
                                break;
                            case 3:
                                m.className = "fa-instagram"
                               // m.URLPrefix = "https://www.instagram.com/";
                                break;
                        }
                        return m;

                    });
                    scope.addVisibilityToSocialMedia();
                });
            }

            scope.getSocialMedia = function () {
                if (scope.organizationId != null) {
                    OrgSocialMediaService.getAvailableSocialMedia(scope.organizationId).then(function (response) {
                        scope.medias = response.data;
                        scope.getSocialMediaPlatforms();
                    });
                }
                else {
                    scope.getSocialMediaPlatforms();
                }
            }
            //init 
            scope.init = function () {
                if (scope.updateOnClick) {
                    scope.getSocialMedia()
                }
                else {
                    scope.getSocialMediaPlatforms();
                }

            }


            scope.init();
        },
        templateUrl: '/app/directives/templates/SocialMediaSelector.html'
    };
});;
/**
 * @license Angular UI Tree v2.22.5
 * (c) 2010-2017. https://github.com/angular-ui-tree/angular-ui-tree
 * License: MIT
 */
!function(){"use strict";angular.module("ui.tree",[]).constant("treeConfig",{treeClass:"angular-ui-tree",emptyTreeClass:"angular-ui-tree-empty",hiddenClass:"angular-ui-tree-hidden",nodesClass:"angular-ui-tree-nodes",nodeClass:"angular-ui-tree-node",handleClass:"angular-ui-tree-handle",placeholderClass:"angular-ui-tree-placeholder",dragClass:"angular-ui-tree-drag",dragThreshold:3,defaultCollapsed:!1,appendChildOnHover:!0})}(),function(){"use strict";angular.module("ui.tree").controller("TreeHandleController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$nodeScope=null,e.$type="uiTreeHandle"}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodeController",["$scope","$element",function(e,n){function t(e){if(!e)return 0;var n,o,l,r=0,a=e.childNodes();if(!a||0===a.length)return 0;for(l=a.length-1;l>=0;l--)n=a[l],o=1+t(n),r=Math.max(r,o);return r}this.scope=e,e.$element=n,e.$modelValue=null,e.$parentNodeScope=null,e.$childNodesScope=null,e.$parentNodesScope=null,e.$treeScope=null,e.$handleScope=null,e.$type="uiTreeNode",e.$$allowNodeDrop=!1,e.collapsed=!1,e.expandOnHover=!1,e.init=function(t){var o=t[0];e.$treeScope=t[1]?t[1].scope:null,e.$parentNodeScope=o.scope.$nodeScope,e.$modelValue=o.scope.$modelValue[e.$index],e.$parentNodesScope=o.scope,o.scope.initSubNode(e),n.on("$destroy",function(){o.scope.destroySubNode(e)})},e.index=function(){return e.$parentNodesScope.$modelValue.indexOf(e.$modelValue)},e.dragEnabled=function(){return!(e.$treeScope&&!e.$treeScope.dragEnabled)},e.isSibling=function(n){return e.$parentNodesScope==n.$parentNodesScope},e.isChild=function(n){var t=e.childNodes();return t&&t.indexOf(n)>-1},e.prev=function(){var n=e.index();return n>0?e.siblings()[n-1]:null},e.siblings=function(){return e.$parentNodesScope.childNodes()},e.childNodesCount=function(){return e.childNodes()?e.childNodes().length:0},e.hasChild=function(){return e.childNodesCount()>0},e.childNodes=function(){return e.$childNodesScope&&e.$childNodesScope.$modelValue?e.$childNodesScope.childNodes():null},e.accept=function(n,t){return e.$childNodesScope&&e.$childNodesScope.$modelValue&&e.$childNodesScope.accept(n,t)},e.remove=function(){return e.$parentNodesScope.removeNode(e)},e.toggle=function(){e.collapsed=!e.collapsed,e.$treeScope.$callbacks.toggle(e.collapsed,e)},e.collapse=function(){e.collapsed=!0},e.expand=function(){e.collapsed=!1},e.depth=function(){var n=e.$parentNodeScope;return n?n.depth()+1:1},e.maxSubDepth=function(){return e.$childNodesScope?t(e.$childNodesScope):0}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodesController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$modelValue=null,e.$nodeScope=null,e.$treeScope=null,e.$type="uiTreeNodes",e.$nodesMap={},e.nodropEnabled=!1,e.maxDepth=0,e.cloneEnabled=!1,e.initSubNode=function(n){return n.$modelValue?void(e.$nodesMap[n.$modelValue.$$hashKey]=n):null},e.destroySubNode=function(n){return n.$modelValue?void(e.$nodesMap[n.$modelValue.$$hashKey]=null):null},e.accept=function(n,t){return e.$treeScope.$callbacks.accept(n,e,t)},e.beforeDrag=function(n){return e.$treeScope.$callbacks.beforeDrag(n)},e.isParent=function(n){return n.$parentNodesScope==e},e.hasChild=function(){return e.$modelValue.length>0},e.safeApply=function(e){var n=this.$root.$$phase;"$apply"==n||"$digest"==n?e&&"function"==typeof e&&e():this.$apply(e)},e.removeNode=function(n){var t=e.$modelValue.indexOf(n.$modelValue);return t>-1?(e.safeApply(function(){e.$modelValue.splice(t,1)[0]}),e.$treeScope.$callbacks.removed(n)):null},e.insertNode=function(n,t){e.safeApply(function(){e.$modelValue.splice(n,0,t)})},e.childNodes=function(){var n,t=[];if(e.$modelValue)for(n=0;n<e.$modelValue.length;n++)t.push(e.$nodesMap[e.$modelValue[n].$$hashKey]);return t},e.depth=function(){return e.$nodeScope?e.$nodeScope.depth():0},e.outOfDepth=function(n){var t=e.maxDepth||e.$treeScope.maxDepth;return t>0&&e.depth()+n.maxSubDepth()+1>t}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$nodesScope=null,e.$type="uiTree",e.$emptyElm=null,e.$callbacks=null,e.dragEnabled=!0,e.emptyPlaceholderEnabled=!0,e.maxDepth=0,e.dragDelay=0,e.cloneEnabled=!1,e.nodropEnabled=!1,e.isEmpty=function(){return e.$nodesScope&&e.$nodesScope.$modelValue&&0===e.$nodesScope.$modelValue.length},e.place=function(n){e.$nodesScope.$element.append(n),e.$emptyElm.remove()},this.resetEmptyElement=function(){e.$nodesScope.$modelValue&&0!==e.$nodesScope.$modelValue.length||!e.emptyPlaceholderEnabled?e.$emptyElm.remove():n.append(e.$emptyElm)},e.resetEmptyElement=this.resetEmptyElement}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTree",["treeConfig","$window",function(e,n){return{restrict:"A",scope:!0,controller:"TreeController",link:function(t,o,l,r){var a,i,d,c={accept:null,beforeDrag:null},s={};angular.extend(s,e),s.treeClass&&o.addClass(s.treeClass),"table"===o.prop("tagName").toLowerCase()?(t.$emptyElm=angular.element(n.document.createElement("tr")),i=o.find("tr"),d=i.length>0?angular.element(i).children().length:1e6,a=angular.element(n.document.createElement("td")).attr("colspan",d),t.$emptyElm.append(a)):t.$emptyElm=angular.element(n.document.createElement("div")),s.emptyTreeClass&&t.$emptyElm.addClass(s.emptyTreeClass),t.$watch("$nodesScope.$modelValue.length",function(e){angular.isNumber(e)&&r.resetEmptyElement()},!0),t.$watch(l.dragEnabled,function(e){"boolean"==typeof e&&(t.dragEnabled=e)}),t.$watch(l.emptyPlaceholderEnabled,function(e){"boolean"==typeof e&&(t.emptyPlaceholderEnabled=e,r.resetEmptyElement())}),t.$watch(l.nodropEnabled,function(e){"boolean"==typeof e&&(t.nodropEnabled=e)}),t.$watch(l.cloneEnabled,function(e){"boolean"==typeof e&&(t.cloneEnabled=e)}),t.$watch(l.maxDepth,function(e){"number"==typeof e&&(t.maxDepth=e)}),t.$watch(l.dragDelay,function(e){"number"==typeof e&&(t.dragDelay=e)}),c.accept=function(e,n,t){return!(n.nodropEnabled||n.$treeScope.nodropEnabled||n.outOfDepth(e))},c.beforeDrag=function(e){return!0},c.expandTimeoutStart=function(){},c.expandTimeoutCancel=function(){},c.expandTimeoutEnd=function(){},c.removed=function(e){},c.dropped=function(e){},c.dragStart=function(e){},c.dragMove=function(e){},c.dragStop=function(e){},c.beforeDrop=function(e){},c.toggle=function(e,n){},t.$watch(l.uiTree,function(e,n){angular.forEach(e,function(e,n){c[n]&&"function"==typeof e&&(c[n]=e)}),t.$callbacks=c},!0)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeHandle",["treeConfig",function(e){return{require:"^uiTreeNode",restrict:"A",scope:!0,controller:"TreeHandleController",link:function(n,t,o,l){var r={};angular.extend(r,e),r.handleClass&&t.addClass(r.handleClass),n!=l.scope&&(n.$nodeScope=l.scope,l.scope.$handleScope=n)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeNode",["treeConfig","UiTreeHelper","$window","$document","$timeout","$q",function(e,n,t,o,l,r){return{require:["^uiTreeNodes","^uiTree"],restrict:"A",controller:"TreeNodeController",link:function(a,i,d,c){var s,u,p,f,m,h,$,g,b,v,N,S,y,x,E,T,C,w,D,H,O,Y,A,X,V,k,M,I={},P="ontouchstart"in window,L=null,W=document.body,q=document.documentElement;angular.extend(I,e),I.nodeClass&&i.addClass(I.nodeClass),a.init(c),a.collapsed=!!n.getNodeAttribute(a,"collapsed")||e.defaultCollapsed,a.expandOnHover=!!n.getNodeAttribute(a,"expandOnHover"),a.scrollContainer=n.getNodeAttribute(a,"scrollContainer")||d.scrollContainer||null,a.sourceOnly=a.nodropEnabled||a.$treeScope.nodropEnabled,a.$watch(d.collapsed,function(e){"boolean"==typeof e&&(a.collapsed=e)}),a.$watch("collapsed",function(e){n.setNodeAttribute(a,"collapsed",e),d.$set("collapsed",e)}),a.$watch(d.expandOnHover,function(e){"boolean"!=typeof e&&"number"!=typeof e||(a.expandOnHover=e)}),a.$watch("expandOnHover",function(e){n.setNodeAttribute(a,"expandOnHover",e),d.$set("expandOnHover",e)}),d.$observe("scrollContainer",function(e){"string"==typeof e&&(a.scrollContainer=e)}),a.$watch("scrollContainer",function(e){n.setNodeAttribute(a,"scrollContainer",e),d.$set("scrollContainer",e),$=document.querySelector(e)}),a.$on("angular-ui-tree:collapse-all",function(){a.collapsed=!0}),a.$on("angular-ui-tree:expand-all",function(){a.collapsed=!1}),S=function(e){if((P||2!==e.button&&3!==e.which)&&!(e.uiTreeDragging||e.originalEvent&&e.originalEvent.uiTreeDragging)){var l,r,d,c,$,g,S,y,x,E=angular.element(e.target);if(l=n.treeNodeHandlerContainerOfElement(E),l&&(E=angular.element(l)),r=i.clone(),y=n.elementIsTreeNode(E),x=n.elementIsTreeNodeHandle(E),(y||x)&&!(y&&n.elementContainsTreeNodeHandler(E)||(d=E.prop("tagName").toLowerCase(),"input"==d||"textarea"==d||"button"==d||"select"==d))){for(V=angular.element(e.target),k=V[0].attributes["ui-tree"];V&&V[0]&&V[0]!==i&&!k;){if(V[0].attributes&&(k=V[0].attributes["ui-tree"]),n.nodrag(V))return;V=V.parent()}a.beforeDrag(a)&&(e.uiTreeDragging=!0,e.originalEvent&&(e.originalEvent.uiTreeDragging=!0),e.preventDefault(),$=n.eventObj(e),s=!0,u=n.dragInfo(a),M=u.source.$treeScope.$id,c=i.prop("tagName"),"tr"===c.toLowerCase()?(f=angular.element(t.document.createElement(c)),g=angular.element(t.document.createElement("td")).addClass(I.placeholderClass).attr("colspan",i[0].children.length),f.append(g)):f=angular.element(t.document.createElement(c)).addClass(I.placeholderClass),m=angular.element(t.document.createElement(c)),I.hiddenClass&&m.addClass(I.hiddenClass),p=n.positionStarted($,i),f.css("height",i.prop("offsetHeight")+"px"),h=angular.element(t.document.createElement(a.$parentNodesScope.$element.prop("tagName"))).addClass(a.$parentNodesScope.$element.attr("class")).addClass(I.dragClass),h.css("width",n.width(i)+"px"),h.css("z-index",9999),S=(i[0].querySelector(".angular-ui-tree-handle")||i[0]).currentStyle,S&&(document.body.setAttribute("ui-tree-cursor",o.find("body").css("cursor")||""),o.find("body").css({cursor:S.cursor+"!important"})),a.sourceOnly&&f.css("display","none"),i.after(f),i.after(m),u.isClone()&&a.sourceOnly?h.append(r):h.append(i),o.find("body").append(h),h.css({left:$.pageX-p.offsetX+"px",top:$.pageY-p.offsetY+"px"}),b={placeholder:f,dragging:h},O(),a.$apply(function(){a.$treeScope.$callbacks.dragStart(u.eventArgs(b,p))}),v=Math.max(W.scrollHeight,W.offsetHeight,q.clientHeight,q.scrollHeight,q.offsetHeight),N=Math.max(W.scrollWidth,W.offsetWidth,q.clientWidth,q.scrollWidth,q.offsetWidth))}}},y=function(e){var o,r,i,d,c,m,S,y,x,E,T,C,w,D,H,O,Y,A,V,k,P,W,q,F=n.eventObj(e);if(h){if(e.preventDefault(),t.getSelection?t.getSelection().removeAllRanges():t.document.selection&&t.document.selection.empty(),i=F.pageX-p.offsetX,d=F.pageY-p.offsetY,i<0&&(i=0),d<0&&(d=0),d+10>v&&(d=v-10),i+10>N&&(i=N-10),h.css({left:i+"px",top:d+"px"}),$?(S=$.getBoundingClientRect(),c=$.scrollTop,m=c+$.clientHeight,S.bottom<F.clientY&&m<$.scrollHeight&&(H=Math.min($.scrollHeight-m,10),$.scrollTop+=H),S.top>F.clientY&&c>0&&(O=Math.min(c,10),$.scrollTop-=O)):(c=window.pageYOffset||t.document.documentElement.scrollTop,m=c+(window.innerHeight||t.document.clientHeight||t.document.clientHeight),m<F.pageY&&m<v&&(H=Math.min(v-m,10),window.scrollBy(0,H)),c>F.pageY&&(O=Math.min(c,10),window.scrollBy(0,-O))),n.positionMoved(e,p,s),s)return void(s=!1);if(x=F.pageX-(t.pageXOffset||t.document.body.scrollLeft||t.document.documentElement.scrollLeft)-(t.document.documentElement.clientLeft||0),E=F.pageY-(t.pageYOffset||t.document.body.scrollTop||t.document.documentElement.scrollTop)-(t.document.documentElement.clientTop||0),angular.isFunction(h.hide)?h.hide():(T=h[0].style.display,h[0].style.display="none"),t.document.elementFromPoint(x,E),w=angular.element(t.document.elementFromPoint(x,E)),X=n.treeNodeHandlerContainerOfElement(w),X&&(w=angular.element(X)),angular.isFunction(h.show)?h.show():h[0].style.display=T,n.elementIsTree(w)?C=w.controller("uiTree").scope:n.elementIsTreeNodeHandle(w)?C=w.controller("uiTreeHandle").scope:n.elementIsTreeNode(w)?C=w.controller("uiTreeNode").scope:n.elementIsTreeNodes(w)?C=w.controller("uiTreeNodes").scope:n.elementIsPlaceholder(w)?C=w.controller("uiTreeNodes").scope:w.controller("uiTreeNode")&&(C=w.controller("uiTreeNode").scope),V=C&&C.$treeScope&&C.$treeScope.$id&&C.$treeScope.$id===M,V&&p.dirAx)p.distX>0&&(o=u.prev(),o&&!o.collapsed&&o.accept(a,o.childNodesCount())&&(o.$childNodesScope.$element.append(f),u.moveTo(o.$childNodesScope,o.childNodes(),o.childNodesCount()))),p.distX<0&&(r=u.next(),r||(y=u.parentNode(),y&&y.$parentNodesScope.accept(a,y.index()+1)&&(y.$element.after(f),u.moveTo(y.$parentNodesScope,y.siblings(),y.index()+1))));else{if(D=!1,!C)return;if(!C.$treeScope||C.$parent.nodropEnabled||C.$treeScope.nodropEnabled||f.css("display",""),"uiTree"===C.$type&&C.dragEnabled&&(D=C.isEmpty()),"uiTreeHandle"===C.$type&&(C=C.$nodeScope),"uiTreeNode"!==C.$type&&!D)return void(I.appendChildOnHover&&(r=u.next(),!r&&g&&(y=u.parentNode(),y.$element.after(f),u.moveTo(y.$parentNodesScope,y.siblings(),y.index()+1),g=!1)));L&&f.parent()[0]!=L.$element[0]&&(L.resetEmptyElement(),L=null),D?(L=C,C.$nodesScope.accept(a,0)&&(C.place(f),u.moveTo(C.$nodesScope,C.$nodesScope.childNodes(),0))):C.dragEnabled()&&(angular.isDefined(a.expandTimeoutOn)&&a.expandTimeoutOn!==C.id&&(l.cancel(a.expandTimeout),delete a.expandTimeout,delete a.expandTimeoutOn,a.$callbacks.expandTimeoutCancel()),C.collapsed&&(a.expandOnHover===!0||angular.isNumber(a.expandOnHover)&&0===a.expandOnHover?(C.collapsed=!1,C.$treeScope.$callbacks.toggle(!1,C)):a.expandOnHover!==!1&&angular.isNumber(a.expandOnHover)&&a.expandOnHover>0&&angular.isUndefined(a.expandTimeoutOn)&&(a.expandTimeoutOn=C.$id,a.$callbacks.expandTimeoutStart(),a.expandTimeout=l(function(){a.$callbacks.expandTimeoutEnd(),C.collapsed=!1,C.$treeScope.$callbacks.toggle(!1,C)},a.expandOnHover))),w=C.$element,Y=n.offset(w),P=n.height(w),W=C.$childNodesScope?C.$childNodesScope.$element:null,q=W?n.height(W):0,P-=q,k=I.appendChildOnHover?.25*P:n.height(w)/2,A=F.pageY<Y.top+k,C.$parentNodesScope.accept(a,C.index())?A?(w[0].parentNode.insertBefore(f[0],w[0]),u.moveTo(C.$parentNodesScope,C.siblings(),C.index())):I.appendChildOnHover&&C.accept(a,C.childNodesCount())?(C.$childNodesScope.$element.prepend(f),u.moveTo(C.$childNodesScope,C.childNodes(),0),g=!0):(w.after(f),u.moveTo(C.$parentNodesScope,C.siblings(),C.index()+1)):!A&&C.accept(a,C.childNodesCount())&&(C.$childNodesScope.$element.append(f),u.moveTo(C.$childNodesScope,C.childNodes(),C.childNodesCount())))}a.$apply(function(){a.$treeScope.$callbacks.dragMove(u.eventArgs(b,p))})}},x=function(e){var n=u.eventArgs(b,p);e.preventDefault(),Y(),l.cancel(a.expandTimeout),a.$treeScope.$apply(function(){r.when(a.$treeScope.$callbacks.beforeDrop(n)).then(function(e){e!==!1&&a.$$allowNodeDrop?(u.apply(),a.$treeScope.$callbacks.dropped(n)):H()}).catch(function(){H()}).finally(function(){m.replaceWith(a.$element),f.remove(),h&&(h.remove(),h=null),a.$treeScope.$callbacks.dragStop(n),a.$$allowNodeDrop=!1,u=null;var e=document.body.getAttribute("ui-tree-cursor");null!==e&&(o.find("body").css({cursor:e}),document.body.removeAttribute("ui-tree-cursor"))})})},E=function(e){a.dragEnabled()&&S(e)},T=function(e){y(e)},C=function(e){a.$$allowNodeDrop=!0,x(e)},w=function(e){x(e)},D=function(){var e;return{exec:function(n,t){t||(t=0),this.cancel(),e=l(n,t)},cancel:function(){l.cancel(e)}}}(),A=function(e){27===e.keyCode&&C(e)},H=function(){i.bind("touchstart mousedown",function(e){a.dragDelay>0?D.exec(function(){E(e)},a.dragDelay):E(e)}),i.bind("touchend touchcancel mouseup",function(){a.dragDelay>0&&D.cancel()})},H(),O=function(){angular.element(o).bind("touchend",C),angular.element(o).bind("touchcancel",C),angular.element(o).bind("touchmove",T),angular.element(o).bind("mouseup",C),angular.element(o).bind("mousemove",T),angular.element(o).bind("mouseleave",w),angular.element(o).bind("keydown",A)},Y=function(){angular.element(o).unbind("touchend",C),angular.element(o).unbind("touchcancel",C),angular.element(o).unbind("touchmove",T),angular.element(o).unbind("mouseup",C),angular.element(o).unbind("mousemove",T),angular.element(o).unbind("mouseleave",w),angular.element(o).unbind("keydown",A)}}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeNodes",["treeConfig","$window",function(e){return{require:["ngModel","?^uiTreeNode","^uiTree"],restrict:"A",scope:!0,controller:"TreeNodesController",link:function(n,t,o,l){var r={},a=l[0],i=l[1],d=l[2];angular.extend(r,e),r.nodesClass&&t.addClass(r.nodesClass),i?(i.scope.$childNodesScope=n,n.$nodeScope=i.scope):d.scope.$nodesScope=n,n.$treeScope=d.scope,a&&(a.$render=function(){n.$modelValue=a.$modelValue}),n.$watch(function(){return o.maxDepth},function(e){"number"==typeof e&&(n.maxDepth=e)}),n.$watch(function(){return o.nodropEnabled},function(e){"undefined"!=typeof e&&(n.nodropEnabled=!0)},!0)}}}])}(),function(){"use strict";function e(e,n){if(void 0===n)return null;for(var t=n.parentNode,o=1,l="function"==typeof t.setAttribute&&t.hasAttribute(e)?t:null;t&&"function"==typeof t.setAttribute&&!t.hasAttribute(e);){if(t=t.parentNode,l=t,t===document.documentElement){l=null;break}o++}return l}angular.module("ui.tree").factory("UiTreeHelper",["$document","$window","treeConfig",function(n,t,o){return{nodesData:{},setNodeAttribute:function(e,n,t){if(!e.$modelValue)return null;var o=this.nodesData[e.$modelValue.$$hashKey];o||(o={},this.nodesData[e.$modelValue.$$hashKey]=o),o[n]=t},getNodeAttribute:function(e,n){if(!e.$modelValue)return null;var t=this.nodesData[e.$modelValue.$$hashKey];return t?t[n]:null},nodrag:function(e){return"undefined"!=typeof e.attr("data-nodrag")&&"false"!==e.attr("data-nodrag")},eventObj:function(e){var n=e;return void 0!==e.targetTouches?n=e.targetTouches.item(0):void 0!==e.originalEvent&&void 0!==e.originalEvent.targetTouches&&(n=e.originalEvent.targetTouches.item(0)),n},dragInfo:function(e){return{source:e,sourceInfo:{cloneModel:e.$treeScope.cloneEnabled===!0?angular.copy(e.$modelValue):void 0,nodeScope:e,index:e.index(),nodesScope:e.$parentNodesScope},index:e.index(),siblings:e.siblings().slice(0),parent:e.$parentNodesScope,resetParent:function(){this.parent=e.$parentNodesScope},moveTo:function(e,n,t){this.parent=e,this.siblings=n.slice(0);var o=this.siblings.indexOf(this.source);o>-1&&(this.siblings.splice(o,1),this.source.index()<t&&t--),this.siblings.splice(t,0,this.source),this.index=t},parentNode:function(){return this.parent.$nodeScope},prev:function(){return this.index>0?this.siblings[this.index-1]:null},next:function(){return this.index<this.siblings.length-1?this.siblings[this.index+1]:null},isClone:function(){return this.source.$treeScope.cloneEnabled===!0},clonedNode:function(e){return angular.copy(e)},isDirty:function(){return this.source.$parentNodesScope!=this.parent||this.source.index()!=this.index},isForeign:function(){return this.source.$treeScope!==this.parent.$treeScope},eventArgs:function(e,n){return{source:this.sourceInfo,dest:{index:this.index,nodesScope:this.parent},elements:e,pos:n}},apply:function(){var e=this.source.$modelValue;this.parent.nodropEnabled||this.parent.$treeScope.nodropEnabled||this.isDirty()&&(this.isClone()&&this.isForeign()?this.parent.insertNode(this.index,this.sourceInfo.cloneModel):(this.source.remove(),this.parent.insertNode(this.index,e)))}}},height:function(e){return e.prop("scrollHeight")},width:function(e){return e.prop("scrollWidth")},offset:function(e){var o=e[0].getBoundingClientRect();return{width:e.prop("offsetWidth"),height:e.prop("offsetHeight"),top:o.top+(t.pageYOffset||n[0].body.scrollTop||n[0].documentElement.scrollTop),left:o.left+(t.pageXOffset||n[0].body.scrollLeft||n[0].documentElement.scrollLeft)}},positionStarted:function(e,n){var t={},o=e.pageX,l=e.pageY;return e.originalEvent&&e.originalEvent.touches&&e.originalEvent.touches.length>0&&(o=e.originalEvent.touches[0].pageX,l=e.originalEvent.touches[0].pageY),t.offsetX=o-this.offset(n).left,t.offsetY=l-this.offset(n).top,t.startX=t.lastX=o,t.startY=t.lastY=l,t.nowX=t.nowY=t.distX=t.distY=t.dirAx=0,t.dirX=t.dirY=t.lastDirX=t.lastDirY=t.distAxX=t.distAxY=0,t},positionMoved:function(e,n,t){var o,l=e.pageX,r=e.pageY;return e.originalEvent&&e.originalEvent.touches&&e.originalEvent.touches.length>0&&(l=e.originalEvent.touches[0].pageX,r=e.originalEvent.touches[0].pageY),n.lastX=n.nowX,n.lastY=n.nowY,n.nowX=l,n.nowY=r,n.distX=n.nowX-n.lastX,n.distY=n.nowY-n.lastY,n.lastDirX=n.dirX,n.lastDirY=n.dirY,n.dirX=0===n.distX?0:n.distX>0?1:-1,n.dirY=0===n.distY?0:n.distY>0?1:-1,o=Math.abs(n.distX)>Math.abs(n.distY)?1:0,t?(n.dirAx=o,void(n.moving=!0)):(n.dirAx!==o?(n.distAxX=0,n.distAxY=0):(n.distAxX+=Math.abs(n.distX),0!==n.dirX&&n.dirX!==n.lastDirX&&(n.distAxX=0),n.distAxY+=Math.abs(n.distY),0!==n.dirY&&n.dirY!==n.lastDirY&&(n.distAxY=0)),void(n.dirAx=o))},elementIsTreeNode:function(e){return"undefined"!=typeof e.attr("ui-tree-node")},elementIsTreeNodeHandle:function(e){return"undefined"!=typeof e.attr("ui-tree-handle")},elementIsTree:function(e){return"undefined"!=typeof e.attr("ui-tree")},elementIsTreeNodes:function(e){return"undefined"!=typeof e.attr("ui-tree-nodes")},elementIsPlaceholder:function(e){return e.hasClass(o.placeholderClass)},elementContainsTreeNodeHandler:function(e){return e[0].querySelectorAll("[ui-tree-handle]").length>=1},treeNodeHandlerContainerOfElement:function(n){return e("ui-tree-handle",n[0])}}}])}();;
