homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.account', {
                url: "/account",
                abstract: true,
                ncyBreadcrumb: {
                    label: 'Account'
                }
            })
            .state('base.account.changePassword', {
                url: "/changepassword",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/user/changePassword/changePassword.html",
                        controller: 'userChangePasswordCtrl'
                    }
                },
                ncyBreadcrumb: {
                    label: 'Change Password'
                }
            });
    }
]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.activitylogs', {
                url: "/activitylogs",
                views: {
                    //'@': {
                    //    templateUrl: "/app/modules/menu/menu.html",
                    //    controller: 'MenuCtrl'
                    //},
                    'content@base': {
                        templateUrl: "/app/modules/admin/activityLog/log.html",
                        controller: 'log',
                        resolve: {
                            gridData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getGridEntity('/api/ActivityLog/SearchAllLogs');
                            }],
                            users: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/activityLog/users', {}).then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.activitylogs.allow']
                },
                ncyBreadcrumb: {
                    label: 'Activity Logs'
                }
            });
    }
]);
homeModule.controller('log',
['$scope', 'gridData', '$state', 'users',
function ($scope, gridData, $state, users) {

    $scope.currentState = $state.current.name;
    var newUsers = [{ id: null, displayName: "All Users" }];
    angular.forEach(users, function (u) {
        newUsers.push(u);
    });
    var events = [
        { id: null, name: "All Events" },
        { id: 1, name: "Create" },
        { id: 2, name: "Update" },
        { id: 3, name: "Delete" },
        { id: 4, name: "Login" },
        { id: 5, name: "Other" }
    ];

    $scope.gridOptions = {
        itemType: 'Activities',
        items: gridData,
        gridName: 'allActivities',
        fetchUrl: '/api/ActivityLog/SearchAllLogs',
        exportUrl: '/exportGrid/getActivityLogs/',
        initSortString: 'createddate desc',
        enableSorting: true,
        enableSearching: true,
        enableDateRange: true,
        enableExport: true,
        enablePaging: true,
        columnDefs: [
            { field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
            { field: 'createdDate', displayName: 'Time', customSortField: 'createdDate', cellFilter: 'date:\'HH:mm\'', width: "70px" },
            { field: 'user', displayName: 'User', customSortField: 'user', width: "100px" },
            { field: 'userFullName', displayName: 'Name', customSortField: 'userFullName', width: "150px", visibleAt: '979' },
            { field: 'customerId', displayName: 'Customer', customSortField: 'customerId', width: "150px", visibleAt: '979' },
            { field: 'details', displayName: 'Details', customSortField: 'details', sortable: false },
            // { field: 'url', displayName: 'Url', customSortField: 'Url', cellTemplate: "<div class=\"ngCellText\"><a href=\"#{{row.entity.url}}\" ng-hide=\"row.entity.url==''\">{{row.entity.url}}</a></div>" },
            { field: 'ipAddress', displayName: 'IP Address', customSortField: 'ipAddress', visibleAt: '1024', width: "100px" },
            { field: 'os', displayName: 'OS', customSortField: 'os', visibleAt: '1024', width: "50px" },
            { field: 'browser', displayName: 'Browser', customSortField: 'browser', visibleAt: '1024', width: "50px" },
            { field: 'browserVersion', displayName: 'Browser Version', customSortField: 'browserVersion', visibleAt: '1024', width: "50px" }
        ],
        enableCustomFields: true,
        customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.u" class="form-control" ng-options="d.id as d.displayName for d in dg.fetchOptions.extraData.users"></select>' +
            '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.ev" class="form-control" ng-options="d.id as d.name for d in dg.fetchOptions.extraData.events"></select>',
        extraParams: {
            u: null,
            ev: null
        },
        extraData: {
            users: newUsers,
            events: events
        }
    };
}
]);
(function () {
    'use strict';
    homeModule.controller('AdminApiMappingCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$timeout', 'GRID_CONSTANTS', 'modalFactory', 'baseFactory', 'sharedFactory', 'IMPORT_CONSTANTS'];
    function ctrl($scope, $rootScope, $modal, $state, $timeout, GRID_CONSTANTS, modalFactory, baseFactory, sharedFactory, IMPORT_CONSTANTS) {

        $scope.disableSubmitButton = false;
        $scope.isLoading = false;
        $scope.dataMapTypes = ['Item', 'Field', 'ExcludeField', 'Value'];
        $scope.currentDataMapType = "Item";
        $scope.searchTerm = "";
        $scope.nItem = {
            customerId: null,
            customerValue: null,
            twcValue: null,
            type: $scope.currentDataMapType,
            isEdit: true
        };
        $scope.data = {
            customerId: null,
            mapping: []
        };
        $scope.saveItem = function (mForm, dataToSend) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.disableSubmitButton = true;
                baseFactory.post('/api/twcCustomOrder/saveApiMapping', angular.copy(dataToSend)).then(function (rdata) {
                    $scope.disableSubmitButton = false;
                });
            }
        };
        $scope.addItem = function (nItem) {
            nItem.type = $scope.currentDataMapType;
            $scope.data.mapping.unshift(angular.copy(nItem));
            //
            $timeout(function () {
                $scope.nItem = {
                    customerId: null,
                    customerValue: null,
                    twcValue: null,
                    type: $scope.currentDataMapType,
                    isEdit: true
                };
            }, 100);
        };
        $scope.deleteItem = function (indx) {
            $scope.data.mapping.splice(indx, 1);
        };
        var loadItems = function (cid) {
            $scope.data.customerId = cid;
            $scope.disableSubmitButton = true;
            $scope.isLoading = true;
            baseFactory.fetch('/api/twcCustomOrder/getApiMapping/' + cid).then(function (rdata) {
                $scope.data.mapping = rdata.object;
                $scope.disableSubmitButton = false;
                $scope.isLoading = false;
            });
        };

        $scope.setTab = function (dm) {
            $scope.currentDataMapType = dm;
        };
        $scope.filterTypeFn = function (item) {
                return item.type === $scope.currentDataMapType;
        };
        $scope.filterSearchFn = function (item) {
            if ($scope.searchTerm === null || $scope.searchTerm === '')
                return true;

            if (item.type !== $scope.currentDataMapType)
                return false;

            return item.customerValue.indexOf($scope.searchTerm) >= 0 ||
                item.twcValue.indexOf($scope.searchTerm) >= 0;
        };
        $scope.onCustomerSelect = function ($item, $model, $label) {
            loadItems($model.customerId);
        };
        $scope.getCustomer = function (val) {
            $scope.data.customerId = null;
            return sharedFactory.searchCustomer(val).then(function (data) {
                return data;
            });
        };
        $rootScope.$on(IMPORT_CONSTANTS.FILE_IMPORTED_SAVED, function (ev, d) {
            loadItems($scope.data.customerId);
        });

    }
})();
(function () {
    'use strict';
    homeModule.filter('dataMapSearchFilter', [function () {
        return function (items, search) {
            if (search === null || search === '')
                return items;

            return items.filter(function (element, index, array) {
                return element.customerValue.toLowerCase().indexOf(search.toLowerCase()) >= 0 ||
                    (element.twcValue !== null && element.twcValue.toLowerCase().indexOf(search.toLowerCase()) >= 0);
            });

        };
    }]);
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.articles', {
                url: "/articles",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/articles/views/index.html",
                        controller: 'ArticleAdminCtrl'
                    }
                },
                resolve: {
                    categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                        return baseFactory.fetch('/api/articles/getcategories').then(function (rdata) {
                            return rdata.object;
                        });
                    }]
                },
                data: {
                    permissions: ['system.articles.allow']
                },
                ncyBreadcrumb: {
                    label: 'Articles'
                }
            })
            .state('base.articles.create', {
                url: "/create",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/articles/views/createEdit.html",
                        controller: 'ArticleCreateEditAdminCtrl',
                        resolve: {
                            isNew: function () {
                                return true;
                            },
                            article: function () {
                                return {
                                    id: 0,
                                    alias: null,
                                    heading: null,
                                    categoryId: null,
                                    body: null,
                                    permissions: [],
                                    relatedItems: []
                                };
                            },
                            roles: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/roles/GetAll').then(function (rrdata) {
                                    return rrdata.object == null ? {} : rrdata.object;
                                });
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.articles.allow']
                },
                ncyBreadcrumb: {
                    label: 'Create Article'
                }
            })
            .state('base.articles.edit', {
                url: "/edit/:id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/articles/views/createEdit.html",
                        controller: 'ArticleCreateEditAdminCtrl',
                        resolve: {
                            isNew: function () {
                                return false;
                            },
                            article: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/articles/get/' + $stateParams.id).then(function (rrdata) {
                                    return rrdata.object == null ? {} : rrdata.object;
                                });
                            }],
                            roles: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/roles/GetAll').then(function (rrdata) {
                                    return rrdata.object == null ? {} : rrdata.object;
                                });
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.articles.allow']
                },
                ncyBreadcrumb: {
                    label: 'Edit Article'
                }
            });
    }
]);
homeModule.controller('ArticleAdminCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS) {

            $scope.gridOptions = {
                itemType: 'article',
                gridName: 'article',
                fetchUrl: '/api/articles/SearchAll',
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'date', displayName: 'Date', width: '150', customSortField: 'date', cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>' },
                    {
                        field: 'heading', displayName: 'Heading', customSortField: 'heading',
                        cellTemplate: '<div class="ngCellText" ng-if="row.entity.categoryAlias!=\'industries\'"><a href="/news/{{row.entity.year}}/{{row.entity.categoryAlias}}/{{row.entity.alias}}" target="_self">{{row.entity.heading}}</a></div>' +
                            '<div class="ngCellText" ng-if="row.entity.categoryAlias==\'industries\'"><a href="/{{row.entity.categoryAlias}}/{{row.entity.alias}}" target="_self">{{row.entity.heading}}</a></div>'
                    },
                    { field: 'categoryName', displayName: 'Category', customSortField: 'categoryName' }
                ],
                controlCellTemplateHtml: controlHtml(),
                extraParams: {
                    retrieveSize: 20
                }
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ui-sref="base.articles.edit({id:row.entity.id})" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteArticle(row.entity)" class="btn btn-danger" title="Danger"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteArticle = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.heading,
                    value.id,
                    'Article',
                    null,
                    '/api/articles/delete/',
                    $scope.gridOptions.gridName
                );
            };

        }
    ]);
homeModule.controller('ArticleCreateEditAdminCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$timeout', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'categories', 'isNew', 'article', 'roles',
        function ($scope, $rootScope, $modal, $state, $timeout, baseFactory, modalFactory, GRID_CONSTANTS, categories, isNew, article, roles) {

            $scope.isNew = isNew;
            $scope.categories = categories;
            $scope.m = article;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.disableAlias = true;
            $scope.currentTabId = 1;
            var currentAlias = isNew ? null : angular.copy(article.alias);
            
            var capitaliseFirstLetter = function (str) {
                str = str.charAt(0).toUpperCase() + str.slice(1);
                str = str.replace(/([a-z])([A-Z])/g, '$1 $2');
                return str;
            };
            // auto generate alias
            if (isNew) {
                $scope.$watch('m.heading', function (v) {
                    if (v !== null) {
                        var alias = v.toLowerCase().replace(/\s\s+/g, ' ').replaceAll(' ', '-');
                        $scope.m.alias = alias.replace(/^\s+|\s+$/gm, '');
                    }
                });
            }

            $scope.setAllRoles = function () {
                $scope.isAllSelected = !$scope.isAllSelected;
                for (var i = 0; i < $scope.m.roles.length; i++) {
                    $scope.m.roles[i].isSelected = $scope.isAllSelected;
                }
            };
            $scope.enableAliasEdit = function () {
                $scope.disableAlias = !$scope.disableAlias;
                if ($scope.disableAlias)
                    $scope.m.alias = currentAlias;
            };
            $scope.setActiveTab = function (id) {
                $scope.currentTabId = id;
            };

            $scope.save = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    var dataToSend = angular.copy(m);
                    if (!isNew) {
                        var alias = dataToSend.alias.toLowerCase().replace(/\s\s+/g, ' ').replaceAll(' ', '-');
                        dataToSend.alias = alias.replace(/^\s+|\s+$/gm, '');
                    }
                    dataToSend.heading = capitaliseFirstLetter(dataToSend.heading);
                    dataToSend.permissions = [];
                    for (var i = 0; i < dataToSend.roles.length; i++)
                        if (dataToSend.roles[i].isSelected)
                            dataToSend.permissions.push($scope.m.roles[i].id);
                    //
                    delete dataToSend.roles;
                    //
                    var testAlt = function (str) {
                        var pattern = /( alt )/;
                        return !str.match(pattern);
                    };
                    var hdr = dataToSend.heading.replaceAll('"', '');
                    dataToSend.body = dataToSend.body.replaceAll('" alt="" ', '" alt="' + hdr + '" ').replaceAll("IMAGEALTERNATIVE", hdr);
                    //
                    var arrItemNumbers = [];
                    for (var j = 0; j < dataToSend.relatedItems.length; j++)
                        arrItemNumbers.push(dataToSend.relatedItems[j].itemNumber);
                    dataToSend.relatedItemArr = arrItemNumbers.join();
                    delete dataToSend.relatedItems;
                    //
                    baseFactory.post("/api/articles/save", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            $state.go('base.articles', null, { reload: true });
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            //
            $scope.dateOpened = false;
            $scope.open = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateOpened = true;
            };
            //
            // FILE
            $scope.fileModel = {
                fileName: "",
                fileFolder: ""
            };
            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = ["jpeg", "jpg", "png"];
                var result = fType.indexOf(ext) >= 0;

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };
            $scope.onFileSelect = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) {
                            $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                        }).success(function (data, status, headers, config) {
                            // temporary folder
                            $scope.fileModel = data.object;
                            $scope.m.file = $scope.fileModel;
                            $scope.m.isUploaded = true;
                            $scope.m.isNew = true;
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            $timeout(function () {
                                $scope.resetInputFile();
                            }, 2000);
                        });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };
            $scope.changeFile = function () {
                $scope.m.isUploaded = false;
                $scope.m.file = {
                    fileName: "",
                    fileFolder: ""
                };
                $scope.m.photoThumbnailUrl = "";
                $scope.m.isNew = true;
            };
            $scope.resetInputFile = function () {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type === 'file') {
                        elems[i].value = null;
                    }
                }
            };

            // Related Items
            $scope.relatedItem = null;
            $scope.addRelatedItem = function (relatedItem) {
                if (!relatedItem)
                    return;

                var isExist = false;

                angular.forEach($scope.m.relatedItems, function (i, itemIndex) {
                    if (relatedItem.itemNumber === i.itemNumber) {
                        isExist = true;
                    }
                });

                if (!isExist) {
                    var newItem = {
                        itemNumber: angular.copy(relatedItem.itemNumber),
                        itemName: angular.copy(relatedItem.itemName)
                    };

                    $scope.m.relatedItems.push(newItem);
                }
                $scope.relatedItem = null;
                angular.element("[relatedItem]").val("");
            };
            $scope.removeRelatedItem = function (deleteditem) {
                if (!deleteditem) {
                    return;
                }

                angular.forEach($scope.m.relatedItems, function (i, itemIndex) {
                    if (deleteditem.itemNumber === i.itemNumber) {
                        $scope.m.relatedItems.splice(itemIndex, 1);
                        return;
                    }
                });
            };

            $scope.loadingItems = false;
            $scope.searchProducts = function (searchText) {
                if (searchText.length < 2)
                    return [];

                var dataToSend = {
                    itemVisibility: true,
                    startIndex: 1,
                    retrieveSize: 10,
                    searchText: searchText,
                    sort: 'name asc'
                };
                $scope.loadingItems = true;
                return baseFactory.fetch('/api/item/Search', dataToSend).then(function (rdata) {
                    $scope.loadingItems = false;
                    var arr = [];
                    for (var ii = 0; ii < rdata.object.length; ii++) {
                        arr.push(rdata.object[ii]);
                    }
                    return arr;
                });
            };

            // INIT
            $scope.m.roles = [];
            for (var i = 0; i < roles.length; i++) {
                $scope.m.roles.push({
                    id: roles[i].id,
                    name: roles[i].name,
                    isSelected: $scope.m.permissions.indexOf(roles[i].id) >= 0
                });
            }

            $scope.mediumButtons = ['bold', 'italic', 'underline', 'unorderedlist', 'orderedlist', 'fontname', 'fontsize', 'h2', 'h3', 'html'];
            $scope.mediumEditorAddons = {
                images: {
                    fileUploadOptions: {
                        url: '/api/upload/articleimage',
                        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
                        beforeSend: function (xhr, data) {
                            xhr.setRequestHeader('ClientKey', 1);
                            xhr.setRequestHeader('IsMobile', true);
                        }
                    }
                },
                embeds: false
            };
        }
    ]);
homeModule.controller('BulkOrderUpdateCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'sharedFactory',
        'promptFactory', 'categories', 'orderStatuses', 'workOrderStatuses', 'itemStatuses', 'items', 'twcZones',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, sharedFactory,
            promptFactory, categories, orderStatuses, workOrderStatuses, itemStatuses, items, twcZones) {
            $scope.categories = angular.copy(categories);
            $scope.categories.splice(0, 0, { id: null, name: 'Select All' });
            //
            $scope.items = [];
            //
            $scope.twcZones = angular.copy(twcZones);
            $scope.twcZones.splice(0, 0, { id: null, name: 'Select All' });
            //
            $scope.customers = [];
            $scope.customers.splice(0, 0, { id: null, name: 'Select All' });
            //
            $scope.deliveryDateStatuses = [
                { id: null, name: 'Select All' },
                { id: true, name: 'Yes' },
                { id: false, name: 'No' }
            ];
            //
            $scope.orderStatusesOnly = angular.copy(orderStatuses);
            $scope.orderStatuses = angular.copy(orderStatuses);
            $scope.orderStatuses.splice(0, 0, { id: null, name: 'Select All' });
            //

            $scope.workOrderStatusesOnly = angular.copy(workOrderStatuses);
            $scope.workOrderStatuses = angular.copy(workOrderStatuses);
            if (workOrderStatuses.length > 0) {
                $scope.workOrderStatusesOnly.splice(0, 0, { id: null, name: '' });
                $scope.workOrderStatuses.splice(0, 0, { id: 0, name: 'All Statuses' });
                $scope.workOrderStatuses.splice(0, 0, { id: -1, name: 'Not Started' });
            }
            //
            $scope.itemColoursOnly = [];
            $scope.itemColours = [{ colour: 'Select All' }];
            $scope.itemStatusesOnly = angular.copy(itemStatuses);
            $scope.itemStatuses = angular.copy(itemStatuses);
            $scope.itemStatuses.splice(0, 0, { colours: null, material: 'Select All' });

            $scope.dateOptions = {
                formatYear: 'yyyy',
                startingDay: 1
            };
            $scope.bulkSearchUrl = '/api/order/bulkSearch';
            $scope.bulkSearchExportUrl = '/exportGrid/getTwcOrderUpdates/';
            $scope.completionDateOpened = false;
            $scope.completionDatePickerOpen = true;
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.searchResult = null;
            $scope.currentStep = 1;
            $scope.steps = [
                {
                    step: 1,
                    title: 'Search Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Review Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 3,
                    title: 'Update Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 4,
                    title: 'Confirm Update',
                    isDone: false,
                    isEditing: false
                }
            ];
            $scope.m1 = {
                product: null,
                itemNumber: null,
                selectedItems: [],
                customer: null,
                selectedOrderStatuses: [],
                workOrderStatusId: workOrderStatuses.length > 0 ? -1 : null,
                searchText: null,
                shipmentNumber: null,
                isMustGo: null,
                shipVia: null,
                orderDate: {
                    startDate: moment().startOf('year'),
                    endDate: moment().endOf('year')
                },
                completionDate: {
                    startDate: moment().startOf('year'),
                    endDate: moment().endOf('year')
                },
                selectedMaterials: [],
                selectedColours: []
            };
            $scope.m2 = {
                status: null,
                workOrderStatusId: workOrderStatuses.length > 0 ? -1 : null,
                completionDate: null,
                completionDateExtension: 0,
                material: null,
                colour: null,
                comments: "",
                orderIds: []
            };

            // PRIVATE
            var encodeQueryData = function (data) {
                var ret = [];
                for (var d in data) {
                    if (typeof data[d] !== 'undefined' && data[d] !== null)
                        ret.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d]));
                }
                return ret.join("&");
            };
            var generateRefreshOptions = function (m) {
                return m;
            };
            var findValue = function (strArray, key, label, val) {
                for (var i = 0; i < $scope[strArray].length; i++) {
                    if ($scope[strArray][i][key] === val) {
                        return $scope[strArray][i][label];
                    }
                }
                return null;
            };
            var getSearchOrders = function (dataToSend, isLoadMore) {
                baseFactory.fetch($scope.bulkSearchUrl, dataToSend).then(function (rdata) {
                    if (!isLoadMore) {
                        $scope.searchResult = {
                            result: rdata.object,
                            selection: 1,
                            selected: 0,
                            exportUrl: ''
                        };
                        $scope.nextStep(2);
                    } else {
                        var ctr = 0;
                        for (var i = 0; i < rdata.object.length; i++) {
                            $scope.searchResult.result.push(rdata.object[i]);
                            ctr++;
                        }
                        if (ctr > 0)
                            $scope.searchResult.selection = 3;
                    }
                    $scope.searchResult.exportUrl = $scope.bulkSearchExportUrl + '?' + encodeQueryData(generateRefreshOptions(dataToSend));
                });
            };
            var getColorArr = function (data) {
                var arr = [];
                for (var k = 0; k < data.length; k++) {
                    arr.push(data[k].colour);
                }
                return arr;
            };
            var getIdsArr = function (data) {
                var arr = [];
                for (var k = 0; k < data.length; k++) {
                    arr.push(data[k].id);
                }
                return arr;
            };

            // PUBLIC
            $scope.multipleSelectSettings = {
                smartButtonMaxItems: 3,
                displayProp: 'display',
                idProp: 'itemNumber',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 9) {
                        var str = itemText.substring(0, 9);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleTextSettings = {
                buttonDefaultText: 'Select All Items'
            };
            $scope.searchOrder = function (mForm, m) {
                var orderStatusArr = [];
                if (typeof m.selectedOrderStatuses !== 'undefined')
                    for (i = 0; i < m.selectedOrderStatuses.length; i++) {
                        orderStatusArr.push(m.selectedOrderStatuses[i].id);
                    }
                var itemArr = [];
                if (typeof m.selectedItems !== 'undefined')
                    for (var i = 0; i < m.selectedItems.length; i++) {
                        itemArr.push(m.selectedItems[i].id);
                    }
                var materialArr = [];
                if (typeof m.selectedMaterials !== 'undefined')
                    for (i = 0; i < m.selectedMaterials.length; i++) {
                        materialArr.push(m.selectedMaterials[i].id);
                    }
                var colourArr = [];
                if (typeof m.selectedColours !== 'undefined')
                    for (i = 0; i < m.selectedColours.length; i++) {
                        colourArr.push(m.selectedColours[i].id);
                    }
                var templateArr = [];
                if (typeof m.selectedTemplates !== 'undefined')
                    for (i = 0; i < m.selectedTemplates.length; i++) {
                        templateArr.push(m.selectedTemplates[i].id);
                    }
                var dataToSend = {
                    searchText: m.searchText,
                    shipmentNumber: m.shipmentNumber,
                    shipVia: m.shipVia,
                    isMustGo: m.isMustGo,
                    product: m.product,
                    itemNumbers: itemArr.join(),
                    workOrderStatusId: m.workOrderStatusId,
                    customer: m.customer !== null && m.customer !== '' ? m.customer.customerId : null,
                    orderStartDate: moment(m.orderDate.startDate).format('YYYY-MM-DD'),
                    orderEndDate: moment(m.orderDate.endDate).format('YYYY-MM-DD'),
                    completionStartDate: moment(m.completionDate.startDate).format('YYYY-MM-DD'),
                    completionEndDate: moment(m.completionDate.endDate).format('YYYY-MM-DD'),
                    startIndex: 1,
                    retrieveSize: 9999999
                };
                if (typeof m.printed !== 'undefined')
                    dataToSend.printed = angular.copy(m.printed);
                if (typeof m.r !== 'undefined')
                    dataToSend.r = angular.copy(m.r);
                if (typeof m.t !== 'undefined')
                    dataToSend.t = angular.copy(m.t);
                if (typeof m.sort !== 'undefined')
                    dataToSend.sort = angular.copy(m.sort);
                if (typeof m.dateRange !== 'undefined') {
                    dataToSend.startDate = moment(m.dateRange.startDate).format('YYYY-MM-DD');
                    dataToSend.endDate = moment(m.dateRange.endDate).format('YYYY-MM-DD');
                }
                if (orderStatusArr.length > 0)
                    dataToSend.orderStatus = orderStatusArr.join();
                if (materialArr.length > 0)
                    dataToSend.materials = materialArr.join().replace(/</g, "").replace(/>/g, "");
                if (colourArr.length > 0)
                    dataToSend.colours = colourArr.join();
                if (templateArr.length > 0)
                    dataToSend.templates = templateArr.join();
                //
                getSearchOrders(dataToSend, false);
            };
            $scope.loadMore = function (m) {
                var orderStatusArr = [];
                if (typeof m.selectedOrderStatuses !== 'undefined')
                    for (i = 0; i < m.selectedOrderStatuses.length; i++) {
                        orderStatusArr.push(m.selectedOrderStatuses[i].id);
                    }
                var itemArr = [];
                if (typeof m.selectedItems !== 'undefined')
                    for (var i = 0; i < m.selectedItems.length; i++) {
                        itemArr.push(m.selectedItems[i].id);
                    }
                var materialArr = [];
                if (typeof m.selectedMaterials !== 'undefined')
                    for (i = 0; i < m.selectedMaterials.length; i++) {
                        materialArr.push(m.selectedMaterials[i].id);
                    }
                var colourArr = [];
                if (typeof m.selectedColours !== 'undefined')
                    for (i = 0; i < m.selectedColours.length; i++) {
                        colourArr.push(m.selectedColours[i].id);
                    }
                var templateArr = [];
                if (typeof m.selectedTemplates !== 'undefined')
                    for (i = 0; i < m.selectedTemplates.length; i++) {
                        templateArr.push(m.selectedTemplates[i].id);
                    }
                var dataToSend = {
                    searchText: m.searchText,
                    shipmentNumber: m.shipmentNumber,
                    shipVia: m.shipVia,
                    product: m.product,
                    itemNumbers: itemArr.join(),
                    workOrderStatusId: m.workOrderStatusId,
                    customer: m.customer !== null && m.customer !== '' ? m.customer.customerId : null,
                    orderStartDate: moment(m.orderDate.startDate).format('YYYY-MM-DD'),
                    orderEndDate: moment(m.orderDate.endDate).format('YYYY-MM-DD'),
                    completionStartDate: moment(m.completionDate.startDate).format('YYYY-MM-DD'),
                    completionEndDate: moment(m.completionDate.endDate).format('YYYY-MM-DD'),
                    startIndex: $scope.searchResult.result.totalItems + 1,
                    retrieveSize: 40
                };
                if (typeof m.printed !== 'undefined')
                    dataToSend.printed = angular.copy(m.printed);
                if (typeof m.r !== 'undefined')
                    dataToSend.r = angular.copy(m.r);
                if (typeof m.t !== 'undefined')
                    dataToSend.t = angular.copy(m.t);
                if (typeof m.sort !== 'undefined')
                    dataToSend.sort = angular.copy(m.sort);
                if (typeof m.dateRange !== 'undefined') {
                    dataToSend.startDate = moment(m.dateRange.startDate).format('YYYY-MM-DD');
                    dataToSend.endDate = moment(m.dateRange.endDate).format('YYYY-MM-DD');
                }
                if (orderStatusArr.length > 0)
                    dataToSend.orderStatus = orderStatusArr.join();
                if (materialArr.length > 0)
                    dataToSend.materials = materialArr.join().replace(/</g, "").replace(/>/g, "");
                if (colourArr.length > 0)
                    dataToSend.colours = colourArr.join();
                if (templateArr.length > 0)
                    dataToSend.templates = templateArr.join();
                //
                getSearchOrders(dataToSend, true);
            };
            $scope.selectRowOrder = function (r) {
                // 1 = All unchecked
                // 2 = All checked
                // 3 = Some checked
                if (!$scope.disableSubmitButton) {
                    r.isSelected = !r.isSelected;
                    if (r.isSelected)
                        $scope.searchResult.selected++;
                    else
                        $scope.searchResult.selected--;
                    //
                    if ($scope.searchResult.selected > 0)
                        $scope.searchResult.selection = $scope.searchResult.selected === $scope.searchResult.result.length ? 2 : 3;
                    else
                        $scope.searchResult.selection = 1;
                    // Reset
                    $scope.steps[2].isDone = false;
                    $scope.steps[2].isEditing = false;
                }
            };
            $scope.selectAllRowOrders = function () {
                if (!$scope.disableSubmitButton) {
                    if ($scope.searchResult.selection === 1 || $scope.searchResult.selection === 3) {
                        $scope.searchResult.selection = 2;
                    } else if ($scope.searchResult.selection === 2) {
                        $scope.searchResult.selection = 1;
                    }
                    for (var i = 0; i < $scope.searchResult.result.length; i++) {
                        $scope.searchResult.result[i].isSelected = $scope.searchResult.selection === 2;
                    }
                    $scope.searchResult.selected = $scope.searchResult.selection === 2 ? $scope.searchResult.result.length : 0;
                }
            };
            $scope.updateSelectedOrders = function (orders) {
                $scope.m2.orderIds = [];
                for (var i = 0; i < orders.length; i++) {
                    if (orders[i].isSelected)
                        $scope.m2.orderIds.push(orders[i].id);
                }
                $scope.nextStep(3);
            };
            $scope.updateOrder = function (mForm, m1, m2, searchResult) {
                $scope.confirmHtml = null;
                var validFields = 0;
                var fields = [];
                for (var k in m2) {
                    if (k === 'isSendEmail' || k === 'orderIds')
                        continue;
                    if (k === 'completionDate' && !$scope.completionDatePickerOpen)
                        continue;
                    if (k === 'completionDateExtension' && $scope.completionDatePickerOpen)
                        continue;
                    if (k === 'completionDateExtension' && !$scope.completionDatePickerOpen && m2[k] === 0)
                        continue;

                    if (m2[k] === '')
                        m2[k] = null; if (m2[k] !== null) {
                            validFields++;
                            var label = '';
                            var txt = m2[k];
                            if (k === 'material')
                                txt = txt.replace(/</g, "&lt;").replace(/>/g, "&gt;");
                            if (k === 'completionDate')
                                txt = moment(m2[k]).format('YYYY-MM-DD');
                            if (k === 'completionDateExtension') {
                                var isAdd = m2[k] >= 0;
                                var isEqual = m2[k] === 0 || m2[k] === 1;

                                txt = (isAdd ? '+' : '') + (isEqual ? m2[k] + ' day' : m2[k] + ' days');
                            }
                            if (k === 'status') {
                                label = 'Order Status';
                                txt = findValue('orderStatuses', 'id', 'name', txt);
                            }
                            if (k === 'workOrderStatusId') {
                                label = 'Work Order Status';
                                txt = findValue('workOrderStatuses', 'id', 'name', txt);
                            }
                            if (k === 'completionDate')
                                label = 'Est Date Completion';
                            if (k === 'completionDateExtension')
                                label = 'Est Date Completion';
                            if (k === 'material')
                                label = 'Material';
                            if (k === 'colour')
                                label = 'Colour';

                            if (k === 'comments') {
                                fields.push('<div>Comments:<div class="text-bold m-left20">' + txt + '</div></div>');
                            } else {
                                fields.push('<div>' + label + ': <strong>' + txt + '</strong></div>');
                            }
                        }
                }

                if (validFields > 0) {
                    var html = '<div class="alert alert-info mTop20 mBottom20">' + fields.join('') + '</div>';
                    var msg = '<div>You are about to update <strong>' + m2.orderIds.length + '</strong> orders with the following details;</div>' +
                        html + '<div>Are you sure you want to continue? This action cannot be undone.</div>';

                    $scope.confirmHtml = msg;
                    $scope.nextStep(4);
                }
            };
            $scope.confirmUpdate = function (mForm, m2) {
                var dataToSend = {
                    orderStatus: m2.status,
                    workOrderStatusId: m2.workOrderStatusId,
                    completionDate: m2.completionDateExtension !== 0 || m2.completionDate === null ? null : moment(m2.completionDate).format('YYYY-MM-DD'),
                    completionDateExtension: m2.completionDateExtension === 0 ? null : m2.completionDateExtension,
                    material: m2.material,
                    colour: m2.colour,
                    comments: m2.comments,
                    orderIds: m2.orderIds
                };
                var dts = {};
                for (var k in dataToSend) {
                    if (dataToSend[k] !== null) {
                        dts[k] = dataToSend[k];
                    }
                }
                $scope.disableSubmitButton = true;
                baseFactory.post('/api/order/bulkUpdate', dts).then(function (rdata) {
                    //
                    $scope.disableSubmitButton = !rdata.isErrored;
                    if (!rdata.isErrored) {
                        $scope.resultData = rdata.object;
                        $scope.steps[3].isDone = true;
                    }
                });
            };
            $scope.nextStep = function (indx) {
                if (indx < 4)
                    $scope.resultData = null;
                $scope.goToStep(indx, false);
            };
            $scope.goToStep = function (indx, isSkip) {
                if (!$scope.disableSubmitButton) {
                    var isMove = false;
                    for (var i = 0; i < $scope.steps.length; i++) {
                        if (!isSkip) {
                            if ($scope.steps[i].step === indx - 1) {
                                $scope.steps[i].isDone = true;
                            }
                            if ($scope.steps[i].step === indx && $scope.steps[i].isDone) {
                                $scope.steps[i].isEditing = true;
                            }
                            isMove = true;
                        } else if (isSkip && $scope.steps[i].step === indx && $scope.steps[i].isDone) {
                            $scope.steps[i].isEditing = true;
                            isMove = true;
                        }
                    }
                    if (isMove)
                        $scope.currentStep = indx;
                }
            };
            $scope.getCustomer = function (val) {
                return sharedFactory.searchCustomer(val).then(function (data) {
                    return data;
                });
            };
            $scope.materialChange = function (m) {
                if (m === 'm1') {
                    if ($scope[m].material === 'Select All') {
                        $scope.itemColours = [{ colour: 'Select All' }];
                    } else {
                        $scope.itemColours = [];
                        for (var i = 0; i < itemStatuses.length; i++) {
                            if ($scope[m].material === itemStatuses[i].material) {
                                $scope.itemColours = angular.copy(itemStatuses[i].colours);
                                $scope.itemColours.splice(0, 0, { colour: 'Select All' });
                                break;
                            }
                        }
                    }
                    $scope[m].colour = 'Select All';
                } else {
                    $scope.itemColoursOnly = [];
                    for (var j = 0; j < itemStatuses.length; j++) {
                        if ($scope[m].material === itemStatuses[j].material) {
                            $scope.itemColoursOnly = angular.copy(itemStatuses[j].colours);
                            $scope.itemColoursOnly.splice(0, 0, { colour: '' });
                            break;
                        }
                    }
                    $scope[m].colour = '';
                }
            };
            $scope.changeCompDateUi = function () {
                $scope.completionDatePickerOpen = !$scope.completionDatePickerOpen;
            };
            $scope.increaseExtension = function () {
                $scope.m2.completionDateExtension++;
            };
            $scope.decreaseExtension = function () {
                $scope.m2.completionDateExtension--;
            };
            $scope.opencompletionDate = function ($event, cf) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.completionDateOpened = true;
            };

            //
            $scope.categoryChanged = function (categoryId) {
                var arr = [];
                var allOptionStr = '';
                var isItemNumberExist = false;
                for (var i = 0; i < categories.length; i++) {
                    if (categories[i].id === categoryId) {
                        var catName = categories[i].name;
                        allOptionStr = catName;
                        for (var y = 0; y < items.length; y++) {
                            if (items[y].categoryName === catName) {
                                arr.push(items[y]);
                                if (!isItemNumberExist)
                                    isItemNumberExist = items[y].itemNumber === $scope.m1.itemNumber;
                            }
                        }

                        break;
                    }
                }
                //
                if (!isItemNumberExist)
                    $scope.m1.itemNumber = null;
                $scope.items = angular.copy(arr);
            };

            $scope.multipleSelectSettingsForMaterials = {
                smartButtonMaxItems: 3,
                displayProp: 'material',
                idProp: 'material',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 9) {
                        var str = itemText.substring(0, 9);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleTextSettingsForMaterials = {
                buttonDefaultText: 'Select All Materials'
            };
            $scope.multipleEventSettingsForMaterials = {
                onSelectionChanged: function () {
                },
                onItemSelect: function (item) {
                    // generateColour
                    var arr = getIdsArr($scope.m1.selectedMaterials);
                    var colourArr = getColorArr($scope.itemColoursOnly);
                    for (var j = 0; j < $scope.itemStatusesOnly.length; j++) {
                        if (arr.indexOf($scope.itemStatusesOnly[j].material) >= 0) {
                            for (var k = 0; k < $scope.itemStatusesOnly[j].colours.length; k++) {
                                if (colourArr.indexOf($scope.itemStatusesOnly[j].colours[k].colour) < 0) {
                                    $scope.itemColoursOnly.push($scope.itemStatusesOnly[j].colours[k]);
                                    colourArr.push($scope.itemStatusesOnly[j].colours[k].colour);
                                }
                            }
                        }
                    }
                },
                onItemDeselect: function (item) {
                    // generateColour
                    $timeout(function () {
                        $scope.itemColoursOnly = [];
                        var arr = getIdsArr($scope.m1.selectedMaterials);
                        var colourArr = getColorArr($scope.itemColoursOnly);
                        for (var j = 0; j < $scope.itemStatusesOnly.length; j++) {
                            if (arr.indexOf($scope.itemStatusesOnly[j].material) >= 0) {
                                for (var k = 0; k < $scope.itemStatusesOnly[j].colours.length; k++) {
                                    if (colourArr.indexOf($scope.itemStatusesOnly[j].colours[k].colour) < 0) {
                                        $scope.itemColoursOnly.push($scope.itemStatusesOnly[j].colours[k]);
                                        colourArr.push($scope.itemStatusesOnly[j].colours[k].colour);
                                    }
                                }
                            }
                        }
                    }, 100);
                },
                onSelectAll: function () {
                    $scope.itemColoursOnly = [];
                },
                onDeselectAll: function () {
                    $scope.itemColoursOnly = [];
                }
            };

            $scope.multipleSelectSettingsForColours = {
                smartButtonMaxItems: 3,
                displayProp: 'colour',
                idProp: 'colour',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 9) {
                        var str = itemText.substring(0, 9);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleTextSettingsForColours = {
                buttonDefaultText: 'Select All Colours'
            };
            $scope.multipleSelectSettingsForTemplates = {
                smartButtonMaxItems: 4,
                displayProp: 'id',
                idProp: 'id',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 9) {
                        var str = itemText.substring(0, 9);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleTextSettingsForTemplates = {
                buttonDefaultText: 'Select All Templates'
            };
            $scope.multipleSelectSettingsForOrderStatuses = {
                smartButtonMaxItems: 5,
                displayProp: 'name',
                idProp: 'id',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 9) {
                        var str = itemText.substring(0, 9);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleTextSettingsForOrderStatuses = {
                buttonDefaultText: 'Select All Statuses'
            };
        }
    ]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.carriers', {
                url: "/carriers",
                views: {
                    //'@': {
                    //    templateUrl: "/app/modules/menu/menu.html",
                    //    controller: 'MenuCtrl'
                    //},
                    'content@base': {
                        templateUrl: "/app/modules/admin/carriers/views/index.html",
                        controller: 'CarriersCtrl',
                        resolve: {
                            gridData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getGridEntity('/api/carrier/SearchCarrierServices?q=&s=');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.carriers.view']
                },
                ncyBreadcrumb: {
                    label: 'Carriers'
                }
            });
    }
]);
homeModule.controller('CarriersCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'gridData',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, gridData) {

            $scope.currentState = $state.current.name;
            $scope.gridOptions = {
                itemType: 'carrierService',
                items: gridData,
                gridName: 'carrierService',
                fetchUrl: '/api/carrier/SearchCarrierServices',
                initSortString: 'carrier.Name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'carrierName', displayName: 'Name', customSortField: 'carrier.Name' },
                    { field: 'serviceName', displayName: 'Service', customSortField: 'name' },
                    { field: 'fuelSurcharge', displayName: 'FuelSurcharge', customSortField: 'fuelSurcharge' },
                    { field: 'markUp', displayName: 'MarkUp', customSortField: 'markUp' },
                    { field: 'fixedCost', displayName: 'Fixed Cost', customSortField: 'fixedCost' },
                    { field: 'isActive', displayName: 'IsActive', customSortField: 'isActive' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openManageCarrierService(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteCarrierService = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.carrierName,
                    value.id,
                    'Carrier Service',
                    null,
                    '/api/carrier/DeleteCarrierService',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageCarrierService = function (mm) {
                var isNew = mm == null;
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/carriers/modals/carrierServiceModal.html',
                    controller: 'ManageCarrierServiceModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        title: function () {
                            return "Carrier";
                        },
                        saveUrl: function () {
                            return '/api/carrier/SaveCarrierService';
                        },
                        isNew: function () {
                            return isNew;
                        },
                        item: function () {
                            if (isNew) {
                                return {
                                    id: 0,
                                    name: ""
                                };
                            } else {
                                return baseFactory.fetch('/api/carrier/GetCarrierService/' + mm.id).then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }
                        }
                    }
                });

                modalInstance.result.then(
                    function () {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    }, function (isReload) {
                        if (isReload) {
                            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                        }
                    });
            };


        }
    ]);
(function () {
    'use strict';

    homeModule.controller('ManageCarrierServiceModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'title', 'isNew', 'saveUrl', 'item'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, title, isNew, saveUrl, item) {

        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };

        $scope.title = title;
        $scope.isNew = isNew;
        $scope.mode = isNew ? "Create" : "Edit";
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.m = angular.copy(item);

        // PUBLIC
        $scope.dateOpened = false;
        $scope.open = function ($event) {
            $event.preventDefault();
            $event.stopPropagation();

            $scope.dateOpened = true;
        };

        $scope.ok = function (mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);

                baseFactory.post(saveUrl, dataToSend).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(item);
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            if (isNaN(data.object))
                                m = data.object;
                            else
                                m.id = data.object;
                            $modalInstance.close(m);
                        }
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(isReload);
        };
    }
})();
homeModule.controller('category',
    ['$scope', '$modal', 'gridData', 'modalFactory', 'categories', '$state',
        function ($scope, $modal, gridData, modalFactory, categories, $state) {
            $scope.categories = categories;
            $scope.currentState = $state.current.name;
            $scope.gridOptions = {
                itemType: 'category',
                items: gridData,
                gridName: 'category',
                fetchUrl: '/api/category/Search',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'name', displayName: 'Category Name', customSortField: 'name', width: "25%" },
                    { field: 'sortOrder', displayName: 'Sort Order', customSortField: 'sortOrder', width: "15%" },
                    { field: 'isHomepage', displayName: 'IsHomepage', sortable: false, width: "8%" },
                    { field: 'isMenu', displayName: 'IsMenu', sortable: false, width: "8%" },
                    {
                        field: 'subCat', displayName: 'Sub Category', customSortField: 'subCategories', sortable: false,
                        cellTemplate: '<div class="ellipsis"><span ng-repeat="u in row.entity.subCategories"> {{u.name}} {{$last ? \'\' : \', \'}}</span></div>'
                    }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls" permission permissions="system.categories.edit">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openManageCategory(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteCategory(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteCategory = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Category',
                    null,
                    '/api/category/Delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageCategory = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/categories/categoryModal/addOrEditCategory.html',
                    controller: 'addOrEditCategory',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        category: function () {
                            if (m == null) {
                                return {
                                    name: "",
                                    isMenu: true,
                                    isHomepage: false,
                                    subCategories: []
                                };
                            }
                            return m;
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });

                modalInstance.result.then(function () {
                }, function (isReloadPage) {
                });
            };


        }
    ]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.categories', {
                url: "/categories",
                views: {
                    //'@': {
                    //    templateUrl: "/app/modules/menu/menu.html",
                    //    controller: 'MenuCtrl'
                    //},
                    'content@base': {
                        templateUrl: "/app/modules/admin/categories/category.html",
                        controller: 'category',
                        resolve: {
                            gridData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getGridEntity('/api/category/Search?q=&s=');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.categories.view']
                },
                ncyBreadcrumb: {
                    label: 'Categories'
                }
            });
    }
]);
(function () {
    homeModule.controller('addOrEditCategory', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', 'category', 'GRID_CONSTANTS', 'gridName', 'baseFactory', '$rootScope', '$timeout', 'isNew'];
    function ctrl($scope, $modalInstance, category, GRID_CONSTANTS, gridName, baseFactory, $rootScope, $timeout, isNew) {

        $scope.category = category;
        $scope.m = angular.copy(category);
        $scope.bgcolors = ["#F0AD4E", "#D8C233", "#8BBF61", "#008800", "#3695D5", "#76268F", "#424242", "#13072C", "#d9534f"];
        $scope.disableAlias = true;
        $scope.isNew = isNew;
        var currentAlias = isNew ? null : angular.copy(category.alias);

        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };

        $scope.subCategories = [];
        $scope.subCategory = "";


        if (!isNew) {
            $scope.manageCategoryTitle = "Edit Category";
        } else {
            $scope.manageCategoryTitle = "Add Category";
        }

        // auto generate alias
        if (isNew) {
            $scope.$watch('m.name', function (v) {
                var alias = v.toLowerCase().replace(/\s\s+/g, ' ').replaceAll(' ', '-');
                $scope.m.alias = alias.replace(/^\s+|\s+$/gm, '');
            });
        }

        $scope.enableAliasEdit = function () {
            $scope.disableAlias = !$scope.disableAlias;
            if ($scope.disableAlias)
                $scope.m.alias = currentAlias;
        };

        $scope.enableSubAliasEdit = function () {
            $scope.m.subCategories[$scope.currentSubCategoryIndex].disableAlias =
                !$scope.m.subCategories[$scope.currentSubCategoryIndex].disableAlias;
        };

        $scope.ismenuChanged = function () {
            angular.forEach($scope.m.subCategories, function (sc) {
                sc.isMenu = $scope.m.isMenu;
            });
        };

        $scope.sashEnabled = function (m) {
            if (!m.sash.isEnabled) {
                m.sash = null;
            } else {
                m.sash = { text: 'Sale', colour: null, isEnabled: true };
            }
        };
        $scope.setBgColor = function (sash, bg) {
            sash.colour = bg;
        };

        $scope.addSubcategory = function (subCategory) {
            if (subCategory.length > 0) {
                var newSubCat = {
                    id: 0,
                    name: subCategory,
                    isHomepage: $scope.m.isHomepage,
                    isMenu: $scope.m.isMenu,
                    seo: {}
                };
                $scope.m.subCategories.push(newSubCat);
                $scope.subCategory = null;
                $scope.currentSubCategoryIndex = $scope.m.subCategories.length - 1;
            }
        };
        $scope.removeSubCategory = function (m, indx) {
            angular.forEach($scope.m.subCategories, function (value, index) {
                if (value.name == m.name) {
                    $scope.m.subCategories.splice(index, 1);
                }
            });
            if (indx === $scope.currentSubCategoryIndex)
                $scope.currentSubCategoryIndex = null;
        };

        $scope.currentSubCategoryIndex = $scope.m.subCategories.length > 0 ? 0 : null;
        if ($scope.currentSubCategoryIndex != null)
            $scope.m.subCategories[$scope.currentSubCategoryIndex].disableAlias = true;
        $scope.editSubCategory = function (indx) {
            $scope.currentSubCategoryIndex = indx;
            $scope.m.subCategories[indx].disableAlias = true;
        };

        function isValid() {
            for (var i = 0; i < $scope.m.subCategories.length; i++) {
                if ($scope.m.subCategories[i].name == null || $scope.m.subCategories[i].name == '')
                    return false;
            }
            return true;
        }

        $scope.saveCat = function (m, mForm) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid && isValid()) {
                $scope.submitted = true;
                $scope.loading = true;

                var dataToSend = angular.copy(m);

                if (!isNew) {
                    var alias = dataToSend.alias.toLowerCase().replace(/\s\s+/g, ' ').replaceAll(' ', '-');
                    dataToSend.alias = alias.replace(/^\s+|\s+$/gm, '');
                }

                baseFactory.post("/api/category/Save/", dataToSend).then(function (data) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                    $scope.loading = false;
                    $modalInstance.close();
                });
            }
        };


        // FILE
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["jpeg", "jpg", "png"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.changeFile = function (cat) {
            cat.isUploaded = false;
            cat.file.fileFolder = "";
            cat.file.fileName = "";
            cat.photoUrlThumnail = "";
            cat.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };
        $scope.onFileSelect = function (cat, $files, indx) {
            if (isFileValid($files[0].name)) {
                $scope.isFileUploading = true;
                $scope.progress = 0;

                baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files, false)
                    .progress(function (evt) { })
                    .success(function (data, status, headers, config) {
                        $scope.isFileUploading = false;

                        // temporary folder
                        cat.file = {
                            fileFolder: angular.copy(data.object.fileFolder),
                            fileName: angular.copy(data.object.fileName)
                        };
                        cat.isUploaded = true;
                        cat.isNew = true;

                        // show thumbnail
                        window.previewImage(indx);

                    });
            }
        };
        $scope.currentTabId = 1;
        $scope.setActiveTab = function (tid) {
            $scope.currentTabId = tid;
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.configurations', {
                url: "/configurations",
                views: {
                    //'@': {
                    //    templateUrl: "/app/modules/menu/menu.html",
                    //    controller: 'MenuCtrl'
                    //},
                    'content@base': {
                        templateUrl: "/app/modules/admin/configuration/configuration.html",
                        controller: 'configuration',
                        resolve: {
                            gridData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getGridEntity('/api/Configuration/Search');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.configuration.view']
                },
                ncyBreadcrumb: {
                    label: 'Configurations'
                }
            });
    }
]);

homeModule.controller('configuration',
    ['$scope', '$rootScope', 'gridData', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', 'categories', '$state',
        function ($scope, $rootScope, gridData, $modal, GRID_CONSTANTS, baseFactory, modalFactory, categories, $state) {

            $scope.categories = categories;

            $scope.currentState = $state.current.name;

            $scope.gridOptions = {
                itemType: 'adminConfiguration',
                items: gridData,
                gridName: 'adminConfiguration',
                fetchUrl: '/api/Configuration/Search',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name', customSortField: 'name' },
                    { field: 'value', displayName: 'Value', customSortField: 'value' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls" permission permissions="system.configurations.edit">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openOrderStatusModal(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '</div></div>';
            }

            $scope.openOrderStatusModal = function (m) {

                var newUser = true;

                if (m != null) {
                    newUser = false;
                }

                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/configuration/editConfiguration/editConfiguration.html',
                    controller: 'editConfiguration',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-md',
                    resolve: {
                        model: function () {
                            return m;
                        },
                        isNew: function () {
                            return newUser;
                        },
                        orderStatus: function () {
                            return m;
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });

            }

        }
    ]);
(function () {
    homeModule.controller('editConfiguration', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'model', '$modalInstance', 'baseFactory', 'orderStatus', 'isNew',  '$modal', 'gridName', 'GRID_CONSTANTS'];

    function ctrl($scope, $rootScope, model, $modalInstance, baseFactory, orderStatus, isNew, $modal, gridName, GRID_CONSTANTS) {
        $scope.model = model;

        $scope.gridName = gridName;

        $scope.variableName = model.name;

        $scope.variableValue = model.value;

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.isDisabled = false;

        if ($scope.variableName == "formBuilder") {
            $scope.isDisabled = true;
        }
        

        $scope.saveConfiguration = function () {

            $scope.newConfiguration = {
                id:model.id,
                name: $scope.variableName,
                value: $scope.variableValue
            }

            baseFactory.post("/api/Configuration/save", $scope.newConfiguration).then(function (data) {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridName);
                $modalInstance.close();
            });
        }


    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.contacts', {
                url: "/contacts",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/contacts/index.html",
                        controller: 'ContactCtrl',
                        resolve: {
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: []
                },
                ncyBreadcrumb: {
                    label: 'Contacts'
                }
            });
    }
]);
homeModule.controller('ContactCtrl',
    ['$scope', '$modal', 'gridData', 'modalFactory', 'categories', '$state',
        function ($scope, $modal, gridData, modalFactory, categories, $state) {
            $scope.categories = categories;
            $scope.currentState = $state.current.name;
            $scope.gridOptions = {
                itemType: 'contact',
                gridName: 'contact',
                fetchUrl: '/api/contacts/Search',
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'name', displayName: 'Name', customSortField: 'name' },
                    { field: 'email', displayName: 'Email', customSortField: 'email' },
                    { field: 'phone', displayName: 'Phone', customSortField: 'phone' },
                    { field: 'type', displayName: 'Type', customSortField: 'type' },
                    { field: 'details', displayName: 'Details', customSortField: 'details' },
                ]
            };
        }
    ]);
homeModule.controller('CouponCtrl',
    ['$scope', '$rootScope', '$modal', 'modalFactory', '$state', 'GRID_CONSTANTS',
        function ($scope, $rootScope, $modal, modalFactory, $state, GRID_CONSTANTS) {
            $scope.gridOptions = {
                itemType: 'coupons',
                gridName: 'CouponGrid',
                fetchUrl: '/api/coupon/searchAll',
                initSortString: 'code asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'code', displayName: 'Code', customSortField: 'code' },
                    { field: 'description', displayName: 'Description', customSortField: 'description' },
                    { field: 'dateFrom', displayName: 'From', customSortField: 'dateFrom', cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateFrom | date:"dd/MM/yyyy"}}</span></div>' },
                    { field: 'dateTo', displayName: 'To', customSortField: 'dateTo', cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateTo | date:"dd/MM/yyyy"}}</span></div>' },
                    { field: 'couponAmount', displayName: 'Amount', customSortField: 'couponAmount' },
                    { field: 'couponPercentage', displayName: 'Percentage', customSortField: 'couponPercentage', cellTemplate: '<div class="ngCellText"><span ng-if=row.entity.couponPercentage>{{row.entity.couponPercentage * 100}}</span></div>' },
                    { field: 'customerIds', displayName: 'Customers', sortable: false },
                    { field: 'itemIds', displayName: 'Items', sortable: false }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openManageCoupon(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteCoupon(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteCoupon = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.code,
                    value.id,
                    'Coupon',
                    null,
                    '/api/coupon/delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageCoupon = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/coupons/modals/createEditCouponModal.html',
                    controller: 'CreateEditCouponModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        coupon: function () {
                            if (m == null) {
                                return {
                                    id: 0,
                                    code: "",
                                    description: null,
                                    dateFrom: moment(),
                                    dateTo: moment().add(5, 'days'),
                                    customerIds: null,
                                    itemIds: null,
                                    couponAmount: 0,
                                    couponPercentage: null
                                };
                            }
                            return m;
                        }
                    }
                });

                modalInstance.result.then(
                    function () {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    }, function (isReload) {
                        if (isReload) {
                            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                        }
                    });
            };


        }
    ]);
(function () {
    homeModule.controller('CreateEditCouponModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', 'coupon', 'baseFactory', 'sharedFactory', '$rootScope', '$timeout', 'isNew'];
    function ctrl($scope, $modalInstance, coupon, baseFactory, sharedFactory, $rootScope, $timeout, isNew) {

        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };

        $scope.m = angular.copy(coupon);
        $scope.m.from = angular.copy(coupon.dateFrom);
        $scope.m.to = angular.copy(coupon.dateTo);
        $scope.m.radioDiscount = $scope.m.couponAmount !== null ? 'amount' : 'percentage';

        $scope.dateRanges = {
            'Today': [moment(), moment()],
            'Next 7 Days': [moment(), moment().add(6, 'days')],
            'Next 30 Days': [moment(), moment().add(29, 'days')],
            'This Month': [moment().startOf('month'), moment().endOf('month')],
            'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
            'This Year': [moment().startOf('year'), moment().endOf('year')],
            'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')]
        };

        $scope.isNew = isNew;
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;


        if (!isNew) {
            $scope.mode = "Edit";

            if (coupon.couponPercentage !== null && coupon.couponPercentage > 0) {
                $scope.m.couponPercentage = coupon.couponPercentage * 100;
            }
        } else {
            $scope.mode = "Add";
        }

        $scope.$watch('m.radioDiscount', function (v) {
            if (v === 'amount') {
                if ($scope.m.couponAmount == null)
                    $scope.m.couponAmount = 0;
                $scope.m.couponPercentage = null;
            } else {
                if ($scope.m.couponPercentage == null)
                    $scope.m.couponPercentage = 0;
                $scope.m.couponAmount = null;
            }
        });

        $scope.save = function (m, mForm) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);

                dataToSend.customerIds = null;
                if (dataToSend.customerArr.length > 0)
                    dataToSend.customerIds = dataToSend.customerArr.join();

                dataToSend.itemIds = null;
                if (dataToSend.itemArr.length > 0)
                    dataToSend.itemIds = dataToSend.itemArr.join();

                dataToSend.dateFrom = moment(dataToSend.from).format('YYYY-MM-DD');
                dataToSend.dateTo = moment(dataToSend.to).format('YYYY-MM-DD');
                delete dataToSend.from;
                delete dataToSend.to;

                delete dataToSend.customerArr;
                baseFactory.post("/api/coupon/save/", dataToSend).then(function (rdata) {
                    if (!rdata.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(coupon);
                            $scope.m.from = angular.copy(coupon.dateFrom);
                            $scope.m.to = angular.copy(coupon.dateTo);
                            $scope.m.customerArr = [];
                            $scope.m.radioDiscount = $scope.m.couponAmount !== null ? 'amount' : 'percentage';

                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            $modalInstance.close();
                        }
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss(isReload);
        };

        // CUSTOMERS
        $scope.m.tmpCustomer = null;
        $scope.m.customerArr = $scope.m.customerIds === null || $scope.m.customerIds === '' ? [] : $scope.m.customerIds.split(',');
        $scope.getCustomer = function (val) {
            return sharedFactory.searchCustomer(val, false, false).then(function (data) {
                return data;
            });
        };
        $scope.onCustomerSelect = function ($item, $model, $label) {
            if ($scope.m.customerArr.indexOf($item.customerId) < 0) {
                $scope.m.customerArr.push($item.customerId);
            }
            $timeout(function () {
                $scope.m.tmpCustomer = null;
            }, 10);
        };
        $scope.deleteCustomer = function (indx) {
            if (indx >= 0)
                $scope.m.customerArr.splice(indx, 1);
        };

        // ITEMS
        $scope.m.tmpItem = null;
        $scope.m.itemArr = $scope.m.itemIds === null || $scope.m.itemIds === '' ? [] : $scope.m.itemIds.split(',');
        $scope.getItem = function (val) {
            return sharedFactory.searchItem(val).then(function (data) {
                return data;
            });
        };
        $scope.onItemSelect = function ($item, $model, $label) {
            if ($scope.m.itemArr.indexOf($item.itemNumber) < 0) {
                $scope.m.itemArr.push($item.itemNumber);
            }
            $timeout(function () {
                $scope.m.tmpItem = null;
            }, 10);
        };
        $scope.deleteItem = function (indx) {
            if (indx >= 0)
                $scope.m.itemArr.splice(indx, 1);
        };
    }
})();
(function () {
    'use strict';
    customerDetailsModule.config(
        ['$stateProvider',
            function ($stateProvider) {
                $stateProvider
                    .state('base.customers', {
                        url: "/customers",
                        views: {
                            'content@base': {
                                templateUrl: "/app/modules/admin/customers/views/customers.html",
                                controller: 'customerDetailsController',
                                resolve: {
                                }
                            }
                        },
                        data: {
                            permissions: ['system.customers.view']
                        },
                        ncyBreadcrumb: {
                            label: 'Customers'
                        }
                    })
                    .state('base.customers.create', {
                        url: "/create",
                        views: {
                            'content@base': {
                                templateProvider: ['$stateParams', '$templateRequest', '$rootScope',
                                    function ($stateParams, $templateRequest, $rootScope) {
                                        var templateUrl = '';
                                        if ($rootScope.clientName == "TWC" || $rootScope.clientName == "RETAILBLINDS" || $rootScope.clientName == "BLOCKOUT") {
                                            templateUrl = "/app/modules/admin/customers/views/createEditTwc.html";
                                        } else {
                                            templateUrl = "/app/modules/admin/customers/views/createEdit.html";
                                        }
                                        return $templateRequest(templateUrl);
                                    }],
                                controller: 'CustomerCreateEditCtrl',
                                resolve: {
                                    customer: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        return baseFactory.fetch('/api/customer/get/' + 0)
                                            .then(function (rdata) { return rdata.object; });
                                    }],
                                    customFields: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        return [];
                                    }],
                                    orderStatuses: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        if ($rootScope.clientName != "TWC" && $rootScope.clientName != "RETAILBLINDS" && $rootScope.clientName !== "BLOCKOUT")
                                            return [];
                                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                            return rrdata.object || [];
                                        });
                                    }]
                                }
                            }
                        },
                        data: {
                            permissions: ['system.customers.edit']
                        },
                        ncyBreadcrumb: {
                            label: 'Customer - Create'
                        }
                    })
                    .state('base.customers.edit', {
                        url: "/edit/:customerId",
                        views: {
                            'content@base': {
                                templateProvider: ['$stateParams', '$templateRequest', '$rootScope',
                                    function ($stateParams, $templateRequest, $rootScope) {
                                        var templateUrl = '';
                                        if ($rootScope.clientName == "TWC" || $rootScope.clientName == "RETAILBLINDS" || $rootScope.clientName == "BLOCKOUT") {
                                            templateUrl = "/app/modules/admin/customers/views/createEditTwc.html";
                                        } else {
                                            templateUrl = "/app/modules/admin/customers/views/createEdit.html";
                                        }
                                        return $templateRequest(templateUrl);
                                    }],
                                controller: 'CustomerCreateEditCtrl',
                                resolve: {
                                    customer: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        return baseFactory.fetch('/api/customer/get/' + $stateParams.customerId)
                                            .then(function (rdata) { return rdata.object; });
                                    }],
                                    customFields: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        return baseFactory.fetch('/api/customer/getCustomerCustomFields/' + $stateParams.customerId)
                                            .then(function (rdata) { return rdata.object; });
                                    }],
                                    orderStatuses: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        if ($rootScope.clientName != "TWC" && $rootScope.clientName != "RETAILBLINDS" && $rootScope.clientName !== "BLOCKOUT")
                                            return [];
                                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                            return rrdata.object || [];
                                        });
                                    }]
                                }
                            }
                        },
                        data: {
                            permissions: ['system.customers.edit']
                        },
                        ncyBreadcrumb: {
                            label: 'Customer - Edit'
                        }
                    })
                    .state('base.customers.manage', {
                        url: "/v/:customerId",
                        redirectTo: 'base.customers.manage.dashboard',
                        views: {
                            'content@base': {
                                templateUrl: "/app/modules/admin/customers/views/manage.html",
                                controller: 'CustomerManageController'
                            }
                        },
                        resolve: {
                            customer: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/customer/get/' + $stateParams.customerId)
                                    .then(function (rdata) { return rdata.object; });
                            }]
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}}'
                        }
                    })
                    .state('base.customers.manage.dashboard', {
                        url: "/dashboard",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/dashboard.html",
                                controller: 'CustomerDashboardController',
                                resolve: {
                                    dashboardReports: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
                                        return baseFactory.fetch('/api/reportApi/getByGroup', { id: 'customer' }).then(function (rrdata) {
                                            return rrdata.object || [];
                                        });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: 'Dashboard'
                        }
                    })
                    .state('base.customers.manage.dashboard.view', {
                        url: "/:id",
                        views: {
                            'dashboardReportView': {
                                templateUrl: "/app/modules/admin/customers/views/dashboardView.html",
                                controller: 'ReportDashboardCtrl',
                                resolve: {
                                },
                                data: {
                                    authorizedRoles: []
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            skip: true
                        }
                    })
                    .state('base.customers.manage.profile', {
                        url: "/profile",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/profile.html",
                                controller: 'CustomerProfileController',
                                resolve: {
                                    customFields: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        return baseFactory.fetch('/api/customer/getCustomerCustomFields/' + $stateParams.customerId)
                                            .then(function (rdata) { return rdata.object; });
                                    }],
                                    orderStatuses: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        if ($rootScope.clientName != "TWC" && $rootScope.clientName != "RETAILBLINDS" && $rootScope.clientName !== "BLOCKOUT")
                                            return [];
                                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                            return rrdata.object || [];
                                        });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Profile'
                        }
                    })
                    .state('base.customers.manage.profileEdit', {
                        url: "/edit",
                        views: {
                            '@base.customers.manage': {
                                templateProvider: ['$stateParams', '$templateRequest', '$rootScope',
                                    function ($stateParams, $templateRequest, $rootScope) {
                                        var templateUrl = '';
                                        if ($rootScope.clientName == "TWC" || $rootScope.clientName == "RETAILBLINDS" || $rootScope.clientName == "BLOCKOUT") {
                                            templateUrl = "/app/modules/admin/customers/views/createEditTwc.html";
                                        } else {
                                            templateUrl = "/app/modules/admin/customers/views/createEdit.html";
                                        }
                                        return $templateRequest(templateUrl);
                                    }],
                                controller: 'CustomerCreateEditCtrl',
                                resolve: {
                                    customFields: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        return baseFactory.fetch('/api/customer/getCustomerCustomFields/' + $stateParams.customerId)
                                            .then(function (rdata) { return rdata.object; });
                                    }],
                                    orderStatuses: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                        if ($rootScope.clientName != "TWC" && $rootScope.clientName != "RETAILBLINDS" && $rootScope.clientName !== "BLOCKOUT")
                                            return [];
                                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                            return rrdata.object || [];
                                        });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Profile Edit'
                        }
                    })
                    .state('base.customers.manage.contacts', {
                        url: "/contacts",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/contacts.html",
                                controller: 'CustomerContactController'
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Contacts'
                        }
                    })
                    .state('base.customers.manage.invoices', {
                        url: "/invoices",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/grid.html",
                                controller: 'invoicesCtrl',
                                resolve: {
                                    model: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                        return baseFactory.fetch('/api/Receipt/GetCreateReceiptModel', {})
                                            .then(function (rrdata) {
                                                return rrdata.object;
                                            });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Invoices'
                        }
                    })
                    .state('base.customers.manage.notes', {
                        url: "/notes",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/grid.html",
                                controller: 'CustomerNoteController',
                                resolve: {
                                    noteTypes: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                        return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                            return rrdata.object;
                                        });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Notes'
                        }
                    })
                    .state('base.customers.manage.users', {
                        url: "/users",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/users.html",
                                controller: 'UserCtrl',
                                resolve: {
                                    categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                        return baseFactory.fetch('/api/category/GetAll');
                                    }],
                                    roles: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                        return resolveFactory.getEntity('/api/roles/GetAll');
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Users'
                        }
                    })
                    .state('base.customers.manage.activityLogs', {
                        url: "/activitylogs",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/grid.html",
                                controller: 'CustomerActivityLogsController',
                                resolve: {
                                    noteTypes: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                        return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                            return rrdata.object;
                                        });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Activity Logs'
                        }
                    })
                    .state('base.customers.manage.emailLogs', {
                        url: "/emaillogs",
                        views: {
                            '@base.customers.manage': {
                                templateUrl: "/app/modules/admin/customers/views/grid.html",
                                controller: 'CustomerEmailLogsController',
                                resolve: {
                                    noteTypes: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                        return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                            return rrdata.object;
                                        });
                                    }]
                                }
                            }
                        },
                        ncyBreadcrumb: {
                            label: '{{customerName}} - Email Logs'
                        }
                    });
            }
        ]);


})();
customerDetailsModule.controller('CustomerActivityLogsController',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.gridOptions = {
                itemType: 'Activities',
                gridName: 'allCustomerActivities',
                fetchUrl: '/api/ActivityLog/SearchAllLogs?customerId=' + $stateParams.customerId,
                exportUrl: '/exportGrid/getActivityLogs/?customerId=' + $stateParams.customerId,
                initSortString: 'createddate desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
                    { field: 'createdDate', displayName: 'Time', customSortField: 'createdDate', cellFilter: 'date:\'HH:mm\'', width: "70px" },
                    { field: 'user', displayName: 'User', customSortField: 'user', width: "100px" },
                    { field: 'userFullName', displayName: 'Name', customSortField: 'userFullName', width: "150px", visibleAt: '979' },
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber', width: "150px", sortable: false },
                    { field: 'details', displayName: 'Details', customSortField: 'details', sortable: false }
                ]
            };
        }
    ]);
customerDetailsModule.controller('CustomerContactController',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            // CONTACTS
            var columnDefs = [
                    {
                        field: 'userId', displayName: '', sortable: false, width: 40,
                        cellTemplate: "<div class=\"ngCellText text-center\" ng-show=\"row.entity.userId\"><a title=\"View User\" ng-click=\"viewUser(row.entity.userId)\" class=\"cursor-pointer\"><i class=\"fa fa-user\"></i></a></div>"
                    },
                    { field: 'title', displayName: 'Title', customSortField: 'title' },
                    { field: 'firstName', displayName: 'First Name', customSortField: 'firstName' },
                    { field: 'surname', displayName: 'Last Name', customSortField: 'surname' },
                    { field: 'email', displayName: 'Email', customSortField: 'emailAddress' },
                    { field: 'phone', displayName: 'Phone', customSortField: 'phoneNumber' },
                    { field: 'mobile', displayName: 'Mobile', customSortField: 'mobile' },
                    { field: 'fax', displayName: 'Fax', customSortField: 'fax' }
            ];
            if ($rootScope.clientName == 'PPI') {
                columnDefs.push({ field: 'salesperson', displayName: 'Salesperson', customSortField: 'salesperson' });
            }
            $scope.gridOptions = {
                itemType: 'Customer Contacts',
                gridName: 'customerContacts',
                fetchUrl: '/api/customer/searchallcontacts?cid=' + $stateParams.customerId,
                initSortString: 'surname asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: columnDefs,
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group" dropdown>' +
                    '<button type="button" class=" btn-sm btn btn-default" dropdown-toggle>Manage <span class="caret"></span></button>' +
                    '<ul class="dropdown-menu">' +
                    '<li ng-if="row.entity.contactType == 2"><a ng-click="openManageUser(row.entity)">Edit</a></li>' +
                    '<li ng-if="row.entity.contactType == 1"><a ng-click="openManageContact(row.entity)">Edit</a></li>' +
                    '<li ng-if="row.entity.contactType == 1"><a ng-click="deleteEntity(row.entity)">Delete</a></li>' +
                    '<li ng-if="row.entity.contactType == 1 && row.entity.userId == null" class="divider"></li>' +
                    '<li ng-if="row.entity.contactType == 1 && row.entity.userId == null"><a ng-click="openManageUser(row.entity)">Generate User</a></li>' +
                    '</ul>' +
                    '</div>' +
                    '</div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.firstName + ' ' + value.surname,
                    value.id,
                    'Contact',
                    null,
                    '/api/customer/deletecontact/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageContact = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageContactModal.html',
                    controller: 'ManageContactModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        m: function () {
                            return m;
                        },
                        addresses: function () {
                            return $scope.$parent.m.details.addresses || [];
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

            // USERS
            $scope.openManageUser = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/user/userModal/addOrEditUserContacts.html',
                    controller: 'addOrEditUser',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        model: function () {

                        },
                        isNew: function () {
                            return false;
                        },
                        user: function () {
                            return baseFactory.fetch('/api/users/get/' + m.id).then(function (rdata) {
                                return rdata.object;
                            });
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                }).result.then(function () {
                }, function () { });
            };
            $scope.viewUser = function (id) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/user/userModal/viewUserContacts.html',
                    controller: 'addOrEditUser',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        model: function () {

                        },
                        isNew: function () {
                            return false;
                        },
                        user: function () {
                            return baseFactory.fetch('/api/users/get/' + id).then(function (rdata) {
                                return rdata.object;
                            });
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                }).result.then(function () {
                }, function () { });
            };
        }
    ]);
(function () {
    'use strict';
    customerDetailsModule.controller('CustomerCreateEditCtrl',
        ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$timeout', '$upload', '$state', '$stateParams', 'customer', 'customFields', 'orderStatuses',
            function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $timeout, $upload, $state, $stateParams, customer, customFields, orderStatuses) {

                $scope.showHeader = $state.current.name != 'base.customers.manage.profileEdit';
                if (customer.details.isSage && $scope.showHeader) {
                    $state.go('base.customers');
                } else if (customer.details.isSage) {
                    $state.go('base.customers.manage', { customerId: customer.details.customerId });
                }
                $scope.m = $state.current.name == 'base.customers.create' || $scope.isModal ? angular.copy(customer.details) : angular.copy($scope.$parent.m.details);
                if (typeof $scope.m.customerTypeOptions !== 'undefined') delete $scope.m.customerTypeOptions;
                $scope.isNew = customer.details.customerId == null;
                $scope.mode = $scope.isNew ? 'Create' : 'Edit';
                $scope.customFields = $rootScope.groupList(customFields, 'customFieldGroupName');
                $scope.submitTxt = "Save";
                $scope.disableSubmitButton = false;
                //
                $scope.m.customerTypeId = $scope.isNew ? null : $scope.m.customerTypeId;
                $scope.customerTypes = [{ id: null, name: "Select Customer Type" }];
                if (customer.details.customerTypeOptions)
                    for (var i = 0; i < customer.details.customerTypeOptions.length; i++) {
                        $scope.customerTypes.push(customer.details.customerTypeOptions[i]);
                    }
                $scope.orderStatuses = orderStatuses;
                $scope.states = [
                    {
                        id: null,
                        name: 'State'
                    }, {
                        id: 'ACT', // 4,
                        name: 'ACT'
                    }, {
                        id: 'NSW', // 5,
                        name: 'NSW'
                    }, {
                        id: 'NT', // 7,
                        name: 'NT'
                    }, {
                        id: 'QLD', // 8,
                        name: 'QLD'
                    }, {
                        id: 'SA', // 3,
                        name: 'SA'
                    }, {
                        id: 'TAS', // 6,
                        name: 'TAS'
                    }, {
                        id: 'VIC', // 1,
                        name: 'VIC'
                    }, {
                        id: 'WA', // 2,
                        name: 'WA'
                    }
                ];
                //
                $scope.dateOpened = false;
                $scope.open = function ($event) {
                    $event.preventDefault();
                    $event.stopPropagation();
                    $scope.dateOpened = true;
                };
                //
                // FILE
                $scope.fileModel = {
                    fileName: "",
                    fileFolder: ""
                };
                var isFileValid = function (filename) {
                    var extAr = filename.split('.');
                    var ext = extAr[extAr.length - 1];
                    ext = ext.toLocaleLowerCase();
                    var fType = ["jpeg", "jpg", "png"];
                    var result = fType.indexOf(ext) >= 0;

                    if (!result)
                        $scope.message = "The file " + filename + " is not valid.";

                    $timeout(function () {
                        $scope.message = null;
                    }, 2500);

                    return result;
                };
                $scope.onFileSelect = function ($files) {
                    if (isFileValid($files[0].name)) {
                        $scope.disableSubmitButton = true;
                        $scope.submitTxt = "Uploading...";
                        $scope.progress = 0;
                        $scope.upload = baseFactory
                            .upload('/api/upload/media', { oldfolder: '' }, $files)
                            .progress(function (evt) {
                                $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                            }).success(function (data, status, headers, config) {
                                $scope.resetInputFile();
                                // temporary folder
                                $scope.fileModel = data.object;
                                $scope.m.file = $scope.fileModel;
                                $scope.m.isUploaded = true;
                                $scope.m.isNew = true;
                                $scope.submitTxt = "Save";
                                $scope.disableSubmitButton = false;
                            });
                    } else {
                        $scope.resetInputFile();
                        $scope.changeFile();
                    }
                };
                $scope.changeFile = function () {
                    $scope.m.isUploaded = false;
                    $scope.m.file = {
                        fileName: "",
                        fileFolder: ""
                    };
                    $scope.m.photoThumbnailUrl = "";
                    $scope.m.isNew = true;
                };
                $scope.resetInputFile = function () {
                    var elems = document.getElementsByTagName('input');
                    for (var i = 0; i < elems.length; i++) {
                        if (elems[i].type == 'file') {
                            elems[i].value = null;
                        }
                    }
                };

                //
                $scope.openManageAddress = function (m) {
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/admin/customers/modals/manageAddressModal.html',
                        controller: 'ManageAddressModalCtrl',
                        size: 'md',
                        backdrop: 'static',
                        resolve: {
                            isNew: function () {
                                return m == null;
                            },
                            isStatic: function () {
                                return true;
                            },
                            model: function () {
                                if (m == null) {
                                    return {
                                        id: 0,
                                        customerId: $scope.m.customerId,
                                        customerName: $scope.m.name,
                                        state: null
                                    };
                                }
                                return m;
                            }
                        }
                    }).result.then(function (rdata) {
                        if (m == null) {
                            rdata.isActive = true;
                            $scope.m.addresses.push(rdata);
                        } else {
                            for (var k in rdata) {
                                m[k] = rdata[k];
                            }
                        }
                    }, function () { });
                };
                $scope.deleteAddress = function (item, index) {
                    item.isActive = false;
                    if (item.id == 0)
                        $scope.m.addresses.splice(index, 1);
                };

                //
                $scope.save = function (mform, m) {
                    // console.log(form);
                    $rootScope.formSubmit(mform);
                    if (mform.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;

                        baseFactory.post("/api/customer/save", m).then(function (data) {
                            if (!data.isErrored) {
                                if ($state.current.name == 'base.customers.create') {
                                    $state.go('base.customers', null, { reload: true });
                                } else {
                                    $scope.$parent.m.details.photoThumbnailUrl = data.object.photoThumbnailUrl;
                                    $scope.$parent.updateCustomer();
                                }
                            }
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };

                // INIT
                $scope.isLoadingSalespersons = true;
                baseFactory.fetch('/api/users/getAllSalespersons').then(function (rdata) {
                    $scope.salespersons = rdata.object;
                    $scope.isLoadingSalespersons = false;
                });
            }
        ]);
})();
customerDetailsModule.controller('CustomerDashboardController',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$state', '$stateParams', 'dashboardReports',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $state, $stateParams, dashboardReports) {
            // Dashboards
            $scope.currentDashboardReportId = null;
            $scope.dashboardReports = $rootScope.groupList(dashboardReports, "group");

            // Sidebar
            $scope.showSidebar = true;
            $scope.toggleSidebar = function (isShow) {
                $scope.showSidebar = !isShow;
                window.dispatchEvent(new Event('resize'));
            };

            // INIT
            if ($scope.dashboardReports.length > 0 && $state.current.name == 'base.customers.manage.dashboard') {
                $state.go('base.customers.manage.dashboard.view', { id: $scope.dashboardReports[0].list[0].id });
            }
        }
    ]);
customerDetailsModule.controller('CustomerEmailLogsController',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.gridOptions = {
                itemType: 'Email Log',
                gridName: 'allCustomerEmailLogs',
                fetchUrl: '/api/emailLog/getAll?customerId=' + $stateParams.customerId,
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: false,
                enablePaging: true,
                columnDefs: [
                    { field: 'from', displayName: 'From' },
                    { field: 'to', displayName: 'To' },
                    { field: 'subject', displayName: 'Subject' },
                    { field: 'status', displayName: 'Status', sortable: false },
                    { field: 'orderNumber', displayName: 'Order No.', sortable: false },
                    { field: 'purchaseOrderNumber', displayName: 'Purchase Order No.', sortable: false },
                    { field: 'dateCreated', displayName: 'Date', customSortField: 'dateCreated', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            $scope.viewEmail = function (id) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/emailLogs/modals/manageEmailLogModal.html',
                    controller: 'ManageEmailLogModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        email: function () {
                            return baseFactory.fetch('/api/emailLog/get/' + id).then(function (rdata) {
                                return rdata.object;
                            });
                        }
                    }
                });
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm">' +
                    '<a ng-click="viewEmail(row.entity.id)" class="btn btn-default" title="View">View</a>' +
                    '</div></div>';
            }
        }
    ]);
customerDetailsModule.controller('CustomerManageController',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$state', '$stateParams', 'customer',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $state, $stateParams, customer) {
            // console.log(customer);
            $scope.customerId = $stateParams.customerId;
            $scope.m = customer;
            $scope.customerName = customer.details.customerName;

            $scope.updateCustomer = function () {
                baseFactory.fetch('/api/customer/get/' + $stateParams.customerId).then(function (rdata) {
                    customer = rdata.object;
                    $scope.m = customer;
                    $scope.customerName = customer.details.customerName;
                });
            };

            // CONTACTS
            $scope.openManageContact = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageContactModal.html',
                    controller: 'ManageContactModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m === null;
                        },
                        m: function () {
                            if (m === null) {
                                return {
                                    id: 0,
                                    customerId: customer.customerId,
                                    customerName: customer.name,
                                    firstname: null,
                                    surname: null,
                                    email: null,
                                    phone: null,
                                    mobile: null,
                                    salesperson: customer.salesperson1
                                };
                            }
                            return m;
                        },
                        addresses: function () {
                            return [];
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + 'customerContacts');
                    $state.go('base.customers.manage.contacts', { customerId: $stateParams.customerId });
                }, function () { });
            };

            // NOTES
            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            if (m === null) {
                                return {
                                    id: 0,
                                    customerId: customer.customerId,
                                    customerName: customer.name,
                                    contactId: null,
                                    isVisibleCustomer: true,
                                    date: moment().format()
                                };
                            }
                            return m;
                        },
                        contacts: function () {
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: customer.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes').then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                }).result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + 'customerNotes');
                    $state.go('base.customers.manage.notes', { customerId: $stateParams.customerId });
                }, function () { });
            };

            // CUSTOM FIELDS
            $scope.openManageCustomField = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageCustomFieldModal.html',
                    controller: 'ManageCustomerCustomFieldModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            if (m === null) {
                                return {
                                    id: 0,
                                    customerId: customer.customerId,
                                    customerName: customer.name,
                                    customFieldId: null
                                };
                            }
                            return m;
                        },
                        customFields: function () {
                            return baseFactory.fetch('/api/customFields/getall', { isCustomer: true }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                }).result.then(function () {
                    $state.go('base.customers.manage.profile', { customerId: $stateParams.customerId }, { reload: true });
                }, function () { });
            };

            // USERS
            $scope.openManageUser = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/addOrEditUser.html',
                    controller: 'addOrEditUser',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        model: function () {

                        },
                        isNew: function () {
                            return true;
                        },
                        user: function () {
                            return {
                                customerId: customer.customerId,
                                customerName: customer.name,
                                userType: 3 // Client
                            };
                        },
                        gridName: function () {
                            var gridName = "Users";
                            if ($rootScope.clientName && ($rootScope.clientName.toLowerCase() === "ppi" ||
                                $rootScope.clientName.toLowerCase() === "kingpin")) {
                                gridName = "Users";
                            }
                            return gridName;
                        }
                    }
                }).result.then(function () {
                    $state.go('base.customers.manage.users', { customerId: $stateParams.customerId });
                }, function () { });
            };

            // USERS
            $scope.openMoveData = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/moveDataModal.html',
                    controller: 'ManageCustomerMoveDataModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        customerId: function () {
                            return $stateParams.customerId;
                        }
                    }
                }).result.then(function (cid) {
                    $state.go('base.customers.manage.profile', { customerId: cid }, { reload: true });
                }, function () {
                });
            };

            // INIT
            if ($state.current.name === "base.customers.manage")
                $state.go('base.customers.manage.dashboard', { customerId: $stateParams.customerId });
        }
    ]);
customerDetailsModule.controller('CustomerNoteController',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams', 'noteTypes',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams, noteTypes) {

            // NOTES
            $scope.gridOptions = {
                itemType: 'Customer Notes',
                gridName: 'customerNotes',
                fetchUrl: '/api/notes/searchall?cid=' + $stateParams.customerId,
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [],
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: '100%',
                headerRowHeight: 1,
                enableCustomFields: true,
                customFieldsHtml: customFieldsHtml(),
                extraParams: {
                    typeId: null
                },
                extraData: {
                    noteTypes: noteTypes
                },
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                var html = '<div ng-include src="\'/app/modules/admin/customers/views/noteTemplate.html\'"></div>';
                return html;
            }

            function customFieldsHtml() {
                return '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.typeId" class="form-control" ng-options="a.id as a.name for a in dg.fetchOptions.extraData.noteTypes"></select>';
            }

            function notesDetailsTemplate() {
                return '<div class="ngCellText">' +
                        '<div style="white-space: pre-line;">{{row.entity.content}}</div>' +
                    '</div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.noteType,
                    value.id,
                    'Note',
                    null,
                    '/api/notes/deletenote/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            return m;
                        },
                        contacts: function () {
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: $stateParams.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () { });
            };
        }
    ]);
customerDetailsModule.controller('CustomerProfileController',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', '$stateParams', 'customFields', 'orderStatuses',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, $stateParams, customFields, orderStatuses) {
            // console.log(customFields);
            $scope.m = $scope.$parent.m;
            $scope.customFields = $rootScope.groupList(customFields, 'customFieldGroupName');
            $scope.orderStatuses = orderStatuses;

            $scope.openManageAddress = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageAddressModal.html',
                    controller: 'ManageAddressModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        isStatic: function () {
                            return false;
                        },
                        model: function () {
                            if (m == null) {
                                return {
                                    id: 0,
                                    name: null,
                                    customerId: $scope.m.customerId,
                                    customerName: $scope.m.name,
                                };
                            }
                            return m;
                        }
                    }
                }).result.then(function (rdata) {
                    if (m == null) {
                        $scope.m.details.addresses.push(rdata);
                    } else {
                        for (var k in rdata) {
                            m[k] = rdata[k];
                        }
                    }
                }, function () { });
            };

            $scope.deleteAddress = function (item, index) {
                promptFactory.confirm("Are you sure you want to delete this address?", function (result) {
                    if (result) {
                        baseFactory.remove('/api/customer/deleteAddress/' + item.id).then(function (rrdata) {
                            $scope.m.details.addresses.splice(index, 1);
                        });
                    }
                });
            };

            // CUSTOM FIELDS
            $scope.openManageCustomField = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/viewCustomFieldModal.html',
                    controller: 'ManageCustomerCustomFieldModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return false;
                        },
                        model: function () {
                            console.log(m);
                            return m;
                        },
                        customFields: function () {
                            return baseFactory.fetch('/api/customFields/getall', { isCustomer: true }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                }).result.then(function () {
                    $state.go('base.customers.manage.profile', { customerId: $stateParams.customerId }, { reload: true });
                }, function () { });
            };
            $scope.deleteCustomField = function (entity) {
                modalFactory.openDeleteModal('Custom Field', entity.customFieldName).result.then(function (r) {
                    if (r) {
                        baseFactory.post('/api/customer/deleteCustomerCustomField/' + entity.id).then(function (rdata) {
                            baseFactory.fetch('/api/customer/getCustomerCustomFields/' + $stateParams.customerId)
                                    .then(function (rdata) {
                                        $scope.customFields = $rootScope.groupList(rdata.object || [], 'customFieldGroupName');
                                    });
                        });
                    }
                });
            }
        }
    ]);
customerDetailsModule.controller('CustomerProfileEditController',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$timeout', '$upload', '$stateParams', 'customFields', 'orderStatuses',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $timeout, $upload, $stateParams, customFields, orderStatuses) {
            //console.log(customFields);
            $scope.m = $scope.$parent.m;

            if ($scope.m.details == null) {
                $scope.m.details = {
                    customerId: angular.copy($scope.m.customerId),
                    customerName: angular.copy($scope.m.customerName),
                    apiAccess: false,
                    apiKey: null,
                    apiOrderStatus: null,
                    photoThumbnailUrl: null,
                    file: {
                        fileName: "",
                        fileFolder: ""
                    }
                };
            }
            $scope.orderStatuses = orderStatuses;
            $scope.customFields = $rootScope.groupList(customFields, 'customFieldGroupName');

            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;

            // FILE
            $scope.fileModel = {
                fileName: "",
                fileFolder: ""
            };
            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = ["jpeg", "jpg", "png", "svg"];
                var result = fType.indexOf(ext) >= 0;

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };
            $scope.onFileSelect = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        $scope.resetInputFile();
                        // temporary folder
                        $scope.fileModel = data.object;
                        $scope.m.details.file = $scope.fileModel;
                        $scope.m.details.isUploaded = true;
                        $scope.m.details.isNew = true;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };
            $scope.changeFile = function () {
                $scope.m.details.isUploaded = false;
                $scope.m.details.file = {
                    fileName: "",
                    fileFolder: ""
                };
                $scope.m.details.photoThumbnailUrl = "";
                $scope.m.details.isNew = true;
            };
            $scope.resetInputFile = function () {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };

            //
            $scope.save = function (form, m) {
                // console.log(form);
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    baseFactory.post("/api/customer/save", m).then(function (data) {
                        if (!data.isErrored) {
                            // m.id = data.object;
                            $scope.$parent.m.details.photoThumbnailUrl = data.object.photoThumbnailUrl;
                        }
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
        }
    ]);
customerDetailsModule.controller('customerDetailsController',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {
            $scope.currentState = $state.current.name;
            $scope.gridOptions = {
                itemType: 'CustomerDetails',
                gridName: 'customerDetails',
                fetchUrl: '/api/Customer/SearchAll',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'customerId', displayName: 'Customer Id', customSortField: 'IDCUST' },
                    { field: 'name', displayName: 'Customer Name', customSortField: 'NAMECUST' },
                    { field: 'phone', displayName: 'Phone', customSortField: 'Phone' },
                    { field: 'startDate', displayName: 'Start Date', customSortField: 'StartDate', cellTemplate: '<div class="ngCellText"><span>{{row.entity.startDate | date:"dd/MM/yyyy"}}</span></div>' },
                    { field: 'suburb', displayName: 'Suburb', customSortField: 'NAMECITY' },
                    { field: 'state', displayName: 'State', customSortField: 'CODESTTE' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls" permission is-sys-admin><div class="btn-group btn-group-sm"><button class="btn btn-default" ui-sref="base.customers.manage({customerId:row.entity.customerId})">Manage</button></div></div>';
            }
            
            $scope.openOrderStatusModal = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/createEditCustomer.html',
                    controller: 'createEditCustomerController',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-sm',
                    resolve: {
                        customerId: function () {
                            return m.customerId;
                        },
                        model: function () {
                            return m;
                        },
                        pricingGroups: function () {
                            return baseFactory.fetch('/api/PricingGroup/GetAll');
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
            };
        }
    ]);
customerDetailsModule.controller('CustomerSalesController',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            // DECLARATIONS
            $scope.currentTab = 1;
            $scope.dateRange = {
                from: moment().startOf('year'),
                to: moment()
            };

            // DUMMY
            $scope.chart1Config = {
                options: {
                    chart: {
                        type: 'area'
                    },
                    plotOptions: {
                        series: {
                            label: {
                                connectorAllowed: false
                            }
                        },
                        area: {
                            dataLabels: {
                                enabled: false
                            }
                        }
                    },
                    tooltip: {
                        formatter: function () {
                            return 'Amount: <b> $' + this.y + '</b><br>' +
                                'Date: <b>' + moment(this.x).format('DD/MM/YYYY') + '</b>';
                        },
                        useHTML: true
                    }
                },
                yAxis: {
                    minPadding: 0,
                    maxPadding: 0,
                    title: {
                        text: ''
                    }
                },
                xAxis: {
                    type: 'datetime',
                    labels: {
                        formatter: function () {
                            return moment(this.value).format('DD-MMM');
                        }
                    },
                    title: {
                        text: ''
                    }
                },
                title: {
                    text: ''
                },
                series: [{
                    name: 'Orders',
                    showInLegend: false,
                    data: []
                }],
                responsive: {
                    rules: [{
                        condition: {
                            maxWidth: 500
                        },
                        chartOptions: {
                            legend: {
                                layout: 'horizontal',
                                align: 'center',
                                verticalAlign: 'bottom'
                            }
                        }
                    }]
                }
            };
            $scope.chart2Config = {
                options: {
                    chart: {
                        type: 'column'
                    },
                    plotOptions: {
                        series: {
                            label: {
                                connectorAllowed: false
                            }
                        }
                    },
                    tooltip: {
                        formatter: function () {
                            return 'Amount: <b> $' + this.y + '</b><br>' +
                                'Day: <b>' + this.point.day + '</b>';
                        },
                        useHTML: true
                    }
                },
                yAxis: {
                    minPadding: 0,
                    maxPadding: 0,
                    title: {
                        text: ''
                    }
                },
                xAxis: {
                    categories: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
                    categories2: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
                },
                title: {
                    text: ''
                },
                series: [{
                    name: 'Day of week',
                    showInLegend: false,
                    data: []
                }],
                responsive: {
                    rules: [{
                        condition: {
                            maxWidth: 500
                        },
                        chartOptions: {
                            legend: {
                                layout: 'horizontal',
                                align: 'center',
                                verticalAlign: 'bottom'
                            }
                        }
                    }]
                }
            };
            $scope.chart3Config = {
                options: {
                    chart: {
                        type: 'area'
                    },
                    plotOptions: {
                        series: {
                            label: {
                                connectorAllowed: false
                            }
                        },
                        area: {
                            dataLabels: {
                                enabled: false
                            }
                        }
                    },
                    tooltip: {
                        formatter: function () {
                            return 'Amount: <b> $' + this.y + '</b><br>' +
                                'Time: <b>' + moment(this.x).format('h:mm a') + '</b>';
                        },
                        useHTML: true
                    }
                },
                yAxis: {
                    minPadding: 0,
                    maxPadding: 0,
                    title: {
                        text: ''
                    }
                },
                xAxis: {
                    type: 'datetime',
                    labels: {
                        formatter: function () {
                            return moment(this.value).format('hA');
                        }
                    },
                    title: {
                        text: ''
                    }
                },
                title: {
                    text: ''
                },
                series: [{
                    name: 'Time',
                    showInLegend: false,
                    data: []
                }],
                responsive: {
                    rules: [{
                        condition: {
                            maxWidth: 500
                        },
                        chartOptions: {
                            legend: {
                                layout: 'horizontal',
                                align: 'center',
                                verticalAlign: 'bottom'
                            }
                        }
                    }]
                }
            };

            // PUBLIC
            $scope.dateRangeChanged = function (dr) {
                var dataToSend = {
                    startDate: moment(dr.from).format('YYYY-M-DD'),
                    endDate: moment(dr.to).format('YYYY-M-DD')
                };
                baseFactory.fetch('/api/sales/summary', dataToSend).then(function (rrdata) {
                    var seriesData1 = [];
                    var seriesData2 = [];
                    var seriesData3 = [];
                    if (!rrdata.isErrored) {
                        for (var i = 0; i < rrdata.object.sales.length; i++) {
                            seriesData1.push({
                                x: moment(rrdata.object.sales[i].date).valueOf(),
                                y: rrdata.object.sales[i].amount
                            });
                        }
                        for (var i = 0; i < $scope.chart2Config.xAxis.categories.length; i++) {
                            var day = $scope.chart2Config.xAxis.categories[i];
                            var day2 = $scope.chart2Config.xAxis.categories2[i];
                            var dd = null;
                            for (var j = 0; j < rrdata.object.salesByWeek.length; j++) {
                                var sday = rrdata.object.salesByWeek[j].day;
                                if (sday.substring(0, 2) == day) {
                                    dd = {
                                        y: rrdata.object.salesByWeek[j].amount,
                                        day: rrdata.object.salesByWeek[j].day
                                    };
                                }
                            }
                            seriesData2.push(dd || { y: 0, day: day2 });
                        }
                        for (var i = 0; i < rrdata.object.salesByTime.length; i++) {
                            var time = rrdata.object.salesByTime[i].time;
                            var h = time.split(':')[0];
                            var m = time.split(':')[1];
                            seriesData3.push({
                                x: Date.UTC(1970, 1, 1, h, m),
                                y: rrdata.object.salesByTime[i].amount
                            });
                        }
                        $scope.chart1Config.series[0].data = seriesData1;
                        $scope.chart2Config.series[0].data = seriesData2;
                        $scope.chart3Config.series[0].data = seriesData3;
                    }
                });
            };

            // INIT
            // $scope.dateRangeChanged($scope.dateRange);
        }
    ]);
(function () {
    customerDetailsModule.controller('createEditCustomerController', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'customerId', 'model', '$modalInstance', 'baseFactory', '$modal', 'gridName', 'GRID_CONSTANTS', 'pricingGroups'];

    function ctrl($scope, $rootScope, customerId,  model, $modalInstance, baseFactory, $modal, gridName, GRID_CONSTANTS, pricingGroups) {
        $scope.model = model;
        $scope.pricingGroups = pricingGroups.object;
        $scope.group = null;
        $scope.gridName = gridName;
        $scope.notUpdated = true;
        init();
        function init() {
            angular.forEach($scope.pricingGroups, function(group) {
                if (model.pricingGroupId == group.id) {
                    $scope.group = group;
                };
            });
        };

        $scope.enableSave = function () {
            $scope.notUpdated = false;
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.isDisabled = false;

        if ($scope.variableName == "formBuilder") {
            $scope.isDisabled = true;
        }
        

        $scope.save = function () {

            var details = {
                id: model.detailsId,
                pricingGroupId: $scope.group.id,
                customerId: model.customerId
            }
            baseFactory.post("/api/Customer/save", details).then(function (data) {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridName);
                $modalInstance.close();
            });
        }


    }
})();
customerDetailsModule.controller('ManageAddressModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'STATES', 'model', 'isNew', 'isStatic',
        function ($scope, $rootScope, $modalInstance, baseFactory, STATES, model, isNew, isStatic) {

            $scope.isNew = isNew;
            $scope.isStatic = isStatic;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.submitTxt2 = isNew ? "Add" : "Update";
            $scope.disableSubmitButton = false;
            $scope.n = angular.copy(model);

            $scope.states = STATES;

            $scope.ok = function (form, m) {
                $rootScope.formSubmit(form);

                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    baseFactory.post("/api/customer/saveaddress", m).then(function (data) {
                        if (!data.isErrored) {
                            $modalInstance.close(data.object);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.ok2 = function (form, m) {
                $rootScope.formSubmit(form);

                if (form.$valid) {
                    $modalInstance.close(m);
                }
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
customerDetailsModule.controller('ManageContactModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'm', 'isNew', 'addresses',
        function ($scope, $rootScope, $modalInstance, baseFactory, m, isNew, addresses) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.m = angular.copy(m);
            $scope.customerAddresses = addresses;
            $scope.salespersons = [];
            $scope.isLoading = true;

            $scope.ok = function (form, m) {
                // console.log(form);
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    baseFactory.post("/api/customer/savecontact", m).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };

            // INIT
            baseFactory.fetch('/api/users/getAllSalespersons').then(function (rdata) {
                $scope.salespersons = rdata.object;
                $scope.isLoading = false;
            });
        }]);
(function () {
    'use strict';

    customerDetailsModule.controller('ManageCustomerModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', '$controller', '$timeout', '$state', 'baseFactory', 'customer', 'customFields', 'orderStatuses', 'isNew',
            function ($scope, $rootScope, $modalInstance, $controller, $timeout, $state, baseFactory, customer, customFields, orderStatuses, isNew) {
                $scope.isModal = true;
                angular.extend(this, $controller('CustomerCreateEditCtrl', { $scope: $scope, customer: customer, customFields: customFields, orderStatuses: orderStatuses }));

                $scope.isNew = isNew;
                $scope.mode = isNew ? "Create" : "Edit";

                $scope.ok = function (mform, m) {
                    $rootScope.formSubmit(mform);
                    if (mform.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;

                        baseFactory.post("/api/customer/save", m).then(function (data) {
                            if (!data.isErrored) {
                                if (!data.isErrored) {
                                    var d = angular.copy(data.object);
                                    d.name = data.object.customerName;
                                    $modalInstance.close(d);
                                } else {
                                    $scope.submitTxt = "Save";
                                    $scope.disableSubmitButton = false;
                                }
                            }
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };
                $scope.cancel = function () {
                    $modalInstance.close(false);
                };
            }]);
})();
customerDetailsModule.controller('ManageCustomerCustomFieldModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$timeout', '$state', 'baseFactory', 'model', 'customFields', 'isNew',
        function ($scope, $rootScope, $modalInstance, $timeout, $state, baseFactory, model, customFields, isNew) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.cf = angular.copy(model);
            $scope.customFields = customFields;
            $scope.showCustomField = false;
            
            if (!isNew) {
                try {
                    $scope.cf.values = $scope.cf.split(',');
                } catch (er) {
                    $scope.cf.values = [];
                }

                angular.forEach(customFields, function (cff) {
                    if (cff.id == $scope.cf.customFieldId) 
                        $scope.cf.customField = cff;
                });

                if ($scope.cf.customField.typeId == 2)
                    $scope.cf.value = parseFloat($scope.cf.value);

                $scope.showCustomField = true;
            }

            $scope.cfChange = function (cf) {
                $scope.showCustomField = false;
                try {
                    $scope.cf.customFieldId = cf.id;
                } catch (err) {
                    $scope.cf.customFieldId = null;
                }
                $timeout(function () {
                    $scope.showCustomField = true;
                }, 50);
            };

            $scope.ok = function (form, m) {
                // console.log(form);
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    var dataToSend = angular.copy(m);
                    delete dataToSend.customField;
                    baseFactory.post("/api/customer/saveCustomerCustomField", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.close(false);
            };
        }]);
angular.module('appHomeModule').controller('ManageNoteModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'model', 'noteTypes', 'contacts', 'isNew',
        function ($scope, $rootScope, $modalInstance, baseFactory, model, noteTypes, contacts, isNew) {
            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.n = angular.copy(model);
            $scope.noteTypes = noteTypes;
            $scope.contacts = contacts;
            $scope.messages = [];

            $scope.dateOpened = false;
            $scope.open = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateOpened = true;
            };
            $scope.dateOptions = {
                formatYear: 'yyyy',
                startingDay: 1
            };
            $scope.onItemSelected = function (item) {
                $scope.n.customerId = null;
                $scope.n.customerName = null;
                $scope.n.orderId = null;
                $scope.n.contactId = null;
                //
                if (item.filterName == "Customers") {
                    $scope.n.customerId = item.id;
                    $scope.n.customerName = item.name;
                } else if (item.filterName == "Contacts") {
                    $scope.n.contactId = item.contactId;
                    $scope.n.customerId = item.id;
                    $scope.n.customerName = item.description;
                } else if (item.filterName == "Orders") {
                    $scope.n.orderId = item.id;
                    $scope.n.tempOrderNumber = item.name;
                }
            };

            $scope.ok = function (form, m) {
                $rootScope.formSubmit(form);
                $scope.messages = [];
                if (m.orderId == null && m.customerId == null && m.userId == null) {
                    $scope.messages.push("Order or Customer is required");
                }
                if (form.$valid && $scope.messages.length == 0) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    baseFactory.post("/api/notes/savenote", m).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
customerDetailsModule.controller('ManageCustomerMoveDataModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'customerId',
        function ($scope, $rootScope, $modalInstance, baseFactory, customerId) {

            $scope.submitTxt = "Merge";
            $scope.disableSubmitButton = false;
            $scope.n = {
                originCustomerId: customerId,
                destinationCustomerId: null,
                destinationCustomerName: null
            };
            $scope.onItemSelected = function (opt) {
                $scope.n.destinationCustomerId = opt.id;
                $scope.n.destinationCustomerName = opt.Name;
            };
            $scope.ok = function (form, m) {
                $rootScope.formSubmit(form);

                if (form.$valid) {
                    $scope.submitTxt = "Merging...";
                    $scope.disableSubmitButton = true;

                    baseFactory.post("/api/customer/mergedata", m).then(function (data) {
                        if (!data.isErrored) {
                            $modalInstance.close(data.object);
                        } else {
                            $scope.submitTxt = "Merge";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
customFieldModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.customfields', {
                url: "/customfields",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/customFields/customFields.html",
                        controller: 'customFieldController',
                        resolve: {
                            fields: ['resolveFactory', function(resolveFactory) {
                                return resolveFactory.getGridEntity('/api/CustomFields/Search');
                            }],
                            customFieldGroups: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/CustomFields/GetAllGroups');
                            }],
                            customFieldTypes: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/CustomFields/GetAllTypes');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.customfields.view']
                },
                ncyBreadcrumb: {
                    label: 'Custom Fields'
                }
            });
    }
]);

customFieldModule.controller('customFieldController',
    [
        '$scope', '$rootScope', 'baseFactory', 'modalFactory', 'fields', '$modal', 'customFieldGroups', 'customFieldTypes', 'GRID_CONSTANTS', 'categories', '$state',
        function ($scope, $rootScope, baseFactory, modalFactory, fields, $modal, customFieldGroups, customFieldTypes, GRID_CONSTANTS, categories, $state) {

            $scope.categories = categories;

            $scope.currentState = $state.current.name;

            $scope.gridOptions = {
                itemType: 'Items',
                items: fields,
                gridName: 'Items',
                fetchUrl: '/api/CustomFields/Search',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name', customSortField: 'Name', width: "30%" },
                    { field: 'typeName', displayName: 'Type', width: "30%", sortable: false },
                    { field: 'suffix', displayName: 'Suffix', customSortField: 'suffix' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls" permission permissions="system.customfields.edit">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openCreateModal(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteCustomField(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteCustomField = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Custom Field',
                    null,
                    '/api/customfields/delete/',
                    $scope.gridOptions.gridName
                );

            }

            $scope.openCreateModal = function (item) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customFields/create/modal.html',
                    controller: 'createCustomFieldController',
                    size: 'lg',
                    backdrop: 'static',
                    // windowClass: 'app-modal-window-sm',
                    resolve: {
                        item: function () {
                            return item;
                        },
                        customFieldGroups: function () {
                            return customFieldGroups.object;
                        },
                        customFieldTypes: function () {
                            return customFieldTypes.object;
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });

            }
        }
    ]);
(function () {
    customFieldModule.controller('createCustomFieldController', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', 'item', 'customFieldGroups', 'customFieldTypes'];

    function ctrl($scope, $rootScope, baseFactory, $modalInstance, item, customFieldGroups, customFieldTypes) {
        console.log(item)
        $scope.customFieldGroups = customFieldGroups;
        $scope.customFieldTypes = customFieldTypes;
        $scope.hideGroup = true;
        $scope.submitTxt = "Save";

        if (item === null) {
            $scope.customField = { id: 0, questions: [], optionList: [], minValue: '', maxValue: '', isVisible: false };
            $scope.mode = "Add";
        } else {
            $scope.customField = item;
            if ($scope.customField.typeId < 8) {
                $scope.customField.option = item.optionArray.length > 0 ? item.optionArray.join('\n') : '';
            } else {
                $scope.customField.questions = item.options === null || item.options === '' ? [] : JSON.parse(item.options);
            }
            $scope.mode = "Edit";
        }

        function isValid() {
            return true;
        }

        $scope.addQuestion = function () {
            if (typeof $scope.customField.questions === 'undefined')
                $scope.customField.questions = [];
            if ($scope.customField.questions === null || $scope.customField.questions === '')
                $scope.customField.questions = [];

            $scope.customField.questions.push({
                question: null,
                options: []
            });
        };
        $scope.deleteQuestion = function (indx) {
            $scope.customField.questions.splice(indx, 1);
        };

        $scope.addQuestionOption = function (q) {
            if (typeof q.options === 'undefined')
                q.options = [];
            if (q.options === null || q.options === '')
                q.options = [];

            q.options.push({
                photoUrl: null,
                name: "Option " + (q.options.length + 1),
                isSelected: false,
                measurements: []
            });
        };
        $scope.deleteQuestionOption = function (q, indx) {
            q.options.splice(indx, 1);
        };

        $scope.addQuestionOptionMeasurement = function (opt) {
            if (typeof opt.measurements === 'undefined')
                opt.measurements = [];
            if (opt.measurements === null || opt.measurements === '')
                opt.measurements = [];

            opt.measurements.push({
                isSelected: false,
                name: "Measure " + (opt.measurements.length + 1),
                value: null
            });
        };
        $scope.deleteQuestionOptionMeasurement = function (opt, indx) {
            opt.measurements.splice(indx, 1);
        };

        $scope.saveCustomField = function (form) {
            $scope.submitted = true;
            if (!form.$valid || !isValid()) {
                return;
            }
            //set to default group with id 1
            $scope.customField.groupId = 1;
            if (!$scope.customField.isOrder) {
                $scope.customField.orderOptionalField = null;
            };
            if (!$scope.customField.isOrderItem) {
                $scope.customField.orderItemOptionalField = null;
            };
            
            $scope.loading = true;
            if ($scope.customField.typeId > 3 && $scope.customField.typeId < 7 && $scope.customField.option.trim() !== '') {
                $scope.customField.options = angular.toJson($scope.customField.option.split('\n'));
            } else {
                $scope.customField.options = null;
            }

            baseFactory.post("/api/customfields/save", $scope.customField).then(function (data) {
                    $modalInstance.close();
            }).finally(function () {
                    $scope.loading = false;
            });

        }

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.updateSelection = function () {
            if (!$scope.customField.isItem) {
                $scope.customField.isVisibleOnWeb = false;
            }
        }
    }
})();
(function () {
    'use strict';
    homeModule.controller('AdminDashboardReportCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', 'GRID_CONSTANTS', 'modalFactory', 'baseFactory', 'dashboardGroups'];
    function ctrl($scope, $rootScope, $modal, $state, GRID_CONSTANTS, modalFactory, baseFactory, dashboardGroups) {

        var arrDashboardGroups = angular.copy(dashboardGroups);
        arrDashboardGroups.splice(0, 0, { id: null, name: "All Groups" });
        //
        $scope.gridOptions = {
            itemType: 'AdminDashboardReport',
            gridName: 'allAdminDashboardReports',
            fetchUrl: '/api/dashboards/getAllReports',
            initSortString: 'name asc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            columnDefs: [
                { field: 'name', displayName: 'Report', customSortField: 'name' },
                { field: 'dashboardGroupName', displayName: 'Group', customSortField: 'dashboardGroupName', width: 120 },
                { field: 'sortOrder', displayName: 'Sort Order', customSortField: 'sortOrder', width: 100 },
                { field: 'published', displayName: 'Published', customSortField: 'published', width: 120, sortable: false }
            ],
            enableCustomFields: true,
            extraParams: {
                groupId: null,
                isPublished: null
            },
            extraData: {
                dashboardGroups: arrDashboardGroups,
                dahboardStatuses: [
                    { id: null, name: "All Statuses" },
                    { id: true, name: "Published" },
                    { id: false, name: "Not Published" }
                ]
            },
            controlColumnWidth: 150,
            customFieldsHtml: customFieldsHtml(),
            controlCellTemplateHtml: controlHtml()
        };
        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ui-sref="base.home.uxreporteditor({id:row.entity.id})" ng-if="!row.entity.isSchemaEmpty" class="btn btn-default" title="Designer">Designer</a>' +
                '<a ng-click="openManageDashboardReport(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '<a ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                '</div></div>';
        }
        function customFieldsHtml() {
            return '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.groupId" class="form-control" ng-options="t.id as t.name for t in dg.fetchOptions.extraData.dashboardGroups"></select>' +
                '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.isPublished" class="form-control" ng-options="r.id as r.name for r in dg.fetchOptions.extraData.dahboardStatuses"></select>';
        }

        $scope.deleteEntity = function (value) {
            modalFactory.deleteEntityFromGrid(
                value.name,
                value.id,
                'Dashboard Report',
                null,
                '/api/dashboards/deletereport/',
                $scope.gridOptions.gridName
            );
        };

        $scope.openManageDashboardReport = function (m) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/dashboardReports/modals/manageDashboardReportModal.html',
                controller: 'ManageDashboardReportModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    isNew: function () {
                        return m == null;
                    },
                    dashboardGroups: function () {
                        return baseFactory.fetch('/api/dashboards/getgroups').then(function (rrdata) {
                            return rrdata.object == null ? [] : rrdata.object;
                        });
                    },
                    gridName: function () {
                        return $scope.gridOptions.gridName;
                    },
                    roles: function () {
                        return baseFactory.fetch('/api/roles/GetAll').then(function (rrdata) {
                            return rrdata.object == null ? [] : rrdata.object;
                        });
                    },
                    m: function () {
                        var id = 0;
                        if (m != null)
                            id = m.id;
                        return baseFactory.fetch('/api/dashboards/getreport/' + id).then(function (rrdata) {
                            return rrdata.object == null ? {
                                id: 0,
                                name: null,
                                dashboardGroupId: null
                            } : rrdata.object;
                        });
                    },
                }
            });

            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            });
        };

    }

})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.dashboardReports', {
                url: "/dashboardreports",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/dashboardReports/index.html",
                        controller: 'AdminDashboardReportCtrl',
                        resolve: {
                            dashboardGroups: ["$rootScope", "$stateParams", "baseFactory",
                                function ($rootScope, $stateParams, baseFactory) {
                                    return baseFactory.fetch('/api/dashboards/getgroups').then(function (rrdata) {
                                        return rrdata.object == null ? [] : rrdata.object;
                                    });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Dashboard Reports'
                }
            });
    }
]);
homeModule.controller('ManageDashboardReportModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$modal', '$upload', '$timeout', 'baseFactory', 'modalFactory', 'm', 'dashboardGroups', 'roles', 'isNew', 'gridName',
        function ($scope, $rootScope, $modalInstance, $modal, $upload, $timeout, baseFactory, modalFactory, m, dashboardGroups, roles, isNew, gridName) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.m = angular.copy(m);
            $scope.dashboardGroups = dashboardGroups;
            var mRoles = [];

            //
            var ctrSelected = 0;
            for (var i = 0; i < roles.length; i++) {
                var isExist = false;
                if ($scope.m.roles.length > 0) {
                    for (var j = 0; j < $scope.m.roles.length; j++) {
                        if ($scope.m.roles[j].id == roles[i].id) {
                            isExist = true;
                            ctrSelected++;
                            break;
                        }
                    }
                }
                mRoles.push({
                    id: roles[i].id,
                    name: roles[i].name,
                    isSelected: isExist,
                    isShow: true
                });
            }
            $scope.isAllSelected = mRoles.length == ctrSelected;
            $scope.m.roles = angular.copy(mRoles);

            // FILE
            $scope.fileModel = {
                fileName: "",
                fileFolder: ""
            };
            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = ["xml"];
                var result = fType.indexOf(ext) >= 0;

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };
            $scope.onFileSelect = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        $scope.resetInputFile();
                        // temporary folder
                        $scope.fileModel = data.object;
                        $scope.m.fileFolder = $scope.fileModel.fileFolder;
                        $scope.m.fileName = $scope.fileModel.fileName;
                        $scope.m.isUploaded = true;
                        $scope.m.isNew = true;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };
            $scope.changeFile = function () {
                $scope.m.isUploaded = false;
                $scope.m.fileFolder = "";
                $scope.m.fileName = "";
                $scope.m.photoUrl = "";
                $scope.m.link = "";
                $scope.m.isNew = true;
            };
            $scope.resetInputFile = function () {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };
            $scope.setAllRoles = function () {
                $scope.isAllSelected = !$scope.isAllSelected;
                for (var i = 0; i < $scope.m.roles.length; i++) {
                    $scope.m.roles[i].isSelected = $scope.isAllSelected;
                }
            };

            $scope.ok = function (form, m) {
                // console.log(form);
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    var dataToSend = angular.copy(m);
                    var roles = [];
                    for (var i = 0; i < dataToSend.roles.length; i++) {
                        if (dataToSend.roles[i].isSelected) {
                            roles.push(dataToSend.roles[i]);
                        }
                    }
                    dataToSend.roles = angular.copy(roles);

                    baseFactory.post("/api/dashboards/savereport", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
(function () {
    'use strict';
    homeModule.controller('AdminDataMappingTwcCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', 'GRID_CONSTANTS', 'modalFactory', 'baseFactory'];
    function ctrl($scope, $rootScope, $modal, $state, GRID_CONSTANTS, modalFactory, baseFactory) {
        $scope.runApi = function () {
            baseFactory.fetch('/api/twcCustomOrder/processTBFOrders').then(function (rdata) { });
            // baseFactory.fetch('/api/twcCustomOrder/runOrder').then(function (rdata) { });
        };
    }

})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.datasync', {
                url: "/datasync",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/dataSync/views/index.html",
                        controller: 'AdminDataSyncCtrl'                        
                    }
                },
                data: {
                    permissions: ['system.datasync.allow']
                },
                ncyBreadcrumb: {
                    label: 'Data Sync'
                }
            });
    }
]);
(function () {
    'use strict';
    homeModule.controller('AdminDataSyncCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'GRID_CONSTANTS', 'modalFactory', 'gridTemplateFactory', 'promptFactory', 'baseFactory'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, GRID_CONSTANTS, modalFactory, gridTemplateFactory, promptFactory, baseFactory) {


        $scope.gridOptions = {
            itemType: 'Data Sync',
            gridName: 'allDataSyncs',
            fetchUrl: '/api/configuration/getDataSyncAll',
            initSortString: 'dateCreated desc',
            enableSorting: false,
            enableSearching: true,
            enablePaging: true,
            columnDefs: [
                { field: 'name', displayName: 'Name', sortable: false, width: '120px' },
                { field: 'lastResult', displayName: 'Last Result', sortable: false, width: '120px' },
                { field: 'message', displayName: 'Message', sortable: false },
                {
                    field: 'lastRun', displayName: 'Last Run', sortable: false, width: '180px', visibleAt: '1024',
                    cellTemplate: "<div class=\"ngCellText\"><span timeago=\"row.entity.lastRun\"></span></div>"
                },
                { field: 'cronTranslated', displayName: 'Schedule', sortable: false, width: '180px', visibleAt: '1024' },
                { field: 'isEnabled', displayName: 'Enabled', sortable: false, width: '80px', visibleAt: '1024' }
            ],
            controlColumnWidth: 40,
            controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls" permission permissions="system.datasync.allow">' +
                '<div class="btn-group btn-group-sm pull-right">' +
                '<a ng-click="openManageDataSync(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '</div></div>';
        }

        $scope.openManageDataSync = function (m) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/dataSync/modals/manageDataSyncModal.html',
                controller: 'manageDataSyncModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-md',
                resolve: {
                    model: function () {
                        return angular.copy(m);
                    },
                    gridName: function () {
                        return $scope.gridOptions.gridName;
                    }
                }
            });
        };

    }

})();
homeModule.controller('manageDataSyncModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'promptFactory', 'model', 'gridName', 'GRID_CONSTANTS',
        function ($scope, $rootScope, $modalInstance, baseFactory, promptFactory, model, gridName, GRID_CONSTANTS) {

            $scope.m = model;

            $scope.fullSync = function (mForm, m) {
                var dataSync = angular.copy(m);

                promptFactory.confirm("Are you sure you want to run a full data sync for " + dataSync.name + "?", function (result) {
                    if (result) {
                        $scope.save(mForm, dataSync, true);
                    }
                });
            };
            $scope.save = function (mForm, m, isFullSync) {
                $rootScope.formSubmit(mForm);

                if (mForm.$valid) {
                    var dataSync = angular.copy(m);
                    delete dataSync.configurationId;
                    delete dataSync.configurationName;
                    delete dataSync.cronTranslated;

                    var newConfiguration = {
                        id: m.configurationId,
                        name: m.configurationName,
                        value: angular.toJson(dataSync),
                        isFullSync: isFullSync
                    };
                    baseFactory.post("/api/configuration/saveDataSync", newConfiguration).then(function (data) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                        $modalInstance.close();
                    });
                }
            };

            $scope.cancel = function () {
                $modalInstance.dismiss();
            };

        }]);
homeModule.controller('DeliveryAdminBulkUpdateCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state', 'zones', 'statuses', 'twcZones', 'warehouses',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state, zones, statuses, twcZones, warehouses) {

            $scope.dtsstatuses = angular.copy(statuses);
            $scope.dtswarehouses = angular.copy(warehouses);

            // zones.unshift({ id: null, name: "All Carrier Zones" });
            statuses.unshift({ id: null, name: "All Statuses" });
            // twcZones.unshift({ id: null, name: "All Zones" });
            warehouses.unshift({ id: null, name: "All Warehouses" });
            //
            $scope.zones = angular.copy(zones);
            $scope.twcZones = angular.copy(twcZones);
            $scope.statuses = angular.copy(statuses);
            $scope.warehouses = angular.copy(warehouses);
            //
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.searchResult = null;
            $scope.resultData = null;
            $scope.currentStep = 1;
            $scope.steps = [
                {
                    step: 1,
                    title: 'Search Deliveries',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Review Deliveries',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 3,
                    title: 'Update Deliveries',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 4,
                    title: 'Confirm Update',
                    isDone: false,
                    isEditing: false
                }
            ];
            $scope.m1 = {
                deliveryDate: {
                    startDate: moment().startOf('year'),
                    endDate: moment().endOf('year')
                },
                searchText: null,
                s: null,
                z: null,
                sv: null,
                selectedShipVias: [],
                selectedCarrierZones: [],
                w: null
            };
            $scope.m2 = {
                statusId: null,
                warehouseId: null,
                comments: null,
                orderNumbers: []
            };

            // PRIVATE
            var encodeQueryData = function (data) {
                var ret = [];
                for (var d in data) {
                    if (data[d] && typeof data[d] !== 'undefined')
                        ret.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d]));
                }
                return ret.join("&");
            };
            var findValue = function (strArray, key, label, val) {
                for (var i = 0; i < $scope[strArray].length; i++) {
                    if ($scope[strArray][i][key] == val) {
                        return $scope[strArray][i][label];
                    }
                }
                return null;
            };
            var getSearchOrders = function (dataToSend, isLoadMore) {
                baseFactory.fetch('/api/twcdeliveries/searchAllManifestReports', dataToSend).then(function (rdata) {
                    if (!isLoadMore) {
                        $scope.searchResult = {
                            result: rdata.object,
                            selection: 1,
                            selected: 0,
                            exportUrl: ''
                        };
                        $scope.nextStep(2);
                    } else {
                        var ctr = 0;
                        for (var i = 0; i < rdata.object.length; i++) {
                            $scope.searchResult.result.push(rdata.object[i]);
                            ctr++;
                        }
                        if (ctr > 0)
                            $scope.searchResult.selection = 3;
                    }
                    $scope.searchResult.exportUrl = '/report/exportManifestReport/' + '?' + encodeQueryData(dataToSend);
                });
            };

            // PUBLIC
            $scope.multipleSelectSettings = {
                smartButtonMaxItems: 5,
                displayProp: 'name',
                idProp: 'id',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 7) {
                        var str = itemText.substring(0, 7);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleSelectSettings2 = {
                smartButtonMaxItems: 8,
                displayProp: 'name',
                idProp: 'id',
                smartButtonTextConverter: function (itemText, originalItem) {
                    if (itemText.length > 7) {
                        var str = itemText.substring(0, 7);
                        return str + '...';
                    }

                    return itemText;
                }
            };
            $scope.multipleTextSettings = {
                buttonDefaultText: 'Select All Zones'
            };
            $scope.multipleTextSettings2 = {
                buttonDefaultText: 'Select All Carrier Zones'
            };
            $scope.searchOrder = function (mForm, m) {
                var zoneArr = [];
                var i = 0;
                for (i = 0; i < m.selectedShipVias.length; i++) {
                    zoneArr.push(m.selectedShipVias[i].id);
                }
                var carrierArr = [];
                for (i = 0; i < m.selectedCarrierZones.length; i++) {
                    carrierArr.push(m.selectedCarrierZones[i].id);
                }
                var dataToSend = angular.copy(m);
                dataToSend.z = carrierArr.join();
                dataToSend.sv = zoneArr.join();
                dataToSend.deliveryStartDate = moment(m.deliveryDate.startDate).format('YYYY-MM-DD');
                dataToSend.deliveryEndDate = moment(m.deliveryDate.endDate).format('YYYY-MM-DD');
                dataToSend.startIndex = 1;
                dataToSend.retrieveSize = 9999999;

                delete dataToSend.deliveryDate;
                delete dataToSend.selectedShipVias;
                delete dataToSend.selectedCarrierZones;
                //
                getSearchOrders(dataToSend, false);
            };
            $scope.loadMore = function (m) {
                var dataToSend = angular.copy(m);
                dataToSend.startIndex = $scope.searchResult.result.totalItems + 1;
                dataToSend.retrieveSize = 40;
                //
                getSearchOrders(dataToSend, true);
            };
            $scope.selectRowDelivery = function (r) {
                // 1 = All unchecked
                // 2 = All checked
                // 3 = Some checked
                if (!$scope.disableSubmitButton) {
                    r.isSelected = !r.isSelected;
                    if (r.isSelected)
                        $scope.searchResult.selected++;
                    else
                        $scope.searchResult.selected--;
                    //
                    if ($scope.searchResult.selected > 0)
                        $scope.searchResult.selection = $scope.searchResult.selected === $scope.searchResult.result.length ? 2 : 3;
                    else
                        $scope.searchResult.selection = 1;
                    // Reset
                    $scope.steps[2].isDone = false;
                    $scope.steps[2].isEditing = false;
                }
            };
            $scope.selectAllRowDeliveries = function () {
                if (!$scope.disableSubmitButton) {
                    if ($scope.searchResult.selection === 1 || $scope.searchResult.selection === 3) {
                        $scope.searchResult.selection = 2;
                    } else if ($scope.searchResult.selection === 2) {
                        $scope.searchResult.selection = 1;
                    }
                    for (var i = 0; i < $scope.searchResult.result.length; i++) {
                        $scope.searchResult.result[i].isSelected = $scope.searchResult.selection === 2;
                    }
                    $scope.searchResult.selected = $scope.searchResult.selection === 2 ? $scope.searchResult.result.length : 0;
                }
            };
            $scope.updateSelectedDeliveries = function (orders) {
                $scope.m2.orderNumbers = [];
                for (var i = 0; i < orders.length; i++) {
                    if (orders[i].isSelected)
                        $scope.m2.orderNumbers.push(orders[i].orderNumber.trim() + '-' + orders[i].deliveryNumber + '-' + orders[i].delivery);
                }
                $scope.nextStep(3);
            };
            $scope.updateDelivery = function (mForm, m1, m2, searchResult) {
                $rootScope.formSubmit(mForm);
                $scope.confirmHtml = null;
                var invalidFields = 0;
                var fields = [];
                for (var k in m2) {
                    if (k == 'orderNumbers')
                        continue;

                    if (m2[k] === '')
                        m2[k] = null;

                    if (m2[k] !== null) {
                        var txt = m2[k];
                        if (k == 'statusId') {
                            label = 'Delivery Status';
                            txt = findValue('statuses', 'id', 'name', txt);
                        }
                        if (k == 'warehouseId') {
                            label = 'Delivery Warehouse';
                            txt = findValue('warehouses', 'id', 'name', txt);
                        }

                        if (k == 'comments') {
                            fields.push('<div>Comments:<div class="text-bold m-left20">' + txt + '</div></div>');
                        } else {
                            fields.push('<div>' + label + ': <strong>' + txt + '</strong></div>');
                        }
                    } else if (k == 'statusId') {
                        invalidFields++;
                    }
                }

                if (invalidFields == 0) {
                    var html = '<div class="alert alert-info mTop20 mBottom20">' + fields.join('') + '</div>';
                    var msg = '<div>You are about to update <strong>' + m2.orderNumbers.length + '</strong> deliveries with the following details;</div>' +
                        html + '<div>Are you sure you want to continue? This action cannot be undone.</div>';

                    $scope.confirmHtml = msg;
                    $scope.nextStep(4);
                }
            };
            $scope.confirmUpdate = function (mForm, m2) {
                var dataToSend = {
                    statusId: m2.statusId,
                    warehouseId: m2.warehouseId,
                    comments: m2.comments,
                    orderNumbers: m2.orderNumbers.join()
                };
                $scope.disableSubmitButton = true;
                baseFactory.post('/api/twcdeliveries/bulkupdate', dataToSend).then(function (rdata) {
                    //
                    $scope.disableSubmitButton = !rdata.isErrored;
                    if (!rdata.isErrored) {
                        $scope.resultData = rdata.object;
                        $scope.steps[3].isDone = true;
                    }
                });
            };

            //
            $scope.nextStep = function (indx) {
                $scope.goToStep(indx, false);
            };
            $scope.goToStep = function (indx, isSkip) {
                if (!$scope.disableSubmitButton) {
                    var isMove = false;
                    for (var i = 0; i < $scope.steps.length; i++) {
                        if (!isSkip) {
                            if ($scope.steps[i].step == indx - 1) {
                                $scope.steps[i].isDone = true;
                            }
                            if ($scope.steps[i].step == indx && $scope.steps[i].isDone) {
                                $scope.steps[i].isEditing = true;
                            }
                            isMove = true;
                        } else if (isSkip && $scope.steps[i].step == indx && $scope.steps[i].isDone) {
                            $scope.steps[i].isEditing = true;
                            isMove = true;
                        }
                    }
                    if (isMove)
                        $scope.currentStep = indx;
                }
            };
        }
    ]);
homeModule.controller('DeliveryBulkUpdateCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state', 'twcZones', 'statuses', 'warehouses',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state, twcZones, statuses, warehouses) {

            $scope.dtsstatuses = angular.copy(statuses);
            $scope.dtswarehouses = angular.copy(warehouses);
            $scope.dtstwcZones = angular.copy(twcZones);
            //
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.searchResult = null;
            $scope.resultData = null;
            $scope.currentStep = 1;
            $scope.steps = [
                {
                    step: 1,
                    title: 'Update Deliveries',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Confirm Update',
                    isDone: false,
                    isEditing: false
                }
            ];
            $scope.m2 = {
                statusId: null,
                warehouseId: null,
                //zoneId: null,
                comments: null,
                orderNumberStr: null,
                orderNumbers: []
            };

            // PRIVATE
            var findValue = function (strArray, key, label, val) {
                for (var i = 0; i < $scope[strArray].length; i++) {
                    if ($scope[strArray][i][key] === val) {
                        return $scope[strArray][i][label];
                    }
                }
                return null;
            };

            // PUBLIC
            $scope.updateDelivery = function (mForm, m2) {
                $rootScope.formSubmit(mForm);
                $scope.confirmHtml = null;
                var invalidFields = 0;
                var fields = [];
                for (var k in m2) {
                    if (k === 'orderNumbers') {
                        continue;
                    }
                    if (m2[k] === '')
                        m2[k] = null;

                    if (m2[k] !== null) {
                        var txt = m2[k];
                        if (k === 'orderNumberStr' || k === 'orderNumbers') {
                            m2['orderNumbers'] = txt.split("\n");
                            continue;
                        }
                        if (k === 'statusId') {
                            label = 'Delivery Status';
                            txt = findValue('dtsstatuses', 'id', 'name', txt);
                        }
                        if (k === 'warehouseId') {
                            label = 'Delivery Warehouse';
                            txt = findValue('dtswarehouses', 'id', 'name', txt);
                        }

                        if (k === 'comments') {
                            fields.push('<div>Comments:<div class="text-bold m-left20">' + txt + '</div></div>');
                        } else {
                            fields.push('<div>' + label + ': <strong>' + txt + '</strong></div>');
                        }
                    } else if (k === 'statusId' || k === 'orderNumbers') {
                        invalidFields++;
                    }
                }

                if (invalidFields === 0) {
                    var html = '<div class="alert alert-info mTop20 mBottom20">' + fields.join('') + '</div>';
                    var msg = '<div>You are about to update <strong>' + m2.orderNumbers.length + '</strong> deliveries with the following details;</div>' +
                        html + '<div>Are you sure you want to continue? This action cannot be undone.</div>';

                    $scope.confirmHtml = msg;
                    $scope.nextStep(2);
                }
            };
            $scope.confirmUpdate = function (mForm, m2) {
                var dataToSend = {
                    statusId: m2.statusId,
                    warehouseId: m2.warehouseId,
                    comments: m2.comments,
                    orderNumbers: m2.orderNumbers.join()
                };
                $scope.disableSubmitButton = true;
                $scope.resultData = null;
                baseFactory.post('/api/twcdeliveries/bulkupdate', dataToSend).then(function (rdata) {
                    //
                    $scope.disableSubmitButton = !rdata.isErrored;
                    if (!rdata.isErrored) {
                        $scope.resultData = rdata.object;
                        $scope.steps[1].isDone = true;
                    }
                });
            };

            //
            $scope.nextStep = function (indx) {
                $scope.goToStep(indx, false);
            };
            $scope.goToStep = function (indx, isSkip) {
                if (!$scope.disableSubmitButton) {
                    var isMove = false;
                    for (var i = 0; i < $scope.steps.length; i++) {
                        if (!isSkip) {
                            if ($scope.steps[i].step === indx - 1) {
                                $scope.steps[i].isDone = true;
                            }
                            if ($scope.steps[i].step === indx && $scope.steps[i].isDone) {
                                $scope.steps[i].isEditing = true;
                            }
                            isMove = true;
                        } else if (isSkip && $scope.steps[i].step === indx && $scope.steps[i].isDone) {
                            $scope.steps[i].isEditing = true;
                            isMove = true;
                        }
                    }
                    if (isMove)
                        $scope.currentStep = indx;
                }
            };
        }
    ]);
homeModule.controller('DeliveryDeviceCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', 'IMPORT_CONSTANTS', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, IMPORT_CONSTANTS, $state) {

            $scope.gridOptions = {
                itemType: 'Devices',
                gridName: 'AdminDeliveryDevice',
                fetchUrl: '/api/twcdeliveries/searchAllDevices',
                initSortString: 'deviceName asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'deviceName', displayName: 'Name' },
                    { field: 'deviceModel', displayName: 'Model' },
                    { field: 'deviceSystemName', displayName: 'System' },
                    { field: 'userFullName', displayName: 'User' },
                    {
                        field: 'dateAdded', displayName: 'Date Added',
                        cellTemplate: '<div class="ngCellText"><span timeago="row.entity.dateAdded"></span></div>'
                    },
                    {
                        field: 'dateLastLogin', displayName: 'Last Login',
                        cellTemplate: '<div class="ngCellText"><span timeago="row.entity.dateLastLogin"></span></div>'
                    }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="deleteDevice(row.entity)" class="btn btn-danger" title="Deactivate"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteDevice = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.deviceName,
                    value.id,
                    'Device',
                    null,
                    '/api/twcdeliveries/deactivatedevice/',
                    $scope.gridOptions.gridName
                );
            };
        }
    ]);
homeModule.controller('DeliveryManageCtrl',
    ['$scope', '$rootScope', '$modal', '$window', '$timeout', 'GRID_CONSTANTS', 'baseFactory', 'RemotePagerFactory', 'promptFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, $window, $timeout, GRID_CONSTANTS, baseFactory, RemotePagerFactory, promptFactory , modalFactory, $state) {

            $scope.pageContainerCss = {
                lhs: '',
                rhs: 'hidden-xs'
            };
            $scope.docWidth = 0;
            $scope.currentPageId = null;
               
            var resize = function () {
                var docHeight = (document.height !== undefined) ? document.height : document.body.offsetHeight;
                $scope.docWidth = (document.width !== undefined) ? document.width : document.body.offsetWidth;

                var ht = 0; //docWidth > 766 ? 0 : 200;

                $scope.page_items_style = {
                    height: docHeight - 180 - ht,
                    'overflow-y': 'auto',
                    'overflow-x': 'hidden'
                };
                $scope.page_item_style = {
                    height: docHeight - 260 - ht,
                    'overflow-y': 'auto',
                    'margin-bottom': 10
                };
                // loadFirstItem();
            };
            //
            $rootScope.mainContentStyle = {
                'min-height': 'initial'
            };     
            resize(); 
            angular.element($window).bind('resize', function () {
                resize();
                $scope.$apply();
            });   

            $rootScope.$on('$stateChangeSuccess', function (event, current, previous) {
                if (current.name === 'base.deliveries.manage') {
                    $scope.pageContainerCss = {
                        lhs: '',
                        rhs: 'hidden-xs'
                    };
                    $scope.currentPageId = null;
                }
            });

            $scope.searchParam = {
                url: '/api/twcdeliveries/searchAll',
                searchText: ''
            };
            $scope.pageItemList = new RemotePagerFactory($scope.searchParam, 40);

            $scope.updateSearch = function () {
                $scope.pageItemList.reload($scope.searchParam);
            };
            $scope.clearSearch = function () {
                $scope.searchParam.searchText = '';
                $scope.pageItemList.reload($scope.searchParam);
            };

            $scope.deleteItem = function (cvs) {
                promptFactory.confirm("Are you sure you want to delete this delivery?", function (result) {
                    if (result) {
                        baseFactory.remove("/api/twcdeliveries/delete/" + cvs.id, {}).then(function (rdata) {
                            if (!rdata.isErrored) {
                                $timeout(function () {
                                    $state.transitionTo("base.deliveries.manage", null, { 'reload': false });
                                    $scope.pageItemList.reload();
                                }, 100);
                            }
                        });
                    }
                });
            };
            var loadFirstItem = function () {
                if ($scope.pageItemList.items.length > 0 && $scope.currentPageId === null &&
                    $state.current.name === 'base.deliveries.manage' && $scope.docWidth > 767) {
                    $state.go('base.deliveries.manage.edit', { id: $scope.pageItemList.items[0].id });
                }
            };

            $rootScope.$on("PAGED_ON_ACTIVE", function () {
            });
            $rootScope.$on('REMOTE-PAGER-NEXT', function (ev, arg) {
                loadFirstItem();
            });
            $rootScope.$on('REMOTE-PAGER-RELOADED', function (ev, arg) {
                loadFirstItem();
            });

            $scope.searchOrderNumber = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/reworks/modals/searchOrderModal.html',
                    controller: 'SearchOrderDeliveryModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {}
                });

                modalInstance.result.then(function (orderNumber) {
                    $scope.pageItemList.reload();
                }, function () {
                });
            };
        }
    ]);
homeModule.controller('DeliveryManageCreateEditCtrl',
    ['$scope', '$rootScope', '$modal', '$window', '$filter', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', 'promptFactory', '$timeout',
        '$state', '$stateParams', 'delivery', 'statuses', 'zones', 'shipvia',
        function ($scope, $rootScope, $modal, $window, $filter, GRID_CONSTANTS, baseFactory, modalFactory, promptFactory, $timeout,
            $state, $stateParams, delivery, statuses, zones, shipvia) {

            $scope.$parent.pageContainerCss = {
                lhs: 'hidden-xs',
                rhs: 'col-xs-12'
            };

            $scope.m = delivery;
            $scope.currentStatus = "";
            $scope.currentTab = 1;
            $scope.$parent.currentPageId = $stateParams.id || $stateParams.orderId;
            var deliveryStatuses = $filter('orderBy')(angular.copy(statuses), 'sortOrder');
            $scope.zones = angular.copy(zones);
            $scope.allShipvia = angular.copy(shipvia);

            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.warehouseChanged = function (item) {
                if (item.deliveryWarehouseId !== item.deliveryWarehouse.id) {
                    item.deliveryWarehouseId = item.deliveryWarehouse.id;
                    item.deliveryWarehouseBayId = null;
                }
            };
            var saveData = function (m) {
                $scope.disableSubmitButton = true;
                var dataToSend = angular.copy(m);
                for (var i = 0; i < dataToSend.items.length; i++) {
                    delete dataToSend.items[i].warehouses;
                    delete dataToSend.items[i].deliveryWarehouse;
                }
                if (dataToSend.carrierZone === null || dataToSend.carrierZone.length === 0) {
                    dataToSend.carrierZoneId = null;
                }

                baseFactory.post("/api/twcdeliveries/save/", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $state.go('base.deliveries.manage.edit', { id: data.object });
                        $scope.$parent.pageItemList.reload();
                        $scope.m.isAddressUpdated = false;
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    }
                    $scope.disableSubmitButton = false;
                    $scope.submitTxt = "Save";
                });
            };
            $scope.save = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    saveData(m);
                }
            };

            $scope.getFilename = function (url) {
                return url.substring(url.lastIndexOf('/') + 1);
            };
            $scope.addQuantity = function (isAdd) {
                if (isAdd) {
                    $scope.m.labels++;
                } else if ($scope.m.labels > 0) {
                    $scope.m.labels--;
                }
            };

            var initDeliveryStatuses = function () {
                $scope.deliveryStatuses = [];
                $scope.currentStatus = null;

                var i = 0;
                var arrIds = [];
                for (i = 0; i < $scope.m.events.length; i++) {
                    if (arrIds.indexOf($scope.m.events[i].deliveryStatusId) < 0)
                        arrIds.push($scope.m.events[i].deliveryStatusId);
                }

                $scope.currentStatus = $scope.m.deliveryStatus;
                for (i = 0; i < deliveryStatuses.length; i++) {
                    if (arrIds.indexOf(deliveryStatuses[i].id) >= 0) {
                        deliveryStatuses[i].isDone = true;
                    } else {
                        deliveryStatuses[i].isDone = false;
                    }
                    if (deliveryStatuses[i].deliveryStatusData.cssClass && deliveryStatuses[i].deliveryTypeId == delivery.deliveryType)
                        $scope.deliveryStatuses.push(deliveryStatuses[i]);
                }
            };
            initDeliveryStatuses();

            //
            var updateDeliveryUI = function () {
                baseFactory.fetch('/api/twcdeliveries/getDeliveryEvents/' + $scope.$parent.currentPageId).then(function (rrdata) {
                    $scope.m.events = rrdata.object;
                    initDeliveryStatuses();
                    $scope.currentStatus = angular.copy($scope.m.events[0].deliveryStatus);
                    $scope.m.deliveryStatusId = angular.copy($scope.m.events[0].deliveryStatusId);
                    $scope.m.deliveryStatus = angular.copy($scope.m.events[0].deliveryStatus);
                    $scope.m.deliveryWareHouseId = angular.copy($scope.m.events[0].warehouseId);
                    $scope.m.deliveryWareHouse = angular.copy($scope.m.events[0].warehouse);
                    $scope.$parent.updateSearch();
                });
            };
            $scope.addComment = function (comment) {
                promptFactory.dialog(comment == null ? 'Add Comment' : 'Update Comment', null, "md", angular.copy(comment), 'Save', 'Cancel',
                    function (res) {
                        if (res.result) {
                            $scope.m.deliveryComments = res.inputValue;
                            saveData($scope.m);
                        }
                    },
                    {
                        isTextarea: true,
                        placeholder: 'Enter delivery comments...'
                    });
            };
            $scope.updateDeliveryStatus = function (status, orderNumber, deliveryType, deliveryTypeId, indx) {
                var isAllow = true;// false;
                if (indx > 0) {
                    var curr = $scope.deliveryStatuses[indx].isDone;
                    var prev = $scope.deliveryStatuses[indx - 1].isDone;
                    var nxt = $scope.deliveryStatuses.length === (indx + 1) ? true : !(curr < $scope.deliveryStatuses.length); // $scope.deliveryStatuses[indx + 1].isDone;
                    //
                    if (prev && curr && !nxt) {
                        isAllow = true;
                    } else if (prev && !curr && !nxt) {
                        isAllow = true;
                    } else if (prev && !curr && nxt) {
                        isAllow = true;
                    }
                }
                if (isAllow) {
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/admin/deliveries/main/modals/manageDeliveryStatusModal.html',
                        controller: 'ManageDeliveryMainStatusModalCtrl',
                        size: 'md',
                        backdrop: 'static',
                        resolve: {
                            status: function () {
                                return status;
                            },
                            statuses: function () {
                                return status != null ? [] : angular.copy(statuses);
                            },
                            warehouses: function () {
                                return baseFactory.fetch('/api/twcdeliveries/getallwarehouses').then(function (rrdata) {
                                    return rrdata.object;
                                });
                            },
                            deliveryTypeId: function () {
                                return deliveryTypeId;
                            },
                            orderNumber: function () {
                                return orderNumber + '-' + deliveryType;
                            },
                            deliveryId: function () {
                                return delivery.id;
                            }
                        }
                    }).result.then(function () {
                        if (status != null)
                            $scope.m.deliveryStatusId = status.id;
                        //
                        updateDeliveryUI();
                    }, function () { });
                }
            };
            $scope.checkTracking = function (deliveryId) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/main/modals/checkTrackingStatusModal.html',
                    controller: 'ManageDeliveryMainCheckTrackModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        deliveryId: function () {
                            return deliveryId;
                        }
                    }
                }).result.then(function (d) {
                    //
                    if (d.statusId !== null)
                        updateDeliveryUI();
                }, function () { });
            };
            $scope.editAddress = function (m) {
                function shipToLocationSelected(shipToLocation) {
                    if (!shipToLocation) {
                        shipToLocation = {};
                    }
                    // console.log(shipToLocation);
                    $scope.m.customerShipToLocationId = shipToLocation.customerShipToLocationId;
                    $scope.m.locationName = shipToLocation.locationName;
                    $scope.m.address1 = shipToLocation.address1;
                    $scope.m.address2 = shipToLocation.address2;
                    $scope.m.city = shipToLocation.city;
                    $scope.m.state = shipToLocation.state;
                    $scope.m.postcode = shipToLocation.postcode;
                    $scope.m.phone = shipToLocation.phone;
                    $scope.m.email = shipToLocation.email;
                    $scope.m.contactName = shipToLocation.contactName;
                    $scope.m.shipVia = shipToLocation.shipVia;
                    $scope.m.twcZones = angular.copy(shipvia);
                    $scope.m.isAddressUpdated = true;

                    saveData($scope.m);
                }

                $modal.open({
                    templateUrl: '/app/modules/order/shipToLocationModal/shipToLocationModal.html',
                    controller: 'shipToLocationModal',
                    size: 'lg',
                    resolve: {
                        order: function () {
                            return baseFactory.fetch('/api/twcdeliveries/getshiptolocations/' + m.orderId).then(function (rrdata) {
                                var order = angular.copy(m);
                                order.shipToLocations = rrdata.object;
                                return order;
                            });
                        },
                        isCustomer: function () {
                            return $rootScope.user.customerId || $rootScope.user.customerName;
                        },
                        twcZones: function () {
                            return [];
                        }
                    }
                }).result.then(function (shipToLocation) {
                    shipToLocationSelected(shipToLocation);
                }, function () { });
            };
            $scope.deleteItem = function (cvs) {
                promptFactory.confirm("Are you sure you want to delete this delivery?", function (result) {
                    if (result) {
                        baseFactory.remove("/api/twcdeliveries/delete/" + cvs.id, {}).then(function (rdata) {
                            if (!rdata.isErrored) {
                                $timeout(function () {
                                    $state.transitionTo("base.deliveries.manage", null, { 'reload': false });
                                    $scope.pageItemList.reload();
                                }, 100);
                            }
                        });
                    }
                });
            };

            $scope.zoneClicked = function (item) {
                $scope.m.carrierZoneId = item.id;
                $scope.m.carrierZone = item.name;
            };
            $scope.shipviaClicked = function (item) {
                $scope.m.shipVia = item;
            };

            //
            $scope.gridOptions = {
                itemType: 'Delivery logs',
                gridName: 'allDeliveryActivities',
                fetchUrl: '/api/ActivityLog/SearchAllLogs?deliveryId=' + $stateParams.id,
                initSortString: 'createddate desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: false,
                enableExport: false,
                enablePaging: false,
                columnDefs: [
                    { field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
                    { field: 'createdDate', displayName: 'Time', customSortField: 'createdDate', cellFilter: 'date:\'HH:mm\'', width: "70px" },
                    { field: 'userFullName', displayName: 'Name', customSortField: 'userFullName', width: "150px", visibleAt: '979' },
                    { field: 'deviceModel', displayName: 'Device', customSortField: 'deviceModel', width: "150px", sortable: false },
                    { field: 'details', displayName: 'Details', customSortField: 'details', sortable: false }
                ]
            };
            $scope.openSignatureModal = function (src) {

                $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/main/modals/viewSignatureModal.html',
                    controller: ['$scope', '$modalInstance', '$sce', 'imageUrl', function ($scope, $modalInstance, $sce, imageUrl) {
                        $scope.trustSrc = $sce.trustAsResourceUrl(imageUrl);
                        $scope.cancel = function () {
                            $modalInstance.dismiss();
                        };
                    }],
                    size: 'lg',
                    resolve: {
                        imageUrl: function () {
                            return src;
                        }
                    }
                }).result.then(function (shipToLocation) {
                }, function () { });
            };
        }
    ]);
homeModule.controller('DeliveryMainCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {


        }
    ]);
orderModule.controller('ManageDeliveryMainCheckTrackModalCtrl',
    ['$scope', '$modalInstance', 'baseFactory', 'deliveryId',
        function ($scope, $modalInstance, baseFactory, deliveryId) {

            $scope.disableSubmitButton = true;
            $scope.isSuccess = false;
            $scope.message = "Loading...";
            $scope.result = null;

            baseFactory.put('/api/twcdeliveries/checktracking?id=' + deliveryId).then(function (rrdata) {
                if (!rrdata.isErrored) {
                    $scope.message = rrdata.object.comment;
                    $scope.result = rrdata.object;
                    $scope.isSuccess = true;
                }
                $scope.disableSubmitButton = false;
            });
            $scope.cancel = function () {
                if ($scope.isSuccess && $scope.result !== null) {
                    $modalInstance.close($scope.result);
                } else {
                    $modalInstance.dismiss();
                }
            };
        }]);
orderModule.controller('ManageDeliveryMainStatusModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$timeout', '$state', '$cookies', 'baseFactory', 'status', 'statuses', 'orderNumber', 'deliveryId', 'deliveryTypeId', 'warehouses',
        function ($scope, $rootScope, $modalInstance, $timeout, $state, $cookies, baseFactory, status, statuses, orderNumber, deliveryId, deliveryTypeId, warehouses) {

            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.deliveryTypeId = deliveryTypeId;
            $scope.status = status;
            $scope.statuses = statuses;
            $scope.warehouses = warehouses;
            var warehouseId = $cookies.getObject(CLIENT_NAME + '_warehouse') || null;
            $scope.m = {
                // orderNumber: orderNumber.trim(),
                deliveryId: deliveryId,
                statusId: status == null ? null : status.id,
                warehouseId: warehouseId,
                comment: null
            };
            $scope.save = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    $cookies.putObject(CLIENT_NAME + '_warehouse', m.warehouseId);
                    //
                    //if (m.comment === null || m.comment.length === 0)
                    //    m.comment = status.name;
                    //
                    baseFactory.put('/api/twcdeliveries/updateDeliveryStatus?' + $rootScope.objToParam(m)).then(function (rrdata) {
                        if (!rrdata.isErrored) {
                            $modalInstance.close();
                        }
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };

        }]);
orderModule.controller('SearchOrderDeliveryModalCtrl', ['$scope', '$rootScope', '$modalInstance', '$timeout', '$state', 'promptFactory', 'baseFactory', 'clientHelperFactory',
    function ($scope, $rootScope, $modalInstance, $timeout, $state, promptFactory, baseFactory, clientHelperFactory) {
        //
        var isTwcClientVisible = clientHelperFactory.isTwcClient();
        $scope.gridOptions = {
            itemType: 'Orders',
            gridName: 'ordersTwc',
            fetchUrl: '/api/twcdeliveries/SearchOrders',
            initSortString: 'dateUpdated desc',
            enableSorting: false,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: true,
            enableExport: false,
            enableCustomButtons: true,
            pageSize: 10,
            dateRange: {
                startDate: moment('1970-01-01', 'YYYY-MM-DD'),
                endDate: moment()
            },
            columnDefs: [
                { field: 'orderDate', width: '120', displayName: 'Order Date', customSortField: 'orderDate', cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>' },
                { field: 'orderNumber', width: '120', displayName: 'Order Number', customSortField: 'orderNumber', visible: !isTwcClientVisible },
                { field: 'purchaseOrderNumber', width: '120', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
                { field: 'customerId', width: '120', displayName: 'Customer Id', customSortField: 'customerId' },
                { field: 'customerName', displayName: 'Customer Name', customSortField: 'customerName' }
            ],
            controlCellTemplateHtml: controlHtml(),
            controlColumnWidth: 80,
            extraParams: {
                // excludeDeliveries: true
            },
            extraData: {}
        };

        function controlHtml() {
            return '<div class="text-right padding-5"><a class="btn btn-primary btn-xs cursor-pointer" ng-click="createDelivery(row.entity)">Select</a></div>';
        }

        $scope.createDelivery = function (order) {
            function generate(t) {
                baseFactory.fetch('/api/twcdeliveries/generateByOrder/' + order.id, { isreprint: t }).then(function (rrdata) {
                    $modalInstance.close();
                    $state.go('base.deliveries.manage.edit', { id: rrdata.object.id });
                });
            }
            if (order.packedDate !== null) {
                promptFactory.confirm("A delivery already exists for this order.<br>Would you like to create a new delivery?", function (result) {
                    generate(!result);
                });
            } else {
                generate(true);
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };

    }]);
homeModule.controller('DeliveryStatusCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {

            $scope.gridOptions = {
                itemType: 'Delivery Statuses',
                gridName: 'AdminDeliveryStatus',
                fetchUrl: '/api/twcdeliveries/searchAllStatuses',
                initSortString: 'deliveryTypeId asc, sortOrder asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name' },
                    {
                        field: 'deliveryTypeId', displayName: 'Type',
                        cellTemplate: '<div class="ngCellText"><span ng-if="row.entity.deliveryTypeId == 1">Delivery</span><span ng-if="row.entity.deliveryTypeId == 2">Return</span></div>'
                    },
                    { field: 'sortOrder', displayName: 'Sort Order' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="manageDeliveryStatus(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteDeliveryStatus(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteDeliveryStatus = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Delivery Status',
                    null,
                    '/api/twcdeliveries/deleteStatus/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.manageDeliveryStatus = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/statuses/modals/manageDeliveryStatusModal.html',
                    controller: 'ManageDeliveryStatusModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            return m === null ? {
                                id: 0,
                                name: "",
                                code: "",
                                deliveryTypeId: 1,
                                warehouseBays: [],
                                deliveryStatusData: {
                                    availableStatuses:[]
                                }
                            } : baseFactory.fetch('/api/twcdeliveries/getstatus/' + m.id).then(function (rrdata) {
                                    return rrdata.object;
                                });
                        },
                        statuses: function () {
                            return baseFactory.fetch('/api/twcdeliveries/getallstatuses').then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

        }
    ]);
(function () {
    homeModule.controller('ManageDeliveryStatusModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'isNew', 'model', 'gridName', 'statuses'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, isNew, model, gridName, statuses) {

        $scope.isNew = isNew;
        $scope.mode = isNew ? "Add" : "Edit";
        $scope.submitTxt = "Save";
        $scope.m = angular.copy(model);
        $scope.mm = {
            name: null,
            sortOrder: null,
            id: null,
            deliveryTypeId: 1
        };
        $scope.gridName = gridName;
        $scope.statuses = [];
        $scope.deliveryTypes = [{ id: 1, name: "Delivery" }, { id: 2, name: "Return" }];
        $scope.clearStatuses = function () {
            angular.forEach($scope.statuses, function (s) {

            });
        };

        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                var dataToSend = angular.copy(n);
                //
                dataToSend.deliveryStatusData.availableStatuses = [];
                for (var i = 0; i < $scope.statuses.length; i++) {
                    if ($scope.statuses[i].isSelected && $scope.statuses[i].deliveryTypeId === dataToSend.deliveryTypeId)
                        dataToSend.deliveryStatusData.availableStatuses.push($scope.statuses[i].id);
                }
                //
                baseFactory.post("/api/twcdeliveries/saveStatus", dataToSend).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(model);
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            $modalInstance.close(n);
                        }
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };

        // INIT
        for (var i = 0; i < statuses.length; i++) {
            $scope.statuses.push({
                id: statuses[i].id,
                deliveryTypeId: statuses[i].deliveryTypeId,
                isSelected: $scope.m.deliveryStatusData.availableStatuses.indexOf(statuses[i].id) >= 0,
                name: statuses[i].name
            });
        }
    }
})();
homeModule.controller('DeliveryVehicleCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {

            $scope.gridOptions = {
                itemType: 'Delivery Vehicles',
                gridName: 'AdminDeliveryVehicle',
                fetchUrl: '/api/twcdeliveries/searchAllVehicles',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name' },
                    { field: 'registration', displayName: 'Registration' },
                    { field: 'driver', displayName: 'Driver' },
                    { field: 'arrZones', displayName: 'Zones' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="manageDeliveryVehicle(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteDeliveryVehicle(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteDeliveryVehicle = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Delivery Vehicle',
                    null,
                    '/api/twcdeliveries/deleteVehicle/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.manageDeliveryVehicle = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/vehicles/modals/manageDeliveryVehicleModal.html',
                    controller: 'ManageDeliveryVehicleModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-sm',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            return m === null ? {
                                id: 0,
                                name: "",
                                registration: "",
                                driver: "",
                                zones: []
                            } : m;
                        },
                        zones: function () {
                            return baseFactory.fetch('/api/twcdeliveries/getallCarrierZones').then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

        }
    ]);
(function () {
    homeModule.controller('ManageDeliveryVehicleModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'isNew', 'model', 'gridName', 'zones'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, baseFactory, isNew, model, gridName, zones) {

        $scope.isNew = isNew;
        $scope.mode = isNew ? "Add" : "Edit";
        $scope.submitTxt = "Save";
        $scope.m = angular.copy(model);
        $scope.gridName = gridName;
        $scope.zones = zones;

        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };

        //
        $scope.addZone = function (z) {
            if ($scope.m.zones.indexOf(z) < 0)
                $scope.m.zones.push(z);

            $timeout(function () {
                $scope.m.zone = null;
            }, 10);
        };
        $scope.deleteZone = function (indx) {
            if (indx >= 0)
                $scope.m.zones.splice(indx, 1);
        };

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(n);
                dataToSend.arrZones = n.zones.join();
                baseFactory.post("/api/twcdeliveries/saveVehicle", dataToSend).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(model);
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            $modalInstance.close(dataToSend);
                        }
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
homeModule.controller('DeliveryWarehouseCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {

            $scope.gridOptions = {
                itemType: 'Delivery Warehouses',
                gridName: 'AdminDeliveryWarehouse',
                fetchUrl: '/api/twcdeliveries/searchAllWarehouses',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name' },
                    { field: 'code', displayName: 'Code' },
                    { field: 'bayCount', displayName: 'Bays' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="manageDeliveryWarehouse(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteDeliveryWarehouse(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteDeliveryWarehouse = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Delivery Warehouse',
                    null,
                    '/api/twcdeliveries/deleteWarehouse/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.manageDeliveryWarehouse = function (m) {

                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/warehouses/modals/manageDeliveryWarehouseModal.html',
                    controller: 'ManageDeliveryWarehouseModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            return m == null ? {
                                id: 0,
                                name: "",
                                code: "",
                                warehouseBays: []
                            } : baseFactory.fetch('/api/twcdeliveries/getwarehouse/' + m.id).then(function (rrdata) {
                                    return rrdata.object;
                                });
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

        }
    ]);
(function () {
    homeModule.controller('ManageDeliveryWarehouseModalCtrl', ctrl);    
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'isNew', 'model', 'gridName'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, isNew, model, gridName) {
        
        $scope.isNew = isNew;
        $scope.mode = isNew ? "Add" : "Edit";
        $scope.submitTxt = "Save";
        $scope.m = angular.copy(model);
        $scope.mm = {
            name: null,
            code: null,
            id: null
        };
        $scope.gridName = gridName;
        
        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };
        
        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                baseFactory.post("/api/twcdeliveries/saveWarehouse", n).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(model);
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            $modalInstance.close(n);
                        }
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.manageWarehouseBay = function (m) {
            var isExist = false;
            for (var i = 0; i < $scope.m.warehouseBays.length; i++) {
                if ($scope.m.warehouseBays[i].code == m.code)
                    isExist = true;
            }
            if (!isExist) {
                $scope.m.warehouseBays.push(angular.copy(m));
                $scope.mm = {
                    name: null,
                    code: null,
                    id: null
                };
            }
        };
        $scope.deleteWarehouseBay = function (indx) {
            $scope.m.warehouseBays.splice(indx, 1);
        };
    }
})();
homeModule.controller('DeliveryZoneCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', 'IMPORT_CONSTANTS', '$state', 'zones',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, IMPORT_CONSTANTS, $state, zones) {

            $scope.currentZoneId = null;
            $scope.currentZoneName = null;
            $scope.zones = angular.copy(zones);
            $scope.locations = [];
            $scope.locationDataTemp = null;
            $scope.locationData = null;
            $scope.loadZoneLocation = function (z) {
                $scope.currentZoneId = z;
                for (var i = 0; i < $scope.zones.length; i++) {
                    if ($scope.zones[i].id == z) {
                        $scope.currentZoneName = $scope.zones[i].name;
                    }
                }
                baseFactory.fetch('/api/twcdeliveries/getAllCarrierZoneLocations', { zid: z }).then(function (rrdata) {
                    $scope.locations = rrdata.object || [];
                });
            };
            $scope.getLocations = function (filterStr) {
                return baseFactory.typeAheadFetch('/api/locations/get', filterStr);
            };
            $scope.selectLocation = function ($item) {
                $scope.locationData = {
                    id: 0,
                    carrierZoneId: $scope.currentZoneId,
                    locationId: $item.id,
                    postcode: $item.postcode,
                    stateId: $item.state.id,
                    state: $item.state.name,
                    suburb: $item.suburb
                };
            };
            $scope.addLocation = function () {
                var dataToSend = angular.copy($scope.locationData);
                dataToSend.sortOrder = $scope.locations.length;
                baseFactory.post('/api/twcdeliveries/saveCarrierZoneLocation', dataToSend).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        dataToSend.id = rrdata.object;
                        var isExist = false;
                        for (var i = 0; i < $scope.locations.length; i++) {
                            if ($scope.locations[i].id === dataToSend.id) {
                                isExist = true;
                                break;
                            }
                        }
                        if (!isExist) {
                            $scope.locations.push(angular.copy(dataToSend));
                        }
                        $scope.locationDataTemp = null;
                        $scope.locationData = null;
                    }
                });
            };
            $scope.deleteLocation = function (id) {
                baseFactory.post('/api/twcdeliveries/deleteCarrierZoneLocation/' + id).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        for (var i = 0; i < $scope.locations.length; i++) {
                            if ($scope.locations[i].id === id) {
                                $scope.locations.splice(i, 1);
                                break;
                            }
                        }
                    }
                });
            };
            $scope.importExportZone = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/zones/modals/importExportDeliveryZoneModal.html',
                    controller: 'ManageDeliveryZoneImportExportModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    baseFactory.fetch('/api/twcdeliveries/getAllCarrierZones').then(function (rrdata) {
                        $scope.zones = rrdata.object || [];
                    });
                }, function (isReload) {
                });
            };
            $scope.manageZone = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveries/zones/modals/createEditDeliveryZoneModal.html',
                    controller: 'ManageDeliveryZoneCreateEditModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m === null;
                        },
                        zone: function () {
                            return m === null ? {
                                id: 0,
                                name: null,
                                abbreviation: null,
                                carrierId: 1,
                                locations: []
                            } : m;
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    if (m === null) {
                        baseFactory.fetch('/api/twcdeliveries/getAllCarrierZones').then(function (rrdata) {
                            $scope.zones = rrdata.object || [];
                            $scope.loadZoneLocation(rrrdata.id);
                        });
                    } else {
                        $scope.loadZoneLocation(rrrdata.id);
                    }
                }, function (isReload) {
                });
            };

            function setItemSortOrder() {
                var arr = [];
                for (var i = 0; i < $scope.locations.length; i++) {
                    $scope.locations[i].sortOrder = i;
                    arr.push($scope.locations[i].id);
                }

                // SAVE
                baseFactory.post('/api/twcdeliveries/saveCarrierZoneLocationSortOrder', { ids: arr.join() }).then(function (rrdata) { });
            }
            $scope.sortableOptions = {
                handle: '> .my-handle',
                stop: function () {
                    setItemSortOrder();
                }
            };
        }
    ]);
(function () {
    homeModule.controller('ManageDeliveryZoneCreateEditModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'isNew', 'zone'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, baseFactory, isNew, zone) {

        $scope.zone = angular.copy(zone);
        $scope.mode = isNew ? 'Create' : 'Edit';
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.m = angular.copy(zone);


        $scope.ok = function (form, m) {
            $rootScope.formSubmit(form);

            if (form.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                baseFactory.post("/api/twcdeliveries/saveCarrierZone", m).then(function (data) {
                    if (!data.isErrored) {
                        m.id = data.object;
                        $modalInstance.close(m);
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
(function () {
    homeModule.controller('ManageDeliveryZoneImportExportModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'IMPORT_CONSTANTS'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, baseFactory, IMPORT_CONSTANTS) {

        $scope.resultData = null;
        $rootScope.$on(IMPORT_CONSTANTS.FILE_IMPORTED_SAVED, function (ev, d) {
            $scope.resultData = d;
        });

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.deliveryTimes', {
                url: "/deliverytimes/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/deliveryTimes/views/index.html",
                        controller: 'DeliveryTimesCtrl',
                        resolve: {
                            gridData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getGridEntity('/api/DeliveryTime/SearchAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: []
                },
                ncyBreadcrumb: {
                    label: 'Delivery Times'
                }
            });
    }
]);

homeModule.controller('DeliveryTimesCtrl',
    ['$scope', '$rootScope', 'gridData', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, gridData, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {

            $scope.currentState = $state.current.name;
            $scope.gridOptions = {
                itemType: 'DeliveryTimes',
                items: gridData,
                gridName: 'DeliveryTime',
                fetchUrl: '/api/DeliveryTime/SearchAll',
                initSortString: 'days asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'days', displayName: 'Days' },
                    { field: 'customerId', displayName: 'Customer Id' },
                    { field: 'categoryCode', displayName: 'Category Code' },
                    { field: 'itemNumber', displayName: 'Item Number' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="manageDeliveryTime(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteDeliveryTime(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteDeliveryTime = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.days,
                    value.id,
                    'Delivery Time',
                    null,
                    '/api/DeliveryTime/Delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.bulkUpdateModal = function () {

                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveryTimes/modals/manageBulkDeliveryTimeModal.html',
                    controller: 'ManageBulkDeliveryTimeModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-sm',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        model: function () {
                            return {
                                customerId: null,
                                categoryCode: null,
                                itemNumber: null,
                                itemNumbers: [],
                                days: 0
                            };
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

            $scope.manageDeliveryTime = function (m) {

                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/deliveryTimes/modals/manageDeliveryTimeModal.html',
                    controller: 'ManageDeliveryTimeModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-sm',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            return m == null ? {
                                id: 0,
                                customerId: "",
                                categoryCode: "",
                                itemNumber: "",
                                days: 0
                            } : m;
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

        }
    ]);
(function () {
    homeModule.controller('ManageBulkDeliveryTimeModalCtrl', ctrl);

    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'model', 'gridName'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, model, gridName) {

        $scope.mode = "Bulk Update";
        $scope.submitTxt = "Save";
        $scope.m = angular.copy(model);
        $scope.gridName = gridName;

        $scope.addItemNumber = function (itemNumber) {
            if ($scope.m.itemNumbers.indexOf(itemNumber) < 0) {
                $scope.m.itemNumbers.push(itemNumber);
            }
            $scope.m.itemNumber = null;
        };
        $scope.removeItemNumber = function (itemNumber) {
            var index = $scope.m.itemNumbers.indexOf(itemNumber);
            $scope.m.itemNumbers.splice(index, 1);
        };

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                var dts = {
                    customerId: n.customerId,
                    categoryCode: n.categoryCode,
                    itemNumbers: n.itemNumbers.join(),
                    days: n.days
                };
                baseFactory.post("/api/deliveryTime/bulkUpdate", dts).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        $modalInstance.close(dts);
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
(function () {
    homeModule.controller('ManageDeliveryTimeModalCtrl', ctrl);
    
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'isNew', 'model', 'gridName'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, isNew, model, gridName) {
        
        $scope.isNew = isNew;
        $scope.mode = isNew ? "Add" : "Edit";
        $scope.submitTxt = "Save";
        $scope.m = angular.copy(model);
        $scope.gridName = gridName;
        
        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };
        
        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                baseFactory.post("/api/deliveryTime/save", n).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(model);
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            $modalInstance.close(n);
                        }
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
homeModule.config(
    ['$stateProvider',
        function ($stateProvider) {
            $stateProvider
                .state('base.bulk', {
                    url: "/bulk",
                    abstract: true,
                    ncyBreadcrumb: {
                        label: 'Bulk'
                    }
                })
                .state('base.bulk.email', {
                    url: "/email",
                    views: {
                        'content@base': {
                            templateUrl: "/app/modules/admin/emailBulk/views/index.html",
                            controller: 'AdminEmailBulkCtrl',
                            resolve: {
                                emailTemplates: ['$route', 'baseFactory', function ($route, baseFactory) {
                                    return baseFactory.fetch('/api/emailtemplate/getall?isSystem=false').then(function (rrdata) {
                                        return rrdata.object || [];
                                    });
                                }]
                            }

                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Bulk Email'
                    }
                });
        }
    ]);
(function () {
    'use strict';
    homeModule.controller('AdminEmailBulkCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', '$timeout', '$sce',
        'modalFactory', 'promptFactory', 'baseFactory', 'emailTemplates'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, $timeout, $sce,
        modalFactory, promptFactory, baseFactory, emailTemplates) {

        // DECLARATIONS
        $scope.submitTxt = "Send";
        $scope.disableSubmitButton = false;
        $scope.isEmailSent = false;
        $scope.resultData = null;
        $scope.emailTemplates = [
            { id: null, name: "None", body: null, subject: null }
        ];
        for (var i = 0; i < emailTemplates.length; i++) {
            $scope.emailTemplates.push(emailTemplates[i]);
        }
        $scope.showEditor = false;
        $scope.m = {
            templateId: null,
            recipients: [],
            attachments: [],
            subject: "",
            body: "",
            insertAsAttachment: true
        };
        $scope.variables = [
            { id: 1, name: "{{CompanyName}}" },
            { id: 2, name: "{{FirstName}}" },
            { id: 3, name: "{{Surname}}" },
            { id: 4, name: "{{Username}}" },
            { id: 6, name: "{{Email}}" }
        ];

        // Email Templates
        $scope.setEmailTemplate = function (templateId) {
            $scope.showEditor = false;
            for (var i = 0; i < $scope.emailTemplates.length; i++) {
                if (templateId == $scope.emailTemplates[i].id) {
                    // console.log($scope.emailTemplates[i]);
                    for (var k in $scope.emailTemplates[i]) {
                        $scope.m[k] = angular.copy($scope.emailTemplates[i][k]);
                    }

                    $scope.m.id = null;

                    $timeout(function () {
                        $scope.showEditor = true;
                    }, 500);
                    break;
                }
            }
        };
        $scope.saveEmailTemplate = function (mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                //
                var templateModel = angular.copy(m);
                templateModel.id = templateModel.templateId;
                templateModel.from = "";
                delete templateModel.templateId;

                var updateList = function (rdata) {
                    // Success
                    var indx = -1;
                    for (var i = 0; i < $scope.emailTemplates.length; i++) {
                        if (rdata.id == $scope.emailTemplates[i].id)
                            indx = i;
                    }

                    if (indx >= 0) {
                        $scope.emailTemplates[indx] = rdata;
                    } else {
                        $scope.emailTemplates.push(rdata);
                    }
                };

                if (m.templateId == null) {
                    // CREATE
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/admin/emailBulk/modals/manageEmailTemplateModal.html',
                        controller: 'ManageEmailBulkTemplateCtrl',
                        size: 'md',
                        backdrop: 'static',
                        windowClass: 'app-modal-window',
                        resolve: {
                            model: function () {

                                return templateModel;
                            }
                        }
                    });

                    modalInstance.result.then(function (rdata) {
                        updateList(rdata);
                    });
                } else {
                    // UPDATE
                    baseFactory.post("/api/emailtemplate/CreateOrUpdateEmailTemplate", templateModel).then(function (data) {
                        if (!data.isErrored) {
                            updateList(data.object);
                            $modalInstance.close(data.object);
                        }
                    });
                }
            }
        };

        // Recipients
        $scope.addRecipients = function (tRecipients) {
            angular.forEach(tRecipients, function (tRecipient) {
                var isExist11 = false;
                angular.forEach($scope.m.recipients, function (u) {
                    if (u.id == tRecipient.id)
                        isExist11 = true;
                });
                if (!isExist11 && tRecipient.email) {
                    $scope.m.recipients.push(tRecipient);
                }
            });
        };
        $scope.removeAllRecipients = function () {
            $scope.m.recipients = [];
        };
        $scope.removeRecipient = function (usr) {
            var indx = -1;
            angular.forEach($scope.m.recipients, function (u, i) {
                if (u.id == usr.id)
                    indx = i;
            });
            if (indx >= 0)
                $scope.m.recipients.splice(indx, 1);
        };

        // Upload Document
        var isDocument = true;
        var isMedia = true;
        $scope.trustSrc = function (src) {
            return $sce.trustAsResourceUrl(src);
        }
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["png", "jpg", "jpeg", "gif", "doc", "docx", "xls", "xlsx", "pdf", "txt"];
                result = fType.indexOf(ext) >= 0;
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.m.name == '' || typeof $scope.m.name === 'undefined') {
                    $scope.m.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '', isDirect: true }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;

                            $scope.m.attachments.push({
                                fileFolder: $scope.fileModel.fileFolder,
                                fileName: $scope.fileModel.fileName,
                                url: '/api/file/showImage?filefolder=' + $scope.fileModel.fileFolder + '&filename=' + $scope.fileModel.fileName,
                                photoThumbnailUrl: '/api/file/showImage?filefolder=' + $scope.fileModel.fileFolder + '&filename=' + $scope.fileModel.fileName,
                                isUploaded: true,
                                isDeleted: false,
                                isNew: true
                            });
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
            }
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };
        $scope.removeFile = function (file, indx) {
            file.isDeleted = true;
        };

        //
        $scope.insertAsAttachmentChange = function () {
            if (!$scope.m.insertAsAttachment) {
                $scope.m.attachments = [];
            }
        };

        // Saved
        $scope.saveForm = function (mForm, m, isTest) {
            $rootScope.formSubmit(mForm);
            console.log(mForm.$valid, m)

            if (mForm.$valid && m.recipients.length > 0) {
                $scope.submitTxt = "Sending...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);
                dataToSend.isTest = isTest;
                dataToSend.attachments = [];
                dataToSend.body = '<div>' + dataToSend.body + '</div>';

                for (var i = 0; i < m.attachments.length; i++) {
                    if (!m.attachments[i].isDeleted) {
                        dataToSend.attachments.push(m.attachments[i]);
                    }
                }

                baseFactory.post('/api/users/bulkEmail', dataToSend).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.isEmailSent = true;
                        $scope.resultData = rdata.object;
                    }
                    $scope.submitTxt = "Send";
                    $scope.disableSubmitButton = false;
                });
            }
        };

        $scope.showEditor = true;

        $scope.mediumButtons = ['bold', 'italic', 'underline', 'unorderedlist', 'orderedlist', 'fontname', 'fontsize', 'anchor', 'h2', 'h3', 'html'];
        $scope.mediumEditorAddons = {
            images: {
                fileUploadOptions: {
                    url: '/api/upload/articleimage',
                    acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
                    beforeSend: function (xhr, data) {
                        xhr.setRequestHeader('ClientKey', 1);
                        xhr.setRequestHeader('IsMobile', true);
                    }
                }
            },
            embeds: false
        };
    }

})();
(function () {
    homeModule.controller('ManageEmailBulkTemplateCtrl', ctrl);

    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'model'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, model) {

        $scope.submitTxt = "Save";
        model.isSystem = false;
        $scope.m = model;

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                baseFactory.post("/api/emailtemplate/CreateOrUpdateEmailTemplate", n).then(function (data) {
                    if (!data.isErrored) {
                        $modalInstance.close(data.object);
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.emaillogs', {
                url: "/emaillogs",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/emailLogs/views/index.html",
                        controller: 'AdminEmailLogCtrl'                        
                    }
                },
                ncyBreadcrumb: {
                    label: 'Email Logs'
                }
            });
    }
]);
(function () {
    'use strict';
    homeModule.controller('AdminEmailLogCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'GRID_CONSTANTS', 'modalFactory', 'gridTemplateFactory', 'promptFactory', 'baseFactory'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, GRID_CONSTANTS, modalFactory, gridTemplateFactory, promptFactory, baseFactory) {


        $scope.gridOptions = {
            itemType: 'Email Log',
            gridName: 'allEmailLogs',
            fetchUrl: '/api/emailLog/getAll' + ($stateParams.uid ? '?uid=' + $stateParams.uid : ''),
            initSortString: 'dateCreated desc',
            enableSorting: true,
            enableSearching: true,
            enableDateRange: true,
            enableExport: false,
            enablePaging: true,
            columnDefs: [
                { field: 'from', displayName: 'From' },
                { field: 'to', displayName: 'To' },
                { field: 'subject', displayName: 'Subject' },
                { field: 'status', displayName: 'Status', sortable: false },
                { field: 'orderNumber', displayName: 'Order No.', sortable: false },
                { field: 'purchaseOrderNumber', displayName: 'Purchase Order No.', sortable: false },
                { field: 'dateCreated', displayName: 'Date', customSortField: 'dateCreated', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" }
            ],
            controlCellTemplateHtml: controlHtml()
        };

        //function controlHtml() {
        //    return '<div class="controls">' +
        //        '<div class="btn-group btn-group-sm pull-right">' +
        //        '<a ng-click="openManageCategory(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
        //        '<a ng-click="deleteCategory(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
        //        '</div></div>';
        //}

        $scope.viewEmail = function (id) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/emailLogs/modals/manageEmailLogModal.html',
                controller: 'ManageEmailLogModalCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    email: function () {
                        return baseFactory.fetch('/api/emailLog/get/' + id).then(function (rdata) {
                            return rdata.object;
                        });
                    }
                }
            });
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ng-click="viewEmail(row.entity.id)" class="btn btn-default" title="View">View</a>' +
                '</div></div>';
        }

    }

})();
homeModule.controller('ManageEmailLogModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$sce', 'baseFactory', 'email',
        function ($scope, $rootScope, $modalInstance, $sce, baseFactory, email) {

            $scope.m = email;
            
            // emailLogFrame
            setTimeout(function() {
                // 
                email.body = email.body.replace('<table style="', '<table style="table-layout: fixed;');

                // RENDER iFrame
                var iframe = document.getElementById('emailLogFrame'),
                    iframedoc = iframe.contentDocument || iframe.contentWindow.document;
                iframedoc.body.innerHTML = $sce.trustAsHtml(email.body);
            }, 10);
            
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };

        }]);
orderModule.controller('OrderEmailLogsCtrl', function ($scope, $rootScope, $modalInstance, $modal, baseFactory, GRID_CONSTANTS, orderId) {

    $scope.orderId = orderId;

    $scope.gridOptions = {
        itemType: 'Order Email Log',
        gridName: 'allOrderEmailLogs',
        fetchUrl: '/api/emailLog/getAll?orderId=' + orderId,
        initSortString: 'dateCreated desc',
        enableSorting: false,
        enableSearching: false,
        enablePaging: true,
        enableDateRange: false,
        columnDefs: [
            { field: 'from', displayName: 'From' },
            { field: 'to', displayName: 'To' },
            { field: 'subject', displayName: 'Subject' },
            { field: 'status', displayName: 'Status', sortable: false },
            { field: 'dateCreated', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
            { field: 'edit', width: "100px", displayName: '', cellTemplate: controlHtml() }
        ]
    };

    $scope.viewEmail = function (id) {
        var modalInstance = $modal.open({
            templateUrl: '/app/modules/admin/emailLogs/modals/manageEmailLogModal.html',
            controller: 'ManageEmailLogModalCtrl',
            size: 'lg',
            backdrop: 'static',
            resolve: {
                email: function () {
                    return baseFactory.fetch('/api/emailLog/get/' + id).then(function (rdata) {
                        return rdata.object;
                    });
                }
            }
        });
    };

    function controlHtml() {
        return '<div class="controls">' +
            '<div class="btn-group btn-group-sm">' +
            '<a ng-click="viewEmail(row.entity.id)" class="btn btn-default" title="View">View</a>' +
            '</div></div>';
    }

    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };

});
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.emailtemplates', {
                url: "/emailtemplates",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/emailTemplate/email.html",
                        controller: 'email',
                        resolve: {
                            emailTemplateData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getEntity('/api/emailtemplate/getall');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                        
                    }
                },
                data: {
                    permissions: ['system.emailtemplates.view']
                },
                ncyBreadcrumb: {
                    label: 'Email Templates'
                }
            });
    }
]);
homeModule.controller('email',
['$scope', '$modal', 'emailTemplateData', 'categories', '$state',
function ($scope, $modal, emailTemplateData, categories, $state) {

    $scope.categories = categories;
    $scope.currentState = $state.current.name;

    $scope.data = [];
    $scope.variables = [
        { id: 1, name: "{{CompanyName}}" },
        { id: 2, name: "{{FirstName}}" },
        { id: 3, name: "{{Surname}}" },
        { id: 4, name: "{{Username}}" },
        { id: 5, name: "{{Password}}" },
        { id: 6, name: "{{Data}}" },
        { id: 7, name: "{{EmailItemStatusMessage}}" },
        { id: 8, name: "{{OrderId}}" },
        { id: 9, name: "{{ClientName}}" },
        { id: 10, name: "{{ItemName}}" },
        { id: 11, name: "{{ItemNumber}}" },
        { id: 12, name: "{{PurchaseOrder}}" },
        { id: 13, name: "{{OrderNumber}}" }
    ];

    angular.forEach(emailTemplateData, function (value) {
        var emailTemplateName = {
            name: value.name,
            subject: value.subject,
            body: value.body,
            from: value.from,
            id: value.id,
            isSystem: value.isSystem,
            variables: angular.copy($scope.variables)
        };
        $scope.data.push(emailTemplateName);
    });


    $scope.myField = [
         { field: 'name', displayName: 'Name', width: '30%' },
         { field: 'subject', displayName: 'Subject', width: '50%' },
         {
             field: '', displayName: '', width: '20%', cellTemplate: '<div class="controls" permission permissions="system.emailtemplates.edit">' +
                  '<div class="btn-group btn-group-sm pull-right">' +
                  '<a ng-click="editEmailTemplate(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                  '</div></div>'
         }
    ];



    $scope.emailTemplate = {
        data: 'data',
        columnDefs: 'myField',
        rowHeight: 34,
        plugins: [new ngGridFlexibleHeightPlugin()]
    };


    $scope.editEmailTemplate = function (entity) {
        var modalInstance = $modal.open({
            templateUrl: '/app/modules/admin/emailTemplate/editTemplateModal/editTemplate.html',
            controller: 'editEmailTemplate',
            size: 'md',
            backdrop: 'static',
            windowClass: 'app-modal-window',
            resolve: {
                model: function () {
                    return entity;
                }
            }
        });
    }

}
]);
(function () {
    homeModule.controller('editEmailTemplate', ctrl);
    ctrl.$inject = ['$scope', 'model', '$modalInstance', 'baseFactory', '$modal'];

    function ctrl($scope, model, $modalInstance, baseFactory, $modal) {
        $scope.model = model;

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.variables = { emailVar: null };
        
        $scope.ok = function (form) {
            $scope.submitTxt = "Saving...";
            $scope.disableSubmitButton = true;

            baseFactory.post("/api/emailtemplate/CreateOrUpdateEmailTemplate", $scope.model).then(function (data) {
                if (!data.isErrored) {
                    if ($scope.isAddAnotherField) {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    } else {
                        $modalInstance.close($scope.model);
                    }
                } else {
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                }
            });
        };
    }
})();
formBuilderModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.formbuilder', {
                url: "/formbuilder",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/formBuilder/formBuilder.html",
                        controller: 'formBuilder',
                        resolve: {
                            configuration: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/Configuration/GetConfiguration?name=formBuilder');
                            }],
                            items: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/item/getAll');
                            }],
                            customFields: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/CustomFields/GetAll');
                            }]
                        }
                        
                    }
                },
                data: {
                    permissions: ['system.formbuilder.view']
                },
                ncyBreadcrumb: {
                    label: 'Form Builder'
                }
            });
    }
]);
(function () {
    'use strict';
    formBuilderModule.controller('formBuilder', formBuilder);
    formBuilder.$inject = ['$scope', '$modal', 'baseFactory', 'enumFactory', 'configuration', 'items', 'customFields'];
    function formBuilder($scope, $modal, baseFactory, enumFactory, configuration, items, customFields) {

        $scope.saveAll = saveAll;
        $scope.addCategory = addCategory;
        $scope.removeCategory = removeCategory;
        $scope.setConfig = setConfig;
        $scope.setItemConfig = setItemConfig;
        $scope.dependantFieldChanged = dependantFieldChanged;
        $scope.clearFieldConfig = clearFieldConfig;
        $scope.clearItemConfig = clearItemConfig;
        $scope.cloneConfiguration = cloneConfiguration;
        $scope.workOrderConfig = workOrderConfig;
        $scope.remove = removeParent;
        $scope.viewJson = viewJson;

        init();
        function init() {
            $scope.groups = configuration && configuration.value ? JSON.parse(configuration.value) : [];
            // console.log($scope.groups);
            $scope.items = items;
            angular.forEach($scope.groups, function (item) {
                removeHashKeys(item);
            });

            $scope.customFields = customFields;
            angular.forEach(items, function (blindType) {
                var foundBlind = false;
                angular.forEach($scope.groups, function (group) {
                    if (blindType.itemNumber === group.itemNumber) {
                        foundBlind = true;
                        group.description = blindType.description;
                    }
                });
                if (!foundBlind)
                    $scope.groups.push({
                        itemNumber: blindType.itemNumber,
                        description: blindType.description,
                        questions: []
                    });
            });

            angular.forEach($scope.groups, function (group, index) {
                var groupInItems = false;

                angular.forEach(items, function (item) {
                    if (item.itemNumber === group.itemNumber) {
                        groupInItems = true;
                    }
                });

                if (!groupInItems) {
                    $scope.groups.splice(index, 1);
                }
            });

            //quirk of dropdowns. Need to go through each dependant field and reset them against the custom fields
            angular.forEach($scope.groups, function (group) {
                angular.forEach(group.questions, function (question) {

                    applyCustomFieldToQuestion(question);


                    if (!question.dependantField)
                        return;
                    angular.forEach($scope.customFields, function (field) {
                        if (field.id == question.dependantField.id)
                            question.dependantField = field;
                    });
                });
            });

        }

        function removeHashKeys(group) {
            if (group.$$hashKey) {
                group.$$hashKey = undefined;
                delete group.$$hashKey;
            }

            if (group.questions) {
                angular.forEach(group.questions, function (q) {
                    if (q.$$hashKey) {
                        q.$$hashKey = undefined;
                        delete q.$$hashKey;
                    }
                });
            }
        }

        function setConfig(question, group) {
            var modal = $modal.open({
                templateUrl: '/app/modules/admin/formBuilder/modals/dependantConfigModal.html',
                controller: 'dependantConfigModal',
                size: 'lg',
                resolve: {
                    question: function () {
                        return angular.copy(question);
                    },
                    customFields: function () {
                        return $scope.customFields;
                    },
                    itemNumber: function () {
                        return group.itemNumber;
                    },
                    items: function () {
                        return items;
                    }
                }
            });

            modal.result.then(function (result) {
                question.dependantField = angular.copy(result.dependantField);
                question.dependantFieldOptions = angular.copy(result.fieldOptions);
                question.dependantItemOptions = angular.copy(result.itemOptions);
            }, function () { });
        }

        function setItemConfig(question, group) {
            var modal = $modal.open({
                templateUrl: '/app/modules/admin/formBuilder/modals/dependantConfigModal.html',
                controller: 'dependantConfigModal',
                size: 'lg',
                resolve: {
                    question: function () {
                        return question;
                    },
                    customFields: function () {
                        return $scope.customFields;
                    },
                    itemNumber: function () {
                        return group.itemNumber;
                    },
                    items: function () {
                        return items;
                    }
                }
            });

            modal.result.then(function (result) {
                question.dependantItemOptions = result.itemOptions;
            }, function () { });
        }

        function cloneConfiguration(group) {
            if (!group || !group.selectedCloneGroup || !group.selectedCloneGroup.questions)
                return;
            group.questions = angular.copy(group.selectedCloneGroup.questions);
            shiftItemDependantOptionsOntoNewConfiguration(group);

            group.selectedCloneGroup = null;
        }

        function shiftItemDependantOptionsOntoNewConfiguration(group) {
            //move any item dependancies from the original group.itemNumber to the new one
            angular.forEach(group.questions, function (question) {
                if (!question.dependantItemOptions)
                    return;
                var cloneGroupDependantOptions;
                angular.forEach(question.dependantItemOptions, function (dependantOption) {
                    if (dependantOption.itemNumber == group.selectedCloneGroup.itemNumber) {
                        cloneGroupDependantOptions = angular.copy(dependantOption.options);
                        dependantOption.options = null;
                    }
                });
                if (!cloneGroupDependantOptions)
                    return;
                angular.forEach(question.dependantItemOptions, function (dependantOption) {
                    if (dependantOption.itemNumber == group.itemNumber) {
                        dependantOption.options = cloneGroupDependantOptions;
                    }
                });
            });
        }

        function clearFieldConfig(question) {
            question.dependantFieldOptions = null;
            question.dependantField = null;
        }

        function clearItemConfig(question) {
            question.dependantItemOptions = null;
        }

        function workOrderConfig(question) {
            console.log(question);
            var modal = $modal.open({
                templateUrl: '/app/modules/admin/formBuilder/modals/workOrderConfigModal.html',
                controller: 'WorkOrderConfigModal',
                size: 'md',
                resolve: {
                    question: function () {
                        return angular.copy(question);
                    }
                }
            });

            modal.result.then(function (result) {
                question.workOrderConfig = angular.copy(result.workOrderConfig);
            }, function () { });
        }

        //dependant field has changed. Need to wipe the options
        function dependantFieldChanged(question) {
            question.dependantFieldOptions = null;
        }

        function saveAll(form) {
            //todo remove custom fields from the question

            var groups = JSON.stringify($scope.groups);
            var result = {
                id: configuration ? configuration.id : null,
                name: "formBuilder",
                value: groups
            };

            $scope.loading = true;
            baseFactory.post("/api/Configuration/Save", result).then(function (data) {
                if (!data.isErrored) {
                }
            }).finally(function () {
                $scope.loading = false;
            });
        };

        function addCategory(group) {
            if (!group.newQuestionCustomField)
                return;
            if (!group.questions)
                group.questions = [];

            var question = {
                name: group.newQuestionCustomField.name,
                id: group.newQuestionCustomField.id
            };
            applyCustomFieldToQuestion(question);

            group.questions.push(question);
            group.newQuestionCustomField = null;
        }

        function applyCustomFieldToQuestion(question) {
            //add the custom field to the question. This is used for logic on the page
            angular.forEach($scope.customFields, function (customField) {
                if (customField.id == question.id) {
                    question.customField = angular.copy(customField);
                }
            });
        }

        function removeCategory(list, category) {
            if (!category || !list)
                return;
            var index = list.indexOf(category);
            list.splice(index, 1);
        };

        function removeParent(scope) {
            scope.remove();
        };

        function viewJson(group) {
            $modal.open({
                templateUrl: '/app/modules/admin/formBuilder/modals/jsonModal.html',
                controller: 'jsonModal',
                resolve: {
                    group: function () {
                        return angular.copy(group);
                    }
                }
            }).result.then(function (updatedGroup) {
                group.visible = false;
                group.description = updatedGroup.description;
                group.itemNumber = updatedGroup.itemNumber;
                group.newQuestionCustomField = updatedGroup.newQuestionCustomField;
                group.questions = [];

                angular.forEach(updatedGroup.questions, function (question) {
                    group.questions.push(question);

                    if (question.dependantField) {
                        angular.forEach($scope.customFields, function (field) {
                            if (field.id == question.dependantField.id)
                                question.dependantField = field;
                        });
                    }
                });
            });
        }
    }
})();
(function () {
    'use strict';
    formBuilderModule.controller('dependantConfigModal', dependantFieldConfigModal);
    dependantFieldConfigModal.$inject = ['$scope', '$modalInstance', 'listFactory', 'question', 'customFields', 'items', 'itemNumber'];
    function dependantFieldConfigModal($scope, $modalInstance, listFactory, question, customFields, items, itemNumber) {
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.addOption = addOption;
        $scope.addAllOption = addAllOption;
        $scope.addItemOption = addItemOption;
        $scope.addItemAllOption = addItemAllOption;

        init();
        function init() {
            $scope.question = angular.copy(question);
            $scope.customFieldOptions = JSON.parse($scope.question.customField.options);
            $scope.customFields = angular.copy(customFields);
            $scope.items = items;

            angular.forEach($scope.customFields, function (customField) {
                if (customField.options == "" || customField.options == null) {
                    customField.options = [];
                } else {
                    customField.options = JSON.parse(customField.options);
                }
                var values = [];
                angular.forEach(customField.options, function (option) {
                    var optionToAdd = {
                        name: option,
                        availableOptions: angular.copy($scope.customFieldOptions),
                        selectedOptions: []
                    };
                    if (question.dependantFieldOptions) {
                        angular.forEach(question.dependantFieldOptions, function (dependantOption) {
                            if (dependantOption.itemNumber == option) {
                                angular.forEach(dependantOption.options, function (selectedOption) {
                                    if (optionToAdd.selectedOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(optionToAdd.selectedOptions, selectedOption);

                                    if (optionToAdd.availableOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(optionToAdd.availableOptions, selectedOption);
                                });
                            }
                        });
                    }
                    values.push(optionToAdd);
                });

                customField.options = values;

                if ($scope.question.dependantField)
                    if (customField.id === $scope.question.dependantField.id)
                        $scope.question.dependantField = customField;
            });

            angular.forEach($scope.items, function (item) {
                if (itemNumber === item.itemNumber) {
                    $scope.question.dependantItem = item;
                    item.availableOptions = angular.copy($scope.customFieldOptions);
                    item.selectedOptions = [];
                    if (question.dependantItemOptions) {
                        angular.forEach(question.dependantItemOptions, function (dependantOption) {
                            if (dependantOption.itemNumber == item.itemNumber) {
                                angular.forEach(dependantOption.options, function (selectedOption) {
                                    if (item.selectedOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(item.selectedOptions, selectedOption);

                                    if (item.availableOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(item.availableOptions, selectedOption);
                                });
                            }
                        });
                    }
                }
            });
        }

        function addOption(option) {
            if ($scope.question.dependantField.selectedOption.selectedOptions.indexOf(option) >= 0) {
                listFactory.remove($scope.question.dependantField.selectedOption.selectedOptions, option);
            } else {
                listFactory.add($scope.question.dependantField.selectedOption.selectedOptions, option);
            }
            $scope.question.dependantField.selectedOption.selectedAvailableOption = null;
        }
        function addAllOption() {
            if ($scope.question.dependantField.selectedOption.selectedOptions.length > 0 &&
                $scope.question.dependantField.selectedOption.selectedOptions.length === $scope.question.dependantField.selectedOption.availableOptions.length) {
                $scope.question.dependantField.selectedOption.selectedOptions = [];
            } else {
                $scope.question.dependantField.selectedOption.selectedOptions = [];
                angular.forEach($scope.question.dependantField.selectedOption.availableOptions, function (option) {
                    listFactory.add($scope.question.dependantField.selectedOption.selectedOptions, option);
                });
            }
        }

        function addItemOption(option) {
            if ($scope.question.dependantItem.selectedOptions.indexOf(option) >= 0) {
                listFactory.remove($scope.question.dependantItem.selectedOptions, option);
            } else {
                listFactory.add($scope.question.dependantItem.selectedOptions, option);
            }
            $scope.question.dependantItem.selectedAvailableOption = null;
        }
        function addItemAllOption() {
            if ($scope.question.dependantItem.selectedOptions.length > 0 && $scope.question.dependantItem.selectedOptions.length === $scope.question.dependantItem.availableOptions.length) {
                $scope.question.dependantItem.selectedOptions = [];
            } else {
                $scope.question.dependantItem.selectedOptions = [];
                angular.forEach($scope.question.dependantItem.availableOptions, function (option) {
                    listFactory.add($scope.question.dependantItem.selectedOptions, option);
                });
            }
        }

        $scope.setSelectedCssClass = function () {
            if ($scope.question.dependantField.selectedOption.selectedOptions.length > 0)
                if ($scope.question.dependantField.selectedOption.selectedOptions.length === $scope.question.dependantField.selectedOption.availableOptions.length) {
                    return 'fa-check-circle';
                } else {
                    return 'fa-check-circle-o';
                }
            return 'fa-circle-o';
        };

        $scope.dependantFieldChanged = function (q) {
            if (q.dependantField !== null)
                q.dependantFieldOptions = null;
        };

        $scope.clickOption = function (option) {
            $scope.question.dependantField.selectedOption = option;
        };
        $scope.setCssClass = function (option) {
            return $scope.question.dependantField.selectedOption.selectedOptions.indexOf(option) >= 0 ? 'fa-check-circle' : 'fa-circle-o';
        };

        $scope.setItemSelectedCssClass = function () {
            if ($scope.question.dependantItem.selectedOptions.length > 0)
                if ($scope.question.dependantItem.selectedOptions.length === $scope.question.dependantItem.availableOptions.length) {
                    return 'fa-check-circle';
                } else {
                    return 'fa-check-circle-o';
                }
            return 'fa-circle-o';
        };
        $scope.setItemCssClass = function (option) {
            return $scope.question.dependantItem.selectedOptions.indexOf(option) >= 0 ? 'fa-check-circle' : 'fa-circle-o';
        };

        function save(form) {
            if ($scope.question.dependantField) {
                var fieldOptions = [];
                var i = 0;
                for (i = 0; i < $scope.question.dependantField.options.length; i++) {
                    fieldOptions.push({
                        itemNumber: $scope.question.dependantField.options[i].name,
                        options: $scope.question.dependantField.options[i].selectedOptions
                    });
                }
                $scope.question.dependantField.options = angular.toJson($scope.question.dependantField.optionArray);
                delete $scope.question.dependantField.optionArray;
            }
            var itemOptions = [];
            for (i = 0; i < $scope.items.length; i++) {
                itemOptions.push({
                    itemNumber: $scope.items[i].itemNumber,
                    options: $scope.items[i].selectedOptions
                });
            }
            $modalInstance.close({ dependantField: angular.copy($scope.question.dependantField), fieldOptions: fieldOptions, itemOptions: itemOptions });
        }

        function cancel() {
            $modalInstance.dismiss();
        }

    }
})();
(function () {
    'use strict';
    formBuilderModule.controller('dependantFieldConfigModal', dependantFieldConfigModal);
    dependantFieldConfigModal.$inject = ['$scope', '$modalInstance', 'listFactory', 'title', 'question', 'questionFieldOptions', 'customFieldOptions', 'customFields'];
    function dependantFieldConfigModal($scope, $modalInstance, listFactory, title, question, questionFieldOptions, customFieldOptions, customFields) {
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.addOption = addOption;
        $scope.addAllOption = addAllOption;
        $scope.removeOption = removeOption;
        $scope.clickOption = clickOption;

        init();
        function init() {
            $scope.title = title;
            $scope.question = angular.copy(question);
            $scope.customFieldOptions = JSON.parse(customFieldOptions);
            $scope.customFields = angular.copy(customFields);

            angular.forEach($scope.customFields, function (customField) {
                if (customField.options === "" || customField.options === null) {
                    customField.options = [];
                } else {
                    customField.options = JSON.parse(customField.options);
                }
                var values = [];
                angular.forEach(customField.options, function (option) {
                    var optionToAdd = {
                        name: option,
                        availableOptions: angular.copy($scope.customFieldOptions),
                        selectedOptions: []
                    };
                    if (questionFieldOptions) {
                        angular.forEach(questionFieldOptions, function (dependantOption) {
                            if (dependantOption.itemNumber === option) {
                                angular.forEach(dependantOption.options, function (selectedOption) {
                                    if (optionToAdd.selectedOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(optionToAdd.selectedOptions, selectedOption);

                                    if (optionToAdd.availableOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(optionToAdd.availableOptions, selectedOption);
                                });
                            }
                        });
                    }
                    values.push(optionToAdd);
                });

                customField.options = values;

                if (customField.id === $scope.question.id)
                    $scope.question = customField;
            });
        }

        function addAllOption() {
            if ($scope.question.selectedOption.selectedOptions.length > 0 &&
                $scope.question.selectedOption.selectedOptions.length === $scope.question.selectedOption.availableOptions.length) {
                $scope.question.selectedOption.selectedOptions = [];
            } else {
                $scope.question.selectedOption.selectedOptions = [];
                angular.forEach($scope.question.selectedOption.availableOptions, function (option) {
                    listFactory.add($scope.question.selectedOption.selectedOptions, option);
                });
            }
        }
        function addOption(option) {
            if ($scope.question.selectedOption.selectedOptions.indexOf(option) >= 0) {
                listFactory.remove($scope.question.selectedOption.selectedOptions, option);
            } else {
                listFactory.add($scope.question.selectedOption.selectedOptions, option);
            }
            $scope.question.selectedOption.selectedAvailableOption = null;
        }
        function clickOption(option) {
            $scope.question.selectedOption = option;
        }

        function removeOption(option) {
            listFactory.remove($scope.question.selectedOption.selectedOptions, option);
            listFactory.add($scope.question.selectedOption.availableOptions, option);

        }

        $scope.setSelectedCssClass = function () {
            if ($scope.question.selectedOption.selectedOptions.length > 0)
                if ($scope.question.selectedOption.selectedOptions.length === $scope.question.selectedOption.availableOptions.length) {
                    return 'fa-check-circle';
                } else {
                    return 'fa-check-circle-o';
                }
            return 'fa-circle-o';
        };
        $scope.setCssClass = function (option) {
            return $scope.question.selectedOption.selectedOptions.indexOf(option) >= 0 ? 'fa-check-circle' : 'fa-circle-o';
        };

        function save(form) {

            var options = [];
            angular.forEach($scope.question.options, function (option) {
                options.push({
                    itemNumber: option.name,
                    options: option.selectedOptions
                });
            });
            $modalInstance.close(options);

        }

        function cancel() {
            $modalInstance.dismiss();
        }
    }
})();
(function () {
    'use strict';
    formBuilderModule.controller('dependantItemConfigModal', dependantItemConfigModal);
    dependantItemConfigModal.$inject = ['$scope', '$modalInstance', 'listFactory', 'question', 'itemNumber', 'items'];
    function dependantItemConfigModal($scope, $modalInstance, listFactory, question, itemNumber, items) {
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.addOption = addOption;
        $scope.addAllOption = addAllOption;
        $scope.removeOption = removeOption;

        function init() {
            $scope.question = angular.copy(question);
            $scope.items = items;
            $scope.customFieldOptions = JSON.parse($scope.question.customField.options);
            angular.forEach($scope.items, function (item) {
                if (itemNumber == item.itemNumber) {
                    $scope.question.dependantItem = item;
                    item.availableOptions = angular.copy($scope.customFieldOptions);
                    item.selectedOptions = [];
                    if (question.dependantItemOptions) {
                        angular.forEach(question.dependantItemOptions, function (dependantOption) {
                            if (dependantOption.itemNumber == item.itemNumber) {
                                angular.forEach(dependantOption.options, function (selectedOption) {
                                    if (item.selectedOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(item.selectedOptions, selectedOption);

                                    if (item.availableOptions.indexOf(selectedOption) < 0)
                                        listFactory.add(item.availableOptions, selectedOption);
                                });
                            }
                        });
                    }
                }
            });
        }
        init();

        function addOption(option) {
            if ($scope.question.dependantItem.selectedOptions.indexOf(option) >= 0) {
                listFactory.remove($scope.question.dependantItem.selectedOptions, option);
            } else {
                listFactory.add($scope.question.dependantItem.selectedOptions, option);
            }
            $scope.question.dependantItem.selectedAvailableOption = null;
        }
        function addAllOption() {
            if ($scope.question.dependantItem.selectedOptions.length > 0 && $scope.question.dependantItem.selectedOptions.length === $scope.question.dependantItem.availableOptions.length) {
                $scope.question.dependantItem.selectedOptions = [];
            } else {
                $scope.question.dependantItem.selectedOptions = [];
                angular.forEach($scope.question.dependantItem.availableOptions, function (option) {
                    listFactory.add($scope.question.dependantItem.selectedOptions, option);
                });
            }
        }

        function removeOption(option) {
            listFactory.remove($scope.question.dependantItem.selectedOptions, option);
        }
        $scope.setSelectedCssClass = function () {
            if ($scope.question.dependantItem.selectedOptions.length > 0)
                if ($scope.question.dependantItem.selectedOptions.length === $scope.question.dependantItem.availableOptions.length) {
                    return 'fa-check-circle';
                } else {
                    return 'fa-check-circle-o';
                }
            return 'fa-circle-o';
        };
        $scope.setCssClass = function (option) {
            return $scope.question.dependantItem.selectedOptions.indexOf(option) >= 0 ? 'fa-check-circle' : 'fa-circle-o';
        };


        function save(form) {

            var options = [];
            angular.forEach($scope.items, function (item) {
                options.push({
                    itemNumber: item.itemNumber,
                    options: item.selectedOptions
                });
            });
            $modalInstance.close(options);

        }

        function cancel() {
            $modalInstance.dismiss();
        }
    }
})();
(function () {
    'use strict';
    formBuilderModule.controller('jsonModal', jsonModal);
    jsonModal.$inject = ['$scope', '$modalInstance', 'group'];

    function jsonModal($scope, $modalInstance, group) {
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.group = group;
        $scope.jsonBlob = angular.toJson($scope.group, true);

        function save() {
            var savedGroup;

            try {
                savedGroup = angular.fromJson($scope.jsonBlob);
            } catch (e) {
                $scope.error = e.message;
                return;
            }

            $modalInstance.close(savedGroup);
        }

        function cancel() {
            $modalInstance.dismiss();
        }
    }
})();
(function () {
    'use strict';
    formBuilderModule.controller('WorkOrderConfigModal', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', 'listFactory', 'question'];
    function ctrl($scope, $modalInstance, listFactory, question) {
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.question = question;

        if (typeof $scope.question.workOrderConfig === 'undefined') {
            $scope.question['workOrderConfig'] = {
                visibility: ['Work Order'],
                label: '',
                formula: ''
            };
        }

        $scope.addVisibility = function (v) {
            var indx = $scope.question.workOrderConfig.visibility.indexOf(v);
            if (indx < 0)
                $scope.question.workOrderConfig.visibility.push(v);
            else
                $scope.question.workOrderConfig.visibility.splice(indx, 1);
        };
        function save(form) {
            $modalInstance.close({ workOrderConfig: question.workOrderConfig });
        }

        function cancel() {
            $modalInstance.dismiss();
        }
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.systemHealthCheck', {
                url: "/systemhealthcheck",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/healthCheck/views/index.html",
                        controller: 'AdminHealthCheckCtrl',
                        resolve: {
                            data: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                return baseFactory.fetch('/api/systemstatus/check').then(function (rrdata) {
                                    return rrdata.data;
                                });
                            }],
                        },
                    }
                },
                ncyBreadcrumb: {
                    label: 'System Health Check'
                }
            });
    }
]);
homeModule.controller('AdminHealthCheckCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'data',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, data) {
            $scope.data = data;
            $scope.title = data.status == 0 ? "All Systems Operational" : data.message;

            angular.forEach($scope.data.results, function (d) {
                d.isCollapsed = true;
            });
        }
    ]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.homepage', {
                url: "/homepage",
                views: {
                    'content@base': {
                        templateProvider: ['$stateParams', '$templateRequest', '$rootScope',
                            function ($stateParams, $templateRequest, $rootScope) {
                                var templateUrl = '';
                                if ($rootScope.clientName == "FILDES") {
                                    templateUrl = "/app/modules/admin/homePage/views/indexFildes.html";
                                } else {
                                    templateUrl = "/app/modules/admin/homePage/views/index.html";
                                }
                                return $templateRequest(templateUrl);
                            }],
                        controller: 'HomeAdminCtrl',
                        resolve: {
                            documents: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/documents/GetAllDocuments?isAll=true&retrieveSize=40&startIndex=1&isHomePage=true').then(function (rdata) {
                                    return rdata.object || [];
                                });
                            }],
                            siteConfig: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/configuration/getHomepage').then(function (rdata) {
                                    return rdata.object || [];
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Downloads'
                }
            });
    }
]);
(function () {
    'use strict';

    homeModule.controller('HomeAdminCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'documents', 'siteConfig'];
    function ctrl($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, documents, siteConfig) {

        $scope.documents = documents;
        $scope.siteConfig = siteConfig;

        //
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.saveHomepage = function (mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);

                baseFactory.post('/api/configuration/saveHomepage', dataToSend).then(function (data) {
                    // console.log(data);
                    if (data.isErrored) {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        // DOCUMENTS
        $scope.refreshData = function () {
            baseFactory.fetch('/api/documents/GetAllDocuments?isAll=true&retrieveSize=40&startIndex=1&isHomePage=true').then(function (rdata) {
                $scope.documents = rdata.object || [];
            });
        };
        $scope.setdocIcon = function (ext) {
            switch (ext) {
                case 'doc':
                case 'docx':
                    return '/app/css/img/docicons/icon-doc-20.png';
                case 'xls':
                case 'xlsx':
                    return '/app/css/img/docicons/icon-xls-20.png';
                case 'ppt':
                case 'pptx':
                    return '/app/css/img/docicons/icon-ppt-20.png';
                case 'jpg':
                case 'jpeg':
                case 'png':
                case 'gif':
                    return '/app/css/img/docicons/icon-image-20.png';
                case 'pdf':
                    return '/app/css/img/docicons/icon-pdf-20.png';
                default:
                    return '/app/css/img/docicons/icon-txt-20.png';
            }
        };
        $scope.openUploadDocumentModal = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/uploads/uploadDocumentModal.html',
                controller: 'UploadDocumentModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    doc: function () {
                        return d == null ? {
                            id: 0,
                            fileName: null,
                            isHomePage: true,
                            showHomePage: false,
                            textColour: '#FFFFFF',
                            backgroundColour: '#FFFFFF',
                            permissions: [],
                            categoryId: null
                        } : d;
                    },
                    title: function () {
                        return "Slide";
                    },
                    docTypes: [function () {
                        if ($rootScope.lookup.docTypes.length > 0)
                            return $rootScope.lookup.docTypes;

                        return baseFactory.fetch('/api/documents/GetAllDocumentTypes').then(function (rrdata) {
                            $rootScope.lookup.docTypes = rrdata.object == null ? [] : rrdata.object;
                            return $rootScope.lookup.docTypes;
                        });
                    }],
                    categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                        return baseFactory.fetch('/api/category/GetAll').then(function (rrdata) {
                            return rrdata.object;
                        });
                    }]
                }
            });
            modalInstance.result.then(function () {
                $scope.refreshData();
            });
        };

        $scope.deleteItemDocument = function (item) {
            promptFactory.confirm("Are you sure you want to delete this item?", function (result) {
                if (result) {
                    baseFactory.remove('/api/documents/delete/' + item.id).then(function (rrdata) {
                        $scope.refreshData();
                    });
                }
            });
        };
    }
})();
(function () {
    'use strict';
    itemModule.config(
        ['$stateProvider',
            function ($stateProvider) {
                $stateProvider
                    .state('base.adminItemBrands', {
                        url: "/admin/brands",
                        views: {
                            'content@base': {
                                templateUrl: "/app/modules/admin/itembrands/views/index.html",
                                controller: 'AdminItemBrandCtrl',
                                resolve: {
                                    isAllowEdit: function () {
                                        return true;
                                    }
                                }
                            }
                        },
                        data: {
                            permissions: []
                        },
                        ncyBreadcrumb: {
                            label: 'Brands'
                        }
                    })
                    .state('base.itemBrands', {
                        url: "/brands",
                        noLoginRequired: true,
                        views: {
                            'content@base': {
                                templateUrl: "/app/modules/admin/itembrands/views/view.html",
                                controller: 'AdminItemBrandCtrl',
                                resolve: {
                                    isAllowEdit: function () {
                                        return false;
                                    }
                                }
                            }
                        },
                        data: {
                            permissions: []
                        },
                        ncyBreadcrumb: {
                            label: 'Brands'
                        }
                    });

            }
        ]);
})();

(function () {
    'use strict';

    homeModule.controller('AdminItemBrandCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', 'baseFactory', 'promptFactory', 'isAllowEdit'];
    function ctrl($scope, $rootScope, $modal, baseFactory, promptFactory, isAllowEdit) {

        $scope.isAllowEdit = isAllowEdit;
        $scope.isLoading = true;
        $scope.startIndex = 1;
        $scope.pageSize = 20;
        $scope.items = [];
        $scope.totalRows = 0;
        $scope.filter = {
            searchText: null,
            retrieveSize: 20,
            startIndex: 1
        };

        var searchItems = function () {
            var dataToSend = angular.copy($scope.filter);
            $scope.isLoading = true;
            baseFactory.fetch('/api/item/searchAllBrands', dataToSend).then(function (rrdata) {
                $scope.totalRows = rrdata.object.length;
                angular.forEach(rrdata.object, function (value, index) {
                    $scope.items.push(value);
                });
                $scope.isLoading = false;
            });
        };
        $scope.showMore = function () {
            $scope.filter.startIndex = $scope.items.length + 1;
            $scope.searchItems();
        };
        var reloadSearch = function () {
            $scope.items = [];
            $scope.filter.startIndex = 1;
            searchItems();
        };

        searchItems();

        $scope.manageItemBrand = function (id) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/itemBrands/modals/manageItemBrandModal.html',
                controller: 'ManageItemBrandModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    model: function () {
                        if (id === null)
                            return {
                                id: 0,
                                name: null,
                                description: null,
                                photoUrl: null,
                                website: null
                            };
                        return baseFactory.fetch('/api/item/getBrand/' + id).then(function (rdata) {
                            return rdata.object || null;
                        });
                    },
                    isNew: function () {
                        return id === null;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                reloadSearch();
            }, function () {
            });
        };

        $scope.deleteItemBrand = function (item, index) {
            promptFactory.confirm("Are you sure you want to delete this Brand?", function (result) {
                if (result) {
                    baseFactory.remove('/api/item/deletebrand/' + item.id).then(function (rrdata) {
                        $scope.items.splice(index, 1);
                    });
                }
            });
        };
    }
})();
(function () {
    itemModule.controller('ManageItemBrandModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$timeout', '$modalInstance', 'baseFactory', 'model', 'isNew'];
    function ctrl($scope, $rootScope, $timeout, $modalInstance, baseFactory, model, isNew) {

        $scope.m = angular.copy(model);
        $scope.disableSubmitButton = false;
        $scope.submitTxt = 'Save';
        $scope.mode = isNew ? 'Create' : 'Edit';

        var isImageValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["png", "jpg", "jpeg"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.onImageSelect = function ($files) {
            if (isImageValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.m.fileFolder = data.object.fileFolder;
                            $scope.m.fileName = data.object.fileName;
                            $scope.m.isUploaded = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.m.isUploaded = false;
            $scope.m.fileFolder = "";
            $scope.m.fileName = "";
            $scope.m.link = "";
            $scope.m.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file' && elems[i].name === 'photoFile') {
                    elems[i].value = null;
                }
            }
        };

        $scope.save = function (mForm, po) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                baseFactory.post("/api/item/saveBrand", po).then(function (data) {
                    if (!data.isErrored) {
                        po.id = data.object;
                        $modalInstance.close(po);
                    }
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };
    }
})();
orderModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.itemgroups', {
                url: "/itemgroups/",
                views: {
                    'content@base': {
                        templateUrl: "app/modules/admin/itemGroups/viewAll.html",
                        controller: 'itemGroups',
                    }
                },
                ncyBreadcrumb: {
                    label: 'Item Groups'
                }
            })
            .state('base.itemgroups.create', {
                url: "create/",
                views: {
                    'content@base': {
                        templateUrl: "app/modules/admin/itemGroups/createEdit.html",
                        controller: 'createEditItemGroups',
                        resolve: {
                            model: [
                                'baseFactory', '$stateParams', function(baseFactory, $stateParams) {
                                    return baseFactory.fetch('/api/ItemGroups/GetModel/');
                                }
                            ]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Create Item Group'
                }
            })
            .state('base.itemgroups.edit', {
                url: "edit/:id",
                views: {
                    'content@base': {
                        templateUrl: "app/modules/admin/itemGroups/createEdit.html",
                        controller: 'createEditItemGroups',
                        resolve: {
                            model: [
                                'baseFactory', '$stateParams', function(baseFactory, $stateParams) {
                                    return baseFactory.fetch('/api/ItemGroups/GetModel/?id=' + $stateParams.id);
                                }
                            ]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Edit Item Group'
                }
            });
    }
]);
(function () {
    'use strict';
    itemGroupsModule.controller('createEditItemGroups', createEditItemGroups);
    createEditItemGroups.$inject = ['$scope', '$state', 'baseFactory', 'sharedFactory', '$rootScope', '$sce', '$timeout', 'modalFactory', 'model'];

    function createEditItemGroups($scope, $state, baseFactory, sharedFactory, $rootScope, $sce, $timeout, modalFactory, model) {

        $scope.model = model.object;
        $scope.group = model.object.group;
        $scope.selectedItem = {};
        $scope.displayText = "";
        $scope.itemStatus = {};

        //functions
        $scope.addItem = addItem;
        $scope.removeItem = removeItem;
        $scope.save = save;

        init();
        function init() {
            $scope.title = $scope.model.id && $scope.model.id > 0 ? "Edit Item Group" : "Create Item Group";
            
            if (!$scope.group.items) {
                $scope.group.items = [];
            }

            if (!$scope.model.availableItems) {
                $scope.model.availableItems = [];
            }

            if ($scope.group && $scope.group.itemStatusId && $scope.group.itemStatusId > 0) {
                angular.forEach($scope.model.itemStatuses, function(status) {
                    if (status.id == $scope.group.itemStatusId) {
                        $scope.itemStatus = status;
                    }
                });
            }
        }

        function addItem() {
            if (!$scope.displayText || $scope.displayText === "" || !$scope.selectedItem) {
                return;
            }

            var newItem = {
                groupDisplayName: $scope.displayText,
                itemNumber: $scope.selectedItem.itemNumber,
                itemName: $scope.selectedItem.itemName
            };

            $scope.group.items.push(newItem);
            $scope.displayText = "";
        }

        function removeItem(item) {
            if (!item) {
                return;
            }

            angular.forEach($scope.group.items, function (i, itemIndex) {
                if (item.itemNumber === i.itemNumber) {
                    $scope.group.items.splice(itemIndex, 1);
                    return;
                }
            });

            var availableItem = {
                itemName: item.itemName,
                itemNumber: item.itemNumber,
            };

            $scope.model.availableItems.push(availableItem);
        };

        var generateModelToSave = function () {
            var modelToSave = angular.copy($scope.group);
            modelToSave.itemStatusId = $scope.itemStatus.id;
            modelToSave.isGroup = true;
            modelToSave.parentItemId = null;
            return modelToSave;
        };

        function save(form) {
            $scope.submitted = true;
            if (form.$valid) {
                var uri = $scope.group.id ? '/api/ItemGroups/update' : '/api/ItemGroups/create';

                $scope.loading = true;
                baseFactory.call(
                    uri,
                    generateModelToSave()
                ).then(function (data) {
                    if (!data.isErrored) {
                        $state.go('^', null, { reload: true });
                    }
                }).finally(function () {
                    $scope.loading = false;
                });
            }
        }
    }
})();
itemGroupsModule.controller('itemGroups',
['$scope', 'modalFactory',
    function ($scope, modalFactory) {

        $scope.gridOptions = {
            itemType: 'ItemGroups',
            items: $scope.orders,
            gridName: 'itemgroups',
            fetchUrl: '/api/ItemGroups/Search',
            initSortString: 'itemName asc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: true,
            columnDefs: [
                { field: 'itemName', displayName: 'Name', customSortField: 'itemName' },
                { field: 'description', displayName: 'Description', customSortField: 'description'},
                { field: 'groupDisplayName', displayName: 'Display Name', customSortField: 'groupDisplayName' }
            ],
            controlCellTemplateHtml: '<div class="controls">' +
                '<div class="btn-group btn-group-sm pull-right">' +
                '<a perm-required="sysadmin.sysadminRoles.edit" ui-sref="base.itemgroups.edit({id:COL_FIELD})" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '<a perm-required="sysadmin.sysadminRoles.edit" ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                '</div></div>'
        };

        $scope.deleteEntity = function (value) {

            modalFactory.deleteEntityFromGrid(
                   value.itemName,
                   value.id,
                   'Item Group',
                   null,
                   '/api/ItemGroups/Delete/',
                   $scope.gridOptions.gridName
               );
        };
    }
]);
homeModule.controller('ItemReviewCreateEditCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'promptFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams', 'model',
        function ($scope, $rootScope, $modal, $state, baseFactory, promptFactory, modalFactory, GRID_CONSTANTS, $stateParams, model) {
            $scope.message = angular.copy(model.message);
            $scope.order = angular.copy(model.order);
            $scope.items = angular.copy(model.items);
            $scope.currentItemReview = null;
            $scope.openItemReview = function (item) {
                $scope.currentItemReview = angular.copy(item);
            };
            $scope.cancel = function () {
                $scope.currentItemReview = null;
            };
            $scope.submitTxt = "Submit";
            $scope.disableSubmitButton = false;

            $scope.setRating = function (r) {
                $scope.currentItemReview.rating = r;
            };
            $scope.setApproved = function (b) {
                $scope.currentItemReview.isApproved = b;
            };

            $scope.submit = function (m, mForm) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    var dataToSend = angular.copy(m);
                    if (dataToSend.title === null || dataToSend.title === '')
                        dataToSend.title = "Anonymous";

                    baseFactory.post("/api/itemreviews/save/", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            for (var i = 0; i < $scope.items.length; i++) {
                                if ($scope.items[i].itemNumber === dataToSend.itemNumber) {
                                    $scope.items[i] = angular.copy(dataToSend);
                                    break;
                                }
                            }
                            $scope.cancel();
                        }
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
        }
    ]);
homeModule.controller('ItemReviewsCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'promptFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, promptFactory, modalFactory, GRID_CONSTANTS, $stateParams) {
            $scope.gridOptions = {
                itemType: 'Item Reviews',
                gridName: 'allItemReviews',
                fetchUrl: '/api/itemReviews/SearchAll',
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: false,
                enablePaging: true,
                columnDefs: [
                    {
                        field: 'isApproved', displayName: ' ', width: 50,
                        cellTemplate: '<div class="ngCellText text-center"><a class="cursor-pointer" ng-click="approveItemReview(row.entity)" title="Click to update"><i class="fa fa-circle-o-notch fa-spin" ng-style="{\'display\': row.entity.isLoading ? \'inline-block\':\'none\'}"></i><i class="fa fa-check-circle text-success" ng-show="row.entity.isApproved" ng-if="!row.entity.isLoading"></i><i class="fa fa-times-circle text-danger" ng-hide="row.entity.isApproved" ng-if="!row.entity.isLoading"></i></a></div>'
                    },
                    { field: 'dateCreated', displayName: 'Date Created', customSortField: 'dateCreated', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'orderNumber', displayName: 'Order No', width: 100 },
                    { field: 'itemNumber', displayName: 'Item No', width: 100 },
                    { field: 'itemName', displayName: 'Item' },
                    { field: 'customer', displayName: 'Customer' },
                    { field: 'title', displayName: 'Title' },
                    { field: 'reviewText', displayName: 'Review' },
                    { field: 'replyText', displayName: 'Reply' },
                    { field: 'rating', displayName: 'Rating' }
                ],
                enableCustomFields: true,
                customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.a" class="form-control" ng-options="d.id as d.name for d in dg.fetchOptions.extraData.approvedStats"></select>' +
                    '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.r" class="form-control" ng-options="d.id as d.name for d in dg.fetchOptions.extraData.ratings"></select>',
                extraParams: {
                    a: null,
                    r: null,
                },
                extraData: {
                    approvedStats: [
                        { id: null, name: "All Item Reviews" },
                        { id: true, name: "Approved" },
                        { id: false, name: "Not Approved" },
                    ],
                    ratings: [
                        { id: null, name: "All Ratings" },
                        { id: 1, name: "1" },
                        { id: 2, name: "2" },
                        { id: 3, name: "3" },
                        { id: 4, name: "4" },
                        { id: 5, name: "5" },
                    ]
                },
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: 80
            };

            function controlHtml() {
                return '<div class="controls pull-right p-right10">' +
                    '<div class="btn-group btn-group-sm">' +
                    '<button class="btn btn-default" ng-click="manageItemReview(row.entity)"><i class="glyphicon glyphicon-edit"></i></button>' +
                    '</div></div>';
            }

            $scope.approveItemReview = function (m) {
                m.isLoading = true;
                baseFactory.post('/api/itemreviews/approve', m).then(function (rdata) {
                    m.isLoading = false;
                    m.isApproved = angular.copy(!m.isApproved);
                });
            };

            $scope.manageItemReview = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/itemReviews/modals/editItemReviewModal.html',
                    controller: 'EditItemReviewModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        itemReview: function () {
                            return m;
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReloadPage) {
                });
            };

            $scope.deleteItemReview = function (v) {
                modalFactory.deleteEntityFromGrid(
                    v.title,
                    v.id,
                    'Item Review',
                    null,
                    '/api/itemreviews/delete/',
                    $scope.gridOptions.gridName
                );
            };
        }
    ]);
(function () {
    homeModule.controller('EditItemReviewModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', 'GRID_CONSTANTS', 'baseFactory', '$rootScope', '$timeout', 'itemReview'];
    function ctrl($scope, $modalInstance, GRID_CONSTANTS, baseFactory, $rootScope, $timeout, itemReview) {
        $scope.m = angular.copy(itemReview);
        $scope.saveTxt = "Save";
        $scope.submitTxt = "Submit";
        $scope.disableSubmitButton = false;

        $scope.setRating = function (r) {
            $scope.m.rating = r;
        };
        $scope.setApproved = function (b) {
            $scope.m.isApproved = b;
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };

        $scope.save = function (m, mForm) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);

                baseFactory.post("/api/itemreviews/save/", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $modalInstance.close();
                    }
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                });
            }
        };

        $scope.submit = function (m, mForm) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);
                if (dataToSend.title === null || dataToSend.title === '')
                    dataToSend.title = "Anonymous";

                baseFactory.post("/api/itemreviews/save/", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $modalInstance.close();
                    }
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                });
            }
        };
    }
})();
itemModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.items', {
                url: "/items/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/items/views/items.html",
                        controller: 'itemController',
                        resolve: {
                            items: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getGridEntity('/api/item/Search?itemVisibility=true');
                            }],
                            customFields: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/CustomFields/GetAll?isItem=true');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }],
                            itemstatuses: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/itemstatus/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.items.view']
                },
                ncyBreadcrumb: {
                    label: 'Items'
                }
            })
            .state('base.items.edit', {
                url: "edit/:id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/items/views/createEdit.html",
                        controller: 'ItemCreateEditCtrl',
                        resolve: {
                            item: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/item/GetItemDetails?itemNumber=' + $stateParams.id).then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            }],
                            customers: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/customer/getall/');
                            }],
                            singleItems: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/item/GetSingleItems/');
                            }],
                            itemCustomer: ['resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                return resolveFactory.getEntity('api/item/GetItemCustomers', { itemNumber: $stateParams.id });
                            }],
                            categories: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/category/getAllForTree');
                            }],
                            itemCategories: ['resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                return resolveFactory.getEntity('/api/item/GetItemCategories', { itemNumber: $stateParams.id });
                            }],
                            customFields: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/CustomFields/GetAll').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            }],
                            documents: ['resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                return resolveFactory.getGridEntity('/api/documents/GetAllDocuments?itemNumber=' + $stateParams.id + '&docTypes=' + 1);
                            }],
                            gallery: ['resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                return resolveFactory.getGridEntity('/api/documents/GetAllDocuments?itemNumber=' + $stateParams.id + '&docTypes=' + 2);
                            }],
                            itemStatuses: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/itemStatus/GetAll');
                            }],
                            itemCustomFields: ['resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                return resolveFactory.getGridEntity('/api/customfields/GetItemCustomFields?itemNumber=' + $stateParams.id);
                            }],
                            itemDescription: ['resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                return resolveFactory.getEntity('/api/item/getitemdetails', { itemNumber: $stateParams.id });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'View Item'
                }
            })
            .state('base.items.view', {
                url: "item/:id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/items/viewItem/itemDetails.html",
                        controller: 'itemDetail',
                        resolve: {
                            item: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/item/GetItemDetails?itemNumber=' + $stateParams.id).then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'View Item'
                }
            });

    }
]);

itemModule.controller('itemController',
    [
        '$scope', '$modal', '$rootScope', 'baseFactory', 'items', 'customFields', 'GRID_CONSTANTS', 'categories', 'itemstatuses', 'promptFactory',
        function ($scope, $modal, $rootScope, baseFactory, items, customFields, GRID_CONSTANTS, categories, itemstatuses, promptFactory) {
            $scope.categories = categories;
            $scope.pageTitle = 'Product Items';
            $scope.items = items;

            $scope.openCreateModal = openCreateModal;
            $scope.importItemsModal = importItemsModal;

            $scope.gridColumns = [];
            var controlHtml = '';

            init();

            function init() {
                angular.forEach(itemstatuses.object, function (value, index) {
                    itemstatuses.object[index].value = value.name;
                });
                itemstatuses.object.unshift({ value: null, name: 'All Item Statuses' });

                //ppi and kingpin grid settings
                if ($rootScope.clientName != 'TWC' && $rootScope.clientName != 'RETAILBLINDS') {
                    $scope.gridColumns = [
                        { field: 'itemNumberDisplay', displayName: 'Item Number Display', customSortField: 'ItemNumberDisplay' },
                        { field: 'itemNumber', displayName: 'Item Number', customSortField: 'ItemNumber' },
                        { field: 'itemName', displayName: 'Item Name', customSortField: 'ItemName', width: "20%" },
                        { field: 'category', displayName: 'Category Name(s)', customSortField: 'JoinedCategories' },
                        { field: 'itemType', displayName: 'Item Type', customSortField: 'ItemType' },
                        { field: 'itemStatus', displayName: 'Item Status', customSortField: 'ItemStatus' },
                        { field: 'isVisible', displayName: 'Visible', customSortField: 'IsVisible', cellTemplate: "<div class='ngCellText col5 colt5'>{{row.entity.isVisible | true_false}}</div>" }
                    ];
                    controlHtml = '<div class="controls">' +
                        '<div class="btn-group btn-group-sm">' +
                        ($rootScope.clientName.toLowerCase() === 'fildes' ? '<a permission permissions="system.items.view" href="/p/{{row.entity.itemAlias}}" target="_self" class="btn btn-default" title="View"><i class="glyphicon glyphicon-search"></i></a>' :
                            '<a permission permissions="system.items.view" ui-sref="anonymous.shop.item({id: row.entity.itemAlias})" class="btn btn-default" title="View"><i class="glyphicon glyphicon-search"></i></a>') +
                        '<a permission permissions="system.items.edit" ng-click="editItem(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                        '<a permission permissions="system.items.edit" ng-click="copyItem(row.entity)" class="btn btn-default" title="Copy"><i class="fa fa-copy"></i></a>' +
                        '<a permission permissions="system.items.edit" ng-click="deleteItem(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                        '</div></div>';

                    $scope.customFieldsHtml = '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                        '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.itemStatus" class="form-control" ng-options="status.value as status.name for status in dg.fetchOptions.extraData.itemStatuses"></select>' +
                        '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                        '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.itemType" class="form-control" ng-options="type.value as type.text for type in dg.fetchOptions.extraData.itemTypes"></select>' +
                        '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                        '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.itemVisibility" class="form-control" ng-options="type.value as type.text for type in dg.fetchOptions.extraData.itemVisibilities"></select>';
                } else {
                    $scope.gridColumns = [
                        { field: 'itemNumberDisplay', displayName: 'Item Number Display', customSortField: 'ItemNumberDisplay' },
                        { field: 'itemNumber', displayName: 'Item Number', customSortField: 'ItemNumber' },
                        { field: 'itemName', displayName: 'Item Name', customSortField: 'ItemName', width: "20%" },
                        { field: 'category', displayName: 'Category Name(s)', customSortField: 'JoinedCategories' },
                        { field: 'itemStatus', displayName: 'Item Status', customSortField: 'ItemStatus' },
                        { field: 'isVisible', displayName: 'Visible', customSortField: 'IsVisible', cellTemplate: "<div class='ngCellText col5 colt5'>{{row.entity.isVisible | true_false}}</div>" }
                    ];
                    controlHtml = '<div class="controls" style="text-align: right; padding-right: 5px">' +
                        '<div class="btn-group btn-group-sm">' +
                        // '<a permission permissions="system.items.edit" ng-click="editItem(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                        '<a permission permissions="system.items.edit" ui-sref="base.items.edit({id: row.entity.itemNumber})" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                        '</div></div>';

                    $scope.customFieldsHtml = '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                        '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.itemStatus" class="form-control" ng-options="status.value as status.name for status in dg.fetchOptions.extraData.itemStatuses"></select>' +
                        '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                        '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.itemVisibility" class="form-control" ng-options="type.value as type.text for type in dg.fetchOptions.extraData.itemVisibilities"></select>';
                }
            };

            $scope.gridOptions = {
                itemType: 'Items',
                items: items,
                gridName: 'Items',
                fetchUrl: '/api/item/Search',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: $scope.gridColumns,
                controlCellTemplateHtml: controlHtml,
                controlColumnWidth: '150px',
                enableCustomFields: true,
                enableInputGroup: true,
                customFieldsHtml: $scope.customFieldsHtml,
                extraParams: {
                    itemStatus: null,
                    itemType: null,
                    itemVisibility: "true"
                },
                extraData: {
                    itemStatuses: itemstatuses.object,
                    itemTypes: [{ text: "All Item Types", value: null }, { text: "Single", value: "Single" }, { text: "Group", value: "Group" }],
                    itemVisibilities: [{ text: "All Item Visibilities", value: null }, { text: "Visible", value: "true" }, { text: "Not Visible", value: "false" }]
                }
            };

            $scope.deleteItem = function (value) {
                promptFactory.confirm("Are you sure you want to delete this item?", function (result) {
                    if (result) {
                        return baseFactory.fetch('/api/item/delete?itemNumber=' + value.itemNumber).then(function (data) {
                            if (!data.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                            }
                        });
                    }
                });
            };

            $scope.editItem = function (item) {
                // console.log(item);
                $modal.open({
                    templateUrl: '/app/modules/admin/items/editItemModal/editItem.html',
                    controller: 'editItemCtrl',
                    backdrop: 'static',
                    size: 'lg',
                    resolve: {
                        item: function () {
                            return item;
                        },
                        customers: ['resolveFactory', function (resolveFactory) {
                            return resolveFactory.getEntity('/api/customer/getall/');
                        }],
                        singleItems: ['resolveFactory', function (resolveFactory) {
                            return resolveFactory.getEntity('/api/item/GetSingleItems/');
                        }],
                        itemCustomer: ['resolveFactory', function (resolveFactory) {
                            return resolveFactory.getEntity('api/item/GetItemCustomers', { itemNumber: item.itemNumber });
                        }],
                        categories: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getEntity('/api/category/getAllForTree');
                        }],
                        itemCategories: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getEntity('/api/item/GetItemCategories', { itemNumber: item.itemNumber });
                        }],
                        customFields: [function () {
                            return customFields.object;
                        }],
                        documents: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getGridEntity('/api/documents/GetAllDocuments?itemNumber=' + item.itemNumber + '&docTypes=' + 1);
                        }],
                        gallery: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getGridEntity('/api/documents/GetAllDocuments?itemNumber=' + item.itemNumber + '&docTypes=' + 2);
                        }],
                        itemStatuses: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getEntity('/api/itemStatus/GetAll');
                        }],
                        itemBrands: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getEntity('/api/item/GetAllBrands');
                        }],
                        itemCustomFields: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getGridEntity('/api/customfields/GetItemCustomFields?itemNumber=' + item.itemNumber);
                        }],
                        itemDescription: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getEntity('/api/item/getitemdetails', { itemNumber: item.itemNumber, relatedItems: false });
                        }],
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
            };

            $scope.copyItem = function (item) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/items/copyItemModal/index.html',
                    controller: 'CopyItemModalCtrl',
                    backdrop: 'static',
                    size: 'md',
                    resolve: {
                        item: function () {
                            return item;
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
                //promptFactory.confirm("Are you sure you want to clone this item - " + item.itemName + "?", function (result) {
                //    if (result) {
                //        baseFactory.put('/api/item/cloneItemDetails/?itemNumber=' + item.itemNumber).then(function (rdata) {
                //            if (!rdata.isErrored) {
                //                $scope.editItem(rdata.object);
                //                //var clonedItem = angular.copy(item);
                //                //clonedItem.newItemNumber = rdata.object.itemNumber;
                //                //clonedItem.itemName = rdata.object.itemName;
                //                //clonedItem.id = 0;
                //                //// console.log(clonedItem);
                //                //$scope.editItem(clonedItem);
                //            }
                //        });
                //    }
                //});
            };

            function openCreateModal() {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/items/createItemModal/create.html',
                    controller: 'create',
                    backdrop: 'static',
                    size: 'md',
                    resolve: {
                        model: [
                            function () {
                                return baseFactory.fetch('/api/Item/GetCreateModel/');
                            }
                        ],
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
            }

            function importItemsModal() {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/items/importItemModal/index.html',
                    controller: 'ImportItemModalCtrl',
                    backdrop: 'static',
                    size: 'md',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
            }
        }
    ]);
(function () {
    editItem.controller('ItemCreateEditCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state', 'item', 'customers', 'baseFactory', 'itemCustomer', 'categories', 'itemCategories', 'customFields', '$modal',
        'modalFactory', 'documents', 'gallery', 'itemStatuses', 'GRID_CONSTANTS', 'itemCustomFields', 'itemDescription', '$timeout', 'promptFactory', 'singleItems'];

    function ctrl($scope, $rootScope, $state, item, customers, baseFactory, itemCustomer, categories, itemCategories, customFields, $modal, modalFactory,
        documents, gallery, itemStatuses, GRID_CONSTANTS, itemCustomFields, itemDescription, $timeout, promptFactory, singleItems) {

        $scope.changeTab = function (tab) {
            $scope.currentTab = tab;
        };

        $scope.addGroupedItem = addGroupedItem;
        $scope.removeGroupedItem = removeGroupedItem;
        $scope.itemSelected = itemSelected;
        $scope.isCategorySet = isCategorySet;
        $scope.isCustomFieldsSet = isCustomFieldsSet;
        $scope.groupedItemModel = {
            groupText: "",
            selectedItem: null,
            items: []
        };

        function init() {

            $scope.cat = [];
            $scope.categories = categories;
            $scope.doc = {
                id: 0,
                permissions: []
            };

            $scope.currentTab = 1;
            $scope.item = item;
            $scope.selectedCategories = [];
            $scope.itemDescId = "";
            $scope.model = {};
            $scope.statusChanged = false;
            $scope.sendNotification = false;
            $scope.singleItems = singleItems;

            angular.forEach(gallery, function (value) {
                if (value.isPrimary) {
                    $scope.doc.imgSource = value.thumbnail;
                }
            });

            $scope.itemStatuses = angular.copy(itemStatuses);

            if (itemDescription != null) {
                $scope.item.groupDisplayName = itemDescription.groupDisplayName;
                $scope.item.variance2 = itemDescription.variance2;
                $scope.item.variance3 = itemDescription.variance3;
                $scope.item.relatedItems = itemDescription.relatedItems;
                $scope.itemDescription = itemDescription;
                $scope.model.body = $scope.itemDescription.description;
                $scope.model.statusComment = $scope.itemDescription.statusComment;
                angular.forEach(itemStatuses, function (value, index) {
                    if (value.id == $scope.itemDescription.itemStatusId) {
                        $scope.itemStatus = $scope.itemStatuses[index];
                        $scope.selectedItemStatus = $scope.itemStatuses[index];
                    }
                });
                $scope.itemDescId = itemDescription.id;

                if (itemDescription.items) {
                    angular.forEach(itemDescription.items, function (i) {
                        var newItem = {
                            groupDisplayName: i.groupDisplayName,
                            variance2: i.variance2,
                            variance3: i.variance3,
                            itemNumber: i.itemNumber,
                            itemName: i.itemName
                        };

                        $scope.groupedItemModel.items.push(newItem);
                    });
                }

                if (itemDescription.categories) {
                    var catArr = [];
                    angular.forEach(itemDescription.categories, function (itemCat) {
                        $scope.cat.push({ categoryId: itemCat.categoryId });
                        catArr.push(itemCat.categoryId);
                    });

                    angular.forEach($scope.categories, function (v) {
                        v.selected = catArr.indexOf(v.id) >= 0;

                        if (v.children.length > 0) {
                            var ctr = 0;
                            angular.forEach(v.children, function (vv) {
                                vv.selected = catArr.indexOf(vv.id) >= 0;
                                if (vv.selected)
                                    ctr++;
                            });
                            if (v.children.length == ctr) {
                                v.partial = false;
                                v.selected = true;
                            } else {
                                v.partial = ctr > 0;
                            }
                        }
                    });
                }

                if (itemDescription.documents) {
                    angular.forEach(itemDescription.documents, function (doc) {
                        if (doc.isPrimary) {
                            $scope.primaryImage = doc.thumbnail;
                        }
                    });
                }
            }

            $scope.changeTab(1);

            // tab == 1 (Customer Visibility)
            $scope.customers = customers;
            $scope.allSelectedCustomers = [];
            $scope.arrCustomersVisible = angular.copy(itemCustomer.visibleTo);
            $scope.arrCustomersNotVisible = angular.copy(itemCustomer.invisibleTo);

            // tab == 2 (Categories)
            trySelectCategory(categories);
        }

        // tab == 1 (Customer Visibility)

        $scope.addVisibleCustomers = function (selCustomers) {
            angular.forEach(selCustomers, function (selCustomer) {
                $scope.arrCustomersVisible.push(selCustomer);
            });
        };

        $scope.addNotVisibleCustomers = function (selCustomers) {
            angular.forEach(selCustomers, function (selCustomer) {
                $scope.arrCustomersNotVisible.push(selCustomer);
            });
        };

        $scope.close = function () {
            // $modalInstance.close();
        };

        $scope.saveItemCustomer = function () {

            var custVisible = [];
            angular.forEach($scope.arrCustomersVisible, function (value, index) {
                custVisible.splice(0, 0, value.customerId);
            });

            var custNotVisible = [];
            angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                custNotVisible.splice(0, 0, value.customerId);
            });

            var data = {
                itemNumber: item.itemNumber,
                visibleTo: custVisible,
                invisibleTo: custNotVisible
            };
            baseFactory.post("/api/item/UpdateItemCustomers/", data).then(function (data) {
                $modalInstance.close();
            });
        };

        $scope.removeVisibleCustomer = function (c) {
            angular.forEach($scope.arrCustomersVisible, function (value, index) {
                if (c.customerId == value.customerId) {
                    $scope.arrCustomersVisible.splice(index, 1);
                }
            });
        };

        $scope.removeNotVisibleCustomer = function (c) {
            angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                if (c.customerId == value.customerId) {
                    $scope.arrCustomersNotVisible.splice(index, 1);
                }
            });
        };

        $scope.removeAllVisibleCustomers = function () {
            $scope.arrCustomersVisible = [];
        };

        $scope.removeAllNotVisibleCustomers = function () {
            $scope.arrCustomersNotVisible = [];
        };

        // tab == 2 (Categories)
        function trySelectCategory(cats) {
            angular.forEach(cats, function (category) {
                if (category.label == $scope.item.categoryName) {
                    category.selected = true;
                }

                if (category.children && category.children.length > 0) {
                    // trySelectCategory(category.children);
                    var ctr = 0;
                    angular.forEach(category.children, function (ch) {
                        if (ch.selected)
                            ctr++;
                    });

                    if (category.children.length == ctr) {
                        category.partial = false;
                        category.selected = true;
                    } else {
                        category.partial = ctr > 0;
                    }
                }
            });
        }

        $scope.itemCustomFields = [];
        $scope.customFields = customFields;
        $scope.selectedCustomField = null;
        $scope.selectedValue = null;
        $scope.displayDropDown = false;
        $scope.displayTextField = true;


        if (item == null) {
            $scope.mode = "Create";
        } else {
            $scope.mode = "Edit";
            baseFactory.fetch('/api/item/GetItemCustomFields', { itemNumber: item.itemNumber }).then(function (data) {
                $scope.itemCustomFields = data.object;
            });
        }

        $scope.gridCustomFieldOptions = {

            itemType: 'Custom Fields',
            //items: itemCustomFields,
            loadOnInit: true,
            gridName: 'CustomFields',
            fetchUrl: '/api/item/GetItemCustomFields?itemNumber=' + item.itemNumber,
            initSortString: 'customFieldName desc',
            enableSorting: true,
            enableSearching: false,
            enablePaging: true,
            columnDefs: [
                { field: 'customFieldName', displayName: 'Field', width: "40%", customSortField: 'customFieldName' },
                { field: 'value', displayName: 'Value', width: "40%", sortable: false, customSortField: 'value' },
                {
                    field: 'edit', width: "20%", displayName: '', headerCellTemplate: '<div class="btn-group btn-group-sm pull-right"><a ng-click="editItemCustomField(null)" class="btn btn-default" title="Add"><i class="fa fa-plus"></i></a></div>', cellTemplate: '<div class="controls">' +
                      '<div class="btn-group btn-group-sm pull-right">' +
                      '<a ng-click="editItemCustomField(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a> &nbsp;' +
                      '<a ng-click="deleteItemCustomField(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                      '</div></div>'
                }
            ]
        };

        $scope.editItemCustomField = function (customField) {

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editCustomFieldsModal/editCustomField.html',
                controller: 'editItemCustomFieldController',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    itemCustomField: function () {
                        return customField;
                    },
                    customFields: function () {
                        return customFields;
                    },
                    item: function () {
                        return item;
                    }
                }
            });

            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridCustomFieldOptions.gridName);
                $scope.getItemCustomFields();
            });

        };

        $scope.deleteItemCustomField = function (value) {
            modalFactory.deleteEntityFromGrid(
                value.customFieldName,
                value.id,
                'Item Custom Field',
                null,
                '/api/itemcustomfield/delete/',
                $scope.gridCustomFieldOptions.gridName
            ).then(function () {
                $scope.getItemCustomFields();
            });
        };

        $scope.getItemCustomFields = function () {
            baseFactory.fetch('/api/item/GetItemCustomFields', { itemNumber: item.itemNumber }).then(function (data) {
                $scope.itemCustomFields = data.object;
            });
        };

        // tab == 4 (Documents)

        $scope.gridDocumentsOptions = {
            itemType: 'Documents',
            //items: documents,
            loadOnInit: true,
            gridName: 'Documents',
            fetchUrl: '/api/documents/GetAllDocuments?itemNumber=' + item.itemNumber + '&docTypes=' + 1,
            initSortString: 'fileName desc',
            enableSorting: true,
            enableSearching: false,
            enablePaging: true,
            columnDefs: [
                { field: 'date', displayName: 'Date', customSortField: 'dateCreated', width: "20%", cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>' },
                { field: 'fileName', displayName: 'File Name', customSortField: 'fileName', width: "20%" },
                { field: 'description', displayName: 'Description', customSortField: 'details', width: "20%" },
                { field: 'userName', displayName: 'Created By', sortable: false, width: "20%" },
                {
                    field: 'edit', width: "20%", displayName: '', headerCellTemplate: '<div class="btn-group btn-group-sm pull-right"><a ng-click="editItemDocument()" class="btn btn-default" title="Add"><i class="fa fa-plus"></i></a></div>', cellTemplate: '<div class="controls">' +
                        '<div class="btn-group btn-group-sm pull-right">' +
                        '<a ng-click="editItemDocument(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                        '<a ng-click="deleteItemDocument(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                        '</div></div>'
                }
            ]
        };

        $scope.editItemDocument = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editDocumentsModal/editDocuments.html',
                controller: 'editItemDocuments',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    item: function () {
                        return item;
                    },
                    doc: function () {
                        return d;
                    }
                }
            });
            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridDocumentsOptions.gridName);
            });
        };

        $scope.deleteItemDocument = function (entity) {
            modalFactory.deleteEntityFromGrid(
                entity.fileName,
                entity.id,
                'Documents',
                null,
                '/api/documents/delete/',
                $scope.gridDocumentsOptions.gridName
            );
        };

        // Tab == 5 (Galleries)

        $scope.imagesGallery = gallery;

        $scope.updateItemStatus = function () {
            // console.log(status);
            $scope.selectedItemStatus = $scope.itemStatus;
            $scope.statusChanged = true;
        };

        //Upload Main Image
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };

        var isDocument = true;
        var isMedia = true;

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType;
            var result = false;

            if (isDocument || isMedia) {
                fType = ["jpeg", "jpg", "png"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {

            if (isFileValid($files[0].name)) {

                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                .upload('/api/upload/media', { oldfolder: '' }, $files)
                .progress(function (evt) {
                    $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                }).success(function (data, status, headers, config) {
                    if (!data.isErrored) {

                        $scope.doc.itemNumber = item.itemNumber;
                        $scope.doc.docTypeId = 2;
                        $scope.doc.isPrimary = true;
                        $scope.submitTxt = "Uploading...";
                        $scope.disableSubmitButton = true;
                        $scope.doc.fileName = data.object.fileName;
                        $scope.doc.fileFolder = data.object.fileFolder;

                        baseFactory.post("/api/documents/save", $scope.doc).then(function (data) {
                            $scope.doc.imgSource = data.object.thumbnail;
                        });

                        $scope.resetInputFile();
                        $scope.fileModel = data.object;
                        $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                        $scope.doc.fileName = $scope.fileModel.fileName;
                        $scope.doc.isUploaded = true;
                        $scope.doc.isNew = true;
                    }
                    $scope.disableSubmitButton = false;
                    $scope.submitTxt = "Save";
                });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };


        //Save all Model data

        $scope.saveAll = function () {
            if ($scope.statusChanged) {
                promptFactory.dialog('Item Status Update', 'Do you want to send notification email to the customers?', "md", null, 'Yes', 'No', function (result) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                    $scope.sendNotification = result.result;
                    $scope.postItem();
                });
            } else {
                $scope.postItem();
            }

        };

        $scope.postItem = function () {

            var data = {
                id: typeof item.newItemNumber === "undefined" ? $scope.itemDescId : 0,
                itemNumber: item.newItemNumber || item.itemNumber,
                itemName: $scope.item.itemName,
                description: $scope.model.body,
                itemStatusId: $scope.selectedItemStatus.id,
                statusComment: $scope.model.statusComment,
                sendNotification: $scope.sendNotification,
                items: $scope.groupedItemModel.items,
                isGroup: itemDescription.isGroup,
                parentItemId: itemDescription.parentItemId,
                groupDisplayName: $scope.item.groupDisplayName,
                variance2: $scope.item.variance2,
                variance3: $scope.item.variance3,
                isVisible: $scope.item.isVisible,
                relatedItems: $scope.item.relatedItems,
                formBuilder: angular.copy($scope.item.formBuilder)
            };

            baseFactory.post("/api/item/SaveItemDetails/", data).then(function (data) {
                // Save Customer Visibility
                var custVisible = [];
                angular.forEach($scope.arrCustomersVisible, function (value, index) {
                    custVisible.splice(0, 0, value.customerId);
                });

                var custNotVisible = [];
                angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                    custNotVisible.splice(0, 0, value.customerId);
                });

                var data = {
                    itemNumber: item.newItemNumber || item.itemNumber,
                    visibleTo: custVisible,
                    invisibleTo: custNotVisible
                };
                baseFactory.post("/api/item/UpdateItemCustomers/", data).then(function (data) {
                    // Save Item Categories
                    var data = {
                        itemNumber: item.newItemNumber || item.itemNumber,
                        itemSubCategories: $scope.cat
                    };
                    baseFactory.post("/api/item/UpdateItemCategories/", data).then(function (data) {
                        $state.go("^", null, { reload: true });
                    });
                });
            });
        };

        function addGroupedItem() {
            if (!$scope.groupedItemModel.groupText || $scope.groupedItemModel.groupText === "" || !$scope.groupedItemModel.selectedItem) {
                return;
            }

            var newItem = {
                groupDisplayName: $scope.groupedItemModel.groupText,
                variance2: $scope.groupedItemModel.selectedItem.variance2,
                variance3: $scope.groupedItemModel.selectedItem.variance3,
                itemNumber: $scope.groupedItemModel.selectedItem.itemNumber,
                itemName: $scope.groupedItemModel.selectedItem.itemName
            };

            $scope.groupedItemModel.items.push(newItem);
            $scope.groupedItemModel.groupText = "";
            $scope.groupedItemModel.selectedItem = null;
        }

        function removeGroupedItem(deleteditem) {
            if (!deleteditem) {
                return;
            }

            angular.forEach($scope.groupedItemModel.items, function (i, itemIndex) {
                if (deleteditem.itemNumber === i.itemNumber) {
                    $scope.groupedItemModel.items.splice(itemIndex, 1);
                    return;
                }
            });

            var availableItem = {
                itemName: deleteditem.itemName,
                itemNumber: deleteditem.itemNumber,
            };

            $scope.singleItems.push(availableItem);
        };

        function itemSelected() {
            $scope.groupedItemModel.groupText = $scope.groupedItemModel.selectedItem.itemName;
        }


        // watch categories for changes
        $scope.updateItemCategories = function (nvid) {

            $scope.cat = [];
            angular.forEach($scope.categories, function (v) {
                if (v.children.length > 0) {
                    var ctr = 0;
                    angular.forEach(v.children, function (vv) {
                        if (v.id == nvid)
                            vv.selected = v.selected;

                        if (vv.selected) {
                            $scope.cat.push({ categoryId: vv.id });
                            ctr++;
                        }
                    });

                    if (ctr > 0) {
                        if (v.children.length == ctr) {
                            v.partial = false;
                            v.selected = true;
                        } else {
                            v.partial = true;
                        }
                    } else {
                        v.partial = false;
                        v.selected = false;
                    }
                }

                if (v.selected)
                    $scope.cat.push({ categoryId: v.id });
            });
        };

        function isCategorySet() {
            var categorySet = false;

            angular.forEach($scope.categories, function (category) {
                if (!categorySet && (category.partial || category.selected)) {
                    categorySet = true;
                }
            });

            return categorySet;
        }


        function isCustomFieldsSet() {
            var cartonQuantity = false;
            var cartonWeight = false;
            var cartonWidth = false;
            var cartonLength = false;
            var cartonHeight = false;
            var colour = false;

            angular.forEach($scope.itemCustomFields, function (customField) {

                if (customField.customFieldName == "Carton Quantity" && customField.value != "")
                    cartonQuantity = true;

                if (customField.customFieldName == "Carton Weight" && customField.value != "")
                    cartonWeight = true;

                if (customField.customFieldName == "Carton Height" && customField.value != "")
                    cartonHeight = true;

                if (customField.customFieldName == "Carton Length" && customField.value != "")
                    cartonLength = true;

                if (customField.customFieldName == "Carton Width" && customField.value != "")
                    cartonWidth = true;

                if (customField.customFieldName == "Colour" && customField.value != "")
                    colour = true;


            });

            return cartonQuantity && cartonWeight && cartonHeight && cartonLength && cartonWidth && colour;
        }

        $scope.copyConfig = function (itemNumber, items) {
            promptFactory.confirm("Are you sure you want to copy the item configuration from the parent to the grouped items?", function (result) {
                if (result) {
                    //
                    var itemNumberArr = [];
                    for (var i = 0; i < items.length; i++) {
                        itemNumberArr.push(items[i].itemNumber);
                    }

                    var dataToSend = {
                        copyFromItemNumber: itemNumber,
                        copyToItemNumber: itemNumberArr.join()
                    };

                    baseFactory.post('/api/item/copyItemDetails', dataToSend).then(function (rdata) {
                    });
                }
            });
        };

        // Related Items
        $scope.relatedItem = null;
        $scope.addRelatedItem = function (relatedItem) {
            if (!relatedItem)
                return;

            var isExist = false;

            angular.forEach($scope.item.relatedItems, function (i, itemIndex) {
                if (relatedItem.itemNumber === i.itemNumber) {
                    isExist = true;
                }
            });

            if (!isExist) {
                var newItem = {
                    itemNumber: angular.copy(relatedItem.itemNumber),
                    itemName: angular.copy(relatedItem.itemName)
                };

                $scope.item.relatedItems.push(newItem);
            }
            $scope.relatedItem = null;
            angular.element("[relatedItem]").val("");
        }
        $scope.removeRelatedItem = function (deleteditem) {
            if (!deleteditem) {
                return;
            }

            angular.forEach($scope.item.relatedItems, function (i, itemIndex) {
                if (deleteditem.itemNumber === i.itemNumber) {
                    $scope.item.relatedItems.splice(itemIndex, 1);
                    return;
                }
            });
        };

        // CONFIGURATIONS
        $scope.setConfig = function (question) {
            if (!question.dependantField)
                return;

            var modal = $modal.open({
                templateUrl: '/app/modules/admin/formBuilder/modals/dependantFieldConfigModal.html',
                controller: 'dependantFieldConfigModal',
                resolve: {
                    question: function () {
                        return question;
                    },
                    customFields: function () {
                        return $scope.customFields;
                    }
                }
            });

            modal.result.then(function (result) {
                question.dependantFieldOptions = result;
            });
        };
        $scope.clearFieldConfig = function (question) {
            question.dependantFieldOptions = null;
            question.dependantField = null;
        };
        $scope.setItemConfig = function (question) {
            var modal = $modal.open({
                templateUrl: '/app/modules/admin/formBuilder/modals/dependantItemConfigModal.html',
                controller: 'dependantItemConfigModal',
                resolve: {
                    question: function () {
                        return question;
                    },
                    items: function () {
                        return items;
                    }
                }
            });
            modal.result.then(function (result) {
                question.dependantItemOptions = result;
            });
        };
        $scope.clearItemConfig = function (question) {
            question.dependantItemOptions = null;
        };
        $scope.removeCategory = function (list, category) {
            if (!category || !list)
                return;
            var index = list.indexOf(category);
            list.splice(index, 1);
        };
        $scope.dependantFieldChanged = function (question) {
            //dependant field has changed. Need to wipe the options
            question.dependantFieldOptions = null;
        };
        var applyCustomFieldToQuestion = function (question) {
            //add the custom field to the question. This is used for logic on the page
            angular.forEach($scope.customFields, function (customField) {
                if (customField.id == question.id) {
                    question.customField = angular.copy(customField);
                }
            });
        };
        $scope.addCategory = function (group) {
            if (!group.newQuestionCustomField)
                return;
            if (!group.questions)
                group.questions = [];

            var question = {
                name: group.newQuestionCustomField.name,
                id: group.newQuestionCustomField.id
            };
            applyCustomFieldToQuestion(question);

            group.questions.push(question);
            group.newQuestionCustomField = null;
        };

        init();
    }
})();
(function () {
    itemModule.controller('CopyItemModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'GRID_CONSTANTS', 'item', 'gridName'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, GRID_CONSTANTS, item, gridName) {

        $scope.submitButton = "Copy";
        $scope.close = close;
        $scope.save = save;
        $scope.disableSubmitButton = false;
        $scope.m = {
            copyFromItemNumber: item.itemNumber,
            copyFromItem: item.itemName + " - " + item.itemNumber,
            copyToItemNumber: null,
            copyToItem: null,
            copyToItems: []
        };

        function save(mForm, m) {

            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitButton = "Copying...";
                $scope.disableSubmitButton = true;

                //
                var itemNumberArr = [];
                for (var i = 0; i < $scope.m.copyToItems.length; i++) {
                    itemNumberArr.push($scope.m.copyToItems[i].itemNumber);
                }

                //
                var dataToSend = {
                    copyFromItemNumber: m.copyFromItemNumber,
                    copyToItemNumber: itemNumberArr.join()
                };

                baseFactory.post('/api/item/copyItemDetails', dataToSend).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                        $modalInstance.close();
                    }
                    $scope.submitButton = "Copy";
                    $scope.disableSubmitButton = false;
                });
            }
        };
        function close() {
            $modalInstance.close();
        };

        $scope.loadingItems = false;
        $scope.searchProducts = function (searchText) {
            if (searchText.length < 2)
                return [];

            var dataToSend = {
                itemVisibility: true,
                startIndex: 1,
                retrieveSize: 10,
                searchText: searchText,
                sort: 'name asc'
            };
            $scope.loadingItems = true;
            return baseFactory.fetch('/api/item/Search', dataToSend).then(function (rdata) {
                var arr = [];
                // Exclude
                for (var i = 0; i < rdata.object.length; i++) {
                    if (rdata.object[i].itemNumber != $scope.m.copyFromItemNumber) {
                        arr.push(rdata.object[i]);
                    }
                }
                $scope.loadingItems = false;
                return arr;
            });
        };
        $scope.containsTokens = function (state, viewValue) {
            if (!state || typeof state !== "string") {
                return false;
            }

            var matches = [];
            var tokens = viewValue.split(" ");

            for (var i = 0; i < tokens.length; i++) {
                if (state.toLowerCase().trim().indexOf(tokens[i].toLowerCase().trim()) > -1) {
                    matches.push(true);
                } else {
                    matches.push(false);
                }
            }

            var allMatch = true;

            for (var j = 0; j < matches.length; j++) {
                if (!matches[j]) {
                    allMatch = false;
                }
            }

            return allMatch;
        };
        $scope.addItem = function ($item, $model, $label, $event) {
            console.log($item, $model, $label, $event);
            var isExist = false;
            for (var i = 0; i < $scope.m.copyToItems.length; i++) {
                if ($scope.m.copyToItems[i].itemNumber == $item.itemNumber) {
                    isExist = true;
                    break;
                }
            }
            if (!isExist) {
                $scope.m.copyToItems.push($item);
            }
            $scope.m.copyToItem = null;
        };
        $scope.removeItem = function ($item) {
            for (var i = 0; i < $scope.m.copyToItems.length; i++) {
                if ($scope.m.copyToItems[i].itemNumber == $item.itemNumber) {
                    $scope.m.copyToItems.splice(i, 1);
                    break;
                }
            }
        };
    }
})();
(function () {
    itemModule.controller('create', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'model', 'GRID_CONSTANTS', 'gridName'];

    function ctrl($scope, $rootScope, $modalInstance, baseFactory, model, GRID_CONSTANTS, gridName) {

        $scope.close = close;
        $scope.save = save;
        $scope.disableSubmitButton = disableSubmitButton;

        $scope.model = model.object;

        init();
        function init() {

        }

        var generateModelToSave = function () {
            var modelToSave = angular.copy($scope.model.item);
            modelToSave.itemStatusId = $scope.itemStatus.id;
            return modelToSave;
        };

        function save() {
            var uri = '/api/Item/createitem';

            $scope.loading = true;
            baseFactory.call(uri, generateModelToSave()).then(function (data) {
                if (!data.isErrored) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                    $modalInstance.close();
                }
            }).finally(function () {
                $scope.loading = false;
            });
        };

        function disableSubmitButton() {
            return !$scope.itemStatus || !$scope.model.item.itemName || $scope.model.item.itemName === '';
        };

        function close() {
            $modalInstance.close();
        };
    }
})();
(function () {
    editItem.controller('editItemCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'item', 'customers', 'baseFactory', 'itemCustomer', 'categories', 'itemCategories', 'customFields', '$modal'
        , 'modalFactory', 'documents', 'gallery', 'itemStatuses', 'GRID_CONSTANTS', 'itemCustomFields', 'itemDescription', '$timeout', 'promptFactory', 'gridName', 'singleItems', 'itemBrands'];
    function ctrl($scope, $rootScope, $modalInstance, item, customers, baseFactory, itemCustomer, categories, itemCategories, customFields, $modal, modalFactory,
        documents, gallery, itemStatuses, GRID_CONSTANTS, itemCustomFields, itemDescription, $timeout, promptFactory, gridName, singleItems, itemBrands) {

        $scope.changeTab = function (tab) {
            $scope.currentTab = tab;
        };

        $scope.addGroupedItem = addGroupedItem;
        $scope.removeGroupedItem = removeGroupedItem;
        $scope.itemSelected = itemSelected;
        $scope.isCategorySet = isCategorySet;
        $scope.isCustomFieldsSet = isCustomFieldsSet;
        $scope.groupedItemModel = {
            groupText: "",
            selectedItem: null,
            items: []
        };
        $scope.itemBrands = itemBrands;
        $scope.itemBrands.splice(0, 0, { id: null, name: "None" });

        function init() {

            $scope.cat = [];
            $scope.categories = categories;
            $scope.doc = {
                id: 0,
                permissions: []
            };

            $scope.currentTab = 1;
            $scope.item = item;
            $scope.selectedCategories = [];
            $scope.itemDescId = "";
            $scope.model = {};
            $scope.statusChanged = false;
            $scope.sendNotification = false;
            $scope.singleItems = singleItems;

            angular.forEach(gallery, function (value) {
                if (value.isPrimary) {
                    $scope.doc.imgSource = value.thumbnail;
                }
            });

            $scope.itemStatuses = angular.copy(itemStatuses);

            if (itemDescription != null) {
                $scope.item.seo = itemDescription.seo;
                $scope.item.groupDisplayName = itemDescription.groupDisplayName;
                $scope.item.variance2 = itemDescription.variance2;
                $scope.item.variance3 = itemDescription.variance3;
                $scope.item.relatedItems = itemDescription.relatedItems;
                $scope.itemDescription = itemDescription;
                $scope.model.body = $scope.itemDescription.description;
                $scope.model.statusComment = $scope.itemDescription.statusComment;
                $scope.model.itemBrandId = $scope.itemDescription.itemBrandId;
                angular.forEach(itemStatuses, function (value, index) {
                    if (value.id == $scope.itemDescription.itemStatusId) {
                        $scope.itemStatus = $scope.itemStatuses[index];
                        $scope.selectedItemStatus = $scope.itemStatuses[index];
                    }
                });
                $scope.itemDescId = itemDescription.id;

                if (itemDescription.items) {
                    angular.forEach(itemDescription.items, function (i) {
                        var newItem = {
                            groupDisplayName: i.groupDisplayName,
                            variance2: i.variance2,
                            variance3: i.variance3,
                            itemNumber: i.itemNumber,
                            itemName: i.itemName
                        };

                        $scope.groupedItemModel.items.push(newItem);
                    });
                }

                if (itemDescription.categories) {
                    var catArr = [];
                    angular.forEach(itemDescription.categories, function (itemCat) {
                        $scope.cat.push({ categoryId: itemCat.categoryId });
                        catArr.push(itemCat.categoryId);
                    });

                    angular.forEach($scope.categories, function (v) {
                        v.selected = catArr.indexOf(v.id) >= 0;

                        if (v.children.length > 0) {
                            var ctr = 0;
                            angular.forEach(v.children, function (vv) {
                                vv.selected = catArr.indexOf(vv.id) >= 0;
                                if (vv.selected)
                                    ctr++;
                            });
                            if (v.children.length == ctr) {
                                v.partial = false;
                                v.selected = true;
                            } else {
                                v.partial = ctr > 0;
                            }
                        }
                    });
                }

                if (itemDescription.documents) {
                    angular.forEach(itemDescription.documents, function (doc) {
                        if (doc.isPrimary) {
                            $scope.primaryImage = doc.thumbnail;
                        }
                    });
                }
            }

            $scope.changeTab(1);

            // tab == 1 (Customer Visibility)
            $scope.customers = customers;
            $scope.allSelectedCustomers = [];
            $scope.arrCustomersVisible = angular.copy(itemCustomer.visibleTo);
            $scope.arrCustomersNotVisible = angular.copy(itemCustomer.invisibleTo);

            // tab == 2 (Categories)
            trySelectCategory(categories);
        }

        // tab == 1 (Customer Visibility)

        $scope.addVisibleCustomers = function (selCustomers) {
            angular.forEach(selCustomers, function (selCustomer) {
                $scope.arrCustomersVisible.push(selCustomer);
            });
        };

        $scope.addNotVisibleCustomers = function (selCustomers) {
            angular.forEach(selCustomers, function (selCustomer) {
                $scope.arrCustomersNotVisible.push(selCustomer);
            });
        };

        $scope.close = function () {
            $modalInstance.close();
        };

        $scope.saveItemCustomer = function () {

            var custVisible = [];
            angular.forEach($scope.arrCustomersVisible, function (value, index) {
                custVisible.splice(0, 0, value.customerId);
            });

            var custNotVisible = [];
            angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                custNotVisible.splice(0, 0, value.customerId);
            });

            var data = {
                itemNumber: item.itemNumber,
                visibleTo: custVisible,
                invisibleTo: custNotVisible
            };
            baseFactory.post("/api/item/UpdateItemCustomers/", data).then(function (data) {
                $modalInstance.close();
            });
        };

        $scope.removeVisibleCustomer = function (c) {
            angular.forEach($scope.arrCustomersVisible, function (value, index) {
                if (c.customerId == value.customerId) {
                    $scope.arrCustomersVisible.splice(index, 1);
                }
            });
        };

        $scope.removeNotVisibleCustomer = function (c) {
            angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                if (c.customerId == value.customerId) {
                    $scope.arrCustomersNotVisible.splice(index, 1);
                }
            });
        };

        $scope.removeAllVisibleCustomers = function () {
            $scope.arrCustomersVisible = [];
        };

        $scope.removeAllNotVisibleCustomers = function () {
            $scope.arrCustomersNotVisible = [];
        };

        // tab == 2 (Categories)
        function trySelectCategory(cats) {
            angular.forEach(cats, function (category) {
                if (category.label == $scope.item.categoryName) {
                    category.selected = true;
                }

                if (category.children && category.children.length > 0) {
                    // trySelectCategory(category.children);
                    var ctr = 0;
                    angular.forEach(category.children, function (ch) {
                        if (ch.selected)
                            ctr++;
                    });

                    if (category.children.length == ctr) {
                        category.partial = false;
                        category.selected = true;
                    } else {
                        category.partial = ctr > 0;
                    }
                }
            });
        }

        $scope.itemCustomFields = [];
        $scope.customFields = customFields;
        $scope.selectedCustomField = null;
        $scope.selectedValue = null;
        $scope.displayDropDown = false;
        $scope.displayTextField = true;
        $scope.disableAlias = true;
        var currentAlias = angular.copy(item.itemAlias);

        if (item == null) {
            $scope.mode = "Add";
        } else {
            $scope.mode = "Edit";
            baseFactory.fetch('/api/item/GetItemCustomFields', { itemNumber: item.itemNumber }).then(function (data) {
                $scope.itemCustomFields = data.object;
            });
        }

        $scope.gridCustomFieldOptions = {

            itemType: 'Custom Fields',
            //items: itemCustomFields,
            loadOnInit: true,
            gridName: 'CustomFields',
            fetchUrl: '/api/item/GetItemCustomFields?itemNumber=' + item.itemNumber,
            initSortString: 'customFieldName desc',
            enableSorting: true,
            enableSearching: false,
            enablePaging: true,
            columnDefs: [
                { field: 'customFieldName', displayName: 'Field', width: "40%", customSortField: 'customFieldName' },
                { field: 'value', displayName: 'Value', width: "40%", sortable: false, customSortField: 'value' },
                {
                    field: 'edit', width: "20%", displayName: '', headerCellTemplate: '<div class="btn-group btn-group-sm pull-right"><a ng-click="editItemCustomField(null)" class="btn btn-default" title="Add"><i class="fa fa-plus"></i></a></div>', cellTemplate: '<div class="controls">' +
                        '<div class="btn-group btn-group-sm pull-right">' +
                        '<a ng-click="editItemCustomField(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a> &nbsp;' +
                        '<a ng-click="deleteItemCustomField(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                        '</div></div>'
                }
            ]
        };

        $scope.editItemCustomField = function (customField) {

            var modalInstance = $modal.open({
                templateUrl: customField === null ? '/app/modules/admin/items/editItemModal/editCustomFieldsModal/editCustomField.html' :
                    '/app/modules/admin/items/editItemModal/editCustomFieldsModal/editCustomFieldValue.html',
                controller: 'editItemCustomFieldController',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    itemCustomField: function () {
                        return customField;
                    },
                    customFields: function () {
                        return customFields;
                    },
                    item: function () {
                        return item;
                    }
                }
            });

            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridCustomFieldOptions.gridName);
                $scope.getItemCustomFields();
            });

        };

        $scope.deleteItemCustomField = function (value) {
            modalFactory.deleteEntityFromGrid(
                value.customFieldName,
                value.id,
                'Item Custom Field',
                null,
                '/api/itemcustomfield/delete/',
                $scope.gridCustomFieldOptions.gridName
            ).then(function () {
                $scope.getItemCustomFields();
            });
        };

        $scope.getItemCustomFields = function () {
            baseFactory.fetch('/api/item/GetItemCustomFields', { itemNumber: item.itemNumber }).then(function (data) {
                $scope.itemCustomFields = data.object;
            });
        };

        // tab == 4 (Documents)

        $scope.gridDocumentsOptions = {
            itemType: 'Documents',
            //items: documents,
            loadOnInit: true,
            gridName: 'Documents',
            fetchUrl: '/api/documents/GetAllDocuments?itemNumber=' + item.itemNumber + '&docTypes=' + 1,
            initSortString: 'fileName desc',
            enableSorting: true,
            enableSearching: false,
            enablePaging: true,
            columnDefs: [
                { field: 'date', displayName: 'Date', customSortField: 'dateCreated', width: "20%", cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>' },
                { field: 'fileName', displayName: 'File Name', customSortField: 'fileName', width: "20%" },
                { field: 'description', displayName: 'Description', customSortField: 'details', width: "20%" },
                { field: 'userName', displayName: 'Created By', sortable: false, width: "20%" },
                {
                    field: 'edit', width: "20%", displayName: '', headerCellTemplate: '<div class="btn-group btn-group-sm pull-right"><a ng-click="editItemDocument()" class="btn btn-default" title="Add"><i class="fa fa-plus"></i></a></div>', cellTemplate: '<div class="controls">' +
                        '<div class="btn-group btn-group-sm pull-right">' +
                        '<a ng-click="editItemDocument(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                        '<a ng-click="deleteItemDocument(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                        '</div></div>'
                }
            ]
        };

        $scope.editItemDocument = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editDocumentsModal/editDocuments.html',
                controller: 'editItemDocuments',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    item: function () {
                        return item;
                    },
                    doc: function () {
                        return d;
                    }
                }
            });
            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridDocumentsOptions.gridName);
            });
        };

        $scope.deleteItemDocument = function (entity) {
            modalFactory.deleteEntityFromGrid(
                entity.fileName,
                entity.id,
                'Documents',
                null,
                '/api/documents/delete/',
                $scope.gridDocumentsOptions.gridName
            );
        };

        // Tab == 5 (Galleries)

        $scope.imagesGallery = gallery;
        $scope.item = item;


        $scope.updateItemStatus = function () {
            console.log(status);
            $scope.selectedItemStatus = $scope.itemStatus;
            $scope.statusChanged = true;
        };

        //Upload Main Image
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };

        var isDocument = true;
        var isMedia = true;

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType;
            var result = false;

            if (isDocument || isMedia) {
                fType = ["jpeg", "jpg", "png"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {

            if (isFileValid($files[0].name)) {

                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.doc.itemNumber = item.itemNumber;
                            $scope.doc.docTypeId = 2;
                            $scope.doc.isPrimary = true;
                            $scope.submitTxt = "Uploading...";
                            $scope.disableSubmitButton = true;
                            $scope.doc.fileName = data.object.fileName;
                            $scope.doc.fileFolder = data.object.fileFolder;

                            baseFactory.post("/api/documents/save", $scope.doc).then(function (data) {
                                $scope.doc.imgSource = data.object.thumbnail;
                            });

                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        } else {
                            $scope.resetInputFile();
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    }).error(function () {
                        $scope.resetInputFile();
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };


        //Save all Model data

        $scope.saveAll = function () {
            if ($scope.statusChanged) {
                promptFactory.dialog('Item Status Update', 'Do you want to send notification email to the customers?', "md", null, 'Yes', 'No', function (result) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                    $scope.sendNotification = result.result;
                    $scope.postItem();
                });
            } else {
                $scope.postItem();
            }

        };

        $scope.postItem = function () {
            $scope.disableSubmitButton = true;
            var data = {
                id: typeof item.newItemNumber === "undefined" ? $scope.itemDescId : 0,
                itemNumber: item.newItemNumber || item.itemNumber,
                itemName: $scope.item.itemName,
                description: $scope.model.body,
                itemStatusId: $scope.selectedItemStatus.id,
                itemBrandId: $scope.model.itemBrandId,
                statusComment: $scope.model.statusComment,
                sendNotification: $scope.sendNotification,
                items: $scope.groupedItemModel.items,
                isGroup: itemDescription.isGroup,
                parentItemId: itemDescription.parentItemId,
                groupDisplayName: $scope.item.groupDisplayName,
                variance2: $scope.item.variance2,
                variance3: $scope.item.variance3,
                isVisible: $scope.item.isVisible,
                relatedItems: $scope.item.relatedItems,
                varianceConfiguration: angular.copy($scope.itemDescription.varianceConfiguration),
                seo: $scope.item.seo
            };

            var alias = $scope.item.itemAlias.toLowerCase().replace(/\s\s+/g, ' ').replaceAll(' ', '-');
            data.itemAlias = alias.replace(/^\s+|\s+$/gm, '');

            baseFactory.post("/api/item/SaveItemDetails/", data).then(function (data) {
                if (data.isErrored)
                    $scope.disableSubmitButton = false;

                // Save Customer Visibility
                var custVisible = [];
                angular.forEach($scope.arrCustomersVisible, function (value, index) {
                    custVisible.splice(0, 0, value.customerId);
                });

                var custNotVisible = [];
                angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                    custNotVisible.splice(0, 0, value.customerId);
                });

                var data = {
                    itemNumber: item.newItemNumber || item.itemNumber,
                    visibleTo: custVisible,
                    invisibleTo: custNotVisible
                };
                baseFactory.post("/api/item/UpdateItemCustomers/", data).then(function (data) {
                    // Save Item Categories
                    var data = {
                        itemNumber: item.newItemNumber || item.itemNumber,
                        itemSubCategories: $scope.cat
                    };
                    if (data.isErrored)
                        $scope.disableSubmitButton = false;

                    baseFactory.post("/api/item/UpdateItemCategories/", data).then(function (data) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                        $modalInstance.close();
                        $scope.disableSubmitButton = false;
                    });
                });
            });
        };

        function addGroupedItem() {
            if (!$scope.groupedItemModel.groupText || $scope.groupedItemModel.groupText === "" || !$scope.groupedItemModel.selectedItem) {
                return;
            }
            var newItem = {
                groupDisplayName: $scope.groupedItemModel.groupText,
                variance2: $scope.groupedItemModel.selectedItem.variance2,
                variance3: $scope.groupedItemModel.selectedItem.variance3,
                itemNumber: $scope.groupedItemModel.selectedItem.itemNumber,
                itemName: $scope.groupedItemModel.selectedItem.itemName
            };

            $scope.groupedItemModel.items.push(newItem);
            $scope.groupedItemModel.groupText = "";
            $scope.groupedItemModel.selectedItem = null;
        }

        function removeGroupedItem(deleteditem) {
            if (!deleteditem) {
                return;
            }

            angular.forEach($scope.groupedItemModel.items, function (i, itemIndex) {
                if (deleteditem.itemNumber === i.itemNumber) {
                    $scope.groupedItemModel.items.splice(itemIndex, 1);
                    return;
                }
            });

            var availableItem = {
                itemName: deleteditem.itemName,
                itemNumber: deleteditem.itemNumber,
            };

            $scope.singleItems.push(availableItem);
        };

        function itemSelected() {
            $scope.groupedItemModel.groupText = $scope.groupedItemModel.selectedItem.itemName;
        }


        // watch categories for changes
        $scope.updateItemCategories = function (nvid) {

            $scope.cat = [];
            angular.forEach($scope.categories, function (v) {
                if (v.children.length > 0) {
                    var ctr = 0;
                    angular.forEach(v.children, function (vv) {
                        if (v.id == nvid)
                            vv.selected = v.selected;

                        if (vv.selected) {
                            $scope.cat.push({ categoryId: vv.id });
                            ctr++;
                        }
                    });

                    if (ctr > 0) {
                        if (v.children.length == ctr) {
                            v.partial = false;
                            v.selected = true;
                        } else {
                            v.partial = true;
                        }
                    } else {
                        v.partial = false;
                        v.selected = false;
                    }
                }

                if (v.selected)
                    $scope.cat.push({ categoryId: v.id });
            });
        };

        function isCategorySet() {
            var categorySet = false;

            angular.forEach($scope.categories, function (category) {
                if (!categorySet && (category.partial || category.selected)) {
                    categorySet = true;
                }
            });

            return categorySet;
        }


        function isCustomFieldsSet() {
            var cartonQuantity = false;
            var cartonWeight = false;
            var cartonWidth = false;
            var cartonLength = false;
            var cartonHeight = false;
            var colour = false;

            angular.forEach($scope.itemCustomFields, function (customField) {

                if (customField.customFieldName == "Carton Quantity" && customField.value != "")
                    cartonQuantity = true;

                if (customField.customFieldName == "Carton Weight" && customField.value != "")
                    cartonWeight = true;

                if (customField.customFieldName == "Carton Height" && customField.value != "")
                    cartonHeight = true;

                if (customField.customFieldName == "Carton Length" && customField.value != "")
                    cartonLength = true;

                if (customField.customFieldName == "Carton Width" && customField.value != "")
                    cartonWidth = true;

                if (customField.customFieldName == "Colour" && customField.value != "")
                    colour = true;


            });

            return cartonQuantity && cartonWeight && cartonHeight && cartonLength && cartonWidth && colour;
        }

        $scope.copyConfig = function (itemNumber, items) {
            promptFactory.confirm("Are you sure you want to copy the item configuration from the parent to the grouped items?", function (result) {
                if (result) {
                    //
                    var itemNumberArr = [];
                    for (var i = 0; i < items.length; i++) {
                        itemNumberArr.push(items[i].itemNumber);
                    }

                    var dataToSend = {
                        copyFromItemNumber: itemNumber,
                        copyToItemNumber: itemNumberArr.join()
                    };

                    baseFactory.post('/api/item/copyItemDetails', dataToSend).then(function (rdata) {
                    });
                }
            });
        };

        // Related Items
        $scope.relatedItem = null;
        $scope.addRelatedItem = function (relatedItem) {
            if (!relatedItem)
                return;

            var isExist = false;

            angular.forEach($scope.item.relatedItems, function (i, itemIndex) {
                if (relatedItem.itemNumber === i.itemNumber) {
                    isExist = true;
                }
            });

            if (!isExist) {
                var newItem = {
                    itemNumber: angular.copy(relatedItem.itemNumber),
                    itemName: angular.copy(relatedItem.itemName)
                };

                $scope.item.relatedItems.push(newItem);
            }
            $scope.relatedItem = null;
            angular.element("[relatedItem]").val("");
        }
        $scope.removeRelatedItem = function (deleteditem) {
            if (!deleteditem) {
                return;
            }

            angular.forEach($scope.item.relatedItems, function (i, itemIndex) {
                if (deleteditem.itemNumber === i.itemNumber) {
                    $scope.item.relatedItems.splice(itemIndex, 1);
                    return;
                }
            });
        };

        $scope.loadingItems = false;
        $scope.searchProducts = function (searchText) {
            if (searchText.length < 2)
                return [];

            var dataToSend = {
                itemVisibility: true,
                startIndex: 1,
                retrieveSize: 10,
                searchText: searchText,
                sort: 'name asc',
                itemType: 'Single'
            };
            $scope.loadingItems = true;
            return baseFactory.fetch('/api/item/Search', dataToSend).then(function (rdata) {
                var arr = [];
                var excludeArr = [];

                for (var i = 0; i < $scope.groupedItemModel.items.length; i++) {
                    excludeArr.push($scope.groupedItemModel.items[i].itemNumber);
                }
                // Exclude
                for (var i = 0; i < rdata.object.length; i++) {
                    if (excludeArr.indexOf(rdata.object[i].itemNumber) < 0) {
                        arr.push(rdata.object[i]);
                    }
                }
                $scope.loadingItems = false;
                return arr;
            });
        };

        $scope.editVarianceOption = function (indx, variance) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/varianceOptionModal/edit.html',
                controller: 'VarianceOptionModalCtrl',
                size: 'md',
                resolve: {
                    title: function () {
                        return variance;
                    },
                    options: function () {
                        if ($scope.itemDescription.varianceConfiguration == null) {
                            $scope.itemDescription.varianceConfiguration = {
                                varianceList: [
                                    { options: [] },
                                    { options: [] },
                                    { options: [] }
                                ]
                            };
                        } else if ($scope.itemDescription.varianceConfiguration.varianceList.length == 0) {
                            $scope.itemDescription.varianceConfiguration.varianceList = [
                                { options: [] },
                                { options: [] },
                                { options: [] }
                            ];
                        }
                        return $scope.itemDescription.varianceConfiguration.varianceList[indx].options;
                    }
                }
            });

            modalInstance.result.then(function (options) {
                $scope.itemDescription.varianceConfiguration.varianceList[indx].options = angular.copy(options);
            });
        };

        $scope.enableAliasEdit = function () {
            $scope.disableAlias = !$scope.disableAlias;
            if ($scope.disableAlias)
                $scope.item.itemAlias = currentAlias;
        };

        init();
    }
})();
(function () {
    editItem.controller('galleryController', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'modalFactory'];

    function ctrl($scope, $rootScope, $modal, GRID_CONSTANTS, modalFactory) {

        $scope.editImage = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editGalleryModal/editGallery.html',
                controller: 'editItemGalleries',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    item: function () {
                        return $scope.item;
                    },
                    doc: function () {
                        return d;
                    }
                }
            });

            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.galleryGridOptions.gridName);
            });
        }
        
        $scope.galleryGridOptions = {
            itemType: 'image',
            //items: $scope.imagesGallery,
            loadOnInit: true,
            gridName: 'imageGallery',
            fetchUrl: '/api/documents/GetAllDocuments?itemNumber=' + $scope.item.itemNumber + '&docTypes=' + 2,
            initSortString: 'fileName desc',
            enableSorting: true,
            enableSearching: false,
            enablePaging: true,
            rowHeight: 150,
            columnDefs: [
                { field: 'image', displayName: 'Image', customSortField: 'date', width: "20%", cellTemplate: '<div class="ngCellText"><img ng-src="{{row.entity.thumbnail}}" class="img-responsive" style="margin: 0 auto; max-height: 100px; max-width:150px;" /> </div>' },
                { field: 'fileName', displayName: 'File Name', customSortField: 'fileName', width: "30%" },
                /*{ field: 'isPrimary', displayName: 'Primary', width: "15%", cellTemplate: '<div class="ngCellText"><input type="checkbox" ng-checked="row.entity.isPrimary" ng-model="row.entity.isPrimary" ng-disabled="true"></div>' },*/
                { field: 'description', displayName: 'Description', customSortField: 'details', width: "35%" },
                {
                    field: 'edit', width: "15%", displayName: '',
                    headerCellTemplate: '<div class="btn-group btn-group-sm pull-right"><a ng-click="editImage()" class="btn btn-default" title="Add"><i class="fa fa-plus"></i></a></div>',
                    cellTemplate: '<div class="controls">' +
                      '<div class="btn-group btn-group-sm pull-right">' +
                      '<a ng-click="editImage(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a> &nbsp;' +
                      '<a ng-click="deleteImage(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                      '</div></div>'
                }
            ],
            plugins: [new ngGridFlexibleHeightPlugin()]
        };

        //

        $scope.deleteImage = function (entity) {
            modalFactory.deleteEntityFromGrid(
                entity.fileName,
                entity.id,
                'Image',
                null,
                '/api/documents/delete/',
                $scope.galleryGridOptions.gridName
            );
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.galleryGridOptions.gridName);
        }

    }
})();
(function () {
    editItem.controller('videoGalleryController', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', '$modal', '$state', '$log', '$location', '$timeout',
        'GRID_CONSTANTS', 'modalFactory', 'gridTemplateFactory', 'promptFactory', 'baseFactory', 'permissionFactory'];
    function ctrl($scope, $rootScope, $stateParams, $modal, $state, $log, $location, $timeout,
        GRID_CONSTANTS, modalFactory, gridTemplateFactory, promptFactory, baseFactory, permissionFactory) {
        //var localKeyName = $state.current.name == "home.athletes.dashboard.media" ? "athlete_media_grid" : "athleteProfile_widget_media";
        //$scope.docTypes = [{ id: null, type: "All" }];
        //angular.forEach(docTypes, function (dt) {
        //    var isExist = false;
        //    if (dt.isMedia) {
        //        // check if exist
        //        angular.forEach($scope.docTypes, function (dtt) {
        //            if (dt.id == dtt.id) {
        //                isExist = true;
        //            }
        //        });
        //        if (!isExist) {
        //            $scope.docTypes.push(dt);
        //        }
        //    }
        //});
        var url = '/api/documents/GetAllDocuments?itemNumber=' + $scope.item.itemNumber;

        //
        $scope.gridDebounce = GRID_CONSTANTS.GRID_SEARCH_DEBOUNCE;
        $scope.mediaList = [];
        $scope.isLoadMore = false;
        $scope.isLoading = false;
        $scope.searchText = "";
        $scope.dateRange = {
            startDate: moment().subtract(29, 'days'),
            endDate: moment()
        };
        $scope.dd = null;

        if ($scope.dd == null) {
            //var keys = localStorageService.keys();
            //// console.log(keys);
            //if (keys.indexOf(localKeyName) >= 0) {
            //    $scope.dd = localStorageService.get(localKeyName);
            //    $scope.dd.athleteId = $stateParams.id;
            //    $scope.dateRange = {
            //        startDate: $state.current.name == "home.athletes.dashboard.media" ? moment($scope.dd.startDate, 'YYYY-M-DD') : '1970-1-01',
            //        endDate: moment($scope.dd.endDate, 'YYYY-M-DD')
            //    };
            //} else {
            //}
            $scope.dateRange = {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            };
            $scope.dd = {
                startIndex: 1,
                retrieveSize: 40,
                docTypes: '3',
                sort: 'fileName desc'
            };
            // localStorageService.set(localKeyName, $scope.dd);
            $scope.dd.athleteId = $stateParams.id;
        }

        $scope.loadMore = function () {
            $scope.isLoading = true;
            baseFactory.fetch(url, $scope.dd).then(function (rdata) {
                $scope.isLoading = false;
                if (!rdata.isErrored) {
                    var media = rdata.object || [];
                    angular.forEach(media, function (m) {
                        if (m.isImage && (m.thumbnail == null || m.thumbnail == ""))
                            m.thumbnail = m.link;
                        if (m.isVideo && (m.thumbnail == null || m.thumbnail == ""))
                            m.thumbnail = "/content/img/video-thumbnail.png";
                        $scope.mediaList.push(m);
                    });
                    $scope.isLoadMore = false;
                    if (media.length == rdata.retrievalSize) {
                        $scope.isLoadMore = true;
                        var sIndex = parseInt(rdata.startIndex) + rdata.retrievalSize;
                        $scope.dd = {
                            startIndex: sIndex,
                            retrieveSize: rdata.retrievalSize,
                            docTypes: $scope.dd.docTypes,
                            sort: 'fileName desc'
                        };
                    }
                }
            });
        };
        $scope.reload = function () {
            $scope.mediaList = [];
            $scope.isLoadMore = false;
            $scope.isLoading = true;
            var dd = {
                startIndex: 1,
                retrieveSize: 40,
                docTypes: $scope.dd.docTypes,
                sort: 'fileName desc'
            };
            $scope.dd = dd;
            // localStorageService.set(localKeyName, $scope.dd);
            $scope.dd.athleteId = $stateParams.id;
            baseFactory.fetch(url, dd).then(function (rdata) {
                $scope.isLoading = false;
                if (!rdata.isErrored) {
                    var media = rdata.object || [];
                    angular.forEach(media, function (m) {
                        if (m.isImage && (m.thumbnail == null || m.thumbnail == ""))
                            m.thumbnail = m.link;
                        if (m.isVideo && (m.thumbnail == null || m.thumbnail == ""))
                            m.thumbnail = "/content/img/video-thumbnail.png";
                        $scope.mediaList.push(m);
                    });
                    $scope.isLoadMore = false;
                    if (media.length == rdata.retrievalSize) {
                        $scope.isLoadMore = true;
                        var sIndex = parseInt(rdata.startIndex) + rdata.retrievalSize;
                        $scope.dd = angular.copy({
                            startIndex: sIndex,
                            retrieveSize: rdata.retrievalSize,
                            docTypes: $scope.dd.docTypes,
                            sort: 'fileName desc'
                        });
                    }
                }
            });
        };
        $scope.updateMediaSearch = function () {
            $scope.reload();
        };
        $scope.dateRangeChanged = function () {
            $scope.reload();
        };

        $scope.reload();

        // EDIT
        $scope.createEditVideo = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editVideoGalleryModal/editVideoGallery.html',
                controller: 'editItemVideoGalleries',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    item: function () {
                        return $scope.item;
                    },
                    doc: function () {
                        return d;
                    }
                }
            });

            modalInstance.result.then(function () {
                $scope.reload();
            }, function () { });
        }
        $scope.openVideo = function (m) {
            if (!m.isProcessed) return;
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editVideoGalleryModal/viewSimpleMediaModal.html',
                controller: 'ViewSimpleMediaModalCtrl',
                size: 'lg',
                resolve: {
                    SimpleMediaModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcViewSimpleMediaCtrl');
                    }],
                    doc: function () {
                        return m;
                    },
                }
            });

            modalInstance.result.then(function (c) {
            }, function (r) {
            });
        };

        // DELETE
        $scope.deleteVideo = function (entity) {
            modalFactory.openDeleteModal('Video', entity.name).result.then(function (r) {
                if (r) {
                    baseFactory.post('/api/documents/delete/' + entity.id).then(function (rdata) {
                        $scope.reload();
                    });
                }
            });
        }
    }
})();
(function () {
    customFieldModule.controller('editItemCustomFieldController', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', 'itemCustomField', 'customFields', 'item'];

    function ctrl($scope, $rootScope, baseFactory, $modalInstance, itemCustomField, customFields, item) {

        $scope.customFields = customFields;
        $scope.fieldOptions = [];
        $scope.selectedCustomField = null;
        $scope.displayDropDown = false;
        $scope.displayTextField = true;
        $scope.submitTxt = "Save";
        $scope.modalTitle = "Add Custom Field";

        if (typeof itemCustomField === 'undefined' || itemCustomField === null) {
            $scope.model = { customFieldId: 0, itemNumber: item.itemNumber, value: "", options: null };
        } else {
            $scope.model = angular.copy(itemCustomField);
            angular.forEach(customFields, function (field) {
                if (itemCustomField.customFieldId === field.id) {
                    $scope.selectedCustomField = field;
                    if (field.typeName === 'Colour') {
                        $scope.displayDropDown = false;
                        $scope.displayTextField = false;
                        $scope.displayColourPicker = true;
                    } else if ($scope.model.customFieldTypeId > 3) {
                        $scope.displayDropDown = true;
                        $scope.displayTextField = false;
                        $scope.displayColourPicker = false;
                        $scope.fieldOptions = JSON.parse(field.options);
                    } else {
                        $scope.displayDropDown = false;
                        $scope.displayTextField = true;
                        $scope.displayColourPicker = false;
                    }
                }
            });
            $scope.modalTitle = "Edit Custom Field";
        }

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.customFieldSelected = function () {
            $scope.model.customFieldId = $scope.selectedCustomField.id;
            $scope.model.value = null;
            console.log($scope.selectedCustomField)
            if ($scope.selectedCustomField.typeName === 'Colour') {
                $scope.displayDropDown = false;
                $scope.displayTextField = false;
                $scope.displayColourPicker = true;
            } else if ($scope.selectedCustomField.typeId > 3) {
                $scope.displayDropDown = true;
                $scope.displayTextField = false;
                $scope.displayColourPicker = false;
                $scope.fieldOptions = JSON.parse($scope.selectedCustomField.options);
            } else {
                $scope.displayDropDown = false;
                $scope.displayTextField = true;
                $scope.displayColourPicker = false;
            }
        };
        $scope.onSelectColour = function ($name, $colour) {
            $scope.model.value = $name;
            $scope.model.options = $colour;
        };

        $scope.saveCustomField = function () {
            baseFactory.post("/api/itemcustomfield/save", $scope.model).then(function (data) {
                $modalInstance.close();
            });
        };
    }
})();
(function () {
    itemDocuments.controller('editItemDocuments', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', '$timeout', 'toaster', 'isNew', 'item', 'doc'];

    function ctrl($scope, $rootScope, baseFactory, $modalInstance, $timeout, toaster, isNew, item, doc) {
        $scope.cancel = function () {
            $modalInstance.dismiss();
        }

        $scope.mode = "Edit";
        if (isNew) {
            $scope.doc = {
                id: 0,
                permissions: []
            };
            $scope.mode = "Create";
        } else {
            $scope.doc = angular.copy(doc);
        }
       
        $scope.submitTxt = "Save";

        $scope.isNew = isNew;

        //Upload Document
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        var isDocument = true;
        var isMedia = true;
      
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                .upload('/api/upload/media', { oldfolder: '' }, $files)
                .progress(function (evt) {
                    $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                }).success(function (data, status, headers, config) {

                    if (!data.isErrored) {
                        $scope.resetInputFile();
                        $scope.fileModel = data.object;
                        $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                        $scope.doc.fileName = $scope.fileModel.fileName;
                        $scope.doc.isUploaded = true;
                        $scope.doc.isNew = true;
                    }
                    $scope.disableSubmitButton = false;
                    $scope.submitTxt = "Save";
                });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };

        $scope.ok = function (doc) {
            $scope.doc.itemNumber = item.itemNumber;
            $scope.doc.docTypeId = 1;
            $scope.submitTxt = "Uploading...";
            $scope.disableSubmitButton = true;
            baseFactory.post("/api/documents/save", doc).then(function (data) {
                if (!data.isErrored) {
                    if ($scope.isAddAnotherField) {
                        // Reset
                        $scope.doc = angular.copy(doc);
                        $scope.doc.permissions = [];
                        $scope.roles = angular.copy(roles);
                        angular.forEach(roles, function (r, i) {
                            $scope.doc.permissions.push({
                                isViewable: true,
                                isEditable: true,
                                userRoleId: r.roleId
                            });
                        });
                        $scope.fileModel = {
                            FileName: "",
                            FileFolder: ""
                        };
                        $scope.progress = 100;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                        isReload = true;
                    } else {
                        $modalInstance.close(doc);
                    }
                } else {
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                }
            });
        }

    }
})();
(function () {
    itemDocuments.controller('editItemGalleries', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', '$timeout', 'toaster', 'isNew', 'item', 'doc'];

    function ctrl($scope, $rootScope, baseFactory, $modalInstance, $timeout, toaster, isNew, item, doc) {
        $scope.cancel = function () {
            $modalInstance.dismiss();
        }

        $scope.mode = "Edit";
        if (isNew) {
            $scope.doc = {
                id: 0,
                permissions: []
            };
            $scope.mode = "Create";
        } else {
            $scope.doc = angular.copy(doc);
        }

        $scope.submitTxt = "Save";

        $scope.isNew = isNew;

        //Upload Document
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        var isDocument = true;
        var isMedia = true;

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["jpeg", "jpg", "png"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        } else {
                            $scope.resetInputFile();
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    }).error(function () {
                        $scope.resetInputFile();
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };

        $scope.ok = function (doc) {
            $scope.doc.itemNumber = item.itemNumber;
            $scope.doc.docTypeId = 2;
            $scope.submitTxt = "Uploading...";
            $scope.disableSubmitButton = true;
            baseFactory.post("/api/documents/save", doc).then(function (data) {
                if (!data.isErrored) {
                    if ($scope.isAddAnotherField) {
                        // Reset
                        $scope.doc = angular.copy(docu);
                        $scope.doc.permissions = [];
                        $scope.roles = angular.copy(roles);
                        angular.forEach(roles, function (r, i) {
                            $scope.doc.permissions.push({
                                isViewable: true,
                                isEditable: true,
                                userRoleId: r.roleId
                            });
                        });
                        $scope.fileModel = {
                            FileName: "",
                            FileFolder: ""
                        };
                        $scope.progress = 100;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                        isReload = true;
                    } else {
                        $modalInstance.close(doc);
                    }
                } else {
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                }
            });
        }

    }
})();
(function () {
    itemDocuments.controller('editItemVideoGalleries', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', '$timeout', 'toaster', 'isNew', 'item', 'doc'];

    function ctrl($scope, $rootScope, baseFactory, $modalInstance, $timeout, toaster, isNew, item, doc) {
        $scope.cancel = function () {
            $modalInstance.dismiss();
        }

        $scope.mode = "Edit";
        $scope.isNew = isNew;
        if (isNew) {
            $scope.doc = {
                id: 0,
                permissions: [],
                link: null,
                docTypeId: 3
            };
            $scope.mode = "Create";
        } else {
            $scope.doc = angular.copy(doc);
        }

        $scope.submitTxt = "Save";
        $scope.isNew = isNew;

        //Upload Document
        $scope.isLink = false;
        $scope.docTypeChanged = function () {
            $scope.changeFile();
        };
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            // Validate file extension
            fType = ['mp4', 'avi', 'mpeg', 'mpg', 'mov'];
            result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };

        $scope.ok = function (doc) {
            $scope.doc.itemNumber = item.itemNumber;
            $scope.submitTxt = "Uploading...";
            $scope.disableSubmitButton = true;
            baseFactory.post("/api/documents/save", doc).then(function (data) {
                if (!data.isErrored) {
                    if ($scope.isAddAnotherField) {
                        // Reset
                        $scope.doc = angular.copy(docu);
                        $scope.doc.permissions = [];
                        $scope.roles = angular.copy(roles);
                        angular.forEach(roles, function (r, i) {
                            $scope.doc.permissions.push({
                                isViewable: true,
                                isEditable: true,
                                userRoleId: r.roleId
                            });
                        });
                        $scope.fileModel = {
                            FileName: "",
                            FileFolder: ""
                        };
                        $scope.progress = 100;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                        isReload = true;
                    } else {
                        $modalInstance.close(doc);
                    }
                } else {
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                }
            });
        }
    }
})();
(function () {
    'use strict';
    angular.module('appSharedModule').controller('ViewSimpleMediaModalCtrl', mediaCtrl);
    mediaCtrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'doc'];
    function mediaCtrl($scope, $rootScope, $modalInstance, doc) {
        $scope.doc = angular.copy(doc);

        $scope.setThumbnail = function (d) {
            var doc1 = angular.copy(d);
            return doc1.thumbnail;
        };

        $scope.close = function () {
            $modalInstance.close();
        };
    }
})();

angular.module('appSharedModule').directive('simpleMediaPlayer', ["$compile", function ($compile) {
    return {
        //template: '<div fit-vids class="fit-vids-container">' +
        //    '<video ng-if="doc.isAzureLink" videojs video-url="{{doc.link}}" video-extension="{{doc.fileExtension}}" poster="{{doc.thumbnail}}" class="video-js vjs-big-play-centered"></video>' +
        //    '<iframe ng-if="!doc.isAzureLink" id="visionMedia" ng-src="{{doc.link}}" width="{{width}}" height="{{height}}" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>' +
        //    '</div>',
        //template: '<div fit-vids class="fit-vids-container">' +
        //    '<iframe id="visionMedia" ng-src="{{doc.link}}" width="{{width}}" height="{{height}}" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>' +
        //    '</div>',
        restrict: 'AE',
        template: function (tElement, tAttrs) {
            return '<div fit-vids class="fit-vids-container">' +
                '<video ng-if="doc.isAzureLink" videojs video-url="{{doc.link}}" video-extension="{{doc.fileExtension}}" poster="{{doc.thumbnail}}" class="video-js vjs-big-play-centered"></video>' +
                '<iframe ng-if="!doc.isAzureLink" id="visionMedia" ng-src="{{doc.link}}" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen style="position: absolute; top: 0px; left: 0px; height: 100%; width: 100%;"></iframe>' +
                '</div>';
        },
        replace: false,
        // transclude: true,
        scope: {
            docc: '=ngModel'
        },
        controller: ["$scope", "$sce", function ($scope, $sce) {
            $scope.doc = angular.copy($scope.docc);
            $scope.doc.link = $sce.trustAsResourceUrl($scope.docc.link.replace(/\\/, "/").replace("/Download/DownloadCdnDocument?path=", "/download/video/"));
            $scope.mediaUrl = $scope.docc.link;
        }]
    };
}]);
(function () {
    editItem.controller('VarianceOptionModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'promptFactory', 'title', 'options'];
    function ctrl($scope, $rootScope, $modalInstance, promptFactory, title, options) {

        $scope.modalTitle = title;
        $scope.varianceOptions = [];
        $scope.optionName = null;
        $scope.errorMessage = null;
        $scope.submitTxt = "Done";
        if (options != null)
            $scope.varianceOptions = angular.copy(options);

        function setItemSortOrder() {
            angular.forEach($scope.varianceOptions, function (opt, $index) {
                    opt.sortOrder = $index;
            });
        }
        $scope.sortableOptions = {
            handle: '> .my-handle',
            stop: function () {
                setItemSortOrder();
            }
        };
        $scope.addOption = function (txt) {
            if (txt != null && txt.length > 1) {
                // check if exist
                var isExist = false;
                var lastId = 1;
                for (var i = 0; i < $scope.varianceOptions.length; i++) {
                    lastId = $scope.varianceOptions[i].id > lastId ? $scope.varianceOptions[i].id : lastId;
                    if ($scope.varianceOptions[i].name.toLowerCase() == txt.toLowerCase()) {
                        isExist = true;
                        $scope.errorMessage = "Option already exist";
                    }
                }
                if (!isExist) {
                    $scope.errorMessage = null;
                    $scope.varianceOptions.push({
                        id: lastId + 1,
                        name: angular.copy(txt),
                        sortOrder: $scope.varianceOptions.length
                    });
                    $scope.optionName = null;
                }
            } else {
                $scope.errorMessage = "This field is required";
            }
        };
        $scope.deleteOption = function (indx, opt) {
            promptFactory.confirm("Are you sure you want to delete this option - " + opt + "?", function (result) {
                if (result) {
                    $scope.varianceOptions.splice(indx, 1);
                }
            });
        };
        //
        $scope.save = function () {
            $modalInstance.close($scope.varianceOptions);
        };
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    }
})();
(function () {
    itemModule.controller('ImportItemModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'GRID_CONSTANTS', 'gridName'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, baseFactory, GRID_CONSTANTS, gridName) {

        // DECLARATIONS
        $scope.doc = {

        };
        $scope.submitTxt = "Import";

        $scope.disableSubmitButton = false;

        // PRIVATE

        // PUBLIC
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["xls", "xlsx"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {

                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Import";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };
        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };
        $scope.save = function (mForm, m) {
            $scope.resultData = null;
            $scope.downloadResponseUrl = null;
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Importing...";
                $scope.disableSubmitButton = true;
                $scope.isUploaded = false;
                baseFactory.post("/api/upload/excelItems", m).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.isUploaded = true;
                        $scope.resultData = rdata.object;

                        // RESET
                        $scope.doc = {
                            importTypeId: null,
                            file: {
                                fileFolder: "",
                                fileName: ""
                            },
                            param: {}
                        };
                    }
                    $scope.submitTxt = "Import";
                    $scope.disableSubmitButton = false;
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(null);
        };

        // INIT
        $scope.importFile = {};
    }
})();
(function () {
    'use strict';
    catalogue.controller('itemDetail', ctrl);
    ctrl.$inject = ['$scope', '$location', 'membershipFactory', '$rootScope', 'Lightbox', 'item', '$sce', 'categories'];
    function ctrl($scope, $location, membershipFactory, $rootScope, Lightbox, item, $sce, categories) {

        $scope.item = item;
        $scope.itemDescription = $sce.trustAsHtml(item.description);
        $scope.itemSubText = item.itemSubText == null ? null : $sce.trustAsHtml(item.itemSubText);

        $scope.images = [];
        $scope.documents = [];

        angular.forEach(item.documents, function (value, index) {
            if (value.isImage) {
                if (value.isPrimary) {
                    $scope.primaryImage = value.link;
                } else {
                    var newImage = {
                        url: value.link,
                        thumbUrl: value.thumbnail
                    }
                    $scope.images.push(newImage);
                }
            } else {
                var newDocument = {
                    name: value.name,
                    url: value.link
                }
                $scope.documents.push(newDocument);
            }
        });

        $scope.categories = [];

        angular.forEach(categories, function (value, index) {
            var category = {
                label: value.name,
                children: []
            }

            angular.forEach(value.subCategories, function (subCat, index) {
                category.children.push(subCat.name);
            })

            $scope.categories.push(category);
        })

        $scope.openLightboxModal = function (index) {
            Lightbox.openModal($scope.images, index);
        };

        $scope.getVisibleCustomFields = function () {
            $scope.customField = [];
             angular.forEach($scope.item.customFields, function (value, index) {
                if (value.customFieldIsVisible) {
                    $scope.customField.push(value);
                }
            })

             return $scope.customField;
        }
    }
})();


itemStatusesModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.itemstatuses', {
                url: "/itemstatuses/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/itemStatus/itemStatus.html",
                        controller: 'itemStatusController',
                        resolve: {
                            fields: ['resolveFactory', function(resolveFactory) {
                                return resolveFactory.getGridEntity('/api/ItemStatus/Search');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.itemstatuses.view']
                },
                ncyBreadcrumb: {
                    label: 'Item Statuses'
                }
            });
    }
]);

itemStatusesModule.controller('itemStatusController',
    [
        '$scope', '$rootScope', 'baseFactory', 'modalFactory', 'fields', '$modal', 'GRID_CONSTANTS', 'categories', '$state',
        function ($scope, $rootScope, baseFactory, modalFactory, fields, $modal, GRID_CONSTANTS, categories, $state) {

            //baseFactory.fetch('/api/item/search?retrieveSize=5&startIndex=1').then(function(data) {
            //    $scope.items = data.object;
            //});

            $scope.categories = categories;

            $scope.currentState = $state.current.name;

            $scope.gridOptions = {
                itemType: 'Item Status',
                items: fields,
                gridName: 'ItemStatus',
                fetchUrl: '/api/ItemStatus/Search',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name', customSortField: 'Name' }
                ],
                controlCellTemplateHtml: '<div class="controls" permission permissions="system.itemstatuses.edit">' +
                '<div class="btn-group btn-group-sm pull-right">' +
                '<a ng-click="openCreateModal(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a> &nbsp;' +
                '<a ng-click="delete(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                '</div></div>'
            };

            $scope.delete = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Item Status',
                    null,
                    '/api/itemstatus/delete/',
                    $scope.gridOptions.gridName
                );

            }

            $scope.openCreateModal = function (itemStatus) {

                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/itemStatus/create/modal.html',
                    controller: 'createItemStatusController',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-sm',
                    resolve: {
                        itemStatus: function () {
                            return itemStatus;
                        }

                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });

            }
        }
    ]);
(function () {
    customFieldModule.controller('createItemStatusController', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', 'itemStatus'];

    function ctrl($scope, $rootScope, baseFactory, $modalInstance, itemStatus) {

        $scope.hideGroup = true;
        $scope.submitTxt = "Save";

        if (itemStatus == null) {
            $scope.model = { id: 0, name: '' };
            $scope.mode = "Add";
        } else {
            $scope.model = itemStatus;
            $scope.mode = "Edit";
        }

        function isValid() {
            return true;
        }

        $scope.save = function (form) {

            $scope.submitted = true;
            if (!form.$valid || !isValid()) {
                return;
            }

            $scope.loading = true;

            //set to default group with id 1
            baseFactory.post("/api/itemstatus/save", $scope.model).then(function (data) {
                    $modalInstance.close();
                });

        }

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.orderstatuses', {
                url: "/orderstatuses",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/orderStatus/orderStatus.html",
                        controller: 'orderStatus',
                        resolve: {
                            gridData: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getGridEntity('/api/orderstatus/Search');
                            }],
                            orderStatuses: function (resolveFactory) {
                                return resolveFactory.getGridEntity('/api/orderstatus/getall');
                            },
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.orderstatuses.view']
                },
                ncyBreadcrumb: {
                    label: 'Order Statuses'
                }
            });
    }
]);

homeModule.controller('orderStatus',
    ['$scope', '$rootScope', 'gridData', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', 'orderStatuses', 'categories', '$state',
        function ($scope, $rootScope, gridData, $modal, GRID_CONSTANTS, baseFactory, modalFactory, orderStatuses, categories, $state) {

            $scope.orderStatus = gridData;

            $scope.categories = categories;

            $scope.currentState = $state.current.name;

            $scope.getOrderStatusColor = function (order) {
                return { 'background-color': order };
            };

            $scope.gridOptions = {
                itemType: 'orderStatus',
                items: $scope.orderStatus,
                gridName: 'orderStatus',
                fetchUrl: '/api/orderstatus/Search',
                initSortString: 'Name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Order Status Name', customSortField: 'name' },
                    { field: 'sageImport', displayName: 'Sage Import', customSortField: 'sageImport', cellTemplate: '<span>{{row.entity.sageImport | true_false}}</span>' },
                    { field: 'canEdit', displayName: 'Can Edit', customSortField: 'canEdit', cellTemplate: '<span>{{row.entity.canEdit | true_false}}</span>' },
                    { field: 'colour', displayName: 'Colour', cellTemplate: '<div class="orderStatus text-center" style="padding:5px;" ng-style="getOrderStatusColor(row.entity.colour)"> {{row.entity.colour}} ' + '</div>' }
                ],
                controlCellTemplateHtml: '<div class="controls" permission permissions="system.orderstatuses.edit">' +
                '<div class="btn-group btn-group-sm pull-right">' +
                '<a ng-click="openOrderStatusModal(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '<a ng-click="deleteOrderStatus(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                '</div></div>',
                controlColumnWidth: 110,
            };

            $scope.deleteOrderStatus = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'orderStatus',
                    null,
                    '/api/orderstatus/delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openOrderStatusModal = function (m) {

                var newUser = true;

                if (m != null) {
                    newUser = false;
                }

                $modal.open({
                    templateUrl: '/app/modules/admin/orderStatus/addOrderStatus/addOrderStatus.html',
                    controller: 'addOrderStatus',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window-sm',
                    resolve: {
                        isNew: function () {
                            return newUser;
                        },
                        orderStatus: function () {
                            return m == null ? {
                                id: 0,
                                name: null,
                                sageImport: false,
                                canEdit: true,
                                colour: null
                            } : m;
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
            }
        }
    ]);
(function () {
    homeModule.controller('addOrderStatus', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'orderStatus', 'isNew', '$modal', 'gridName', 'GRID_CONSTANTS'];

    function ctrl($scope, $rootScope, $modalInstance, baseFactory, orderStatus, isNew, $modal, gridName, GRID_CONSTANTS) {

        $scope.m = angular.copy(orderStatus);
        $scope.bgcolors = ["#F0AD4E", "#D8C233", "#8BBF61", "#008800", "#3695D5", "#76268F", "#424242", "#13072C", "#d9534f"];
        $scope.gridName = gridName;
        $scope.submitted = false;
        $scope.loading = false;

        if (isNew) {
            $scope.orderStatusAction = "Create ";
        } else {
            $scope.orderStatusAction = "Edit ";
        }

        $scope.setBgColor = function (bg) {
            $scope.m.colour = bg;
        };

        function isValid() {
            return true;
        }

        $scope.addOrderStatus = function (mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitted = true;
                $scope.loading = true;

                baseFactory.post("/api/orderstatus/save", m).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                        $modalInstance.close();
                    }
                    $scope.submitted = false;
                    $scope.loading = false;
                });
            }
        }

        $scope.cancel = function () {
            $modalInstance.close();
        };
    }
})();
pricingModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.pricing', {
                url: "/pricing",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/pricing/pricing.html",
                        controller: 'pricingController',
                        resolve: {
                            groups: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/PricingGroup/GetAll');
                            }],
                            customers: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/customer/getall/');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Pricing'
                }
            });
    }
]);
pricingModule.controller('pricingController',
    ['$scope', 'groups', 'baseFactory', '$timeout', 'customers',
    function ($scope, groups, baseFactory, $timeout, customers) {

    $scope.currentTab = 1;
    //$scope.viewModel.item = null;
    //$scope.viewModel.group = null;
    //$scope.viewModel.percentage = 0;
    $scope.getItems = getItems;
    $scope.importPricing = importPricing;
    $scope.importPricing2 = importPricing2;
    $scope.exportPricing = exportPricing;
    $scope.updatePricing = updatePricing;
    $scope.disableImport = disableImport;
    $scope.disableExport = disableExport;
    $scope.disableUpdate = disableUpdate;
    $scope.doc = {};
    $scope.doc2 = {};
    $scope.progress2 = 0;
    $scope.message2 = null;

    $scope.groups = groups.object;
    $scope.groups.unshift(null);

    $scope.viewModel = {
        item: null,
        group: null,
        percentage: 0
    };

    //Upload Document
    $scope.fileModel = {
        FileName: "",
        FileFolder: ""
    };
    var isDocument = true;
    var isMedia = true;

    var isFileValid = function (filename) {
        var extAr = filename.split('.');
        var ext = extAr[extAr.length - 1];
        ext = ext.toLocaleLowerCase();
        var fType = [];
        var result = false;

        if (isDocument || isMedia) {
            fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "csv"];
            result = fType.indexOf(ext) >= 0;

            if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                $scope.doc.docTypeId = 1;
            } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                $scope.doc.docTypeId = 2;
            } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                $scope.doc.docTypeId = 1;
            } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                $scope.doc.docTypeId = 3;
            } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                $scope.doc.docTypeId = 5;
            }
        }

        if (!result)
            $scope.message = "The file " + filename + " is not valid.";

        if (result) {
            if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                $scope.doc.name = filename;
            }
        }

        $timeout(function () {
            $scope.message = null;
        }, 2500);

        return result;
    };
    var isFileValid2 = function (filename) {
        var extAr = filename.split('.');
        var ext = extAr[extAr.length - 1];
        ext = ext.toLocaleLowerCase();
        var fType = [];
        var result = false;

        if (isDocument || isMedia) {
            fType = ["zip"];
            result = fType.indexOf(ext) >= 0;

            if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                $scope.doc.docTypeId = 1;
            } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                $scope.doc.docTypeId = 2;
            } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                $scope.doc.docTypeId = 1;
            } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                $scope.doc.docTypeId = 3;
            } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                $scope.doc.docTypeId = 5;
            }
        }

        if (!result)
            $scope.message2 = "The file " + filename + " is not valid.";

        if (result) {
            if ($scope.doc2.name == '' || typeof $scope.doc.name === 'undefined') {
                $scope.doc2.name = filename;
            }
        }

        $timeout(function () {
            $scope.message2 = null;
        }, 2500);

        return result;
    };
    
    $scope.changeTab = function (tab) {
        $scope.currentTab = tab;
    };

    $scope.onFileSelect = function ($files) {
        if (isFileValid($files[0].name)) {
            $scope.disableSubmitButton = true;
            $scope.submitTxt = "Uploading...";
            $scope.progress = 0;
            $scope.upload = baseFactory
            .upload('/api/upload/file', { oldfolder: '' }, $files)
            .progress(function (evt) {
                $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
            }).success(function (data, status, headers, config) {

                if (!data.isErrored) {
                    $scope.resetInputFile();
                    $scope.fileModel = data.object;
                    $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                    $scope.doc.fileName = $scope.fileModel.fileName;
                    $scope.doc.isUploaded = true;
                    $scope.doc.isNew = true;
                }
                $scope.disableSubmitButton = false;
                $scope.submitTxt = "Save";
            });
        } else {
            $scope.resetInputFile();
            $scope.changeFile();
        }
    };
    $scope.changeFile = function () {
        $scope.doc.isUploaded = false;
        $scope.doc.fileFolder = "";
        $scope.doc.fileName = "";
        $scope.doc.link = "";
        $scope.doc.isNew = true;
    };

    $scope.onFileSelect2 = function ($files) {
        if (isFileValid2($files[0].name)) {
            $scope.disableSubmitButton = true;
            $scope.submitTxt = "Uploading...";
            $scope.progress2 = 0;
            $scope.upload = baseFactory
                .upload('/api/upload/file', { oldfolder: '' }, $files)
                .progress(function (evt) {
                    $scope.progress2 = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                }).success(function (data, status, headers, config) {

                    if (!data.isErrored) {
                        $scope.resetInputFile();
                        $scope.fileModel = data.object;
                        $scope.doc2.fileFolder = $scope.fileModel.fileFolder;
                        $scope.doc2.fileName = $scope.fileModel.fileName;
                        $scope.doc2.isUploaded = true;
                        $scope.doc2.isNew = true;
                    }
                    $scope.disableSubmitButton = false;
                    $scope.submitTxt = "Save";
                });
        } else {
            $scope.resetInputFile();
            $scope.changeFile2();
        }
    };
    $scope.changeFile2 = function () {
        $scope.doc2.isUploaded = false;
        $scope.doc2.fileFolder = "";
        $scope.doc2.fileName = "";
        $scope.doc2.link = "";
        $scope.doc2.isNew = true;
    };

    $scope.resetInputFile = function () {
        var elems = document.getElementsByTagName('input');
        for (var i = 0; i < elems.length; i++) {
            if (elems[i].type == 'file') {
                elems[i].value = null;
            }
        }
    };

    function disableImport() {
        return !$scope.viewModel.item || !$scope.viewModel.group || !$scope.doc || !$scope.doc.fileName;
    };

    function disableExport() {
        return !$scope.viewModel.item || !$scope.viewModel.group;
    };

    function disableUpdate() {
        return $scope.viewModel.percentage == 0;
    };

    function getItems(val) {
        return baseFactory.fetch('/api/item/search?retrieveSize=40&startIndex=1&searchText=' + val).then(function (data) {
            return data.object;
        });
    };

    function importPricing() {
        var params = {
            itemNumber: $scope.viewModel.item.itemNumber,
            groupId: $scope.viewModel.group.id,
            filepath: '\\' + $scope.doc.fileFolder + '\\' + $scope.doc.fileName
        };
        return baseFactory.fetch('/api/pricing/importpricing', params).then(function (data) {
            $scope.changeFile();
            $scope.changeFile2();
            $scope.resetInputFile();
            return data.object;
        });
    };

    function importPricing2() {
        var params = {
            filepath: '\\' + $scope.doc2.fileFolder + '\\' + $scope.doc2.fileName
        };
        return baseFactory.fetch('/api/pricing/importzip', params).then(function (data) {
            $scope.changeFile();
            $scope.changeFile2();
            $scope.resetInputFile();
            return data.object;
        });
    };

    function exportPricing() {
        var params = "?itemNumber=" + $scope.viewModel.item.itemNumber + "&groupId=" + $scope.viewModel.group.id;
        window.open('/api/pricing/exportpricing' + params);
    };

    function updatePricing() {
        var params = {
            itemNumber: $scope.viewModel.item == null || $scope.viewModel.item.itemNumber == undefined ? "" : $scope.viewModel.item.itemNumber,
            groupId: $scope.viewModel.group == null ? null : $scope.viewModel.group.id,
            percentage: $scope.viewModel.percentage
        };

        return baseFactory.fetch('/api/pricing/updatepricing', params).then(function (data) {
            return data.object;
        });
    };

    //$scope.refreshGrid = function() {
    //    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
    //}
}
]);
pricingModule.controller('PricingMaterialConfigurationCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$timeout', 'baseFactory', 'promptFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, $timeout, baseFactory, promptFactory, GRID_CONSTANTS, $stateParams) {

            $scope.currentMaterialIndex = null;
            $scope.currentColourIndex = 0;
            $scope.currentPricingMaterial = null;
            $scope.customers = [];
            baseFactory.fetch('/api/twcFabricList/get').then(function (data) {
                $scope.data = data.object;
            });
            baseFactory.fetch('/api/customer/getall/').then(function (data) {
                $scope.customers = data.object;
            });
            $scope.loadMaterial = function (indx) {
                $scope.currentMaterialIndex = indx;
                $scope.currentPricingMaterial = $scope.data.materials[indx].material;
                $scope.currentColourIndex = 0;
                $scope.isLoading = true;
                $timeout(function () {
                    $scope.isLoading = false;

                    $scope.allSelectedCustomers = [];
                    $scope.arrCustomersVisible = [];
                    $scope.arrCustomersNotVisible = [];

                    for (var i = 0; i < $scope.customers.length; i++) {
                        if ($scope.data.materials[indx].customers.visibleTo.indexOf($scope.customers[i].customerId) >= 0) {
                            $scope.arrCustomersVisible.push($scope.customers[i]);
                        }
                        if ($scope.data.materials[indx].customers.invisibleTo.indexOf($scope.customers[i].customerId) >= 0) {
                            $scope.arrCustomersNotVisible.push($scope.customers[i]);
                        }
                    }
                }, 100);
            };
            $scope.loadColour = function (indx) {
                $scope.currentColourIndex = indx;
            };
            //
            var save = function (nw, orig) {
                var dts = {
                    material: nw.material,
                    colour: nw.colour,
                    itemNumber: nw.itemNumber,
                    pricingGroup: nw.pricingGroup || ""
                };

                if (typeof orig !== 'undefined') {
                    dts.origMaterial = orig.material;
                    dts.origColour = orig.colour;
                    dts.origItemNumber = orig.itemNumber;
                    dts.origPricingGroup = orig.pricingGroup;
                }

                baseFactory.post("/api/twcFabricList/save", dts).then(function (data) {

                });
            };
            var deleteData = function (nw) {
                var dts = {
                    material: nw.material,
                    colour: nw.colour || "",
                    itemNumber: nw.itemNumber || "",
                    pricingGroup: nw.pricingGroup || ""
                };

                baseFactory.post("/api/twcFabricList/deleteData", dts).then(function (data) {

                });
            };
            //
            $scope.addMaterial = function (material) {
                var isNew = material === null;
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/addMaterialModal.html',
                    controller: 'PricingMaterialModalCtrl',
                    size: 'sm',
                    backdrop: 'static',
                    resolve: {
                        data: function () {
                            return $scope.data;
                        },
                        material: function () {
                            return isNew ? {
                                material: "",
                                colours: []
                            } : material;
                        },
                        isNew: function () {
                            return isNew;
                        }
                    }
                });

                modalInstance.result.then(
                    function (mt) {
                        if (isNew) {
                            $scope.data.materials.push({ material: mt.material, colours: [] });
                            save(mt.dts1);
                        } else {
                            material.material = mt.dts1.material;
                            save(mt.dts1, mt.dts2);
                        }
                    }, function (isReload) {
                    });
            };
            $scope.addColour = function (material, colour) {
                var isNew = colour === null;
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/addMaterialColourModal.html',
                    controller: 'PricingMaterialColourModalCtrl',
                    size: 'sm',
                    backdrop: 'static',
                    resolve: {
                        material: function () {
                            return material;
                        },
                        colour: function () {
                            return isNew ? {
                                colour: "",
                                itemNumbersAndStatuses: {}
                            } : colour;
                        },
                        isNew: function () {
                            return isNew;
                        }
                    }
                });

                modalInstance.result.then(
                    function (mt) {
                        if (isNew) {
                            var colourData = {
                                colour: mt.colour,
                                itemNumbersAndStatuses: material.colours.length > 1 ? material.colours[0].itemNumbersAndStatuses : {}
                            };
                            material.colours.push(colourData);
                            save(mt.dts1);
                        } else {
                            colour.colour = mt.colour;
                            save(mt.dts1, mt.dts2);
                        }
                    }, function (isReload) {
                    });
            };
            $scope.addProduct = function (products, k, v) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/addMaterialColourProductModal.html',
                    controller: 'PricingMaterialColourProductModalCtrl',
                    size: 'sm',
                    backdrop: 'static',
                    resolve: {
                        items: function () {
                            return $scope.data.items;
                        },
                        products: function () {
                            return products;
                        },
                        product: function () {
                            return k === null ? {
                                index: null,
                                pricingGroup: $scope.data.pricingGroups[0].name,
                                dts1: {
                                    material: $scope.data.materials[$scope.currentMaterialIndex].material,
                                    colour: $scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].colour,
                                    itemNumber: "",
                                    pricingGroup: $scope.data.pricingGroups[0].name
                                }
                            } : {
                                    index: k,
                                    pricingGroup: v
                                };
                        }
                    }
                });

                modalInstance.result.then(
                    function (mt) {
                        if (k === null) {
                            if ($scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].itemNumbersAndStatuses === null)
                                $scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].itemNumbersAndStatuses = {};

                            for (var i = 0; i < $scope.data.materials[$scope.currentMaterialIndex].colours.length; i++) {
                                if (typeof $scope.data.materials[$scope.currentMaterialIndex].colours[i].itemNumbersAndStatuses[mt.index] === 'undefined') {
                                    $scope.data.materials[$scope.currentMaterialIndex].colours[i].itemNumbersAndStatuses[mt.index] = mt.pricingGroup;
                                }
                            }
                            save(mt.dts1);
                        }
                    }, function (isReload) {
                    });
            };
            //
            $scope.deleteMaterial = function (indx) {
                promptFactory.confirm("Are you sure you want to delete this Material: " + $scope.data.materials[indx].material + "? <br><small>This action cannot be undone.</small>", function (result) {
                    if (result) {
                        deleteData({
                            material: angular.copy($scope.data.materials[indx].material)
                        });
                        $scope.data.materials.splice(indx, 1);
                        if (indx === $scope.currentMaterialIndex)
                            $scope.currentMaterialIndex = null;
                    }
                });
            };
            $scope.deleteColour = function (indx) {
                promptFactory.confirm("Are you sure you want to delete this Colour: " + $scope.data.materials[$scope.currentMaterialIndex].colours[indx].colour + "? <br><small>This action cannot be undone.</small>", function (result) {
                    if (result) {
                        deleteData({
                            material: angular.copy($scope.data.materials[$scope.currentMaterialIndex].material),
                            colour: angular.copy($scope.data.materials[$scope.currentMaterialIndex].colours[indx].colour)
                        });
                        $scope.data.materials[$scope.currentMaterialIndex].colours.splice(indx, 1);
                    }
                });
            };
            $scope.deleteProduct = function (k) {
                var item = $scope.data.items[k - 3];
                promptFactory.confirm("Are you sure you want to delete this Product: " + item.itemNumber + " - " + item.itemName + "? <br><small>This action cannot be undone.</small>", function (result) {
                    if (result) {
                        deleteData({
                            material: angular.copy($scope.data.materials[$scope.currentMaterialIndex].material),
                            colour: angular.copy($scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].colour),
                            itemNumber: angular.copy(item.itemNumber)
                        });
                        delete $scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].itemNumbersAndStatuses[k];
                    }
                });

            };
            //
            $scope.productOnChange = function (k, v, itemNumber) {
                // update all colours
                for (var i = 0; i < $scope.data.materials[$scope.currentMaterialIndex].colours.length; i++) {
                    if (typeof $scope.data.materials[$scope.currentMaterialIndex].colours[i].itemNumbersAndStatuses[k] !== 'undefined') {
                        $scope.data.materials[$scope.currentMaterialIndex].colours[i].itemNumbersAndStatuses[k] = v;
                    }
                }
                var dts = {
                    dts1: {
                        material: $scope.data.materials[$scope.currentMaterialIndex].material,
                        colour: $scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].colour,
                        itemNumber: itemNumber,
                        pricingGroup: v
                    },
                    dts2: {
                        material: $scope.data.materials[$scope.currentMaterialIndex].material,
                        colour: $scope.data.materials[$scope.currentMaterialIndex].colours[$scope.currentColourIndex].colour,
                        itemNumber: itemNumber
                    }
                };
                save(dts.dts1, dts.dts2);
            };
            //

            $scope.addVisibleCustomers = function (selCustomers) {
                angular.forEach(selCustomers, function (selCustomer) {
                    $scope.arrCustomersVisible.push(selCustomer);
                });
                $timeout(function () {
                    $scope.saveItemCustomer();
                }, 100);
            };

            $scope.addNotVisibleCustomers = function (selCustomers) {
                angular.forEach(selCustomers, function (selCustomer) {
                    $scope.arrCustomersNotVisible.push(selCustomer);
                });
                $timeout(function () {
                    $scope.saveItemCustomer();
                }, 100);
            };

            $scope.saveItemCustomer = function () {

                var custVisible = [];
                angular.forEach($scope.arrCustomersVisible, function (value, index) {
                    custVisible.splice(0, 0, value.customerId);
                });

                var custNotVisible = [];
                angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                    custNotVisible.splice(0, 0, value.customerId);
                });

                var dts = {
                    material: $scope.currentPricingMaterial,
                    visibleTo: custVisible,
                    invisibleTo: custNotVisible
                };
                $scope.data.materials[$scope.currentMaterialIndex].customers.visibleTo = custVisible;
                $scope.data.materials[$scope.currentMaterialIndex].customers.invisibleTo = custNotVisible;
                baseFactory.post("/api/twcFabricList/saveCustomers", dts).then(function (rdata) {
                });
            };

            $scope.removeVisibleCustomer = function (c) {
                angular.forEach($scope.arrCustomersVisible, function (value, index) {
                    if (c.customerId === value.customerId) {
                        $scope.arrCustomersVisible.splice(index, 1);
                    }
                });
                $timeout(function () {
                    $scope.saveItemCustomer();
                }, 100);
            };

            $scope.removeNotVisibleCustomer = function (c) {
                angular.forEach($scope.arrCustomersNotVisible, function (value, index) {
                    if (c.customerId === value.customerId) {
                        $scope.arrCustomersNotVisible.splice(index, 1);
                    }
                });
                $timeout(function () {
                    $scope.saveItemCustomer();
                }, 100);
            };

            $scope.removeAllVisibleCustomers = function () {
                $scope.arrCustomersVisible = [];
                $timeout(function () {
                    $scope.saveItemCustomer();
                }, 100);
            };

            $scope.removeAllNotVisibleCustomers = function () {
                $scope.arrCustomersNotVisible = [];
                $timeout(function () {
                    $scope.saveItemCustomer();
                }, 100);
            };
        }
    ]);
pricingModule.controller('PricingOverrideCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.gridOptions = {
                itemType: 'Price Ovveride',
                gridName: 'alltwcpricingoverrides',
                fetchUrl: '/api/twcpricingoverrides/searchall',
                exportUrl: '/api/twcpricingoverrides/export',
                initSortString: 'startDate desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: false,
                enableExport: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'items', displayName: 'Items', customSortField: 'items', sortable: false },
                    { field: 'material', displayName: 'Material', customSortField: 'material' },
                    { field: 'colour', displayName: 'Colour', customSortField: 'colour' },
                    { field: 'customers', displayName: 'Customers', customSortField: 'customers', sortable: false },
                    { field: 'group', displayName: 'Group', customSortField: 'group' },
                    { field: 'discount', displayName: 'Discount', customSortField: 'discount' },
                    { field: 'startDate', displayName: 'Start Date', customSortField: 'startDate', cellFilter: "date: 'dd-MM-yyyy HH:mm:ss'" },
                    { field: 'endDate', displayName: 'End Date', customSortField: 'endDate', cellFilter: "date: 'dd-MM-yyyy HH:mm:ss'" },
                    { field: 'description', displayName: 'Description', sortable: false }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openManageItem(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.items,
                    value.id,
                    'Price Override',
                    null,
                    '/api/twcpricingoverrides/delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageItem = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/managePricingOverrideModal.html',
                    controller: 'ManagePricingOverrideModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            return m == null ? {} : m;
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

            $scope.importItems = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/pricingImportExportModal.html',
                    controller: 'PricingImportExportModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        title: function () {
                            return 'Pricing Overrides';
                        },
                        importUrl: function () {
                            return '/api/twcPricingOverrides/import';
                        },
                        exportUrl: function () {
                            return '/api/twcPricingOverrides/export';
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };
        }
    ]);
pricingModule.controller('PricingPartSalesCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.gridOptions = {
                itemType: 'Sales Part',
                gridName: 'alltwcpartsales',
                fetchUrl: '/api/twcpartsaleslist/searchall',
                exportUrl: '/api/twcpartsaleslist/export',
                initSortString: 'partNumber asc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: false,
                enableExport: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'partNumber', displayName: 'Part Number', customSortField: 'partNumber' },
                    { field: 'customers', displayName: 'Customers', sortable: false },
                    { field: 'prontoPartNumber', displayName: 'Pronto Part Number', customSortField: 'prontoPartNumber' },
                    { field: 'description', displayName: 'Description', customSortField: 'description' },
                    { field: 'category', displayName: 'Category', customSortField: 'category' },
                    { field: 'unit', displayName: 'Unit', customSortField: 'unit' },
                    { field: 'colour', displayName: 'Colours', customSortField: 'colour', sortable: false },
                    { field: 'price', displayName: 'Price', customSortField: 'price', cellFilter: 'currency' },
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openManagePart(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.guid,
                    'Part Sale',
                    null,
                    '/api/twcpartsaleslist/delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManagePart = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/managePartSaleModal.html',
                    controller: 'ManagePricingPartSaleModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            return m === null ? {} : m;
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

            $scope.importItems = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/pricingImportExportModal.html',
                    controller: 'PricingImportExportModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        title: function () {
                            return 'Sales Part';
                        },
                        importUrl: function () {
                            return '/api/twcPartSalesList/import';
                        },
                        exportUrl: function () {
                            return '/api/twcPartSalesList/export';
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };
        }
    ]);
pricingModule.controller('PricingSurchargeCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            var gridOptions = {
                itemType: 'Price Surcharge',
                gridName: 'alltwcpricingsurcharges',
                fetchUrl: '/api/twcpricingsurcharges/searchall',
                exportUrl: '/api/twcpricingsurcharges/export',
                initSortString: 'customFieldName asc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: false,
                enableExport: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'items', displayName: 'Items', customSortField: 'items', sortable: false },
                    { field: 'customers', displayName: 'Customers', customSortField: 'customers', sortable: false },
                    { field: 'customFieldName', displayName: 'Custom Field', customSortField: 'customFieldName' },
                    { field: 'value', displayName: 'Selected Value', customSortField: 'Value' },
                    { field: 'charge', displayName: 'Charge', customSortField: 'charge' },
                    { field: 'pricingType', displayName: 'Pricing Type', customSortField: 'pricingType', sortable: false },
                    { field: 'discount', displayName: 'Discount', customSortField: 'discount' },
                    { field: 'expression', displayName: 'Expression', customSortField: 'expression', sortable: false }
                ],
                controlCellTemplateHtml: controlHtml()
            };
            if (typeof $scope.$parent.currentPricingMaterial !== 'undefined') {
                gridOptions.columnDefs = [
                    { field: 'items', displayName: 'Items', customSortField: 'items', sortable: false },
                    { field: 'customers', displayName: 'Customers', customSortField: 'customers', sortable: false },
                    { field: 'charge', displayName: 'Charge', customSortField: 'charge' },
                    { field: 'pricingType', displayName: 'Pricing Type', customSortField: 'pricingType', sortable: false },
                    { field: 'discount', displayName: 'Discount', customSortField: 'discount' },
                    { field: 'expression', displayName: 'Expression', customSortField: 'expression', sortable: false }
                ];
                gridOptions.extraParams = {
                    material: $scope.$parent.currentPricingMaterial
                };
            }

            $scope.gridOptions = gridOptions;

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="openManageItem(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.items,
                    value.id,
                    'Price Surcharge',
                    null,
                    '/api/twcpricingsurcharges/delete/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageItem = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/managePricingSurchargeModal.html',
                    controller: 'ManagePricingSurchargeModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            if (typeof $scope.$parent.currentPricingMaterial !== 'undefined') {
                                return m == null ? {
                                    customFieldName: "Fabric",
                                    value: $scope.$parent.currentPricingMaterial
                                } : m;
                            } else {
                                return m == null ? {} : m;
                            }
                        }
                    }
                });
                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };

            $scope.importItems = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pricing/modals/pricingImportExportModal.html',
                    controller: 'PricingImportExportModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        title: function () {
                            return 'Pricing Surcharge';
                        },
                        importUrl: function () {
                            return '/api/twcPricingSurcharges/import';
                        },
                        exportUrl: function () {
                            return '/api/twcPricingSurcharges/export';
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };
        }
    ]);
customerDetailsModule.controller('PricingMaterialColourModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'material', 'colour', 'isNew',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, material, colour, isNew) {
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.mode = isNew ? "Add" : "Edit";
            $scope.message = null;
            $scope.n = angular.copy(colour);

            $scope.ok = function (form, m) {
                $scope.message = null;
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    var isExist = false;
                    angular.forEach(material.colours, function (mt) {
                        if (mt.colour !== null && mt.colour.toLowerCase() === m.colour.toLowerCase()) {
                            isExist = true;
                        }
                    });
                    //
                    if (!isExist) {
                        var dts = {
                            colour: m.colour.toUpperCase(),
                            dts1: {
                                material: material.material.toUpperCase(),
                                colour: m.colour.toUpperCase(),
                                itemNumber: "",
                                pricingGroup: ""
                            }
                        };

                        if (!isNew) {
                            var copy = angular.copy(colour);
                            dts.dts2 = {
                                material: material.material.toUpperCase(),
                                colour: copy.colour.toUpperCase(),
                                itemNumber: "",
                                pricingGroup: ""
                            };
                        }
                        $modalInstance.close(dts);
                    } else {
                        $scope.message = "Colour already exist";
                    }
                }
            };

            $scope.cancel = function () {
                $modalInstance.dismiss(false);
            };
        }]);
customerDetailsModule.controller('PricingMaterialColourProductModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'items', 'products', 'product',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, items, products, product) {
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.message = null;
            $scope.items = items;
            var arr = [];
            for (var k in products) {
                arr.push(parseInt(k));
            }

            angular.forEach(items, function (item, i) {
                item.index = 3 + i;
            });

            $scope.n = {
                index: null,
                pricingGroup: angular.copy(product.pricingGroup),
                itemNumber: ""
            };

            $scope.checkItem = function () {
                var isExist = arr.indexOf(parseInt($scope.n.index)) >= 0;
                $scope.message = null;
                if (isExist) {
                    $scope.message = "Product already exist";
                }
            };

            $scope.ok = function (form, m) {
                $scope.message = null;
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.checkItem();
                    //
                    if ($scope.message === null) {
                        var dts = angular.copy(product);
                        dts.index = m.index;
                        dts.dts1.itemNumber = m.itemNumber;
                        $modalInstance.close(dts);
                    }
                }
            };

            $scope.cancel = function () {
                $modalInstance.dismiss(false);
            };
        }]);
customerDetailsModule.controller('PricingMaterialModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'data', 'material', 'isNew',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, data, material, isNew) {
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.mode = isNew ? "Add" : "Edit";
            $scope.message = null;
            $scope.n = angular.copy(material);

            $scope.ok = function (form, m) {
                $scope.message = null;
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    var isExist = false;
                    angular.forEach(data.materials, function (mt) {
                        if (mt.material !== null &&
                            mt.material.toLowerCase() === m.material.toLowerCase()) {
                            isExist = true;
                        }
                    });
                    //
                    if (!isExist) {
                        var dts = {
                            material: m.material.toUpperCase(),
                            dts1: {
                                material: m.material.toUpperCase(),
                                colour: "",
                                itemNumber: "",
                                pricingGroup: ""
                            }
                        };

                        if (!isNew) {
                            var copy = angular.copy(material);
                            dts.dts2 = {
                                material: copy.material.toUpperCase(),
                                colour: "",
                                itemNumber: "",
                                pricingGroup: ""
                            };
                        }
                        $modalInstance.close(dts);
                    } else {
                        $scope.message = "Material already exist";
                    }
                }
            };

            $scope.cancel = function () {
                $modalInstance.dismiss(false);
            };
        }]);
customerDetailsModule.controller('ManagePricingPartSaleModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'model', 'isNew',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, model, isNew) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.n = angular.copy(model);
            $scope.n.customers = isNew ? '' : angular.copy(model.customers).replaceAll(',', '\n');
            $scope.n.isNew = isNew;
            $scope.units = $filter('orderBy')(['Each', 'Pair', 'Pairs', 'Mt', 'Sq Mt']);
            $scope.categories = $filter('orderBy')(['OD01', 'OD04', 'CT01', 'CT05', 'AV01', 'AV04', 'VB01', 'RB10', 'PG01', 'HC01', 'AV07', 'AV05', 'RB01', 'SH01', 'CT05']);

            // check
            var capitaliseFirstLetter = function (strr) {
                var arr = strr.split(' ');
                var results = [];
                for (var i = 0; i < arr.length; i++) {
                    var str = arr[i];
                    str = str.charAt(0).toUpperCase() + str.slice(1);
                    str = str.replace(/([a-z])([A-Z])/g, '$1 $2');
                    results.push(str);
                }
                return results.join(' ');
            };
            if (!isNew)
                $scope.n.unit = capitaliseFirstLetter($scope.n.unit);

            $scope.ok = function (form, m) {
                $rootScope.formSubmit(form);

                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    var dataToSend = angular.copy(m);
                    dataToSend.customer = angular.copy(m.customers).replace(/\n/g, ",").split(",");

                    baseFactory.post("/api/twcpartsaleslist/save", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };

            $scope.cancel = function () {
                $modalInstance.close(false);
            };
        }]);
customerDetailsModule.controller('ManagePricingOverrideModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'model', 'isNew',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, model, isNew) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.units = $filter('orderBy')(['Each', 'Pair', 'Pairs', 'Mt', 'Sq Mt']);
            $scope.categories = $filter('orderBy')(['OD01', 'AV01', 'AV04', 'VB01', 'RB10', 'PG01', 'HC01', 'AV07', 'AV05', 'RB01', 'SH01']);
            //
            $scope.n = {
                isNew: isNew,
                id: isNew ? -1 : angular.copy(model.id),
                colour: isNew ? null : angular.copy(model.color),
                discount: isNew ? null : angular.copy(model.discount),
                description: isNew ? null : angular.copy(model.description),
                group: isNew ? null : angular.copy(model.group),
                material: isNew ? null : angular.copy(model.material),
                startDate: isNew ? moment().format() : angular.copy(model.startDate),
                endDate: isNew ? moment().add(5, 'days').format() : angular.copy(model.endDate),
                startDatetime: isNew ? null : model.startDate != null ? model.startDate : null,
                endDatetime: isNew ? null : model.endDate != null ? model.endDate : null,
                items: isNew ? '' : angular.copy(model.items).replaceAll(',', '\n'),
                customers: isNew ? '' : angular.copy(model.customers).replaceAll(',', '\n')
            };

            $scope.dateChanged = function () {
                if ($scope.n.startDate !== null) {
                    var h1 = $scope.n.startDatetime ? parseInt(moment($scope.n.startDatetime).format("H")) : 0;
                    var mm1 = $scope.n.startDatetime ? parseInt(moment($scope.n.startDatetime).format("mm")) : 0;
                    $scope.n.startDatetime = moment($scope.n.startDate).set({ hours: h1, minutes: mm1 }).valueOf();
                }
                if ($scope.n.endDate !== null) {
                    var h2 = $scope.n.endDatetime ? parseInt(moment($scope.n.endDatetime).format("H")) : 23;
                    var mm2 = $scope.n.endDatetime ? parseInt(moment($scope.n.endDatetime).format("mm")) : 59;
                    $scope.n.endDatetime = moment($scope.n.endDate).set({ hours: h2, minutes: mm2 }).valueOf();
                }
            };
            $scope.dateChanged();

            $scope.dateOpened1 = false;
            $scope.open1 = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateOpened1 = true;
            };
            $scope.dateOpened2 = false;
            $scope.open2 = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateOpened2 = true;
            };
            $scope.dateOptions = {
                formatYear: 'yyyy',
                startingDay: 1
            };

            $scope.ok = function (form, m) {
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    var sd = m.startDate === null ? null : moment(moment(angular.copy(m.startDate)).format("YYYY-MM-DD") + "T" + moment(angular.copy(m.startDatetime)).format("HH:mm")).format();
                    var ed = m.endDate === null ? null : moment(moment(angular.copy(m.endDate)).format("YYYY-MM-DD") + "T" + moment(angular.copy(m.endDatetime)).format("HH:mm")).format();
                    var dataToSend = {
                        id: angular.copy(m.id),
                        colour: angular.copy(m.colour),
                        discount: angular.copy(m.discount),
                        group: angular.copy(m.group),
                        material: angular.copy(m.material),
                        description: angular.copy(m.description),
                        startDate: sd,
                        endDate: ed,
                        itemNumbers: angular.copy(m.items).split("/\r?\n|\r/"),
                        customer: angular.copy(m.customers).replace(/\n/g, ",").split(",")
                    };
                    //console.log(dataToSend);
                    //$scope.submitTxt = "Save";
                    //$scope.disableSubmitButton = false;

                    baseFactory.post("/api/twcpricingoverrides/save", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };

            $scope.cancel = function () {
                $modalInstance.close(false);
            };
        }]);
customerDetailsModule.controller('ManagePricingSurchargeModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'model', 'isNew',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, model, isNew) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            //
            $scope.n = {
                isNew: isNew,
                id: isNew ? -1 : angular.copy(model.id),
                charge: isNew ? null : angular.copy(model.charge),
                discount: isNew ? 'N' : angular.copy(model.discount),
                expression: isNew ? null : angular.copy(model.expression),
                customFieldName: model.customFieldName || null,
                pricingType: isNew ? null : angular.copy(model.pricingType),
                value: model.value || null,
                items: isNew ? '' : angular.copy(model.items).replaceAll(',', '\n'),
                customers: isNew ? '' : angular.copy(model.customers).replaceAll(',', '\n'),
            };

            $scope.ok = function (form, m) {
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    var dataToSend = {
                        id: angular.copy(m.id),
                        charge: angular.copy(m.charge),
                        discount: angular.copy(m.discount),
                        expression: angular.copy(m.expression),
                        customFieldName: angular.copy(m.customFieldName),
                        pricingType: angular.copy(m.pricingType),
                        value: angular.copy(m.value),
                        itemNumbers: angular.copy(m.items).split("/\r?\n|\r/"),
                        customer: angular.copy(m.customers).replace(/\n/g, ",").split(","),
                    };

                    baseFactory.post("/api/twcpricingsurcharges/save", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };

            $scope.cancel = function () {
                $modalInstance.close(false);
            };
        }]);
customerDetailsModule.controller('PricingImportExportModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$filter', 'baseFactory', 'importUrl', 'exportUrl', 'title',
        function ($scope, $rootScope, $modalInstance, $filter, baseFactory, importUrl, exportUrl, title) {

            $scope.title = title;
            $scope.importUrl = importUrl;
            $scope.exportUrl = exportUrl;

            $scope.cancel = function () {
                $modalInstance.close(false);
            };
        }]);
(function () {
    'use strict';
    homeModule.controller('AdminPrintersCtrl', AdminPrintersCtrl);
    AdminPrintersCtrl.$inject = ['$scope', 'gridData', 'modalFactory', '$modal', '$rootScope', 'GRID_CONSTANTS', 'categories', '$state'];
    function AdminPrintersCtrl($scope, gridData, modalFactory, $modal, $rootScope, GRID_CONSTANTS, categories, $state) {

        $scope.categories = categories;

        $scope.currentState = $state.current.name;

        $scope.deleteEntity = deleteEntity;

        $scope.gridOptions = {
            itemType: 'Printers',
            items: gridData,
            gridName: 'allPrinters',
            fetchUrl: '/api/calendar/GetAllCalendars',
            initSortString: 'name asc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            columnDefs: [
                { field: 'name', displayName: 'Name', customSortField: 'name' },
                { field: 'sortOrder', displayName: 'Order', customSortField: 'sortOrder' }
            ],
            controlCellTemplateHtml: '<div class="controls" permission permissions="system.printers.edit">' +
            '<div class="btn-group btn-group-sm pull-right">' +
            '<a ng-click="openManageLookUp(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
            '<a ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
            '</div></div>'
        };

        function deleteEntity(entity) {
            modalFactory.deleteEntityFromGrid(
                entity.name,
                entity.id,
                'Printer',
                null,
                '/api/calendar/deleteCalendar/',
                $scope.gridOptions.gridName
            );
        }


        $scope.openManageLookUp = function (m) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/printers/adminPrinterModal/adminPrinterModal.html',
                controller: 'adminPrinterModal',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    printer: function () {
                        return m;
                    }

                }
            });

            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            });
        };

    }

})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.printers', {
                url: "/printers",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/printers/adminPrinters.html",
                        controller: 'AdminPrintersCtrl',
                        resolve: {
                            gridData: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getGridEntity('/api/calendar/GetAllCalendars');
                            }],
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.printers.view']
                },
                ncyBreadcrumb: {
                    label: 'Printers Setup'
                }
            });
    }
]);

(function () {
    homeModule.controller('adminPrinterModal', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', 'printer', 'baseFactory'];

    function ctrl($scope, $modalInstance, printer, baseFactory) {

        if (printer == null) {
            $scope.mode = "Add";
        } else {
            $scope.mode = "Edit";
        }

        $scope.submitTxt = "Save";

        $scope.title = "Printer";

        $scope.cancel = function () {
            $modalInstance.close();
        };

        $scope.m = printer;

        function isValid() {
            return true;
        }

        $scope.ok = function (form, m) {

            $scope.submitted = true;
            if (!form.$valid || !isValid()) {
                return;
            }
           
            $scope.loading = true;

            $scope.submitTxt = "Saving...";
            $scope.disableSubmitButton = true;

            baseFactory.post('/api/calendar/saveCalendars', m).then(function (data) {
                // console.log(data);
                if (!data.isErrored) {
                    if ($scope.isAddAnotherField) {
                        // Reset
                        $scope.m = angular.copy(lookUpData);
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                        isReload = true;
                    } else {
                        m.id = data.object;
                        $modalInstance.close(m);
                    }
                } else {
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                }
            });

        };

    }
})();
importExportModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.productconfigurations', {
                url: '/productconfigurations',
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/productConfigurations/importExport.html"
                    }
                },
                ncyBreadcrumb: {
                    label: 'Product Configurations'
                }
            });


    }
]);
pricingModule.controller('ProntoConfigurationCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'promptFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, promptFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.itemInProgress = false;
            $scope.customerInProgress = false;

            $scope.syncItems = function () {
                promptFactory.confirm("You are about to sync the Items from Pronto. Are you sure you want to continue?", function (result) {
                    if (result) {
                        $scope.itemInProgress = true;
                        baseFactory.put('/api/twcpronto/syncitems').then(function (data) {
                            $scope.itemInProgress = false;
                        });
                    }
                });
            };
            $scope.syncCustomers = function () {
                promptFactory.confirm("You are about to sync the Customers from Pronto. Are you sure you want to continue?", function (result) {
                    if (result) {
                        $scope.customerInProgress = true;
                        baseFactory.put('/api/twcpronto/synccustomers').then(function (data) {
                            $scope.customerInProgress = false;
                        });
                    }
                });
            };
        }
    ]);
pricingModule.controller('ProntoCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {
        }
    ]);
pricingModule.controller('ProntoDashboardCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$timeout', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, $timeout, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, $stateParams) {
            $scope.groupedCards = [];
            $scope.loading = true;
            $scope.ranges = {
                'Today': [moment(), moment()],
                'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                'Last 7 Days': [moment().subtract(6, 'days'), moment()],
                'Last 4 weeks': [moment().subtract(29, 'weeks'), moment()],
                'This Month': [moment().startOf('month'), moment().endOf('month')],
                'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
                'This Year': [moment().startOf('year'), moment().endOf('year')],
                'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year').endOf('year')],
                'All Time': [moment.utc('19700101', 'YYYYMMDD'), moment()]
            };

            // MainDateRange
            if (typeof $scope.dateRange === "undefined") {
                $scope.dateRange = {
                    from: new Date(),
                    to: new Date()
                };
            }

            $scope.dateRangeChanged = function ($daterange) {
                $scope.loading = true;
                $rootScope.showBlanket = true;
                var dts = {
                    startDate: moment($daterange.from).format('YYYY-MM-DD'),
                    endDate: moment($daterange.to).format('YYYY-MM-DD'),
                };
                baseFactory.fetch('/api/twcpronto/dashboard', dts).then(function (rrdata) {
                    $scope.loading = false;
                    $rootScope.showBlanket = false;
                    $scope.groupedCards = rrdata.object || [];
                });
            };
            var updateCardDataTable = function (cardId, data) {
                for (var i = 0; i < $scope.groupedCards.length; i++) {
                    for (var j = 0; j < $scope.groupedCards[i].cards.length; j++) {
                        if ($scope.groupedCards[i].cards[j].guid === cardId) {
                            $scope.groupedCards[i].cards[j].dataTable = data;
                        }
                    }
                }
            };

            $scope.openRequest = function (json, guid) {
                var d = angular.fromJson(json);
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pronto/modals/prontoOrderJsonModal.html',
                    controller: 'ProntoOrderJsonModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        order: function () {
                            return d;
                        }
                    }
                });

                modalInstance.result.then(function () {
                }, function () {
                });
            };

            $scope.uploadToPronto = function (json, cardId) {
                var d = angular.fromJson(json);
                promptFactory.confirm("Are you sure you want to re-upload order to Pronto?", function (result) {
                    if (result) {                        
                        return baseFactory.put('/api/twcorder/uploadToPronto/' + d.orderId).then(function (data) {
                            if (!data.isErrored) {
                                var dts = {
                                    endDate: moment().format("YYYY-M-DD"),
                                    startDate: "1970-01-01"
                                };
                                baseFactory.fetch('/api/twcpronto/getOrderErrors', dts).then(function (rrdata) {
                                    if (!rrdata.isErrored) {
                                        updateCardDataTable(cardId, rrdata.object.dataTable);
                                    }
                                });
                            }
                        });
                    }
                });
            };

            // INIT
            $scope.dateRangeChanged($scope.dateRange);
        }
    ]);
pricingModule.controller('ProntoInvoicesCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'promptFactory', 'modalFactory', 'sharedFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, promptFactory, modalFactory, sharedFactory, GRID_CONSTANTS, $stateParams) {
            var invoiceStatuses = [
                { id: 0, name: "All Statuses" },
                { id: 1, name: "Paid" },
                { id: 2, name: "Unpaid" }
            ];

            $scope.gridOptions = {
                itemType: 'Invoices',
                gridName: 'invoices',
                fetchUrl: '/api/twcpronto/searchAllInvoices',
                exportUrl: '/exportGrid/getInvoices/',
                initSortString: 'reference ASC',
                enableSorting: false,
                enableSearching: false,
                enablePaging: false,
                enableDateRange: true,
                columnDefs: [
                    { field: 'orderNumber', displayName: 'Order #' },
                    { field: 'reference', displayName: 'Invoice #' },
                    { field: 'soOrderNo', displayName: 'Pronto #' },
                    { field: 'details', displayName: 'PO #' },
                    { field: 'customerName', displayName: 'Customer' },
                    {
                        field: 'invoiceDate', displayName: 'Invoice Date',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.invoiceDate | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    {
                        field: 'dueDate', displayName: 'Due Date',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.invoiceDate | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    {
                        field: 'amount', displayName: 'Amount',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.amount | currency}}</span></div>'
                    },
                    {
                        enableSort: false, width: 50,
                        cellTemplate: '<a ng-if="row.entity.link" class="btn btn-default" ng-href="{{row.entity.link}}" target="_blank" rel="nofollow noreferrer noopener" title="Export Invoice"><i class="fa fa-download"></i></a>'
                    }
                ],
                enableCustomFields: true,
                customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.statusId" class="form-control" ng-options="invoice.id as invoice.name for invoice in dg.fetchOptions.extraData.invoiceStatuses"></select>',
                extraParams: {
                    searchText: null,
                    dateRange: {
                        startDate: moment().subtract(29, 'days'),
                        endDate: moment()
                    },
                    statusId: 2,
                    customerId: typeof $stateParams.customerId === 'undefined' ? null : $stateParams.customerId
                },
                extraData: {
                    invoiceStatuses: invoiceStatuses
                }
            };
            $scope.getCustomer = function (val) {
                return sharedFactory.searchCustomer(val, true).then(function (data) {
                    return data;
                });
            };
            //
            $scope.updateSearch = function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            };
        }
    ]);
pricingModule.controller('ProntoLogsCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams', 'promptFactory',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams, promptFactory) {
            $scope.gridOptions = {
                itemType: 'Pronto Logs',
                gridName: 'allProntoLogs',
                fetchUrl: '/api/twcpronto/SearchAllProntoLogs',
                initSortString: 'processed desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: false,
                enablePaging: true,
                columnDefs: [
                    { field: 'id', displayName: 'Id', width: 100 },
                    { field: 'created', displayName: 'Created', customSortField: 'created', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'processed', displayName: 'Processed', customSortField: 'processed', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'customer', displayName: 'Customer' },
                    { field: 'orderNumber', displayName: 'Order No.', width: 150 },
                    { field: 'purchaseOrderNumber', displayName: 'PO No.', width: 150 },
                    { field: 'success', displayName: 'Success', width: 80 },
                    { field: 'result', displayName: 'Result', sortable: false },
                    { field: 'item', displayName: 'Item', width: 100 },
                    { field: 'items', displayName: 'Items', width: 80 },
                    { field: 'total', displayName: 'Total', width: 80 },
                    { field: 'retries', displayName: 'Retries', width: 80 }
                ],
                dateRange: {
                    startDate: moment(),
                    endDate: moment()
                },
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: 140,
                enableCustomFields: true,
                customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.isSuccess" class="form-control" ng-options="d.id as d.name for d in dg.fetchOptions.extraData.statuses"></select>',
                extraParams: {
                    isSuccess: null
                },
                extraData: {
                    statuses: [
                        { id: null, name: "All Responses" },
                        { id: true, name: "Success" },
                        { id: false, name: "Error" },
                    ]
                }
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<button ng-if="row.entity.request && row.entity.response" class="btn btn-default" ng-click="openRequest(row.entity)">JSON</a>' +
                    '<button ng-if="!row.entity.success" class="btn btn-default" ng-click="uploadToPronto(row.entity.id)">Reprocess</a>' +
                    '</div></div>';
            }

            $scope.openRequest = function (d) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/pronto/modals/prontoOrderJsonModal.html',
                    controller: 'ProntoOrderJsonModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        order: function () {
                            return d;
                        }
                    }
                });

                modalInstance.result.then(function () {
                }, function () {
                });
            };

            $scope.uploadToPronto = function (orderId) {
                promptFactory.confirm("Are you sure you want to re-upload order to Pronto?", function (result) {
                    if (result) {
                        return baseFactory.put('/api/twcorder/uploadToPronto/' + orderId).then(function (data) {
                            if (!data.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                            }
                        });
                    }
                });
            };
        }
    ]);
pricingModule.controller('ProntoOrderQueueCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'promptFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, promptFactory, modalFactory, GRID_CONSTANTS, $stateParams) {
            
            $scope.gridOptions = {
                itemType: 'Pronto Order Queue',
                gridName: 'allProntoOrderQueue',
                fetchUrl: '/api/twcpronto/SearchAllProntoOrderQueue',
                initSortString: 'created desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: false,
                enablePaging: true,
                columnDefs: [
                    { field: 'id', displayName: 'Id', width: 100 },
                    { field: 'created', displayName: 'Created', customSortField: 'created', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'updated', displayName: 'Updated', customSortField: 'updated', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'customerId', displayName: 'CustomerId' },
                    { field: 'customer', displayName: 'Customer' },
                    { field: 'purchaseOrderNumber', displayName: 'PO No.', width: 150 },
                    { field: 'itemNumber', displayName: 'Item No.' },
                    { field: 'item', displayName: 'Item' },
                    { field: 'status', displayName: 'Status' },
                    { field: 'items', displayName: 'Items' },
                    { field: 'total', displayName: 'Total' }
                ],
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: 120,
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a class="cursor-pointer btn btn-default" ng-click="uploadToPronto(row.entity.id)">Upload to Pronto</a>' +
                    '</div></div>';
            }

            $scope.uploadToPronto = function (orderId) {
                promptFactory.confirm("Are you sure you want to upload order to Pronto?", function (result) {
                    if (result) {
                        return baseFactory.put('/api/twcorder/uploadToPronto/' + orderId).then(function (data) {
                            if (!data.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                            }
                        });
                    }
                });
            };
        }
    ]);
pricingModule.controller('ProntoWorkOrderEventsCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'promptFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams', 'statuses',
        function ($scope, $rootScope, $modal, $state, baseFactory, promptFactory, modalFactory, GRID_CONSTANTS, $stateParams, statuses) {
            var workOrderStatuses = angular.copy(statuses);
            workOrderStatuses.splice(0, 0, { id: null, name: "All Statuses" });
            var filter = {};
            $scope.gridOptions = {
                itemType: 'Work Order Events',
                gridName: 'allProntoWorkOrderEvents',
                fetchUrl: '/api/twcpronto/SearchAllProntoWorkOrderEvents',
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                dateRange: {
                    startDate: moment(),
                    endDate: moment()
                },
                enableExport: false,
                enablePaging: true,
                columnDefs: [
                    { field: 'dateCreated', displayName: 'Date Created', customSortField: 'dateCreated', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'dateProcessed', displayName: 'Date Processed', customSortField: 'dateProcessed', cellFilter: 'date:\'dd/MM/yyyy HH:mm\'', width: "150px" },
                    { field: 'orderNumber', displayName: 'Order Number', width: 150 },
                    { field: 'workOrderStatus', displayName: 'Status', width: 150 },
                    { field: 'isDespatch', displayName: 'Despatch', width: 100 },
                    { field: 'isSalesOrder', displayName: 'Sales Order', width: 100 },
                    { field: 'success', displayName: 'Response', cellTemplate: "<div class=\"ngCellText\"><span ng-if=\"row.entity.success == true\">Success</span><span ng-if=\"row.entity.success == false\">Error</span></div>", width: 100 },
                    { field: 'message', displayName: 'Message' },
                    { field: 'retries', displayName: 'Retries', sortable: false, width: 80 }
                ],
                enableCustomFields: true,
                customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.s" class="form-control" ng-options="d.id as d.name for d in dg.fetchOptions.extraData.workOrderStatuses"></select>' +
                    '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.r" class="form-control" ng-options="d.id as d.name for d in dg.fetchOptions.extraData.responses"></select>',
                extraParams: {
                    s: null,
                    r: null
                },
                extraData: {
                    workOrderStatuses: workOrderStatuses,
                    responses: [
                        { id: null, name: "All Responses" },
                        { id: true, name: "Success" },
                        { id: false, name: "Error" }
                    ]
                },
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: 200
            };

            function controlHtml() {
                return '<div class="controls pull-right p-right10">' +
                    '<div class="btn-group btn-group-sm">' +
                    '<button class="btn btn-default" ng-click="reprocess(row.entity)" ng-if="row.entity.success == false" ng-disabled="row.entity.text">{{row.entity.text || \'Re-process\'}}</button>' +
                    '<button class="btn btn-danger" ng-click="deleteWorkOrderEvent(row.entity)" ng-if="row.entity.dateProcessed == null" ng-disabled="row.entity.text">Delete</button>' +
                    '</div></div>';
            }
            $scope.reprocess = function (d) {
                d.text = "Processing...";
                baseFactory.put('/api/twcpronto/processWorkOrderEvent?id=' + d.workOrderEventId).then(function (rrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };
            $scope.$on(":REPROCESS-WORKORDER-EVENTS", function () {
                var encodeQueryData = function (data) {
                    var ret = [];
                    for (var d in data) {
                        if (typeof data[d] !== 'undefined' && data[d] !== null)
                            ret.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d]));
                    }
                    return ret.join("&");
                };
                baseFactory.put('/api/twcpronto/processAllWorkOrderEvents?' + encodeQueryData(filter)).then(function (rrdata) {
                    $scope.$emit(":REPROCESS-WORKORDER-EVENTS-DONE");
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            });
            $scope.$on(GRID_CONSTANTS.REBUILD_GRID, function (a, b, c) {
                filter = angular.copy(c);
            });

            $scope.deleteWorkOrderEvent = function (v) {
                modalFactory.deleteEntityFromGrid(
                    v.orderNumber,
                    v.workOrderEventId,
                    'Work Order Event',
                    null,
                    '/api/twcworkorders/deleteevent/',
                    $scope.gridOptions.gridName
                );
            };
        }
    ]);
(function () {
    homeModule.controller('ProntoOrderJsonModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'order'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, order) {
        $scope.order = order;
        $scope.request = angular.fromJson(order.request);
        $scope.response = angular.fromJson(order.response);
        $scope.currentTab = 1;
        $scope.setTab = function (tab) {
            $scope.currentTab = tab;
        };
        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.requestTracker', {
                url: "/requestTracker",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/requestTracker/views/index.html",
                        controller: 'RequestTrackerCtrl',
                        resolve: {
                            types: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/gettypes').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            priorities: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/getpriorities').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            statuses: ['baseFactory', function (baseFactory) {
                                return [
                                    { id: null, description: "Open", name: "Open" },
                                    { id: 1, description: "Closed", name: "Closed" },
                                ];
                            }],
                        }
                    }
                },
                data: {
                    permissions: ['system.requesttracker.allow']
                },
                ncyBreadcrumb: {
                    label: 'Request Tracker'
                }
            })
            .state('base.requestTracker.create', {
                url: "/create",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/requestTracker/views/createEdit.html",
                        controller: 'RequestTrackerCreateEditCtrl',
                        resolve: {
                            types: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/gettypes').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            priorities: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/getpriorities').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            statuses: ['baseFactory', function (baseFactory) {
                                return [];
                            }],
                            isNew: [function () {
                                return true;
                            }],
                            item: [function () {
                                return {
                                    id: null,
                                    summary: null,
                                    description: null,
                                    type: "Task",
                                    priorityId: 4,
                                    attachments: [],
                                    comments: []
                                };
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.requesttracker.allow']
                },
                ncyBreadcrumb: {
                    label: 'Create Request'
                }
            })
            .state('base.requestTracker.edit', {
                url: "/edit/:id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/requestTracker/views/createEdit.html",
                        controller: 'RequestTrackerCreateEditCtrl',
                        resolve: {
                            types: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/gettypes').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            priorities: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/getpriorities').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            statuses: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/requestTracker/getstatuses').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            isNew: [function () {
                                return false;
                            }],
                            item: ['baseFactory', '$stateParams', function (baseFactory, $stateParams) {
                                return baseFactory.fetch('/api/requestTracker/getRequest/' + $stateParams.id).then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.requesttracker.allow']
                },
                ncyBreadcrumb: {
                    label: 'Edit Request'
                }
            });
    }
]);
homeModule.controller('RequestTrackerCtrl',
    ['$scope', '$rootScope', '$state', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'types', 'priorities', 'statuses', 
    function ($scope, $rootScope, $state, $modal, GRID_CONSTANTS, baseFactory, types, priorities, statuses) {

        var statusess = angular.copy(statuses);
        // statusess.unshift({ id: null, description: null, name: "All Statuses" });
        var prios = angular.copy(priorities);
        prios.unshift({ id: null, description: null, name: "All Priorities" });
        var typs = angular.copy(types);
        typs.unshift({ id: null, description: null, name: "All Types" });

        $scope.gridOptions = {
            itemType: 'Requests',
            gridName: 'allProjectIssues',
            fetchUrl: '/api/requestTracker/SearchAllRequests',
            exportUrl: '/exportGrid/getRequestTrackers',
            initSortString: 'createddate asc',
            enableSorting: false,
            enableSearching: true,
            enablePaging: true,
            enableExport: false,
            columnDefs: [
                //{ field: 'id', displayName: 'Id', customSortField: 'id', width: "60px" },
                //{ field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
                //{ field: 'type', displayName: 'Type', customSortField: 'type', width: "100px" },
                //{ field: 'summary', displayName: 'Summary', customSortField: 'summary' },
                //{ field: 'priority', displayName: 'Priority', customSortField: 'priority', width: "100px" },
                //{ field: 'status', displayName: 'Status', customSortField: 'status', width: "100px" }, 
                //{ field: 'user', displayName: 'User', customSortField: 'user', width: "120px" }
            ],
            controlCellTemplateHtml: controlHtml(),
            controlColumnWidth: '100%',
            headerRowHeight: 1,
            enableCustomFields: true,
            customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            '<select name="asf" ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.state" class="form-control" ng-options="d.description as d.name for d in dg.fetchOptions.extraData.states"></select>' +
            '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            '<select name="asff" ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.typ" class="form-control" ng-options="d.description as d.name for d in dg.fetchOptions.extraData.types"></select>',
            //'<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            //'<select name="asfdd" ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.prio" class="form-control" ng-options="d.description as d.name for d in dg.fetchOptions.extraData.priorities"></select>',
            extraParams: {
                state: "Open",
                typ: null,
                prio: null
            },
            extraData: {
                states: statusess,
                priorities: prios,
                types: typs
            }
        };

        function controlHtml() {
            return '<div ng-include src="\'/app/modules/admin/requestTracker/views/requestTrackerTemplate.html\'"></div>';
        }

        $scope.openManageIssue = function (mm) {
            $state.go('base.requestTracker.edit', { id: mm.id }, { reload: true });
        };
    }]);
homeModule.controller('RequestTrackerCreateEditCtrl',
    ['$scope', '$rootScope', '$state', '$stateParams', '$modal', '$timeout', '$sce', 'GRID_CONSTANTS', 'baseFactory', 'types', 'priorities', 'statuses', 'isNew', 'item',
        function ($scope, $rootScope, $state, $stateParams, $modal, $timeout, $sce, GRID_CONSTANTS, baseFactory, types, priorities, statuses, isNew, item) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.m = angular.copy(item);
            $scope.types = types;
            $scope.priorities = priorities;
            $scope.statuses = statuses;

            // PUBLIC
            $scope.trustSrc = function (src) {
                return $sce.trustAsResourceUrl(src);
            }

            //Upload Document
            $scope.fileModel = {
                FileName: "",
                FileFolder: ""
            };
            var isDocument = true;
            var isMedia = true;

            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = [];
                var result = false;

                if (isDocument || isMedia) {
                    fType = ["png", "jpg", "jpeg", "gif", "doc", "docx", "xls", "xlsx", "pdf", "txt"];
                    result = fType.indexOf(ext) >= 0;
                }

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                if (result) {
                    if ($scope.m.name == '' || typeof $scope.m.name === 'undefined') {
                        $scope.m.name = filename;
                    }
                }

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };

            $scope.onFileSelect = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) {
                            $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                        }).success(function (data, status, headers, config) {
                            if (!data.isErrored) {
                                $scope.resetInputFile();
                                $scope.fileModel = data.object;

                                $scope.m.attachments.push({
                                    fileFolder: $scope.fileModel.fileFolder,
                                    fileName: $scope.fileModel.fileName,
                                    url: '/api/file/showImage?filefolder=' + $scope.fileModel.fileFolder + '&filename=' + $scope.fileModel.fileName,
                                    photoThumbnailUrl: '/api/file/showImage?filefolder=' + $scope.fileModel.fileFolder + '&filename=' + $scope.fileModel.fileName,
                                    isUploaded: true,
                                    isDeleted: false,
                                    isNew: true
                                });
                            }
                            $scope.disableSubmitButton = false;
                            $scope.submitTxt = "Save";
                        });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };
            $scope.changeFile = function () {
                $scope.m.isUploaded = false;
                $scope.m.fileFolder = "";
                $scope.m.fileName = "";
                $scope.m.link = "";
                $scope.m.isNew = true;
            };
            $scope.resetInputFile = function () {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };
            $scope.removeFile = function (t, i) {
                $scope.m.attachments[i].isDeleted = true;
            };

            $scope.save = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    var dataToSend = angular.copy(m);

                    baseFactory.post('/api/requestTracker/saveRequest', dataToSend).then(function (data) {
                        // console.log(data);
                        if (!data.isErrored) {
                            $state.go('^', null, { reload: true });
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };

            // COMMENT
            $scope.comment = null;
            if (!isNew) {
                $scope.disableCommentButton = false;
                $scope.commentBtnTxt = "Add Comment";

                var resetTextarea = function () {
                    $scope.comment = null;
                };
                $scope.addComment = function (mForm, m) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.commentBtnTxt = "Saving...";
                        $scope.disableCommentButton = true;

                        var dataToSend = {
                            id: $stateParams.id,
                            comment: angular.copy(m)
                        };

                        baseFactory.post('/api/requestTracker/saveComment', dataToSend).then(function (rdata) {
                            // console.log(rdata);
                            if (!rdata.isErrored) {
                                $scope.comment = null;
                                baseFactory.fetch('/api/requestTracker/getComments/' + $stateParams.id).then(function (rrdata) {
                                    $scope.m.comments = rrdata.object || [];
                                });
                            }
                            $scope.commentBtnTxt = "Add Comment";
                            $scope.disableCommentButton = false;
                        });
                    }
                };
            }
        }]);
(function () {
    'use strict';

    homeModule.controller('ManageRequestTrackerModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$timeout', '$modalInstance', 'baseFactory', 'title', 'isNew', 'saveUrl', 'item', 'types', 'priorities'];
    function ctrl($scope, $rootScope, $timeout, $modalInstance, baseFactory, title, isNew, saveUrl, item, types, priorities) {

        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };

        $scope.title = title;
        $scope.isNew = isNew;
        $scope.mode = isNew ? "Create" : "Edit";
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.m = angular.copy(item);
        $scope.types = types;
        $scope.priorities = priorities;

        // PUBLIC

        //Upload Document
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        var isDocument = true;
        var isMedia = true;

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["png", "jpg", "jpeg"];
                result = fType.indexOf(ext) >= 0;
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.m.name == '' || typeof $scope.m.name === 'undefined') {
                    $scope.m.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.m.fileFolder = $scope.fileModel.fileFolder;
                            $scope.m.fileName = $scope.fileModel.fileName;
                            $scope.m.isUploaded = true;
                            $scope.m.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };
        $scope.changeFile = function () {
            $scope.m.isUploaded = false;
            $scope.m.fileFolder = "";
            $scope.m.fileName = "";
            $scope.m.link = "";
            $scope.m.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };

        $scope.ok = function (mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);

                baseFactory.post(saveUrl, dataToSend).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        $modalInstance.close(m);
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(isReload);
        };
    }
})();
roleModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.roles', {
                url: '/roles/',
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/roles/viewAll.html",
                        controller: 'viewAllRoles',
                        resolve: {
                            roles: [
                                'resolveFactory', function (resolveFactory) {
                                    return resolveFactory.getGridEntity('/api/roles/GetAll');
                                }
                            ]
                        }
                    }
                },
                data: {
                    permissions: ['system.users.view']
                },
                ncyBreadcrumb: {
                    label: 'Roles'
                }
            })
            .state('base.roles.edit', {
                url: 'edit/:id',
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/roles/createEdit.html",
                        controller: 'createEditRole',
                        resolve: {
                            role: [
                                'resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                    return resolveFactory.getBaseEntityById($stateParams.id, '/api/roles/get');
                                }
                            ],
                            customers: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/customer/getall/');
                            }],
                            allComponents: [
                                function () {
                                    return null;
                                }
                            ]
                        }
                    }
                },
                data: {
                    permissions: ['system.users.edit']
                },
                ncyBreadcrumb: {
                    label: 'Edit Role'
                }
            })
            .state('base.roles.create', {
                url: 'create',
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/roles/createEdit.html",
                        controller: 'createEditRole',
                        resolve: {
                            role: [function () {
                                return null;
                            }],
                            customers: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/customer/getall/');
                            }],
                            allComponents: [
                                'resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                    return resolveFactory.getEntity('/api/roles/getAllComponents');
                                }
                            ]
                        }
                    }
                },
                data: {
                    permissions: ['system.users.edit']
                },
                ncyBreadcrumb: {
                    label: 'Create Role'
                }
            })
            .state('base.roles.create.duplicate', {
                url: '/:id',
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/roles/createEdit.html",
                        controller: 'createEditRole',
                        resolve: {
                            role: [
                                'resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                    return resolveFactory.getBaseEntityById($stateParams.id, '/api/roles/get');
                                }
                            ],
                            customers: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/customer/getall/');
                            }],
                            allComponents: [
                                function () {
                                    return null;
                                }
                            ]
                        }
                    }
                },
                data: {
                    permissions: ['system.users.edit']
                },
                ncyBreadcrumb: {
                    label: 'Duplicate'
                }
            })
            .state('base.roles.view', {
                url: 'view/:id',
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/roles/view.html",
                        controller: 'createEditRole',
                        resolve: {
                            role: [
                                'resolveFactory', '$stateParams', function (resolveFactory, $stateParams) {
                                    return resolveFactory.getBaseEntityById($stateParams.id, '/api/roles/get');
                                }
                            ],
                            customers: ['resolveFactory', function (resolveFactory) {
                                return resolveFactory.getEntity('/api/customer/getall/');
                            }],
                            allComponents: [
                                function () {
                                    return null;
                                }
                            ]
                        }
                    }
                },
                data: {
                    permissions: ['system.users.view']
                },
                ncyBreadcrumb: {
                    label: 'View Role'
                }
            });

    }
]);
(function () {
    'use strict';
    roleModule.controller('createEditRole', createEditRole);
    createEditRole.$inject = ['$scope', '$state', 'baseFactory', 'USER_TYPES', 'role', 'allComponents', 'customers'];
    function createEditRole($scope, $state, baseFactory, USER_TYPES, role, allComponents, customers) {

        if ($state.current.name === 'base.roles.create.duplicate') {
            role.id = 0;
            role.name = 'Copy of ' + role.name;
        }
        $scope.saveRole = saveRole;
        $scope.updateComponent = updateComponent;
        $scope.updateSubComponent = updateSubComponent;
        $scope.customers = [];
        $scope.allSelectedCustomers = [];
        $scope.userTypes = USER_TYPES;

        function init() {
            if (role) {
                $scope.mode = $state.current.name === 'base.roles.create.duplicate' ? 'Create' : 'Edit';
                $scope.role = role;
                angular.forEach($scope.role.components, function (component) {
                    if (!component.permission) {
                        var subComponentPermissionSet = false;
                        //check if any of the sub components have been set.
                        //if they have then the component == 'set individually'
                        angular.forEach(component.subComponents, function (subComponent) {
                            if (subComponent.permission)
                                subComponentPermissionSet = true;
                        });
                        if (subComponentPermissionSet)
                            component.permission = -1;
                    }
                });
            } else {
                $scope.mode = "Create";
                $scope.role = {
                    id: 0,
                    components: allComponents,
                    customers: []
                };
            }

            for (var i = 0; i < customers.length; i++) {
                var c = { id: customers[i].customerId, name: customers[i].name }
                $scope.customers.push(c);
                if ($scope.role.customers.indexOf(c.id) >= 0) {
                    $scope.allSelectedCustomers.push(c);
                }
            }
        }

        init();
        var generateRoleToSave = function () {
            var roleToSave = angular.copy($scope.role);
            angular.forEach(roleToSave.components, function (component) {
                //permission set on component. Remove all permissions on the sub components
                if (component.permission >= 0) {
                    component.subComponents = null;
                } else {
                    component.permission = null;
                }
            });
            //
            roleToSave.customers = [];
            for (var i = 0; i < $scope.allSelectedCustomers.length; i++) {
                roleToSave.customers.push($scope.allSelectedCustomers[i].id);
            }
            //
            return roleToSave;
        };

        function saveRole(form) {
            $scope.submitted = true;
            if (form.$valid) {
                var uri = $scope.role.id > 0 ? '/api/roles/update' : '/api/roles/create';

                $scope.loading = true;
                baseFactory.call(uri, generateRoleToSave()).then(function (data) {
                    if (!data.isErrored) {
                        $state.go('base.roles', null, { reload: true });
                    }
                }).finally(function () {
                    $scope.loading = false;
                });
            }
        }

        function updateComponent(component, permission) {
            component.permission = permission;
            angular.forEach(component.subComponents, function (subComponent) {
                subComponent.permission = 0;
            });
        };

        function updateSubComponent(component, subComponent, permission) {
            component.permission = -1;
            subComponent.permission = permission;
        }

        $scope.addVisibleCustomers = function (selCustomers) {
            angular.forEach(selCustomers, function (selCustomer) {
                $scope.allSelectedCustomers.push(selCustomer);
            });
        };
        $scope.removeVisibleCustomer = function (c) {
            angular.forEach($scope.allSelectedCustomers, function (value, index) {
                if (c.id === value.id) {
                    $scope.allSelectedCustomers.splice(index, 1);
                }
            });
        };
        $scope.removeAllVisibleCustomers = function () {
            $scope.allSelectedCustomers = [];
        };
    }
})();
(function () {
    'use strict';
    roleModule.controller('viewAllRoles', viewAllRoles);
    viewAllRoles.$inject = ['$scope', 'modalFactory', 'roles'];

    function viewAllRoles($scope, modalFactory, roles) {

        $scope.getGridName = function () {
            return $scope.gridOptions.gridName;
        };

        $scope.gridOptions = {
            itemType: 'Roles',
            gridName: 'manageRolesfdgdf',
            fetchUrl: '/api/roles/GetAll',
            initSortString: 'name asc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            columnDefs: [
                { field: 'name', displayName: 'Name' }
            ],
            controlColumnWidth: '125px',
            controlCellTemplateHtml: '<div class="controls">' +
                '<div class="btn-group btn-group-sm clearfix">' +
                '<a perm-required="sysadmin.sysadminRoles.edit" ui-sref="base.roles.edit({id:COL_FIELD})" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '<a perm-required="sysadmin.sysadminRoles.edit" ui-sref="base.roles.create.duplicate({id:COL_FIELD})" class="btn btn-default" title="Duplicate Role"><i class="fa fa-copy"></i></a>' +
                '<a perm-required="sysadmin.sysadminRoles.edit" ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                '</div></div>'
        };
        $scope.deleteEntity = function (value) {
            modalFactory.deleteEntityFromGrid(
                   value.name,
                   value.id,
                   'Role',
                   null,
                   '/api/roles/Delete/',
                   $scope.gridOptions.gridName
               );
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.subscribers', {
                url: "/subscribers",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/subscribers/index.html",
                        controller: 'SubscriberCtrl',
                        resolve: {
                        }
                    }
                },
                data: {
                    permissions: ['system.subscribers.allow']
                },
                ncyBreadcrumb: {
                    label: 'Subscribers'
                }
            });
    }
]);
homeModule.controller('SubscriberCtrl',
    ['$scope', '$modal', 'modalFactory', '$state',
        function ($scope, $modal, modalFactory, $state) {
            $scope.gridOptions = {
                itemType: 'subscriber',
                gridName: 'subscriberAdmin',
                fetchUrl: '/api/subscriber/SearchAll',
                exportUrl: '/exportGrid/getSubscribers/',
                initSortString: 'dateCreated desc',
                enableExport: true,
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'name', displayName: 'Name', customSortField: 'name' },
                    { field: 'email', displayName: 'Email', customSortField: 'email' },
                    { field: 'phone', displayName: 'Phone', customSortField: 'phone' },
                    { field: 'details', displayName: 'Details', sortable: false },
                    { field: 'dateCreated', displayName: 'Date Added', customSortField: 'dateCreated', cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateCreated | date:"dd/MM/yyyy"}}</span></div>' }
                ]
            };
        }
    ]);
(function () {
    angular.module("twcItemStatusModule").config(config);

    config.$inject = ['$stateProvider'];

    function config($stateProvider) {
        $stateProvider
            .state('base.twcitemstatuses', {
                url: "/twcitemstatuses/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/twcItemStatus/itemStatus.html",
                        controller: 'twcItemStatusController',
                        resolve: {
                            model: [
                                'resolveFactory', function (resolveFactory) {
                                    return resolveFactory.getGridEntity('/api/TwcItemStatus/GetAll');
                                }
                            ]
                        }
                    }
                },
                data: {
                    permissions: ['system.itemstatuses.view']
                },
                ncyBreadcrumb: {
                    label: 'Item Statuses'
                }
            });
    }
})();
(function () {

    angular.module("twcItemStatusModule").controller("twcItemStatusController", twcItemStatusController);

    twcItemStatusController.$inject = ["$scope", "baseFactory", "model"];

    function twcItemStatusController($scope, baseFactory, model) {

        $scope.model = model.object;
        $scope.emailItems = [];
        $scope.selection = {
            selectedMaterial: null,
            selectedColour: null
        };
        $scope.saving = false;
        $scope.save = save;
        $scope.sendEmails = sendEmails;
        $scope.toggleAll = toggleAll;
        $scope.canSendEmails = canSendEmails;
        $scope.cancel = cancel;

        function save() {
            $scope.saving = true;
            $scope.emailItems = [];
            baseFactory.call("/api/TwcItemStatus/Save", $scope.model).then(function (data) {
                $scope.saving = false;
                if (!data.isErrored) {
                    $scope.emailItems = data.object.groups;
                    $scope.statuses = data.object.statuses;
                }
            });
        }

        function cancel() {
            $scope.emailItems = [];
        }

        function sendEmails() {
            $scope.saving = true;
            
            baseFactory.call("/api/TwcItemStatus/SendEmails", { groups: $scope.emailItems }).then(function (data) {
                $scope.saving = false;
                if (!data.isErrored) {
                    $scope.emailItems = [];
                }
            });
        }

        function toggleAll(item) {
            angular.forEach(item.orderNumbers, function (orderNumber) {
                orderNumber.sendEmail = item.checkAll;
            });
        }

        function canSendEmails() {
            var canSend = false;

            angular.forEach($scope.emailItems, function (item) {
                angular.forEach(item.orderNumbers, function (orderNumber) {
                    if (orderNumber.sendEmail) {
                        canSend = true;
                    }
                });
            });

            return canSend;
        }
    }
})();


(function () {
    itemDocuments.controller('UploadDocumentModalCtrl', ctrl);

    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', '$timeout', 'toaster', 'isNew', 'docTypes', 'categories', 'doc', 'title'];
    function ctrl($scope, $rootScope, baseFactory, $modalInstance, $timeout, toaster, isNew, docTypes, categories, docu, title) {
        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        if (isNew) {
            $scope.doc = docu != null ? angular.copy(docu) : {
                id: 0,
                fileName: null,
                permissions: []
            };
        } else {
            $scope.doc = angular.copy(docu);
            if (docu.link != null && docu.link.length > 0 && docu.isLink && docu.isVideo) {
                $scope.doc.isYoutubeVideo = true;
                // $scope.doc.showHomePage = !docu.isHomePage;
            }
        }

        $scope.title = title;
        $scope.isNew = isNew;
        $scope.mode = $scope.isNew ? "Add" : "Edit";
        $scope.submitTxt = $scope.isNew ? "Save" : "Save";
        $scope.docTypes = docTypes;
        $scope.categories = categories;
        $scope.categories.unshift({ id: null, name: 'None' });

        //Upload Document
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        var isDocument = true;
        var isMedia = true;

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["tif", "tiff", "png", "jpg", "jpeg", "gif", "zip", "rar", "7z", "gz", "ai", "psd", "pdf", "eps", "avi", "mp4", "mov", "mkv", "xls", "xlsx", "doc", "docx", "txt", "ppt", "pptx"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 12) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 13 && fType.indexOf(ext) <= 14) {
                    $scope.doc.docTypeId = 3;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        var isImageValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["png", "jpg", "jpeg", "gif"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message2 = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message2 = null;
            }, 2500);

            return result;
        };

        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };
        $scope.onImageSelect = function ($files) {
            if (isImageValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress2 = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress2 = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.doc.thumbnailFileFolder = data.object.fileFolder;
                            $scope.doc.thumbnailFileName = data.object.fileName;
                            $scope.doc.isUploaded2 = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile2();
                $scope.changeFile2();
            }
        };

        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file' && elems[i].name === 'documentFile') {
                    elems[i].value = null;
                }
            }
        };

        $scope.changeFile2 = function () {
            $scope.doc.isUploaded2 = false;
            $scope.doc.thumbnailFileFolder = "";
            $scope.doc.thumbnailFileName = "";
        };
        $scope.resetInputFile2 = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file' && elems[i].name === 'documentThumbnail') {
                    elems[i].value = null;
                }
            }
        };
        $scope.youtubeBoolChanged = function (isYoutube) {
            if (isYoutube) {
                $scope.doc.isUrl = false;
            }
            $scope.doc.docTypeId = isYoutube ? 3 : null;
            if (isYoutube) {
                $scope.doc.link = null;
            } else {
                $scope.changeFile();
                $scope.fileModel = {
                    FileName: "",
                    FileFolder: ""
                };
            }
        };
        $scope.urlBoolChanged = function (isUrl) {
            if (isUrl) {
                $scope.doc.isYoutubeVideo = false;
                $scope.doc.docTypeId = null;
            }
        };

        $scope.ok = function (doc) {
            $scope.submitTxt = "Saving...";
            $scope.disableSubmitButton = true;
            baseFactory.post("/api/documents/save", doc).then(function (data) {
                if (!data.isErrored) {
                    if ($scope.isAddAnotherField) {
                        // Reset
                        $scope.doc = angular.copy(docu);
                        $scope.doc.isUploaded = false;
                        $scope.fileModel = {
                            FileName: "",
                            FileFolder: ""
                        };
                        $scope.progress = 100;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                        isReload = true;
                    } else {
                        $modalInstance.close(doc);
                    }
                } else {
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                }
            });
        };
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.users', {
                url: "/users/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/user/user.html",
                        controller: 'UserCtrl',
                        resolve: {
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }],
                            roles: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                                return resolveFactory.getEntity('/api/roles/GetAll');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.users.view']
                },
                ncyBreadcrumb: {
                    label: 'Users'
                }
            })
            .state('base.users.changepassword', {
                url: "changepassword/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/user/changePassword/changePassword.html",
                        controller: 'userChangePasswordCtrl'
                    }
                },
                data: {
                    permissions: ['system.users.edit']
                },
                ncyBreadcrumb: {
                    label: 'Change Password'
                }
            });
    }
]);
homeModule.controller('UserCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'baseFactory', 'GRID_CONSTANTS', 'promptFactory', 'modalFactory', 'categories', 'roles',
        function ($scope, $rootScope, $modal, $state, $stateParams, baseFactory, GRID_CONSTANTS, promptFactory, modalFactory, categories, roles) {

            var isCustomerPage = $state.current.name == "base.customers.manage.users";
            var customFieldsHtml = [
                '<span class="input-group-btn" style="width: 0; border: 0px"></span>',
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.role" class="form-control" ng-options="ur.id as ur.name for ur in dg.fetchOptions.extraData.roles"></select>',
                '<span class="input-group-btn" style="width: 0; border: 0px"></span>',
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.isActive" class="form-control" ng-options="ur.key as ur.name for ur in dg.fetchOptions.extraData.statuses"></select>'
            ];

            if ($rootScope.isCompanyUser() && !isCustomerPage) {
                customFieldsHtml = [
                    '<span class="input-group-btn" style="width: 0; border: 0px"></span>',
                    '<input type="text" ng-model="cidtxt" ng-model-options="{debounce:500}" typeahead-wait-ms="500" placeholder="Customer" typeahead="d as d.name for d in getCustomer($viewValue)" ng-change="updateSearchOnFieldChanged(\'cid\')" typeahead-append-to-body="true" typeahead-on-select="dg.fetchOptions.extraParams.cid=$item.customerId;updateSearch()" typeahead-min-length="2" class="form-control"/>',
                    '<span class="input-group-btn" style="width: 0; border: 0px"></span>',
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.role" class="form-control" ng-options="ur.id as ur.name for ur in dg.fetchOptions.extraData.roles"></select>',
                    '<span class="input-group-btn" style="width: 0; border: 0px"></span>',
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.isActive" class="form-control" ng-options="ur.key as ur.name for ur in dg.fetchOptions.extraData.statuses"></select>'
                ];
            }

            $scope.categories = categories;
            $scope.roles = angular.copy(roles);
            $scope.roles.unshift({
                id: null,
                name: "All Roles"
            });
            var statuses = [
                { key: null, name: "All Statuses" },
                { key: true, name: "Active" },
                { key: false, name: "Inactive" }
            ];

            var gridName = "users";
            var columnDefs = [
                { field: 'username', displayName: 'Username', customSortField: 'username', width: "10%" },
                { field: 'firstName', displayName: 'First Name', customSortField: 'firstName', width: "10%" },
                { field: 'surname', displayName: 'Surname', customSortField: 'surname', width: "10%" },
                { field: 'customerId', displayName: 'Customer Id', customSortField: 'customerId', width: "10%" },
                { field: 'customerName', displayName: 'Customer Name', customSortField: 'customerName', width: "10%" },
                { field: 'role', sortable: false, displayName: 'Roles', width: "10%", cellTemplate: '<span class="label label-default pull-left" style="padding:5px; margin: 5px 5px;" ng-repeat="u in row.entity.roles"> {{u.name}} ' + '</span>' },
                { field: 'emailAddress', displayName: 'Email Address', customSortField: 'emailAddress', width: "15%" },
                { field: 'lastLogin', displayName: 'Last Login', customSortField: 'lastLogin', cellTemplate: '<div class="ngCellText"><span>{{row.entity.lastLogin | date:"dd/MM/yyyy"}}</span></div>' }
            ];

            if ($rootScope.clientName && ($rootScope.clientName.toLowerCase() === "ppi" ||
                $rootScope.clientName.toLowerCase() === "kingpin")) {
                gridName = "ppiUsers";
                columnDefs = [
                    { field: 'username', displayName: 'Username', customSortField: 'username', width: "10%" },
                    { field: 'firstName', displayName: 'First Name', customSortField: 'firstName', width: "10%" },
                    { field: 'surname', displayName: 'Surname', customSortField: 'surname', width: "10%" },
                    { field: 'customerId', displayName: 'Customer Id', customSortField: 'customerId', width: "10%" },
                    { field: 'customerName', displayName: 'Customer Name', customSortField: 'customerName', width: "10%" },
                    { field: 'customerType', displayName: 'Customer Type', sortable: false, width: "10%" },
                    { field: 'role', sortable: false, displayName: 'Roles', width: "10%", cellTemplate: '<span class="label label-default pull-left" style="padding:5px; margin: 5px 5px;" ng-repeat="u in row.entity.roles"> {{u.name}} ' + '</span>' },
                    { field: 'emailAddress', displayName: 'Email Address', customSortField: 'emailAddress', width: "15%" },
                    { field: 'lastLogin', displayName: 'Last Login', customSortField: 'lastLogin', cellTemplate: '<div class="ngCellText"><span>{{row.entity.lastLogin | date:"dd/MM/yyyy"}}</span></div>' }
                ];
            }

            $scope.gridOptions = {
                itemType: 'Users' + (isCustomerPage ? 'Customer' : ''),
                gridName: gridName + (isCustomerPage ? 'Customer' : ''),
                fetchUrl: '/api/users/SearchAllUsers',
                exportUrl: '/exportGrid/getUsers/',
                initSortString: 'firstName asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableExport: true,
                columnDefs: columnDefs,
                controlCellTemplateHtml: controlHtml(),
                enableCustomFields: true,
                customFieldsHtml: customFieldsHtml.join(""),
                extraParams: {
                    role: null,
                    isActive: true,
                    cid: isCustomerPage ? $stateParams.customerId : null
                },
                extraData: {
                    roles: $scope.roles,
                    statuses: statuses
                }
            };

            function controlHtml() {
                return '<div permission permissions="system.users.edit" class="controls">' +
                    '<div class="btn-group btn-group-sm" dropdown>' +
                    '<a ng-click="openManageUser(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<button type="button" class="btn btn-default" dropdown-toggle>' +
                    '<span class="caret"></span>' +
                    '<span class="sr-only">Action Menu</span>' +
                    '</button>' +
                    '<ul class="dropdown-menu" role="menu">' +
                    '<li permission is-sys-admin><a ui-sref="base.users.manage({userId: row.entity.id})">View User</a></li>' +
                    '<li><a ng-click="resetPasswordAction(row.entity)">Reset Password</a></li>' +
                    '<li ng-if="row.entity.id != user.userId"><a ng-click="deleteEntity(row.entity)">Delete</a></li>' +
                    '</ul>' +
                    '</div>' +
                    '</div>';
            }
            $scope.filter = null;
            $scope.$on(GRID_CONSTANTS.REBUILD_GRID, function (ev, opts, filter) {
                $scope.filter = filter;
            });

            $scope.bulkDelete = function () {
                promptFactory.confirm('Are you sure you want to bulk delete users?', function (result) {
                    if (result) {
                        baseFactory.put('/api/users/bulkDelete', $scope.filter).then(function (rdata) {
                        });
                    }
                });
            };
            $scope.bulkActivate = function () {
                promptFactory.confirm('Are you sure you want to bulk activate users?', function (result) {
                    if (result) {
                        baseFactory.put('/api/users/bulkActivate', $scope.filter).then(function (rdata) {
                        });
                    }
                });
            };

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.username,
                    value.id,
                    'User',
                    null,
                    '/api/users/delete/',
                    $scope.gridOptions.gridName
                );
            };
            $scope.openManageUser = function (m) {
                var newUser = true;
                if (m !== null)
                    newUser = false;
                var modalInstance = $modal.open({
                    templateUrl: isCustomerPage ? '/app/modules/admin/customers/modals/addOrEditUser.html' : '/app/modules/admin/user/userModal/addOrEditUser.html',
                    controller: 'addOrEditUser',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        model: function () {

                        },
                        isNew: function () {
                            return newUser;
                        },
                        user: function () {
                            if (!newUser) {
                                m.userType = m.userType != null && m.userType > 0 ? m.userType : null;
                            } else {
                                m = {
                                    visibleCustomers: null
                                };
                            }
                            if (isCustomerPage) {
                                m.userType = 3; // Client
                            }
                            return m;
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });

                modalInstance.result.then(function () {
                }, function (isReloadPage) {
                });
            };

            $scope.resetPasswordAction = function (u) {
                promptFactory.confirm('Are you sure you want to reset the password?', function (result) {
                    if (result) {
                        baseFactory.put('/api/users/resetpassword?uid=' + u.id).then(function () {
                        });
                    }
                });
            };
            $scope.getCustomer = function (val) {
                return baseFactory.fetch('/api/customer/SearchAll', { searchText: val, retrieveSize: 10 }).then(function (rdata) {
                    //console.log(rdata.object);

                    return rdata.object;
                });
            };

            //
            $scope.importUsers = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/user/userModal/importUserModal.html',
                    controller: 'ImportUserCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReloadPage) {
                });
            };
        }
    ]);
homeModule.controller('userChangePasswordCtrl',
['$scope', '$rootScope', 'baseFactory', 'toaster', '$state',
function ($scope, $rootScope, baseFactory, toaster, $state) {

    $scope.currentState = $state.current.name;

    $scope.username = $rootScope.user.username;
    $scope.model = null;

    console.log($rootScope.user);

    $scope.save = function () {
        baseFactory.post("/api/users/changepassword", $scope.model).then(function (data) {
            if (!data.isErrored) {
                $scope.isPasswordChanged = false;
                toaster.pop("info", "", "Password was changed. Please login using your new password", 10000);

                $rootScope.$emit(LOGOUT_USER);
            }
        });
    };

}
]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.users.manage', {
                url: "v/:userId",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/admin/user/dashboard/views/manage.html",
                        controller: 'UserManageCtrl'
                    }
                },
                ncyBreadcrumb: {
                    label: 'Dashboard'
                },
                resolve: {
                    user: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                        return baseFactory.fetch('/api/users/get/' + $stateParams.userId)
                            .then(function (rdata) { return rdata.object; });
                    }]
                }
            })
            .state('base.users.manage.dashboard', {
                url: "/dashboard",
                views: {
                    '@base.users.manage': {
                        templateUrl: "/app/modules/admin/user/dashboard/views/dashboard.html",
                        controller: 'UserDashboardCtrl',
                        resolve: {
                            dashboardReports: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/reportApi/getByGroup', { id: 'user' }).then(function (rrdata) {
                                    return rrdata.object || [];
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Dashboard'
                }
            })
            .state('base.users.manage.dashboard.view', {
                url: "/:id",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/admin/user/dashboard/views/dashboardView.html",
                        controller: 'ReportDashboardCtrl',
                        resolve: {
                        },
                        data: {
                            authorizedRoles: []
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: '{{report.name}}'
                }
            })
            .state('base.users.manage.profile', {
                url: "/profile",
                views: {
                    '@base.users.manage': {
                        templateUrl: "/app/modules/admin/user/dashboard/views/profile.html",
                        controller: 'UserProfileCtrl',
                        resolve: {
                            customFields: ['$rootScope', '$stateParams', 'baseFactory', function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/users/getUserCustomFields/' + $stateParams.userId)
                                    .then(function (rdata) { return rdata.object; });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Profile'
                }
            })
            .state('base.users.manage.profileEdit', {
                url: "/edit",
                views: {
                    '@base.users.manage': {
                        templateUrl: "/app/modules/admin/user/dashboard/views/userEdit.html",
                        controller: 'UserUserEditCtrl'
                    }
                },
                ncyBreadcrumb: {
                    label: 'Edit'
                }
            })
            .state('base.users.manage.notes', {
                url: "/notes",
                views: {
                    '@base.users.manage': {
                        templateUrl: "/app/modules/admin/customers/views/grid.html",
                        controller: 'UserNoteCtrl',
                        resolve: {
                            noteTypes: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Notes'
                }
            })
            .state('base.users.manage.activityLogs', {
                url: "/activitylogs",
                views: {
                    '@base.users.manage': {
                        templateUrl: "/app/modules/admin/customers/views/grid.html",
                        controller: 'UserActivityLogsCtrl',
                        resolve: {
                            noteTypes: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Activity Logs'
                }
            })
            .state('base.users.manage.emailLogs', {
                url: "/emaillogs",
                views: {
                    '@base.users.manage': {
                        templateUrl: "/app/modules/admin/customers/views/grid.html",
                        controller: 'UserEmailLogsCtrl',
                        resolve: {
                            noteTypes: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'EmailLogs'
                }
            });
    }
]);
customerDetailsModule.controller('UserActivityLogsCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.gridOptions = {
                itemType: 'Activities',
                gridName: 'allCustomerActivities',
                fetchUrl: '/api/ActivityLog/SearchAllLogs?u=' + $stateParams.userId,
                exportUrl: '/exportGrid/getActivityLogs/?u=' + $stateParams.userId,
                initSortString: 'createddate desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
                    { field: 'createdDate', displayName: 'Time', customSortField: 'createdDate', cellFilter: 'date:\'HH:mm\'', width: "70px" },
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber', width: "150px", sortable: false },
                    { field: 'details', displayName: 'Details', customSortField: 'details', sortable: false }
                ]
            };
        }
    ]);
customerDetailsModule.controller('UserDashboardCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$state', '$stateParams', 'dashboardReports',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $state, $stateParams, dashboardReports) {
            // Dashboards
            $scope.currentDashboardReportId = null;
            $scope.dashboardReports = $rootScope.groupList(dashboardReports, "group");

            // Sidebar
            $scope.showSidebar = true;
            $scope.toggleSidebar = function (isShow) {
                $scope.showSidebar = !isShow;
                window.dispatchEvent(new Event('resize'));
            };

            // INIT
            if ($scope.dashboardReports.length > 0 && $state.current.name == 'base.users.manage.dashboard') {
                $state.go('base.users.manage.dashboard.view', { id: $scope.dashboardReports[0].list[0].id });
            }
        }
    ]);
customerDetailsModule.controller('UserEmailLogsCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            $scope.gridOptions = {
                itemType: 'Email Log',
                gridName: 'allEmailLogs',
                fetchUrl: '/api/emailLog/getAll?uid=' + $stateParams.userId,
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enableDateRange: true,
                enableExport: false,
                enablePaging: true,
                columnDefs: [
                    { field: 'from', displayName: 'From' },
                    { field: 'to', displayName: 'To' },
                    { field: 'subject', displayName: 'Subject' },
                    { field: 'status', displayName: 'Status', sortable: false },
                    { field: 'orderNumber', displayName: 'Order No.', sortable: false },
                    { field: 'purchaseOrderNumber', displayName: 'Purchase Order No.', sortable: false },
                    { field: 'dateCreated', displayName: 'Date', customSortField: 'dateCreated', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            $scope.viewEmail = function (id) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/emailLogs/modals/manageEmailLogModal.html',
                    controller: 'ManageEmailLogModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        email: function () {
                            return baseFactory.fetch('/api/emailLog/get/' + id).then(function (rdata) {
                                return rdata.object;
                            });
                        }
                    }
                });
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm">' +
                    '<a ng-click="viewEmail(row.entity.id)" class="btn btn-default" title="View">View</a>' +
                    '</div></div>';
            }
        }
    ]);
customerDetailsModule.controller('UserManageCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$state', '$stateParams', 'user',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $state, $stateParams, user) {
            // console.log(customer);
            $scope.userId = $stateParams.userId;
            $scope.m = user;

            // NOTES
            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            if (m == null) {
                                return {
                                    id: 0,
                                    userId: user.id,
                                    customerName: user.displayName,
                                    isVisibleCustomer: false,
                                    date: moment().format()
                                };
                            }
                            return m;
                        },
                        contacts: function () {
                            if (user.customerId == null)
                                return [];
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: user.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes').then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                }).result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + 'userNotes');
                    $state.go('base.users.manage.notes', { userId: $stateParams.userId });
                }, function () { });
            };
            $scope.openManageUser = function (m) {
                $modal.open({
                    templateUrl: '/app/modules/admin/user/userModal/addOrEditUser.html',
                    controller: 'addOrEditUser',
                    size: 'md',
                    backdrop: 'static',
                    // windowClass: 'app-modal-window',
                    resolve: {
                        model: function () {

                        },
                        isNew: function () {
                            return false;
                        },
                        user: function () {
                            return m;
                        },
                        gridName: function () {
                            return 'userNotes';
                        }
                    }
                });

            };

            // CUSTOM FIELDS
            $scope.openManageCustomField = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageCustomFieldModal.html',
                    controller: 'ManageUserCustomFieldModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            if (m == null) {
                                return {
                                    id: 0,
                                    userId: user.id,
                                    customerName: user.displayName,
                                    customFieldId: null
                                };
                            }
                            return m;
                        },
                        customFields: function () {
                            return baseFactory.fetch('/api/customFields/getall', { isUser: true }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                }).result.then(function () {
                    $state.go('base.users.manage.profile');
                }, function () { });
            };

            // INIT
            if ($state.current.name == "base.users.manage")
                $state.go('base.users.manage.dashboard', { userId: $stateParams.userId });
        }
    ]);
customerDetailsModule.controller('UserNoteCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams', 'noteTypes',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams, noteTypes) {

            // NOTES
            var nnoteTypes = [{ id: null, name: 'All Types' }];
            for (var i = 0; i < noteTypes.length; i++) {
                nnoteTypes.push(noteTypes[i]);
            }
            $scope.gridOptions = {
                itemType: 'User Notes',
                gridName: 'userNotes',
                fetchUrl: '/api/notes/searchall?uid=' + $stateParams.userId,
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [],
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: '100%',
                headerRowHeight: 1,
                enableCustomFields: true,
                customFieldsHtml: customFieldsHtml(),
                extraParams: {
                    typeId: null
                },
                extraData: {
                    noteTypes: nnoteTypes
                },
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                var html = '<div ng-include src="\'/app/modules/admin/customers/views/noteTemplate.html\'"></div>';
                return html;
            }

            function customFieldsHtml() {
                return '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.typeId" class="form-control" ng-options="a.id as a.name for a in dg.fetchOptions.extraData.noteTypes"></select>';
            }

            function notesDetailsTemplate() {
                return '<div class="ngCellText">' +
                        '<div style="white-space: pre-line;">{{row.entity.content}}</div>' +
                    '</div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.noteType,
                    value.id,
                    'Note',
                    null,
                    '/api/notes/deletenote/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            return m;
                        },
                        contacts: function () {
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: m.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () { });
            };
        }
    ]);
customerDetailsModule.controller('UserProfileCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'USER_TYPES', 'GRID_CONSTANTS', '$stateParams', '$timeout', 'lazyLoadGoogleApi', 'customFields',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, USER_TYPES, GRID_CONSTANTS, $stateParams, $timeout, lazyLoadGoogleApi, customFields) {
            // console.log(customFields);
            $scope.m = $scope.$parent.m;
            $scope.userTypes = USER_TYPES;
            $scope.customFields = $rootScope.groupList(customFields, 'customFieldGroupName');
            
            if ($rootScope.clientName == 'TFT') {
                $scope.mapId = window.randomString();
                $scope.m.showMap = false;
                $scope.$on('mapInitialized', function (evt, evtMap) {
                    $scope.map = evtMap;
                    $timeout(function () {
                        $scope.mapLatLng = new google.maps.LatLng($scope.m.latitude, $scope.m.longitude);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(12);

                        $scope.marker = new google.maps.Marker({
                            position: $scope.mapLatLng,
                            title: $scope.m.address
                        });
                        $scope.marker.setMap($scope.map);
                    }, 500);
                });
                $scope.centerChanged = function (event) {
                    $timeout(function () {
                        try {
                            $scope.map.panTo($scope.marker.getPosition());
                        } catch (er) {
                            $scope.mapLatLng = new google.maps.LatLng($scope.m.latitude, $scope.m.longitude);
                            $scope.map.setCenter($scope.mapLatLng);
                            $scope.map.setZoom(12);

                            $scope.marker = new google.maps.Marker({
                                position: $scope.mapLatLng,
                                title: $scope.m.address
                            });
                            $scope.marker.setMap($scope.map);
                        }
                    }, 500);
                };
                lazyLoadGoogleApi.then(function () {
                    $scope.m.showMap = true;
                });
            }
        }
    ]);
customerDetailsModule.controller('UserUserEditCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'STATES', 'USER_TYPES', '$timeout', '$upload', '$stateParams', 'user',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, STATES, USER_TYPES, $timeout, $upload, $stateParams, user) {

            var isNew = false;
            $scope.isNew = isNew;
            $scope.isUsernameDisabled = !isNew;
            $scope.manageUserTitle = "";
            $scope.states = STATES;
            $scope.roles = [];
            $scope.userTypes = USER_TYPES;
            $scope.manageUserTitle = isNew ? "Create User" : "Edit User";

            if (user) {
                if (user.customerId != null) {
                    $scope.selectedCustomer = user.customerId;
                    $scope.selectedCustomerName = user.name;
                } else {
                    $scope.selectedCustomer = {};
                }

                $scope.user = angular.copy(user);
            } else {
                $scope.user.roles = [];
                $scope.user = {};
            }

            if (!isNew && ($scope.user.username == null || $scope.user.username.length < 1)) {
                $scope.isUsernameDisabled = false;
            }

            $scope.showCompanySelection = function () {
                return $rootScope.user.customerId === undefined || $rootScope.user.customerId == "";
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
            $scope.openManageRoles = function (size, u) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/user/manageUserRolesModal/manageRole.html',
                    controller: 'ManageUserRolesModalCtrl',
                    size: size,
                    backdrop: 'static',
                    resolve: {
                        roles: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                            return resolveFactory.getEntity('/api/roles/GetAll');
                        }],
                        userRoles: function () {
                            return angular.copy(u.roles);
                        },
                        customerId: function () {
                            return u.customerId;

                        }
                    }
                });

                modalInstance.result.then(function (selectedItems) {
                    $scope.user.roles = selectedItems;
                }, function () {

                });
            };
            $scope.getCustomer = function (val) {
                return sharedFactory.searchCustomer(val).then(function (data) {
                    return data;
                });
            };
            $scope.onSelect = function ($item, $model, $label) {
                $scope.user.customerId = $item.customerId;
                $scope.user.customerName = $item.name;
            };
            $scope.saveUser = function (mForm, m) {
                $rootScope.formSubmit(mForm);

                if (mForm.$valid) {

                    if (m.customerId == "") {
                        m.customerName = "";
                    }

                    if (isNew && !$scope.showCompanySelection()) {
                        m.customerId = $rootScope.user.customerId;
                        m.customerName = $rootScope.user.customerName;
                    }

                    $scope.disableSubmitButton = true;
                    $scope.submitted = true;
                    $scope.loading = true;

                    m.password = null;

                    baseFactory.post("/api/users/save/", m).then(function (data) {
                        $scope.$parent.m.photoThumbnailUrl = data.object.photoThumbnailUrl;
                        $scope.$parent.m.displayName = data.object.displayName;
                        $scope.$parent.m.customerName = data.object.customerName;
                        $scope.disableSubmitButton = false;
                        $scope.submitted = false;
                        $scope.loading = false;
                    });
                }

            };

            //
            // FILE
            var scopeName = 'user';
            $scope.fileModel = {
                fileName: "",
                fileFolder: ""
            };
            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = ["jpeg", "jpg", "png"];
                var result = fType.indexOf(ext) >= 0;

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };
            $scope.onFileSelect = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        $scope.resetInputFile();
                        // temporary folder
                        $scope.fileModel = data.object;
                        $scope[scopeName].file = $scope.fileModel;
                        $scope[scopeName].isUploaded = true;
                        $scope[scopeName].isNew = true;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };
            $scope.changeFile = function () {
                $scope[scopeName].isUploaded = false;
                $scope[scopeName].file = {
                    fileName: "",
                    fileFolder: ""
                };
                $scope[scopeName].photoThumbnailUrl = "";
                $scope[scopeName].isNew = true;
            };
            $scope.resetInputFile = function () {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };

            // MAP
            if ($rootScope.clientName == 'TFT') {
                $scope.mapId = window.randomString();
                $scope.tempAddress = isNew ? null : user.address;
                $scope.showMap = false;
                $scope.$on('mapInitialized', function (evt, evtMap) {
                    $scope.map = evtMap;
                    $timeout(function () {
                        if ($scope.user.latitude != null && $scope.user.longitude != null) {
                            // console.log($scope.user);
                            if ($scope.user.latitude != '' && $scope.user.longitude != '') {
                                $scope.mapLatLng = new google.maps.LatLng($scope.user.latitude, $scope.user.longitude);
                                $scope.map.setCenter($scope.mapLatLng);
                                $scope.map.setZoom(12);

                                $scope.marker = new google.maps.Marker({
                                    position: $scope.mapLatLng,
                                    title: $scope.user.address
                                });
                                $scope.marker.setMap($scope.map);
                            }
                        }
                    }, 500);
                });
                $scope.place = null;
                $scope.$watch('place', function (v) {
                    // console.log(v);
                    if (v != null) {
                        if (typeof v.name !== "undefined")
                            $scope.user.name = v.name;

                        if (typeof v.formatted_phone_number !== "undefined")
                            $scope.user.phone = v.formatted_phone_number;

                        $scope.mapLatLng = new google.maps.LatLng($scope.user.latitude, $scope.user.longitude);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(12);

                        $scope.marker = new google.maps.Marker({
                            position: $scope.mapLatLng,
                            title: $scope.user.address
                        });
                        $scope.marker.setMap($scope.map);
                    }
                });
                $scope.centerChanged = function (event) {
                    $timeout(function () {
                        try {
                            $scope.map.panTo($scope.marker.getPosition());
                        } catch (er) {
                            $scope.mapLatLng = new google.maps.LatLng(-24.994167, 134.866944);
                            $scope.map.setCenter($scope.mapLatLng);
                            $scope.map.setZoom(10);

                            $scope.marker = new google.maps.Marker({
                                position: $scope.mapLatLng,
                                title: $scope.user.address
                            });
                            $scope.marker.setMap($scope.map);
                        }
                    }, 500);
                };
                $scope.onSelectPlace = function ($geo) {
                    $scope.user.address = $geo.loc;
                    $scope.user.latitude = $geo.lat;
                    $scope.user.longitude = $geo.lng;
                    $scope.user.state = $geo.state;
                    $scope.user.country = $geo.country;
                    $scope.user.postcode = $geo.postcode;
                    $scope.user.stateId = 'Other'; // Other

                    // Set state
                    angular.forEach($scope.states, function (s) {
                        if (s.name.toLowerCase() == $geo.state.toLowerCase()) {
                            $scope.user.stateId = s.id;
                        }
                    });
                    //
                    $scope.mapLatLng = new google.maps.LatLng($scope.user.latitude, $scope.user.longitude);
                    $scope.map.setCenter($scope.mapLatLng);
                    $scope.map.setZoom(12);

                    $scope.marker = new google.maps.Marker({
                        position: $scope.mapLatLng,
                        title: $scope.user.address
                    });
                    $scope.marker.setMap($scope.map);

                    $scope.$apply();
                };
                $scope.onGoogleInit = function (isInit) {
                    $timeout(function () {
                        $scope.showMap = isInit;
                    }, 500);
                };
            }
        }
    ]);
customerDetailsModule.controller('ManageUserCustomFieldModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'model', 'customFields', 'isNew',
        function ($scope, $rootScope, $modalInstance, $timeout, baseFactory, model, customFields, isNew) {

            $scope.isNew = isNew;
            $scope.mode = isNew ? "Create" : "Edit";
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            $scope.cf = angular.copy(model);
            $scope.customFields = customFields;
            $scope.showCustomField = false;
            
            if (!isNew) {
                try {
                    $scope.cf.values = $scope.cf.split(',');
                } catch (er) {
                    $scope.cf.values = [];
                }

                angular.forEach(customFields, function (cff) {
                    if (cff.id == $scope.cf.customFieldId) 
                        $scope.cf.customField = cff;
                });

                if ($scope.cf.customField.typeId == 2)
                    $scope.cf.value = parseFloat($scope.cf.value);
            }

            $scope.cfChange = function (cf) {
                $scope.showCustomField = false;
                try {
                    $scope.cf.customFieldId = cf.id;
                } catch (err) {
                    $scope.cf.customFieldId = null;
                }
                $timeout(function () {
                    $scope.showCustomField = true;
                }, 50);
            };

            $scope.ok = function (form, m) {
                // console.log(form);
                $rootScope.formSubmit(form);
                if (form.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    var dataToSend = angular.copy(m);
                    delete dataToSend.customField;
                    baseFactory.post("/api/users/saveUserCustomField", dataToSend).then(function (data) {
                        if (!data.isErrored) {
                            m.id = data.object;
                            $modalInstance.close(m);
                        } else {
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        }
                    });
                }
            };
            $scope.cancel = function () {
                $modalInstance.close(false);
            };
        }]);
(function () {
    'use strict';
    homeModule.controller('ManageUserRolesModalCtrl', ManageUserRolesModalCtrl);
    ManageUserRolesModalCtrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'roles', 'userRoles', 'sharedFactory', 'customerId'];

    function ManageUserRolesModalCtrl($scope, $rootScope, $modalInstance, roles, userRoles, sharedFactory, customerId) {

        $scope.tmpRole = null;
        $scope.mRoles = angular.copy(roles);
        $scope.mRoles.splice(0, 0, { id: null, name: "-- Select Role --" });

        if (userRoles == null) {
            $scope.mUserRoles = [];
        } else {
            $scope.mUserRoles = userRoles;
        }

        $scope.addRole = function (tmpRoleId) {
            if (tmpRoleId != null) {
                var isExist = false;
                angular.forEach($scope.mUserRoles, function (r) {
                    if (!isExist)
                        isExist = r.id == tmpRoleId;
                });
                if (!isExist) {
                    for (var i = 0; i < $scope.mRoles.length; i++) {
                        if ($scope.mRoles[i].id == tmpRoleId) {
                            $scope.mUserRoles.push({
                                id: $scope.mRoles[i].id,
                                name: $scope.mRoles[i].name
                            });
                            break;
                        }
                    }
                }

                $scope.tmpRole = null;
            }
        };

        $scope.delete = function (role) {

            angular.forEach($scope.mUserRoles, function (r, i) {
                if (role.id == r.id) {
                    $scope.mUserRoles.splice(i, 1);
                }
            });
        };

        $scope.ok = function () {
            $modalInstance.close($scope.mUserRoles);
        };

        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };
    }
})();

(function () {
    homeModule.controller('ManageUnsubscribeModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory) {
        
        $scope.disableSubmitButton = false;
        $scope.submitTxt = "Unsubscribe";
        $scope.m = [];

        $scope.addUsers = function (tRecipients) {
            angular.forEach(tRecipients, function (tRecipient) {
                var isExist11 = false;
                angular.forEach($scope.m, function (u) {
                    if (u.id == tRecipient.id)
                        isExist11 = true;
                });
                if (!isExist11 && tRecipient.email) {
                    $scope.m.push(tRecipient);
                }
            });
        };
        $scope.removeAllUsers = function () {
            $scope.m = [];
        };
        $scope.removeUser = function (usr) {
            var indx = -1;
            angular.forEach($scope.m, function (u, i) {
                if (u.id == usr.id)
                    indx = i;
            });
            if (indx >= 0)
                $scope.m.splice(indx, 1);
        };

        // Saved
        $scope.saveForm = function (mForm, m) {
            $rootScope.formSubmit(mForm);

            if (mForm.$valid && m.length > 0) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                var dataToSend = [];
                angular.forEach(m, function (u) {
                    dataToSend.push(u.id);
                });

                baseFactory.post('/api/users/unsubscribeUsers', dataToSend).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $modalInstance.close();
                    }
                    $scope.submitTxt = "Unsubscribe";
                    $scope.disableSubmitButton = false;
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };
    }
})();
homeModule.controller('UserUnsubscribedCtrl',
['$scope', '$rootScope', 'baseFactory', 'modalFactory', 'toaster', '$state', '$modal', 'GRID_CONSTANTS',
function ($scope, $rootScope, baseFactory, modalFactory, toaster, $state, $modal, GRID_CONSTANTS) {

    $scope.gridOptions = {
        itemType: 'UnsubscribeUsers',
        gridName: 'UnsubscribeUsers',
        fetchUrl: '/api/users/SearchAllUsers',
        exportUrl: '/exportGrid/getUsers/',
        initSortString: 'firstName asc',
        enableSorting: true,
        enableSearching: true,
        enablePaging: true,
        enableExport: true,
        columnDefs: [
            { field: 'username', displayName: 'Username', customSortField: 'username' },
            { field: 'firstName', displayName: 'First Name', customSortField: 'firstName' },
            { field: 'surname', displayName: 'Surname', customSortField: 'surname' },
            { field: 'customerId', displayName: 'Customer Id', customSortField: 'customerId' },
            { field: 'customerName', displayName: 'Customer Name', customSortField: 'customerName' }
        ],
        controlCellTemplateHtml: controlHtml(),
        extraParams: {
            unsubs: true
        },
    };

    function controlHtml() {
        return '<div permission permissions="system.users.edit" class="controls">' +
            '<div class="btn-group btn-group-sm" dropdown>' +
            '<a ng-click="deleteEntity(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
            '</div>' +
            '</div>';
    }

    $scope.deleteEntity = function (v) {
        modalFactory.openGenericModal('Are you sure you want to remove <strong>"' + v.username + '"</strong> from the Unsubscribe List?', "Remove").result.then(function (result) {
            if (result) {
                baseFactory.put('/api/users/subscribe/' + v.id, {}).then(
                    function (data) { //onsuccess
                        if (!data.isErrored) {
                            //refresh list
                            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                        }
                    }
                );
            }
        });
    };
    $scope.openManageUser = function () {
        var modalInstance = $modal.open({
            templateUrl: '/app/modules/admin/user/unsubscribe/manageUnsubscribeModal.html',
            controller: 'ManageUnsubscribeModalCtrl',
            size: 'md',
            backdrop: 'static',
            windowClass: 'app-modal-window',
            resolve: {
            }
        });

        modalInstance.result.then(function (isReloadPage) {
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        }, function (isReloadPage) {
        });
    };
}
]);
(function () {
    homeModule.controller('addOrEditUser', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', '$state', 'permissionFactory', 'baseFactory', 'sharedFactory', '$modal', 'USER_TYPES', 'GRID_CONSTANTS', 'gridName', 'model', 'user', 'isNew', 'STATES'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, $state, permissionFactory, baseFactory, sharedFactory, $modal, USER_TYPES, GRID_CONSTANTS, gridName, model, user, isNew, STATES) {

        $scope.isNew = isNew;
        $scope.mode = isNew ? "Create" : "Edit";
        $scope.isUsernameDisabled = !isNew;
        $scope.submitTxt = "Save";
        $scope.generateUserTxt = "Generate Contact";
        $scope.manageUserTitle = "";
        $scope.states = STATES;
        $scope.roles = [];
        $scope.isCompany = permissionFactory.isCompany() || $rootScope.user.isSysAdmin;

        $scope.userTypes = USER_TYPES;
        $scope.manageUserTitle = isNew ? "Create User" : "Edit User";

        if (user) {
            if (user.customerId != null) {
                $scope.selectedCustomer = user.customerId;
                $scope.selectedCustomerName = user.name;
            } else {
                $scope.selectedCustomer = {};
            }

            $scope.m = angular.copy(user);
        } else {
            $scope.m = {
                address: null,
                userType: null,
                roles: []
            };
        }

        if (!isNew && ($scope.m.username == null || $scope.m.username.length < 1)) {
            $scope.isUsernameDisabled = false;
        }

        $scope.showCompanySelection = function () {
            return $rootScope.user.customerId === undefined || $rootScope.user.customerId == "";
        };
        $scope.openManageRoles = function (size, u) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/user/manageUserRolesModal/manageRole.html',
                controller: 'ManageUserRolesModalCtrl',
                size: size,
                backdrop: 'static',
                resolve: {
                    roles: ['$route', 'resolveFactory', function ($route, resolveFactory) {
                        return resolveFactory.getEntity('/api/roles/GetAll');
                    }],
                    userRoles: function () {
                        return angular.copy(u.roles);
                    },
                    customerId: function () {
                        return u.customerId;
                    }
                }
            });

            modalInstance.result.then(function (selectedItems) {
                $scope.m.roles = selectedItems;
            }, function () {

            });
        };
        $scope.getCustomer = function (val) {
            return sharedFactory.searchCustomer(val).then(function (data) {
                return data;
            });
        };
        $scope.generateUser = function (userId) {
            $scope.generateUserTxt = "Generating...";
            $scope.disableSubmitButton = true;
            baseFactory.put('/api/users/generateContact/' + userId).then(function (rrdata) {
                $scope.generateUserTxt = "Generate Contact";
                $scope.disableSubmitButton = false;
            });
        };

        $scope.onSelect = function ($item, $model, $label) {
            $scope.m.customerId = $item.customerId;
            $scope.m.customerName = $item.name;
        };

        function isValid() {
            return true;
        }

        $scope.saveUser = function (mForm, m) {
            $rootScope.formSubmit(mForm);

            if (mForm.$valid) {

                if (m.customerId == "") {
                    m.customerName = "";
                }

                if (isNew && !$scope.showCompanySelection()) {
                    m.customerId = $rootScope.user.customerId;
                    m.customerName = $rootScope.user.customerName;
                }

                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Saving";
                $scope.submitted = true;
                $scope.loading = true;

                m.password = null;

                var dataToSend = angular.copy(m);
                dataToSend.roles = [];

                if (dataToSend.userType === 6) {
                    for (var i = 0; i < $scope.mRoles.length; i++) {
                        if ($scope.mRoles[i].name === "Deliveries")
                            dataToSend.roles.push({ id: $scope.mRoles[i].id });
                    }
                } else {
                    for (var i = 0; i < $scope.mRoles.length; i++) {
                        if ($scope.mRoles[i].isSelected)
                            dataToSend.roles.push({ id: $scope.mRoles[i].id });
                    }
                }

                dataToSend.visibleCustomers = null;
                if (dataToSend.customerArr.length > 0)
                    dataToSend.visibleCustomers = dataToSend.customerArr.join();

                delete dataToSend.customerArr;

                // console.log(dataToSend);
                baseFactory.post("/api/users/save/", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                        $modalInstance.close();
                    } else {
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                        $scope.submitted = false;
                        $scope.loading = false;
                    }
                });
            }

        };
        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        //
        $scope.onSelectPlace = function ($geo) {
            $scope.m.address = $geo.loc;
            $scope.m.latitude = $geo.lat;
            $scope.m.longitude = $geo.lng;
            $scope.m.state = $geo.state;
            $scope.m.city = $geo.city;
            $scope.m.country = $geo.country;
            $scope.m.postcode = $geo.postcode;

            $scope.$apply();
        };

        // FILE
        var scopeName = 'm';
        $scope.fileModel = {
            fileName: "",
            fileFolder: ""
        };
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["jpeg", "jpg", "png"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        $scope.resetInputFile();
                        // temporary folder
                        $scope.fileModel = data.object;
                        $scope[scopeName].file = $scope.fileModel;
                        $scope[scopeName].isUploaded = true;
                        $scope[scopeName].isNew = true;
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };
        $scope.changeFile = function () {
            $scope[scopeName].isUploaded = false;
            $scope[scopeName].file = {
                fileName: "",
                fileFolder: ""
            };
            $scope[scopeName].photoThumbnailUrl = "";
            $scope[scopeName].isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file') {
                    elems[i].value = null;
                }
            }
        };

        // ROLES
        $scope.setAllRoles = function () {
            $scope.isAllSelected = !$scope.isAllSelected;
            for (var i = 0; i < $scope.mRoles.length; i++) {
                if ($scope.mRoles[i].userType === $scope.m.userType)
                    $scope.mRoles[i].isSelected = $scope.isAllSelected;
            }
        };
        $scope.mRoles = [];
        var roleIds = [];
        //
        if (typeof $scope.m.visibleCustomers === 'undefined')
            $scope.m.visibleCustomers = '';
        //
        if (typeof $scope.m.roles === 'undefined' || $scope.m.roles.length == 0)
            $scope.m.roles = [];
        //
        for (var j = 0; j < $scope.m.roles.length; j++) {
            roleIds.push($scope.m.roles[j].id);
        }
        baseFactory.fetch($state.current.name === "base.users" ? '/api/roles/GetAll' : '/api/roles/clients').then(function (rrdata) {
            var roles = angular.copy(rrdata.object);
            for (var i = 0; i < roles.length; i++) {
                $scope.mRoles.push({
                    id: roles[i].id,
                    name: roles[i].name,
                    userType: roles[i].userType,
                    isSelected: roleIds.indexOf(roles[i].id) >= 0
                });
            }
        });
        $scope.hasCompanyAdmin = function () {
            var isExist = false;
            for (var i = 0; i < $scope.m.roles.length; i++) {
                if ($scope.m.roles[i].name.toLowerCase() === "company admin") {
                    isExist = true;
                    break;
                }
            }
            return isExist;
        };

        // CUSTOMERS
        $scope.m.tmpCustomer = null;
        $scope.m.customerArr = $scope.m.visibleCustomers === null ? [] : $scope.m.visibleCustomers.split(',');
        $scope.getCustomer = function (val) {
            return sharedFactory.searchCustomer(val, false, false).then(function (data) {
                return data;
            });
        };
        $scope.onCustomerSelect = function ($item, $model, $label) {
            if ($scope.m.customerArr.indexOf($item.customerId) < 0) {
                $scope.m.customerArr.push($item.customerId);
            }
            $timeout(function () {
                $scope.m.tmpCustomer = null;
            }, 10);
        };
        $scope.deleteCustomer = function (indx) {
            if (indx >= 0)
                $scope.m.customerArr.splice(indx, 1);
        };

        if ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN") {
            if (!$rootScope.user.isSysAdmin) {
                $scope.userTypes = [];
                if (isNew) {
                    $scope.userTypes = [{ id: 3, name: "Client" }];
                    $scope.m.userType = 3;
                }
            }
        }
    }
})();
(function () {
    'use strict';
    homeModule.controller('ImportUserCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', '$controller', 'baseFactory'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, $controller, baseFactory) {

        // DECLARATIONS
        $scope.doc = {

        };
        $scope.submitTxt = "Import";

        $scope.disableSubmitButton = false;

        // PRIVATE

        // PUBLIC
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["xls", "xlsx"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {

                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Import";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };
        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };
        $scope.save = function (mForm, m) {
            $scope.resultData = null;
            $scope.downloadResponseUrl = null;
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Importing...";
                $scope.disableSubmitButton = true;
                $scope.isUploaded = false;
                baseFactory.post("/api/upload/excelUsers", m).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.isUploaded = true;
                        $scope.resultData = rdata.object.result;
                        $scope.downloadResponseUrl = rdata.object.response;

                        // RESET
                        $scope.doc = {
                            importTypeId: null,
                            file: {
                                fileFolder: "",
                                fileName: ""
                            },
                            param: {}
                        };
                    }
                    $scope.submitTxt = "Import";
                    $scope.disableSubmitButton = false;
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(null);
        };

        // INIT
        $scope.importFile = {};
    }
})();
artworkApprovalModule.controller('artworkApprovalController',
['$scope', 'baseFactory', 'messages', 'lastmessages', '$stateParams', 'promptFactory', '$timeout', '$state', 'currentUser', 'toaster', '$location', 'isMain', 'orderStatuses', '$rootScope', '$modal', 'categories',
function ($scope, baseFactory, messages, lastmessages, $stateParams, promptFactory, $timeout, $state, currentUser, toaster, $location, isMain, orderStatuses, $rootScope, $modal, categories) {

    $scope.categories = categories;

    $scope.submitTxt = "Send";

    $scope.isOwner = false;

    try {
        $scope.messageId = typeof $stateParams.id === 'undefined' ? 0 : $stateParams.id;
    } catch (er) {
        $scope.messageId = 0;
    }

    $scope.order = messages.order;

    $scope.pageTitle = "Artwork Approval";

    $scope.lastmessages = lastmessages;
    $scope.messages = messages.conversation;

    // Init  
    //if (isMain && $state.current.name == 'catalog.artwork') {
    //    // console.log($scope.lastmessages);
    //    if ($scope.lastmessages.length > 0)
    //        $state.transitionTo('catalog.artwork.edit', { id: $scope.lastmessages[0].id }, { reload: true });
    //}


    $scope.setActive = function (id) {
        if ($stateParams.id == id) {
            return true;
        }
        else {
            return false;
        }
    }

    $scope.deleteConversation = function (cvs) {
        promptFactory.confirm("Are you sure you want to delete this message?", function (result) {
            if (result) {
                baseFactory.fetch("/api/message/delete/" + cvs.id, {}).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $timeout(function () {
                            $state.transitionTo("messages", null, { 'reload': true });
                        }, 100);
                    }
                });
            }
        });
    };

    $scope.messageChange = function (msg) {
        $scope.message = msg;
        if (msg == null || msg == "") {
            $scope.disableButton = true;
        } else {
            $scope.disableButton = false;
        }
    };

    

    
    $scope.getStatusColour = function (colourCode) {
        return {'background-color' : colourCode, 'color' : 'white' };
    };

    $scope.openArtworkDetail = function(message) {
        var modalInstance = $modal.open({
            templateUrl: '/app/modules/artworkApproval/artworkApprovalDetailModal/artworkApprovalDetail.html',
            controller: 'artworkApprovalDetailCtrl',
            size: 'md',
            backdrop: 'static',
            windowClass: 'app-modal-window',
            resolve: {
                messages: function() {
                    return baseFactory.fetch('/api/message/GetAllMessages', { messageId: message.id, page: 1, count: 20 }).then(function(rrdata) {
                        return rrdata.object == null ? [] : rrdata.object;
                    });
                },
                messageDetail: function() {
                    return message;
                },
                currentUser: function() {
                    return currentUser;
                },
                orderStatuses: function(resolveFactory) {
                    return resolveFactory.getGridEntity('/api/orderstatus/getall');
                },
                order: function() {
                    return null;
                }
            }
        });
    };

    //Note: Do not change gridname!
    $scope.gridOptions = {
        itemType: 'Artwork Approval',
        gridName: 'artworkApproval',
        fetchUrl: '/api/message/GetAllLastMessages',
        initSortString: 'datecreated desc',
        enableSorting: true,
        enableSearching: true,
        enablePaging: true,
        enableDateRange: true,
        columnDefs: [],
        controlCellTemplateHtml: controlHtml(),
        controlColumnWidth: '100%',
        rowHeight: 1,
        headerRowHeight: 1
    };

    function controlHtml() {
        var html = '<div ng-include src="\'/app/modules/artworkApproval/artworkApprovalGridTemplate.html\'"></div>';
        return html;
    }

}
]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.artworkapproval', {
                url: "/artworkapprovalold/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/artworkApproval/artworkApproval.html",
                        controller: 'artworkApprovalController',
                        resolve: {
                            messageId: ['$stateParams', function ($stateParams) {
                                return $stateParams.id;
                            }],
                            messages: function () {
                                return [];
                            },
                            mentionedUsers: function () {
                                return [];
                            },
                            lastmessages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllLastMessages').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            currentUser: function (baseFactory) {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            isMain: function () {
                                return true;
                            },
                            orderStatuses: function () {
                                return [];
                            },
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Artwork Approval'
                }
            })
            .state('base.artworkapproval.new', {
                url: "new",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/messages/message.html",
                        controller: 'artworkApprovalController',
                        resolve: {
                            messageId: ['$stateParams', function ($stateParams) {
                                return $stateParams.id;
                            }],
                            messages: function () {
                                return [];
                            },
                            mentionedUsers: function () {
                                return [];
                            },
                            lastmessages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllLastMessages').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            currentUser: function (baseFactory) {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            isMain: function () {
                                return true;
                            },
                            orderStatuses: function () {
                                return [];
                            },
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Create Artwork Approval'
                }
            })
            .state('base.artworkapproval.edit', {
                url: "/:id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/artworkApproval/artworkApproval.html",
                        controller: 'artworkApprovalController',
                        resolve: {
                            messageId: ['$stateParams', function ($stateParams) {
                                return $stateParams.id;
                            }],
                            messages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllMessages', { messageId: $stateParams.id, page: 1, count: 20 }).then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            mentionedUsers: function ($rootScope, $stateParams, baseFactory) {
                                //return baseFactory.fetch('/api/messages/getAllMentioned/' + $stateParams.id).then(function (rrdata) {
                                //    return rrdata.object == null ? [] : rrdata.object;
                                //});
                                return [];
                            },
                            lastmessages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllLastMessages').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            currentUser: function (baseFactory) {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            isMain: function () {
                                return false;
                            },
                            orderStatuses: function (resolveFactory) {
                                return resolveFactory.getGridEntity('/api/orderstatus/getall');
                            },
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Edit Artwork Approval'
                }
            });
    }
]);

artworkApprovalModule.controller('artworkApprovalDetailCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'toaster', '$timeout', '$modal', 'currentUser', 'order', 'orderStatuses', 'messages', 'messageDetail',
        function ($scope, $rootScope, $modalInstance, baseFactory, toaster, $timeout, $modal, currentUser, order, orderStatuses, messages, messageDetail) {

            $scope.order = order;
            $scope.messages = messages.conversation;
            $scope.artWorkMessages = [];

            angular.forEach($scope.messages, function (message) {
                if (message.documentId && message.fileLink)
                    $scope.artWorkMessages.push(message);
            });

            $scope.orderItem = messages.orderItem;
            $scope.orderItemId = messages.orderItem == null ? null : messages.orderItem.id;
            $scope.orderStatus = messages.orderStatus;
            $scope.primaryChanged = primaryChanged;
            $scope.messageDetail = messageDetail == null ? { id: messages.messageId } : messageDetail;
            var isReload = false;
            $scope.cancel = function () {
                $modalInstance.close(isReload);
            };

            $scope.messageChange = function (msg) {
                $scope.message = msg;
                if (msg == null || msg == "") {
                    $scope.disableButton = true;
                } else {
                    $scope.disableButton = false;
                }
            };
            var sendMessage = function (dataToSend, msgLen, callback) {
                baseFactory.post('/api/message/save', dataToSend).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        $scope.messageId = rrdata.object;
                        $scope.message = "";
                        angular.element("[txtmessagebox]").val("");

                        if (typeof callback !== 'undefined')
                            callback();
                    }
                    $scope.disableButton = true;
                    $scope.sendButton = "Send";
                    $scope.tempMentionedUsers = [];
                });
            };
            $scope.addMessage = function () {

                if (!$scope.doc.isUploaded && ($scope.message == null || $scope.message == "")) {
                    toaster.pop("error", "", "Please type the topic message", 1000);
                    return false;
                }

                var msgLen = $scope.messages.length;

                var params = {
                    id: $scope.messageDetail.id
                };

                var data = "";

                baseFactory.fetch('/api/message/GetMessageUsers', params).then(function (rdata) {
                    // console.log(rdata.object);
                    angular.forEach(rdata.object, function (value, index) {
                        if (value.userId != currentUser.id) {
                            $scope.toId = value.userId;
                        }
                    });
                    data = {
                        messageItem: {
                            orderItemId: $scope.orderItemId,
                            orderId: angular.copy(order.id),
                            sortOrder: msgLen,
                            fromId: currentUser.id,
                            fromName: currentUser.firstName,
                            message: '',
                            date: moment()
                        },
                        messageId: $scope.messageDetail.id,
                        toId: $scope.toId
                    };

                    // Replace all line breaks
                    var msg = !$scope.message ? '' : $scope.message.replace(/\n/g, "<br/>");

                    // Get all mentioned

                    // Get all mentioned users on the message
                    var arrWord = msg.split(" ");
                    var eUsr = [];

                    angular.forEach($scope.mentionedUsers, function (u) {
                        eUsr.push(u.mentionId);
                    });


                    if ($scope.isOwner) {
                        angular.forEach(arrWord, function (w, i) {
                            if (w.indexOf('@') == 0) {
                                var word = w.replace('@', '');
                                // Mention User
                                angular.forEach($scope.tempMentionedUsers, function (tbm) {
                                    if (tbm.mentio == word) {
                                        // Add to mentions
                                        if (eUsr.indexOf(tbm.mentionId) < 0) {
                                            var tmp = {
                                                mentionId: tbm.mentionId,
                                                mentionName: tbm.fname,
                                                mentionType: 'user',
                                                photoThumbnailUrl: tbm.photoThumbnailUrl,
                                                sortOrder: $scope.mentionedUsers.length
                                            };
                                            $scope.mentionedUsers.push(tmp);
                                            eUsr.push(tmp.mentionId);
                                        }
                                    } else if (tbm.groupName == word) {
                                        // Add to mentions
                                        if (eUsr.indexOf(tbm.mentionId) < 0) {
                                            var tmp2 = {
                                                mentionId: tbm.mentionId,
                                                mentionName: tbm.fname,
                                                mentionType: 'user',
                                                photoThumbnailUrl: tbm.photoThumbnailUrl,
                                                sortOrder: $scope.mentionedUsers.length
                                            };
                                            $scope.mentionedUsers.push(tmp2);
                                            eUsr.push(tmp2.mentionId);
                                        }
                                    }
                                });
                                // format
                                arrWord[i] = '<span>' + w + '</span>';
                            }
                        });
                    }
                    data.messageItem.message = arrWord.join(" ");

                    $scope.disableButton = true;
                    $scope.sendButton = "Sending...";

                    // Save file to Documents
                    if ($scope.doc.isUploaded) {
                        $scope.saveDoc(data, msgLen);
                    } else {
                        // sendMessage
                        sendMessage(data, msgLen, function () {
                            refresh();
                            //$scope.messages.push({
                            //    sortOrder: msgLen,
                            //    fromId: currentUser.id,
                            //    fromName: currentUser.firstName,
                            //    photoThumbnailUrl: '',
                            //    message: data.messageItem.message,
                            //    date: moment().format()
                            //});
                        });
                    }

                });

            };
            var refresh = function () {
                baseFactory.fetch('/api/message/getAllMessagesByOrder', { orderId: order.id, page: 1, count: 20 }).then(function (rrrdata) {
                    messages = rrrdata.object || null;
                    if (messages != null) {
                        $scope.messages = messages.conversation;
                        $scope.artWorkMessages = [];

                        angular.forEach($scope.messages, function (message) {
                            if (message.documentId && message.fileLink) {
                                $scope.artWorkMessages.push(message);
                            }
                        });
                    }
                });
            };

            // Attach File
            $scope.fileModel = {
                FileName: "",
                FileFolder: ""
            };
            var isDocument = true;
            var isMedia = true;
            $scope.doc = {
                id: 0,
                fileFolder: null,
                fileName: null,
                messageId: null,
                isUploaded: false,
                permissions: [],
                orderId: order.id
            };
            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = [];
                var result = false;

                if (isDocument || isMedia) {
                    fType = ['doc', 'docx', 'eps', 'psd', 'ai', 'pdf', 'jpg', 'jpeg', 'gif', 'png', 'zip', 'rar', 'xls', 'xlsx'];
                    result = fType.indexOf(ext) >= 0;

                    if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 7) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 8 && fType.indexOf(ext) <= 10) {
                        $scope.doc.docTypeId = 2;
                    }
                }

                if (!result)
                    $scope.errorMessage = "The file " + filename + " is not valid.";

                if (result) {
                    if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                        $scope.doc.name = filename;
                    }
                }

                $timeout(function () {
                    $scope.errorMessage = null;
                }, 2500);

                return result;
            };

            $scope.isFileUploading = false;
            $scope.onFileSelectOld = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.isFileUploading = true;
                    $scope.progress = 0;

                    baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) { })
                        .success(function (data, status, headers, config) {
                            if (!data.isErrored) {
                                // temporary folder
                                $scope.fileModel = data.object;
                                $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                                $scope.doc.fileName = $scope.fileModel.fileName;
                                $scope.doc.isUploaded = true;
                                $scope.doc.isNew = true;
                                $scope.doc.messageId = parseInt($scope.messageDetail.id);

                                // Save
                                baseFactory.post("/api/documents/save", $scope.doc).then(function (rrdata) {
                                    if (!rrdata.isErrored) {
                                        var msgLen = $scope.messages.length;
                                        var docData = {
                                            messageItem: {
                                                sortOrder: msgLen,
                                                fromId: currentUser.id,
                                                fromName: currentUser.firstName,
                                                message: 'Attached file',
                                                documentId: rrdata.object.id,
                                                documentName: rrdata.object.fileName,
                                                fileLink: rrdata.object.link,
                                                date: moment.utc(),
                                                isPrimaryArtwork: false
                                            },
                                            mentions: $scope.mentionedUsers,
                                            messageId: $scope.doc.messageId
                                        };

                                        var primaryArtworkSet = false;

                                        angular.forEach($scope.messages, function (message) {
                                            if (message.documentId > 0 && message.isPrimaryArtwork) {
                                                primaryArtworkSet = true;
                                            }
                                        });

                                        if (!primaryArtworkSet) {
                                            docData.messageItem.isPrimaryArtwork = true;
                                        }

                                        baseFactory.post('/api/message/save', docData).then(function (rrrdata) {
                                            $scope.isFileUploading = false;
                                            if (!rrrdata.isErrored) {
                                                $scope.messages.push(docData.messageItem);
                                                if (docData.messageItem.documentId) {
                                                    $scope.artWorkMessages.push(docData.messageItem);
                                                }
                                            }
                                        });
                                    }
                                });
                            } else {
                                $scope.isFileUploading = false;
                            }
                        });
                }
            };
            $scope.onFileSelect = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.isFileUploading = true;
                    $scope.progress = 0;

                    baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) { })
                        .success(function (data) {
                            $scope.isFileUploading = false;
                            if (!data.isErrored) {
                                // temporary folder
                                $scope.fileModel = data.object;
                                $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                                $scope.doc.fileName = $scope.fileModel.fileName;
                                $scope.doc.isUploaded = true;
                                $scope.doc.isNew = true;
                                $scope.doc.messageId = parseInt($scope.messageDetail.id);
                            }
                        });

                    $scope.disableButton = false;

                }
            };
            $scope.onFileSelectAndSend = function ($files) {
                if (isFileValid($files[0].name)) {
                    $scope.isFileUploading = true;
                    $scope.progress = 0;

                    baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) { })
                        .success(function (data, status, headers, config) {
                            $scope.isFileUploading = false;

                            if (!data.isErrored) {
                                // temporary folder
                                $scope.fileModel = data.object;
                                $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                                $scope.doc.fileName = $scope.fileModel.fileName;
                                $scope.doc.isUploaded = true;
                                $scope.doc.isNew = true;
                                $scope.doc.messageId = parseInt($scope.messageDetail.id);
                                $scope.addMessage();
                            }
                        });

                    $scope.disableButton = false;

                }
            };
            $scope.cancelAttachedFile = function (doc) {
                doc.fileFolder = null;
                doc.fileName = null;
                doc.isUploaded = false;
                doc.messageId = null;
                $scope.disableButton = true;
            };
            $scope.saveDoc = function (data, msgLen) {
                baseFactory.post("/api/documents/save", $scope.doc).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        var docData = {
                            messageItem: {
                                sortOrder: msgLen,
                                fromId: currentUser.id,
                                fromName: currentUser.firstName,
                                orderItemId: $scope.orderItemId,
                                orderId: angular.copy(order.id),
                                message: data.messageItem.message || 'Attached file',
                                documentId: rrdata.object.id,
                                documentName: rrdata.object.fileName,
                                fileLink: rrdata.object.link,
                                date: moment().format(),
                                isPrimaryArtwork: false,
                                isArtworkApproved: null,
                                isArtwordApprovalSent: false,
                                artworkStatus: "Not Sent"
                            },
                            mentions: $scope.mentionedUsers,
                            messageId: $scope.doc.messageId
                        };

                        var primaryArtworkSet = false;

                        angular.forEach($scope.messages, function (message) {
                            if (message.documentId > 0 && message.isPrimaryArtwork) {
                                primaryArtworkSet = true;
                            }
                        });

                        if (!primaryArtworkSet) {
                            docData.messageItem.isPrimaryArtwork = true;
                        }
                        sendMessage(docData, msgLen, function () {
                            refresh();
                            //$scope.messages.push(docData.messageItem);
                            //if (docData.messageItem.documentId) {
                            //    $scope.artWorkMessages.push(docData.messageItem);
                            //}
                            $scope.cancelAttachedFile($scope.doc);
                        });
                        isReload = true;
                    }
                });
            };

            $scope.openOrderDetail = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/artworkApproval/orderStatusModal/orderStatus.html',
                    controller: 'artworkOrderStatusController',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        order: function () {
                            return {
                                id: angular.copy(order.id),
                                orderNumber: order.orderNumber,
                                purchaseOrderNumber: order.purchaseOrderNumber,
                                status: $scope.orderStatus
                            };
                        },
                        orderStatuses: function () {
                            return orderStatuses.object;
                        }
                    }
                });

                modalInstance.result.then(function (isReloadPage) {
                    isReload = isReloadPage;
                }, function (isReloadPage) {
                    isReload = isReloadPage;
                });
            };

            function primaryChanged(currentMessage) {
                var needToSetADefault = !currentMessage.isPrimaryArtwork;
                var attachments = [];

                angular.forEach($scope.messages, function (msg, index) {
                    if (msg !== currentMessage) {
                        msg.isPrimaryArtwork = false;
                    }

                    if (msg.documentId) {
                        attachments.push(msg);
                    }
                });

                if (needToSetADefault) {
                    angular.forEach(attachments, function (attachment, index) {
                        if (index === (attachments.length - 1)) {
                            attachment.isPrimaryArtwork = true;
                        }
                    });
                }

                isReload = true;
                baseFactory.post('/api/message/SetPrimaryArtwork', { messageId: $scope.messageDetail.id, mentions: $scope.messages });
            }

            $scope.getFileExtension = function (path) {
                var basename = path.split(/[\\/]/).pop(),
                    pos = basename.lastIndexOf(".");
                if (basename === "" || pos < 1)
                    return "";
                return basename.slice(pos + 1);
            };

            $scope.setEmailNotification = function (isNotify) {
                //UpdateEmailNotification
                baseFactory.post('/api/ppiorder/updateEmailNotification', { id: $scope.order.id, isNotifications: isNotify }).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.order.isNotifications = isNotify;
                    }
                });
            };

            $scope.isSendingIndex = null;
            $scope.isRejectingIndex = null;
            $scope.sendArtworkApproval = function (msg, indx) {
                var dataToSend = {
                    documentId: msg.documentId,
                    orderId: msg.orderId,
                    messageId: $scope.messageDetail.id
                };
                $scope.isSendingIndex = indx;
                baseFactory.post('/api/message/sendPrimaryArtwork', dataToSend).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        refresh();
                    }
                    $scope.isSendingIndex = null;
                });
            };
            $scope.isDeleteingIndex = null;
            $scope.deleteArtwork = function (msg, indx) {
                var dataToSend = {
                    documentId: msg.documentId,
                    orderId: msg.orderId,
                    messageId: $scope.messageDetail.id
                };
                $scope.isDeleteingIndex = indx;
                baseFactory.post('/api/message/deleteArtwork', dataToSend).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        refresh();
                    }
                    $scope.isDeleteingIndex = null;
                });
            };
            $scope.rejectArtwork = function (msg, indx) {
                var dataToSend = {
                    documentId: msg.documentId,
                    orderId: msg.orderId,
                    messageId: $scope.messageDetail.id
                };
                $scope.isRejectingIndex = indx;
                baseFactory.post('/api/message/rejectArtwork', dataToSend).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        refresh();
                    }
                    $scope.isRejectingIndex = null;
                });
            };

            $scope.isShowLogs = false;
            $scope.openLogs = function () {
                $scope.isShowLogs = !$scope.isShowLogs;
            };
        }]);
artworkApprovalModule.controller('artworkApprovalViewCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'toaster', '$timeout', '$modal', 'order', 'documents',
        function ($scope, $rootScope, $modalInstance, baseFactory, toaster, $timeout, $modal, order, documents) {

            $scope.order = order;
            $scope.artWorkMessages = [];
            $scope.documents = documents;
            $scope.cancel = function () {
                $modalInstance.close();
            };
        }]);
artworkApprovalModule.controller('artworkOrderStatusController', ['$scope', '$rootScope', '$modalInstance', '$window', 'order', 'baseFactory', 'orderStatuses',
    function ($scope, $rootScope, $modalInstance, $window, order, baseFactory, orderStatuses) {

        $scope.order = order;

        $scope.orderStatuses = orderStatuses;

        angular.forEach($scope.orderStatuses, function (value, index) {
            if (value.name.indexOf(order.status) >= 0) {
                $scope.status = $scope.orderStatuses[index];
            }
        });


        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };

        $scope.save = function () {

            if ($scope.order.status == "Quote") {
                $scope.changeQuoteStatus = "/api/order/orderquote?orderId=" + order.id;
                baseFactory.fetch($scope.changeQuoteStatus).then(function (data) {
                    $modalInstance.close(true);
                });
            } else {
                $scope.changeOrderStatus = "/api/order/updateorderstatus?orderId=" + order.id + "&statusId=" + $scope.status.id + "&comment=" + $scope.statusComment;
                baseFactory.fetch($scope.changeOrderStatus).then(function (data) {
                    $modalInstance.close(true);
                });
            }
        };

    }]);
homeModule.config(
    ['$stateProvider',
        function ($stateProvider) {
            $stateProvider
                .state('artwork', {
                    url: "/artwork/:token",
                    noLoginRequired: true,
                    templateUrl: "/app/modules/artworkApproval/publicArtworkApproval/views/index.html",
                    // controller: 'artworkApprovalController',
                    resolve: {
                        order: ['$stateParams', 'baseFactory', function ($stateParams, baseFactory) {
                            return baseFactory.fetch('/api/publicArtwork/get/' + $stateParams.token).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }]
                    },
                    ncyBreadcrumb: {
                        label: 'Artwork Approval'
                    }
                });
        }
    ]);

(function () {
    'use strict';
    angular.module('ngCacheBuster', [])
      .config(['$httpProvider', function ($httpProvider) {
          return $httpProvider.interceptors.push('httpRequestInterceptorCacheBuster');
      }])
        .provider('httpRequestInterceptorCacheBuster', function () {

            this.matchlist = [/.*template.*/, /.*tpl.*/, /.*tmpl.*/, /.*hbs.*/];
            this.logRequests = false;

            //Default to whitelist (i.e. block all except matches)
            this.black = false;

            //Select blacklist or whitelist, default to whitelist
            this.setMatchlist = function (list, black) {
                this.black = typeof black != 'undefined' ? black : false;
                this.matchlist = list;
            };


            this.setLogRequests = function (logRequests) {
                this.logRequests = logRequests;
            };

            this.$get = ['$q', '$log', '$rootScope', function ($q, $log, $rootScope) {
                var matchlist = this.matchlist;
                var logRequests = this.logRequests;
                var black = this.black;
                if (logRequests) {
                    $log.log("Blacklist? ", black);
                }
                return {
                    'request': function (config) {

                        //Blacklist by default, match with whitelist
                        var busted = !black;

                        for (var i = 0; i < matchlist.length; i++) {
                            if (config.url && config.url.match(matchlist[i])) {
                                busted = black; break;
                            }
                        }

                        //Bust if the URL was on blacklist or not on whitelist
                        if (busted && $rootScope.buildNumber) {
                            //var d = new Date();
                            //Some url's allready have '?' attached
                            config.url += config.url.indexOf('?') === -1 ? '?' : '&';
                            //config.url += 'cacheBuster=' + d.getTime();
                            config.url += 'cb=' + $rootScope.buildNumber;
                        }

                        if (logRequests) {
                            var log = 'request.url =' + config.url;
                            busted ? $log.warn(log) : $log.info(log);
                        }

                        return config || $q.when(config);
                    }
                }
            }];
        });

})();
(function () {
    'use strict';
    calendarsModule.controller('CalendarCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$log', '$modal', '$timeout', '$window', 'baseFactory', 'sharedFactory', 'users', 'calendars', 'uiCalendarConfig', '$compile', 'categories'];
    function ctrl($scope, $rootScope, $log, $modal, $timeout, $window, baseFactory, sharedFactory, users, calendars, uiCalendarConfig, $compile, categories) {

        $scope.categories = categories;
        $scope.calendars = calendars.object;
        $scope.currentCalendar = 0;

        $scope.changeCalendar = function (selectedCalendar) {
            $scope.currentCalendar = selectedCalendar || 0;
            $scope.myCalendar.fullCalendar('refetchEvents');
        };

        $scope.eventsF = function (start, end, timezone, callback) {
            var s = moment(start).format('DD/MM/YYYY');
            var e = moment(end).format('DD/MM/YYYY');
            $scope.currentStartDate = s;
            $scope.currentEndDate = e;

            baseFactory.fetch('/api/calendar/getAllEvents', { start: s, end: e, calendarId: $scope.currentCalendar }).then(function (rrdata) {
                var obj = rrdata.object;
                angular.forEach(obj, function (v) {
                    v.titleName = angular.copy(v.title);
                    v.isAllDay = true;
                    v.className = 'event-type' + v.eventType;

                    if (v.order != null) {
                        var orderTypeTitle = v.order.orderType == 'CD'
                            ? 'Client Date'
                            : v.order.orderType == 'OD' ? 'Our Date' : v.order.orderType == 'E' ? 'Event' : "";

                        var orderType = orderTypeTitle == ""
                            ? ""
                            : '<span class="label label-primary" style="font-size:16px; position: absolute; top: 5px; right: 5px;" title="' + orderTypeTitle + '">' + v.order.orderType + '</span>';
                        var ul = '<div class="training-events" style="border-left: 4px solid ' +
                            v.order.statusColour +
                            '">' +
                            orderType +
                            '<div class="training-events-lt"><div class="main-event-info">' +
                            '<div><small>Job No.</small></div><p class="text-muted">' +
                            v.titleName +
                            '</p>';
                        if (v.order.purchaseOrderNumber != null)
                            ul += '<div><small>Purchase No.</small></div><p class="text-muted">' +
                                v.order.purchaseOrderNumber +
                                '</p>';
                        ul += '<div><small>Print Logo</small></div><p class="text-muted">' +
                            v.order.orderDescription +
                            '</p>';
                        ul += '<div><small>Item</small></div><p class="text-muted">' + v.order.itemName + '</p>';
                        ul += '<div><small>Quantity</small></div><p class="text-muted">' + v.order.quantity + '</p>';
                        // ul += '<p class="text-muted">' + v.order.description + '</p>';
                        ul += '</div></div></div>';
                        v.title = ul;
                        v.order.customerId = v.order.customerId == null ? "" : v.order.customerId;
                        v.order.customerName = v.order.customerName == null ? "" : v.order.customerName;
                    }
                });
                callback(angular.copy(obj));
            });

        };

        $scope.eventOnDrop = function (event, revertFunc, jsEvent, ui, view) {
            var dataToSend = angular.copy(event);
            dataToSend.title = dataToSend.titleName;
            console.log(dataToSend);

            baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                if (rrdata.isErrored) {
                    revertFunc();
                }
            });
        };

        $scope.eventOnResize = function (event, revertFunc, jsEvent, ui, view) {
            var dataToSend = angular.copy(event);
            dataToSend.title = dataToSend.titleName;
            console.log(dataToSend);

            baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                if (rrdata.isErrored) {
                    revertFunc();
                }
            });
        };

        $scope.selectOnClick = function (start, end, jsEvent, view) {
            console.log("Select on Click");

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/calendars/modals/calendarOrderModal.html',
                controller: 'CalendarOrderModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    order: function () {
                        var ms = $.fullCalendar.moment(start);
                        var me = $.fullCalendar.moment(end);
                        var isAllDay = !(ms.hasTime() && me.hasTime());

                        return {
                            id: 0,
                            title: '', // 'Default Title',
                            start: start,
                            end: isAllDay ? end.subtract(1, 'day') : end,
                            origStart: start,
                            origEnd: end,
                            allDay: !(ms.hasTime() && me.hasTime()),
                            view: view.name,
                            users: [],
                            reminders: [],
                            isPrivate: false,
                            className: '',
                            location: '',
                            comments: '',
                            calendarId: $scope.currentCalendar
                        };
                    },
                    orderStatuses: function () {
                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                            return rrdata.object;
                        });
                    },
                    isNew: function () {
                        return true;
                    },
                    event: function () {
                        return null;
                    },
                    isAllPrinters: function () {
                        if ($scope.currentCalendar == 0) {
                            return true;
                        } else {
                            return false;
                        }
                    },
                    printers: function () {
                        return calendars.object;
                    },
                    orderDetails: function () {
                        return true;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                $scope.myCalendar.fullCalendar('refetchEvents');
            }, function () {

            });

        };

        $scope.eventOnClick = function (event, jsEvent, view) {

            // console.log(view)

            var tempEvent = angular.copy(event);

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/calendars/modals/calendarOrderModal.html',
                controller: 'CalendarOrderModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    order: function () {
                        var ms = $.fullCalendar.moment(tempEvent.start);
                        var me = $.fullCalendar.moment(tempEvent.end);
                        var isAllDay = !(ms.hasTime() && me.hasTime());

                        if (event.end == null) {
                            tempEvent.end = event.end == null ? tempEvent.start : tempEvent.end;
                        }

                        var duration = moment.duration(tempEvent.end.diff(tempEvent.start));
                        var hours = duration.asHours();

                        if (hours == 0) {
                            tempEvent.end = event.end == null ? tempEvent.start : tempEvent.end;
                        } else {
                            tempEvent.end = isAllDay ? tempEvent.end.subtract(1, 'day').toDate() : tempEvent.end;
                        }
                        tempEvent.origStart = tempEvent.start;
                        tempEvent.origEnd = tempEvent.end;

                        return angular.copy(tempEvent);
                    },
                    orderStatuses: function () {
                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                            return rrdata.object;
                        });
                    },
                    isNew: function () {
                        return false;
                    },
                    event: function () {
                        return event;
                    },
                    isAllPrinters: function () {
                        if ($scope.currentCalendar == 0) {
                            return true;
                        }
                        else {
                            return false;
                        }
                    },
                    printers: function () {
                        return calendars.object;
                    },
                    orderDetails: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + tempEvent.orderId).then(function (rrdata) {
                            return rrdata.object;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                if (ddata) {
                    event.location = ddata.location;
                }

                if (ddata.isRemove) {
                    $scope.myCalendar.fullCalendar('removeEvents', ddata.id);
                } else {
                    $scope.myCalendar.fullCalendar('refetchEvents');
                }
            }, function () {
            });
        };

        $scope.events = [];

        $scope.uiConfig = {
            calendar: {
                firstDay: 1,
                height: 700,
                editable: true,
                header: {
                    left: 'month,agendaWeek',
                    center: 'title',
                    right: 'today prev,next'
                },
                selectable: true,
                select: $scope.selectOnClick,
                eventClick: $scope.eventOnClick,
                eventDrop: $scope.eventOnDrop,
                eventResize: $scope.eventOnResize,
                eventRender: function (event, element) {
                    //console.log(element)
                    jQuery(element).draggable();
                    //$(element).addTouch();
                }
            }
        };

        $scope.eventSources = [$scope.eventsF, $scope.events];

        $scope.allocateOrders = function () {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/calendars/modals/calendarAllocateOrderModal.html',
                controller: 'CalendarAllocateOrderCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    printers: function () {
                        return baseFactory.fetch('/api/calendar/list').then(function (rrdata) {
                            return rrdata;
                        });
                    },
                    orders: function () {
                        return baseFactory.fetch('/api/Calendar/SearchOrders').then(function (rrdata) {
                            return rrdata;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                // console.log(ddata)
                $scope.myCalendar.fullCalendar('refetchEvents');
            }, function () {
            });
        };

        $scope.printScheduleReport = function () {
            $modal.open({
                templateUrl: '/app/modules/calendars/modals/printScheduleReportModal.html',
                controller: 'PrintScheduleReportModalCtrl',
                size: 'sm',
                backdrop: 'static',
                resolve: {
                    calendars: function () {
                        return $scope.calendars;
                    }
                }
            });
        };

        // Filter
        $scope.orderNumber = null;

        $scope.getOrders = function (val) {
            return baseFactory.fetch('/api/calendar/GetAllEvents', { searchText: val, calendarId: 0 }).then(function (rdata) {
                return rdata.object || [];
            });
        };

        $scope.onSelect = function ($item, $model, $label) {
            var tempEvent = angular.copy($item);
            tempEvent.titleName = $item.title;
            tempEvent.start = $.fullCalendar.moment(tempEvent.start);
            tempEvent.end = $.fullCalendar.moment(tempEvent.end);
            $scope.eventOnClick(tempEvent);
        };
    }
})();
(function() {
    'use strict';
    calendarsModule.config(config);
    config.$inject = ['$stateProvider'];

    function config($stateProvider) {
        $stateProvider
            .state('base.printerschedule', {
                url: "/printerschedule",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/calendars/views/calendar.html",
                        controller: 'CalendarCtrl',
                        resolve: {
                            FullCalendarModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('OcFullCalendarCtrl');
                            }],
                            users: function($rootScope, $stateParams, baseFactory) {
                              
                            },
                            calendars: function(baseFactory) {
                                return baseFactory.fetch('/api/calendar/list').then(function (rrdata) {
                                    return rrdata;
                                });
                            },
                            events: function($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/calendar/getallevents').then(function (rrdata) {
                                    $rootScope.lookup.events = rrdata.object == null ? [] : rrdata.object;
                                    return $rootScope.lookup.events;
                                });
                            },
                            categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                                return baseFactory.fetch('/api/category/GetAll');
                            }],
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Printers'
                }
            });
    }
})();
(function () {
    'use strict';
    calendarsModule.controller('CalendarAllocateOrderCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'printers', 'orders', 'baseFactory'];
    function ctrl($scope, $rootScope, $modalInstance, printers, orders, baseFactory) {

        $scope.orders = angular.copy(orders.object);
        $scope.data = {};

        // console.log($scope.orders)

        $scope.open1 = function ($event, orderId) {
            $event.preventDefault();
            $event.stopPropagation();
            for (var k in $scope.data) {
                $scope.data[k].isOpen1 = false;
                $scope.data[k].isOpen2 = false;
            }
            $scope.data[orderId].isOpen1 = true;
        };
        $scope.open2 = function ($event, orderId) {
            $event.preventDefault();
            $event.stopPropagation();
            for (var k in $scope.data) {
                $scope.data[k].isOpen1 = false;
                $scope.data[k].isOpen2 = false;
            }
            $scope.data[orderId].isOpen2 = true;
        };

        $scope.orderTitle = "Allocate Orders";
        $scope.btnSubmit = "Save";
        $scope.btnCancel = "Cancel";

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        var init = function() {
            $scope.data = {};

            angular.forEach($scope.orders, function(value) {
                $scope.data[value.id] = {
                    isOpen1: false,
                    isOpen2: false
                };
            });
        };

        $scope.isEmpty = $scope.orders == null || $scope.orders.length === 0;
        $scope.printers = printers.object;

        $scope.ok = function (orderss) {
            var orderCtr = 0;
            var totalAllocatedOrders = 0;

            angular.forEach(orderss, function (order) {
                if (typeof order.printer != "undefined" && typeof order.dateSelected != "undefined") {
                    totalAllocatedOrders++;
                }
            });

            angular.forEach(orderss, function (order) {
                if (typeof order.printer != "undefined" && typeof order.dateSelected != "undefined") {
                    var dataToSend = {
                        calendarId: order.printer.id,
                        start: moment(order.dateSelected),
                        end: order.dateSelected2 ? moment(order.dateSelected2) : null,
                        title: order.orderNumber,
                        allDay: true,
                        eventType: 1,
                        orderId: order.id,
                        id: 0,
                        isPrivate: false
                    };
                    baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                        orderCtr++;
                        if (orderCtr == totalAllocatedOrders)
                            $modalInstance.close();
                    });
                }
            });
        };

        $scope.save = function (orderss) {
            var orderCtr = 0;
            var totalAllocatedOrders = 0;

            angular.forEach(orderss, function (order) {
                if (typeof order.printer != "undefined") {
                    totalAllocatedOrders++;
                }
            });

            angular.forEach(orderss, function (order) {
                if (typeof order.printer != "undefined") {
                    var dataToSend = {
                        calendarId: order.printer.id,
                        start: moment().format("YYYY-MM-DD"),
                        end: moment().format("YYYY-MM-DD"),
                        title: order.orderNumber,
                        allDay: true,
                        eventType: 1,
                        orderId: order.id,
                        id: 0,
                        isPrivate: false
                    };
                    baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                        orderCtr++;
                        if (orderCtr == totalAllocatedOrders)
                            $modalInstance.close();
                    });
                }
            });
        };

        // SEARCH
        $scope.isLoading = false;
        $scope.dd = {
            searchText: "",
            sort: "DeliveryDate desc"
        };
        $scope.sort = {            
            name: "DeliveryDate",
            direction: "desc",
            css: "fa-sort-desc"
        };
        $scope.updateSearch = function () {
            $scope.isLoading = true;
            baseFactory.fetch('/api/Calendar/SearchOrders', $scope.dd).then(function (rrdata) {
                if (!rrdata.isErrored) {
                    $scope.orders = angular.copy(rrdata.object);
                } else {
                    $scope.orders = [];
                }
                init();
                $scope.isLoading = false;
            });
        };
        $scope.sortTable = function (fld) {
            if (fld != $scope.sort.name) {
                $scope.sort = {
                    name: fld,
                    direction: "asc",
                    css: "fa-sort-asc"
                };
            } else if ($scope.sort.direction == 'asc') {
                $scope.sort.direction = 'desc';
                $scope.sort.css = 'fa-sort-desc';
            } else if ($scope.sort.direction == 'desc') {
                $scope.sort.direction = 'asc';
                $scope.sort.css = 'fa-sort-asc';
            }
            $scope.dd.sort = $scope.sort.name + ' ' + $scope.sort.direction;
            $scope.updateSearch();
        };
        
        // INIT
        init();
    }
})();
(function () {
    'use strict';

    calendarsModule.controller('CalendarOrderModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'order', 'isNew', '$document', '$timeout', '$modalInstance', 'baseFactory', 'sharedFactory',
        'event', 'isAllPrinters', 'printers', 'orderDetails', 'orderStatuses'];
    function ctrl($scope, $rootScope, order, isNew, $document, $timeout, $modalInstance, baseFactory, sharedFactory,
        event, isAllPrinters, printers, orderDetails, orderStatuses) {

        $scope.isNew = isNew;
        $scope.isAllPrinters = isAllPrinters;
        $scope.printers = printers;
        $scope.printer = "";
        $scope.orderStatuses = orderStatuses;

        if (isNew) {
            $scope.orderTitle = "Create Tasks";
            $scope.btnCancel = "Cancel";
        } else {
            $scope.orderDetail = angular.copy(orderDetails);
            $scope.orderDetail.location = order.location;

            if (!order.titleName)
                order.titleName = order.title;

            $scope.orderTitle = order.titleName;
            $scope.btnCancel = "Close";
            $scope.event = angular.copy(event);
        }

        $scope.openStockDueDate = function ($event) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.openStockDueDatePicker = true;
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        $scope.btnDelete = "Unallocate";
        $scope.order = angular.copy(order);
        $scope.order.stockAvailable = 'Yes';
        $scope.order.stockDueDate = null;

        // INIT
        angular.forEach(orderDetails.orderCustomFields, function (v) {
            if (v.customFieldName.toLocaleLowerCase() === "stock available") {
                $scope.order.stockAvailable = v.value || 'Yes';
            } else if (v.customFieldName.toLocaleLowerCase() === "stock due date") {
                $scope.order.stockDueDate = v.value || null;
            }
        });

        $scope.btnSubmit = "Save";

        $scope.getOrder = function (val) {
            return sharedFactory.searchOrder(val).then(function (data) {
                return data;
            });
        };

        $scope.onSelect = function ($item, $model, $label) {

        };

        function isValid() {
            return true;
        }

        var saveCustomFields = function (mForm, m, callback) {
            var tempCf = angular.copy(orderDetails.orderCustomFields || []);
            var orderCustomFields = [];
            var isUpdated = false;
            angular.forEach(tempCf, function (value, index) {
                var event = {
                    orderId: orderDetails.id,
                    id: value.id,
                    name: value.name || value.customFieldName,
                    typeId: value.typeId,
                    value: value.value,
                    customFieldTypeId: value.customFieldTypeId,
                    customFieldId: value.customFieldId,
                    customFieldName: value.name || value.customFieldName
                };

                if (event.name.toLocaleLowerCase() === "stock available") {
                    if (!isUpdated && event.value !== m.stockAvailable)
                        isUpdated = true;
                    event.value = m.stockAvailable;
                } else if (event.name.toLocaleLowerCase() === "stock due date") {
                    var stockAvailableDate = m.stockDueDate ? moment(m.stockDueDate).format('YYYY-MM-DD') : null;
                    if (!isUpdated && event.value !== stockAvailableDate)
                        isUpdated = true;
                    event.value = stockAvailableDate;
                }

                orderCustomFields.push(event);
            });
            //
            if (!isUpdated) {
                callback();
                return;
            }

            $scope.submitButtonTxt = "Saving...";
            $scope.disableSubmitButton = true;

            baseFactory.post('/api/ppiorder/saveCustomFields', orderCustomFields).then(function (rdata) {
                $scope.submitButtonTxt = "Save";
                $scope.disableSubmitButton = false;
                callback();
            });
        };
        // Save Printer
        var saveOrder = function (evnt, form, callback) {
            var dataEvent = angular.copy(evnt);
            dataEvent.title = typeof dataEvent.orderNumber !== "undefined" ? typeof dataEvent.orderNumber.orderNumber !== "undefined" ? dataEvent.orderNumber.orderNumber : dataEvent.titleName : dataEvent.titleName;

            if (typeof dataEvent.orderNumber !== "undefined")
                if (typeof dataEvent.orderNumber.orderNumber !== "undefined") {
                    dataEvent.orderId = evnt.orderNumber.id;
                    dataEvent.orderNumber = angular.copy(evnt.orderNumber.orderNumber);
                }

            // check if allDay
            dataEvent.start = moment(dataEvent.start).set('hour', 0).set('minute', 0);
            dataEvent.end = moment(dataEvent.end).add(1, 'day').set('hour', 0).set('minute', 0);

            var dataToSend = angular.copy(dataEvent);

            // Save Event
            $scope.btnDisabled = true;
            $scope.btnSubmit = 'Saving...';
            baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                if (!rrdata.isErrored && rrdata.object !== 0) {
                    dataEvent.id = rrdata.object;
                    dataEvent.isRemove = false;
                    dataEvent.className = 'event-type' + dataToSend.eventType;
                    callback(dataToSend);
                } else {
                    $scope.btnDisabled = false;
                    $scope.btnSubmit = 'Save';
                    callback(null);
                }
            });
        };

        $scope.ok = function (m, form) {
            $scope.submitted = true;
            if (!form.$valid || !isValid()) {
                return;
            }
            if (isAllPrinters) {
                m.calendarId = $scope.order.printer;
            }

            $scope.loading = true;

            saveOrder(m, form, function (dataToSend) {
                saveCustomFields(form, m, function () {
                    if (dataToSend !== null)
                        $modalInstance.close(dataToSend);
                });
            });
        };
        $scope.save = function (od, m, form) {
            saveOrder(od, form, function () {
                saveCustomFields(form, od, function () {
                    $scope.submitted = true;

                    baseFactory.post('/api/calendar/updateLocation/' + $scope.event.id + '?location=' + encodeURIComponent(m.location || ''));

                    var changeOrderStatus = "/api/order/updateorderstatus?orderId=" + m.id + "&statusId=" + m.statusId + "&comment=" + m.statusComments;
                    baseFactory.fetch(changeOrderStatus).then(function () {
                        $modalInstance.close(m);
                    });
                });
            });
        };

        $scope.delete = function (evnt) {
            var evt = angular.copy(evnt);

            $scope.btnDisabled = true;
            $scope.btnDelete = "Unallocating...";

            // Delete Event
            baseFactory.post('/api/calendar/deleteEvent/' + evt.id).then(function (rrdata) {
                if (!rrdata.isErrored) {
                    evt.isRemove = true;
                    $modalInstance.close(evt);
                } else {
                    $scope.btnDisabled = false;
                    $scope.btnDelete = "Unallocate";
                }
            });
        };


        // DATE
        $scope.formatEventDateToStr = function (str, format) {
            format = typeof format === 'undefined' ? 'DD/MM/YYYY' : format;
            return moment(str).format(format);
        };
        $scope.openDateRange = false;
        $scope.openCustomDateRange = true;
        $scope.openDateRangeDropdown = false;
        var isDrdCliked = false;
        $document.bind('click', function () {
            if (!isDrdCliked) {
                $timeout(function () {
                    if ($scope.openDateRangeDropdown)
                        $scope.openDateRangeDropdown = false;
                }, 50);
            }
        });
        $scope.clickDateRangeDropdown = function () {
            isDrdCliked = true;
            $scope.openDateRange = false;
            $scope.openDateRangeDropdown = !$scope.openDateRangeDropdown;
            $timeout(function () {
                isDrdCliked = false;
            }, 100);
        };
        $scope.done = function () {
            $scope.openCustomDateRange = false;
            $scope.openDateRange = false;
        };

    }
})();
(function () {
    'use strict';
    calendarsModule.controller('PrintScheduleReportModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', '$filter', 'calendars'];
    function ctrl($scope, $modalInstance, $filter, calendars) {

        $scope.isAllCalendars = true;
        $scope.calendars = [];
        angular.forEach(calendars, function (cal) {
            $scope.calendars.push({
                id: cal.id,
                name: cal.name,
                isEnabled: true
            });
        });

        $scope.m = {
            startDate: moment().subtract(6, 'days'),
            endDate: moment(),
            pid: null,
            pids: null
        };

        $scope.openDeliveryDate = function ($event, cf) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.opened = true;
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        $scope.calendarChanged = function (isCal) {
            if (isCal) {
                for (var i = 0; i < $scope.calendars.length; i++) {
                    $scope.calendars[i].isEnabled = true;
                }
            } else {
                for (var i = 0; i < $scope.calendars.length; i++) {
                    $scope.calendars[i].isEnabled = false;
                }
            }
        };

        $scope.print = function (m) {
            var filter = [];

            var ids = [];
            var cals = $filter('orderBy')($scope.calendars, 'name');
            for (var i = 0; i < cals.length; i++) {
                if (cals[i].isEnabled)
                    ids.push(cals[i].id);
            }

            if (ids.length > 0)
                filter.push("pids=" + ids.join(','));

            var url = "/Report/PpiPrintSchedule?" + filter.join("&");
            console.log(url);

            window.open(url);
        };
    }
})();
(function () {
    'use strict';

    calendarsModule.controller('ScheduleJobModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$window', '$timeout', '$modalInstance', 'baseFactory', 'lazyLoadGoogleApi', 'job', 'event', 'nearbyUsers'];
    function ctrl($scope, $rootScope, $window, $timeout, $modalInstance, baseFactory, lazyLoadGoogleApi, job, event, nearbyUsers) {

        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.job = job;
        $scope.schedule = event;
        $scope.nearbyUsers = nearbyUsers;
        $scope.schedule.prepackDayData = angular.fromJson($scope.schedule.uiData);
        $scope.mapId = window.randomString();
        $scope.schedule.showMap = false;
        var init = function () {
            $scope.schedule.showMap = true;

            // instantiate google map objects for directions
            var directionsService = new google.maps.DirectionsService();
            // get directions using google maps api
            var getDirections = function (origin, destination, user, isNotAdd) {
                var additionalData = {
                    distance: { text: '0 km', value: 0 },
                    duration: { text: '0 mins', value: 0 }
                };
                if (origin.length == 0) {
                    user.additionalData = additionalData;
                    if (typeof isNotAdd === 'undefined') {
                        $scope.schedule.users.push(user);
                    }
                } else {
                    var request = {
                        origin: origin,
                        destination: destination,
                        travelMode: google.maps.DirectionsTravelMode.DRIVING
                    };
                    directionsService.route(request, function (response, status) {
                        if (status === google.maps.DirectionsStatus.OK) {
                            additionalData = {
                                distance: response.routes[0].legs[0].distance,
                                duration: response.routes[0].legs[0].duration
                            };
                        }
                        //
                        user.additionalData = additionalData;
                        if (typeof isNotAdd === 'undefined') {
                            $scope.schedule.users.push(user);
                            $scope.$apply();
                        }
                    });
                }
            }
            //
            $scope.$on('mapInitialized', function (evt, evtMap) {
                $scope.map = evtMap;
                $timeout(function () {
                    $scope.mapLatLng = new google.maps.LatLng($scope.schedule.lat, $scope.schedule.long);
                    $scope.map.setCenter($scope.mapLatLng);
                    $scope.map.setZoom(10);

                    var marker = new google.maps.Marker({
                        map: evtMap,
                        position: $scope.mapLatLng,
                        title: $scope.schedule.location
                    });

                    // 
                    $scope.nearbyUsersMarker = [];
                    for (var i = 0; i < nearbyUsers.length; i++) {
                        var uiData = nearbyUsers[i];
                        uiData.sortOrder = i;
                        var mapLatLng = new google.maps.LatLng(nearbyUsers[i].latitude, nearbyUsers[i].longitude);
                        var marker2 = new google.maps.Marker({
                            map: evtMap,
                            icon: 'http://maps.google.com/mapfiles/ms/icons/purple-dot.png', // 'app/lib/google-maps/images/people35.png',
                            position: mapLatLng,
                            title: nearbyUsers[i].name,
                            uiData: uiData,
                            infowindow: new google.maps.InfoWindow({
                                content: '<div class="clearfix" style="width: 300px"><div class="pull-left img img-cover" style="width:65px; height: 65px; margin-right: 10px; background-size: cover; background-image: url(' + uiData.photoThumbnailUrl + ')" role="img" aria-label="Test"></div><div class="pull-left" style="width: 225px"><div class="text-bold m-bottom5">' + uiData.name + '</div><div>' + uiData.address + '</div><a onclick="addScheduleModalUser(' + uiData.id + ', ' + uiData.sortOrder + ')" class="p-left0 btn btn-link btn-sm">Add User to Job</a></div></div>'
                            })
                        });
                        google.maps.event.addListener(marker2, 'click', function () {
                            this.infowindow.open(evtMap, this);
                        });
                        $scope.nearbyUsersMarker.push(marker2);
                    }
                }, 500);
            });
            //
            $window.addScheduleModalUser = function (userId, indx) {
                for (var i = 0; i < nearbyUsers.length; i++) {
                    if (nearbyUsers[i].id == userId) {
                        var tRecipient = nearbyUsers[i];
                        getDirections(tRecipient.address || '', $scope.schedule.location, {
                            calendarEventId: $scope.schedule.id,
                            userId: tRecipient.id,
                            name: tRecipient.name,
                            photoThumbnailUrl: tRecipient.photoThumbnailUrl
                        });
                        $scope.nearbyUsersMarker[i].infowindow.close();
                        $scope.nearbyUsersMarker[indx].setMap(null);
                    }
                }
            };
            $scope.addUsers = function (tRecipients) {
                angular.forEach(tRecipients, function (tRecipient) {
                    if ($scope.schedule.users.length < $scope.schedule.prepackDayData.numberOfStaffs) {
                        var isExist11 = false;
                        angular.forEach($scope.schedule.users, function (u) {
                            if (u.userId == tRecipient.id)
                                isExist11 = true;
                        });
                        if (!isExist11) {
                            getDirections(tRecipient.address || '', $scope.schedule.location, {
                                calendarEventId: $scope.schedule.id,
                                userId: tRecipient.id,
                                name: tRecipient.name,
                                photoThumbnailUrl: tRecipient.photoThumbnailUrl
                            });
                        }
                    }
                });
            };
            $scope.removeAllUsers = function () {
                $scope.schedule.users = [];
            };
            $scope.removeUser = function (usr) {
                var userId = angular.copy(usr.userId);
                var indx = -1;
                angular.forEach($scope.schedule.users, function (u, i) {
                    if (u.userId == usr.userId)
                        indx = i;
                });
                if (indx >= 0) {
                    for (var i = 0; i < nearbyUsers.length; i++) {
                        if (nearbyUsers[i].id == userId) {
                            $scope.nearbyUsersMarker[i].setMap($scope.map);
                        }
                    }
                    $scope.schedule.users.splice(indx, 1);
                }
            };

            //
        };
        $scope.ok = function (form, m) {
            $rootScope.formSubmit(form);
            if (form.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);
                dataToSend.title = m.titleName;
                baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                    if (!rrdata.isErrored && rrdata.object !== 0) {
                        $modalInstance.close(m);
                    }
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        // TABS
        $scope.tabId = 1;
        $scope.showTab = function (id) {
            $scope.tabId = id;

            if (id == 3 && !$scope.schedule.showMap) {
                lazyLoadGoogleApi.then(init);
            }
        };

    }
})();
(function () {
    'use strict';
    calendarsModule.config(config);
    config.$inject = ['$stateProvider'];

    function config($stateProvider) {
        $stateProvider
            .state('base.scheduler', {
                url: "/scheduler",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/calendars/scheduler/views/index.html",
                        controller: 'SchedulerCtrl',
                        resolve: {
                            FullCalendarModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('OcFullCalendarCtrl');
                            }],
                            calendars: function (baseFactory) {
                                return baseFactory.fetch('/api/calendar/list').then(function (rrdata) {
                                    return rrdata.object || [];
                                });
                            }
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Scheduler'
                }
            });
    }
})();
(function () {
    'use strict';
    calendarsModule.controller('SchedulerCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$log', '$modal', '$timeout', '$window', '$filter', 'baseFactory', 'calendars'];
    function ctrl($scope, $rootScope, $log, $modal, $timeout, $window, $filter, baseFactory, calendars) {

        $scope.calendars = $filter('orderBy')(calendars, 'name');
        $scope.schedules = [];
        $scope.unallocatedSchedules = [];
        $scope.loading = true;
        $scope.schedulesMode = true;

        var setItemSortOrder = function () {
            var dataToSend = [];
            for (var i = 0; i < $scope.schedules.length; i++) {
                var item = $scope.schedules[i];
                item.sortOrder = i + 1;
                dataToSend.push({ id: item.orderId, sortOrder: item.sortOrder });
            }
            for (var i = 0; i < $scope.unallocatedSchedules.length; i++) {
                var item = $scope.unallocatedSchedules[i];
                item.sortOrder = null;
                dataToSend.push({ id: item.orderId, sortOrder: item.sortOrder });
            }
            // console.log(dataToSend);
            // Save
            baseFactory.post('/api/calendar/saveSortOrder/', dataToSend).then(function (rrdata) {});
        };

        $scope.sortableOptions = {
            handle: '.my-handle',
            placeholder: "media-scheduler-container placeholder",
            connectWith: ".scheduler-container",
            items: '.media-scheduler-container',
            tolerance: 'pointer',
            stop: function () {
                setItemSortOrder();
            }
        };
        $scope.allocateSortableOptions = {
            handle: '.my-handle',
            placeholder: "media-scheduler-container placeholder",
            connectWith: ".scheduler-container",
            items: '.media-scheduler-container',
            tolerance: 'pointer',
            stop: function () {
                setItemSortOrder();
            }
        };

        $scope.allocateOrders = function () {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/calendars/modals/calendarAllocateOrderNoDateRangeModal.html',
                controller: 'CalendarAllocateOrderCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    printers: function () {
                        return baseFactory.fetch('/api/calendar/list').then(function (rrdata) {
                            return rrdata;
                        });
                    },
                    orders: function () {
                        return baseFactory.fetch('/api/Calendar/SearchOrders').then(function (rrdata) {
                            return rrdata;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                // console.log(ddata)
                $scope.updateSearch();
            }, function () {
            });
        };
        $scope.allocateMode = function (mode) {
            $scope.schedulesMode = !mode;
        };
        $scope.printScheduleReport = function () {
            $modal.open({
                templateUrl: '/app/modules/calendars/modals/printScheduleReportModal.html',
                controller: 'PrintScheduleReportModalCtrl',
                size: 'sm',
                backdrop: 'static',
                resolve: {
                    calendars: function () {
                        return $scope.calendars;
                    }
                }
            });
        };

        $scope.eventOnClick = function (event) {
            // console.log(event)
            var tempEvent = angular.copy(event);

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/calendars/modals/calendarOrderModal.html',
                controller: 'CalendarOrderModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    order: function () {
                        var ms = $.fullCalendar.moment(tempEvent.start);
                        var me = $.fullCalendar.moment(tempEvent.end);
                        var isAllDay = !(ms.hasTime() && me.hasTime());

                        if (event.end == null) {
                            tempEvent.end = event.end == null ? tempEvent.start : tempEvent.end;
                        }

                        var duration = moment.duration(tempEvent.end.diff(tempEvent.start));
                        var hours = duration.asHours();

                        if (hours == 0) {
                            tempEvent.end = event.end == null ? tempEvent.start : tempEvent.end;
                        } else {
                            tempEvent.end = isAllDay ? tempEvent.end.subtract(1, 'day').toDate() : tempEvent.end;
                        }
                        tempEvent.origStart = tempEvent.start;
                        tempEvent.origEnd = tempEvent.end;

                        console.log('tempEvent', angular.copy(tempEvent));
                        return angular.copy(tempEvent);
                    },
                    orderStatuses: function () {
                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                            return rrdata.object;
                        });
                    },
                    isNew: function () {
                        return false;
                    },
                    event: function () {
                        console.log('event', event);
                        return event;
                    },
                    isAllPrinters: function () {
                        return true;
                    },
                    printers: function () {
                        return $scope.calendars;
                    },
                    orderDetails: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + tempEvent.orderId).then(function (rrdata) {
                            return rrdata.object;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                if (ddata) {
                    event.location = ddata.location;
                }
                $scope.updateSearch();
            }, function () {
            });
        };
        $scope.onSelect = function ($item) {
            var tempEvent = angular.copy($item);
            tempEvent.titleName = $item.title;
            tempEvent.start = $.fullCalendar.moment(tempEvent.start);
            tempEvent.end = $.fullCalendar.moment(tempEvent.end);
            $scope.eventOnClick(tempEvent);
        };
        $scope.openOrderJobBag = function (order) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderJobBagModal/orderJobBagModal.html',
                controller: 'orderJobBagModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    orderData: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + order.id).then(function (data) {
                            return data.object;
                        });
                    }
                }
            });
        };

        $scope.dg = {
            searchText: "",
            calendarId: $scope.calendars.length > 0 ? $scope.calendars[0].id : null,
            isProductionOnly: true
        };
        $scope.updateSearch = function () {
            $scope.schedules = [];
            $scope.unallocatedSchedules = [];
            $scope.loading = true;
            baseFactory.fetch('/api/calendar/GetAllEvents', $scope.dg).then(function (rdata) {
                var schedules = rdata.object || [];
                $scope.loading = false;
                var uasched = [];
                var asched = [];

                angular.forEach(schedules, function (s, i) {
                    //// TODO Test only
                    //if (i > 10)
                    //    s.sortOrder = null;

                    if (s.sortOrder == null) {
                        uasched.push(s);
                    } else {
                        asched.push(s);
                    }
                });
                $scope.unallocatedSchedules = uasched;
                $scope.schedules = asched;
            });
        };
        $scope.updateSearch();

        $scope.openStockAvailability = function (orderr) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderStockAvailabilityModal/index.html',
                controller: 'OrderStockAvailabilityModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    order: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + orderr.orderId).then(function (rdata) {
                            return rdata.object || null;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                $scope.updateSearch();
            }, function () {
            });
        };
        $scope.openArtWorkApproval = function (orderr) {
            baseFactory.fetch('/api/order/get/' + orderr.orderId).then(function (rrdata) {
                var item = rrdata.object.items[0];

                angular.forEach(rrdata.object.items, function (itm) {
                    if (itm.isPrimary) {
                        item = itm;
                    }
                });

                // console.log(item)
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/artworkApproval/artworkApprovalDetailModal/artworkApprovalDetail.html',
                    controller: 'artworkApprovalDetailCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        messages: function () {
                            return baseFactory.fetch('/api/message/getAllMessagesByOrder', { orderId: orderr.orderId, page: 1, count: 20 }).then(function (rrrdata) {
                                return rrrdata.object || null;
                            });
                        },
                        messageDetail: function () {
                            return null;
                        },
                        currentUser: function () {
                            return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrrdata) {
                                return rrrdata.object == null ? [] : rrrdata.object;
                            });
                        },
                        orderStatuses: function (resolveFactory) {
                            return resolveFactory.getGridEntity('/api/orderstatus/getall');
                        },
                        order: function () {
                            return rrdata.object;
                        }
                    }
                });

                modalInstance.result.then(function (isReloadPage) {
                    if (isReloadPage)
                        $scope.updateSearch();
                }, function (isReloadPage) {
                    if (isReloadPage)
                        $scope.updateSearch();
                });
            });
        };
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('catalogueCtrl', ctrl);
    ctrl.$inject = ['$scope', '$location', 'membershipFactory', 'shoppingCartFactory', '$rootScope', 'Lightbox', 'categories', 'baseFactory', '$sce', '$state', 'itemCategory', 'items'];
    function ctrl($scope, $location, membershipFactory, shoppingCartFactory, $rootScope, Lightbox, categories, baseFactory, $sce, $state, itemCategory, items) {


        init();
        function init() {
            $scope.categories = categories;
            $scope.itemCategory = itemCategory;

            $scope.loading = true;
            $scope.dataToSend = [];
            $scope.cart = [];

            $scope.items = items;
            angular.forEach($scope.items, function(item) {
                item.quantity = item.minimumQuantity;
            });
        }

        $scope.changeCategory = function (param) {
            $state.go('base.catalog.category', { id: param.id });
        }
    }
})();


(function () {
    'use strict';
    angular.module('appCatalogue').controller('sharedMenuCategory', ctrl);
    ctrl.$inject = ['$scope', 'baseFactory', '$state', '$window'];
    function ctrl($scope, baseFactory, $state, $window) {

        //$scope.categories = $scope.categories;
        $scope.items = [];

        init();
        function init() {
            if ($state.current.name == "base.catalog.category") {
                selectCategoryName($scope.categories);
            }
        }

        function selectCategoryName(categories) {
            angular.forEach(categories, function (category) {
                if (category.id.toString() == $scope.$parent.itemCategory) {
                    $scope.selectedCategoryName = category.label;
                    return;
                }
                if (category.children && category.children.length > 0) {
                    selectCategoryName(category.children);
                }
            });
        }


        //angular.forEach($scope.$parent.categories.object, function(value, index) {
        //    var category = {
        //        label: value.name,
        //        id: value.id,
        //        children: []
        //    }

        //    //angular.forEach(value.subCategories, function (subCat, index) {
        //    //    var subCat = {
        //    //        label: subCat.name,
        //    //        id: subCat.id
        //    //    }
        //    //    category.children.push(subCat);
        //    //})

        //    $scope.categories.push(category);
        //});

        $scope.changeCategory = function (param) {
            $state.go('base.catalog.category', { id: param.id });
        }



        //Setting up min height
        var header = 56;
        var footer = 256;
        $scope.popupHeight = $window.innerHeight - header - footer;
        $scope.height = $scope.popupHeight + "px";

        $scope.setMinHeight = function () {
            var test = "as";
            return { 'min-height': $scope.height };
        }

    }
})();


angular.module('appCatalogue').controller('checkoutForm',
    [
        '$scope', 'baseFactory', '$modal', '$locale', '$rootScope', 'shoppingCartFactory', 'promptFactory',
        'orderCustomFields', 'itemCustomField', '$timeout', '$state', 'printers', 'items', 'FREIGHT_CONSTANTS', 'CART_CONSTANTS', 'pricingFactory', 'customerContacts', 'ppiOrderFactory',
        function ($scope, baseFactory, $modal, $locale, $rootScope, shoppingCartFactory, promptFactory,
            orderCustomFields, itemCustomField, $timeout, $state, printers, items, FREIGHT_CONSTANTS, CART_CONSTANTS, pricingFactory, customerContacts, ppiOrderFactory) {

            $scope.customerId = "";
            $scope.showCustomFieldDate = showCustomFieldDate;
            $scope.createQuote = createQuote;
            $scope.submitOrder = submitOrder;
            $scope.openEventDate = openEventDate;
            $scope.openPreProductionDate = openPreProductionDate;
            $scope.openDeliveryDate = openDeliveryDate;
            $scope.openStockDueDate = openStockDueDate;
            $scope.editDeliveryAddress = editDeliveryAddress;
            $scope.formValid = formValid;
            $scope.displaySplitDeliveries = displaySplitDeliveries;
            $scope.getGrandTotal = getGrandTotal;
            $scope.downloadOrderUrl = "";
            $scope.itemsValid = true;
            $scope.hideQuoteButton = false;
            $scope.quoteButtonText = "Create Quote";
            $scope.submitButtonTxt = "Submit Order";
            $scope.disableSubmitButton = false;
            $scope.clickDeliveryRequired = clickDeliveryRequired;
            $scope.isEditMode = true;
            $scope.isCodCustomer = false;
            $scope.grandTotal = 0;
            $scope.stockDueDate = null;

            init();

            //Upload Document
            $scope.onFileSelect = onFileSelect;
            $scope.changeFile = changeFile;
            $scope.resetInputFile = resetInputFile;
            var isDocument = true;
            var isMedia = true;
            $scope.fileModel = {
                FileName: "",
                FileFolder: ""
            };

            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = [];
                var result = false;

                if (isDocument || isMedia) {
                    fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg"];
                    result = fType.indexOf(ext) >= 0;

                    if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                        $scope.doc.docTypeId = 2;
                    } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                        $scope.doc.docTypeId = 3;
                    } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                        $scope.doc.docTypeId = 5;
                    }
                }

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                if (result) {
                    if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                        $scope.doc.name = filename;
                    }
                }

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };

            function onFileSelect($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) {
                            $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                        }).success(function (data, status, headers, config) {

                            if (!data.isErrored) {
                                $scope.resetInputFile();
                                $scope.fileModel = data.object;
                                $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                                $scope.doc.fileName = $scope.fileModel.fileName;
                                $scope.doc.isUploaded = true;
                                $scope.doc.isNew = true;
                            }
                            $scope.disableSubmitButton = false;
                            $scope.submitTxt = "Save";
                        });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };

            function changeFile() {
                $scope.doc.isUploaded = false;
                $scope.doc.fileFolder = "";
                $scope.doc.fileName = "";
                $scope.doc.link = "";
                $scope.doc.isNew = true;
            };

            function resetInputFile() {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };
            //End of Upload Document

            $scope.$watch("deliveryRequired", function (newValue) {
                if (newValue === 'Yes') {
                    $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE);
                }
                $rootScope.$emit(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, newValue === 'Yes');
            });
            $scope.$onRootScope(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, function (ev, res) {
                clickDeliveryRequired(res ? 'Yes' : 'No');
            });
            function clickDeliveryRequired(v) {
                $scope.deliveryRequired = v;
            }

            function init() {
                $scope.order = {
                    orderCustomFields: orderCustomFields.object,
                    customerContacts: customerContacts,
                    uiData: { deliverySplits: [] },
                    notifications: []
                };

                $scope.deliveryRequired = 'No';
                $scope.dateOptions = {
                    formatYear: 'yy',
                    startingDay: 1
                };

                $scope.buttonToggles = {
                    isSendEmails: 'Yes',
                    stockAvailable: 'No'
                };

                $scope.isCompanyUser = [1, 2, 4].indexOf($rootScope.user.userType) !== -1;
                $scope.displayImpersonate = !$rootScope.user.customerId;
                var customerId = $rootScope.user.customerId;
                if (!customerId) {
                    customerId = $rootScope.user.impersonateCustomerId;
                }

                if (customerId) {
                    baseFactory.fetch('/api/customer/get/' + customerId).then(function (data) {
                        if (data.object != null) {
                            $scope.order.delivery = {
                                address: data.object.street1,
                                address2: data.object.street2,
                                suburb: data.object.suburb,
                                postcode: data.object.postcode,
                                state: data.object.state,
                                location: data.object.location,
                                details: ''
                            };

                            $scope.deliveryOrder = $scope.order.delivery.suburb.replace(/ /g, '') + " , " + $scope.order.delivery.postcode.replace(/ /g, '') + " , " + $scope.order.delivery.state.replace(/ /g, '')

                            setupDeliverySplits();

                            $scope.isCodCustomer = data.object.isCodCustomer;
                        }
                    });
                }

                $scope.order.items = items;
                initItems();
                $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: false });

                angular.forEach($scope.order.items, function (item) {
                    item.kits = item.config.kits;
                    item.kitting = item.config.kitting;
                    var selectedConfig = item.config.selectedPrintTypeConfig;
                    if (selectedConfig != undefined) {
                        selectedConfig.overriddenSetupTotal = item.overriddenSetupTotal || (typeof selectedConfig !== 'undefined') ? selectedConfig.setupTotal : 0;
                        selectedConfig.overriddenUnitPrice = item.overriddenUnitPrice || (typeof selectedConfig !== 'undefined') ? selectedConfig.unitPrice : 0;
                        selectedConfig.overridePricing = item.overridePricing || false;
                        selectedConfig.overriddenTotal = item.overriddenTotal || (typeof selectedConfig !== 'undefined') ? selectedConfig.total : 0;
                        selectedConfig.unitPrice = item.unitPrice || (typeof selectedConfig !== 'undefined') ? selectedConfig.unitPrice : 0;
                        selectedConfig.setupTotal = item.setupTotal || (typeof selectedConfig !== 'undefined') ? selectedConfig.setupTotal : 0;
                    }
                });

                if ($scope.order.artwork) {
                    $scope.doc = {
                        id: $scope.order.artwork.id,
                        permissions: [],
                        fileName: $scope.order.artwork.fileName,
                        link: $scope.order.artwork.link,
                        isUploaded: true,
                        isDownload: true,
                        downloadLink: $scope.order.artwork.link
                    };
                } else {
                    $scope.doc = {
                        id: 0,
                        permissions: []
                    };
                }
            };

            function setupDeliverySplits() {
                if ($scope.order.uiData.deliverySplits && $scope.order.uiData.deliverySplits.length > 0) {
                    return;
                }

                var firstDeliverySplit = !$scope.order.delivery ? {} : angular.copy($scope.order.delivery);

                firstDeliverySplit.items = [];
                $scope.order.uiData.deliverySplits.push(firstDeliverySplit);

                ppiOrderFactory.updateFreight($scope.order);
            }

            function initItems(overwriteOverriddenPrices) {
                angular.forEach($scope.order.items, function (item) {
                    var setToOriginals = typeof item.config.selectedPrintTypeConfig !== 'undefined' && item.config.selectedPrintTypeConfig != null;
                    var originalOverriddenSetupTotal = !setToOriginals ? 0 : item.config.selectedPrintTypeConfig.overriddenSetupTotal;
                    var originalOverriddenTotal = !setToOriginals ? 0 : item.config.selectedPrintTypeConfig.overriddenTotal;
                    var originalOverriddenUnitPrice = !setToOriginals ? 0 : item.config.selectedPrintTypeConfig.overriddenUnitPrice;
                    var originalOverridePricing = !setToOriginals ? false : item.config.selectedPrintTypeConfig.overridePricing;
                    var originalSetupTotal = !setToOriginals ? 0 : item.config.selectedPrintTypeConfig.setupTotal;
                    //var originalTotal = !setToOriginals ? 0 : item.config.selectedPrintTypeConfig.total;
                    var originalUnitPrice = !setToOriginals ? 0 : item.config.selectedPrintTypeConfig.unitPrice;

                    pricingFactory.initConfigurations(item);
                    pricingFactory.calculateAllPricing(item);
                    angular.forEach(item.config.productPrintTypeConfigurations, function (printTypeConfig) {
                        if (printTypeConfig.active) {
                            item.config.selectedPrintTypeConfig = printTypeConfig;
                        }

                        pricingFactory.calculateTotal(item, printTypeConfig);

                        if (item.config.selectedPrintTypeConfig) {
                            if (overwriteOverriddenPrices) {
                                item.config.selectedPrintTypeConfig.overriddenSetupTotal = item.config.selectedPrintTypeConfig.overriddenSetupTotal;
                                item.config.selectedPrintTypeConfig.overriddenUnitPrice = item.config.selectedPrintTypeConfig.overriddenUnitPrice;
                                item.config.selectedPrintTypeConfig.overridePricing = item.config.selectedPrintTypeConfig.overridePricing;
                                item.config.selectedPrintTypeConfig.overriddenTotal = item.config.selectedPrintTypeConfig.overriddenTotal;
                                item.config.selectedPrintTypeConfig.unitPrice = item.config.selectedPrintTypeConfig.unitPrice;
                                item.config.selectedPrintTypeConfig.setupTotal = item.config.selectedPrintTypeConfig.setupTotal;
                            } else if (setToOriginals) {
                                item.config.selectedPrintTypeConfig.overriddenSetupTotal = originalOverriddenSetupTotal;
                                item.config.selectedPrintTypeConfig.overriddenUnitPrice = originalOverriddenUnitPrice;
                                item.config.selectedPrintTypeConfig.overridePricing = originalOverridePricing;
                                item.config.selectedPrintTypeConfig.overriddenTotal = originalOverriddenTotal;
                                item.config.selectedPrintTypeConfig.unitPrice = originalUnitPrice;
                                item.config.selectedPrintTypeConfig.setupTotal = originalSetupTotal;
                            }
                        }
                    });
                });
            }

            function showCustomFieldDate(cf) {
                var result = false;
                if (cf == "Yes") {
                    result = true;
                }
                return result;
            };

            function createQuote(form, order) {
                submitOrder(form, order, true);
            };

            function submitOrder(form, order, isQuote) {
                if (!isQuote) {
                    if (form.$invalid) {
                        return;
                    }
                }

                var customerId, customerName;

                if ($rootScope.impersonate) {
                    customerId = $rootScope.impersonate.customerId;
                    customerName = $rootScope.impersonate.name;
                } else {
                    customerId = $rootScope.user.customerId;
                    customerName = $rootScope.user.customerName;
                }

                $scope.date = new Date();
                //
                order.uiData.items = order.items;
                order.uiData.deliveryRequired = $scope.deliveryRequired === 'Yes';
                order.uiData.isEvent = $scope.event === "Yes";
                order.uiData.preProduction = $scope.preProduction === "Yes" ? moment($scope.preProductionDate).format('YYYY-MM-DD') : null;
                order.uiData.useOurDate = $scope.buttonToggles.ourDate === "Yes";
                order.isNotifications = $scope.buttonToggles.isSendEmails === "Yes";

                angular.forEach(order.uiData.items, function (item) {
                    item.serialisedConfig = angular.toJson(item.config);
                });
                var data = {
                    id: 0,
                    customerId: customerId,
                    customerName: customerName,
                    orderDescription: order.desc,
                    comments: order.comments,
                    purchaseOrderNumber: order.purchaseOrderNumber,
                    orderDate: $scope.date,
                    total: 0,
                    itemCount: 0,
                    userId: $rootScope.user.userId,
                    address1: order.delivery ? order.delivery.address : '',
                    address2: order.delivery ? order.delivery.address2 : '',
                    deliveryDetails: order.delivery ? order.delivery.details : '',
                    locationId: order.delivery && order.delivery.location ? order.delivery.location.id : '',
                    items: order.items,
                    customFields: order.orderCustomFields,
                    deliveryDate: order.deliveryDate,
                    isQuote: isQuote === true,
                    uiData: angular.toJson(order.uiData),
                    selectedCustomerContact: null,
                    selectedCustomerContactId: order.selectedCustomerContactId,
                    notifications: order.notifications,
                    isNotifications: order.isNotifications
                };

                order.uiData.items = null;
                delete order.uiData.items;

                if (data.selectedCustomerContactId) {
                    angular.forEach(order.customerContacts, function (contact) {
                        if (contact.id === data.selectedCustomerContactId) {
                            data.selectedCustomerContact = contact;
                        }
                    });
                }

                if (order.delivery && order.delivery.location) {
                    angular.forEach(data.items, function (item) {
                        item.toLocationId = order.delivery.location.id;
                    });
                }

                var newData = {
                    order: '',
                    customFields: [],
                    artworkFile: '',
                    items: order.items,
                    sendQuoteEmail: true,
                    total: $scope.grandTotal
                };

                var tempCf = angular.copy(order.orderCustomFields);
                order.orderCustomFields = [];
                angular.forEach(tempCf, function (value, index) {
                    var event = {
                        id: value.id,
                        name: value.name || value.customFieldName,
                        typeId: value.typeId,
                        value: null,
                        customFieldTypeId: value.typeId,
                        customFieldId: value.id,
                        customFieldName: value.name || value.customFieldName
                    }

                    if (value.name.toLocaleLowerCase() == "event") {
                        event.value = $scope.eventDate;
                    } else if (value.name.toLocaleLowerCase() == "pre-production") {
                        event.value = $scope.preProductionDate;
                    }
                    order.orderCustomFields.push(event);
                });

                newData.order = data;
                newData.customFields = angular.copy(order.orderCustomFields);
                newData.items = $scope.order.items;

                angular.forEach(newData.items, function (item) {
                    item.overriddenSetupTotal = item.config.selectedPrintTypeConfig.overriddenSetupTotal;
                    item.overriddenTotal = item.config.selectedPrintTypeConfig.overriddenTotal;
                    item.overriddenUnitPrice = item.config.selectedPrintTypeConfig.overriddenUnitPrice;
                    item.overridePricing = item.config.selectedPrintTypeConfig.overridePricing;
                    item.setupTotal = item.config.selectedPrintTypeConfig.setupTotal;
                    item.unitPrice = item.config.selectedPrintTypeConfig.unitPrice;
                    item.discountAmount = item.config.discountAmount;
                    item.discountPercentage = item.config.discountPercentage;
                    item.additionalItems = item.config.additionalItems;
                    item.additionalItemsTotalPrice = item.config.additionalItemsTotalPrice;

                    // Quantity
                    if (typeof item.config.selectedPrintTypeConfig.overriddenQuantity !== "undefined") {
                        item.overriddenQuantity = item.config.selectedPrintTypeConfig.overriddenQuantity;
                        item.quantity = item.config.selectedPrintTypeConfig.overriddenQuantity;
                        newData.quantity = newData.quantity + (item.overriddenQuantity != item.quantity ? item.overriddenQuantity : item.quantity);
                    }
                });

                newData.order.artworkFile = $scope.doc;

                if (isQuote) {
                    $scope.quoteButtonText = "Saving...";
                } else {
                    $scope.submitButtonTxt = "Submitting...";
                }

                $scope.disableSubmitButton = true;

                baseFactory.post('/api/ppiorder/save', newData).then(function (rdata) {
                    if (!rdata.isErrored) {

                        if ($scope.order && $scope.order.items) {
                            var itemsInCart = $scope.order.items.length;
                            for (var i = 0; i < itemsInCart; i++) {
                                $rootScope.$emit(CART_CONSTANTS.REMOVE_ITEM_FROM_CART_SUBMIT, $scope.order.items[0]);
                            }
                        }
                        if (rdata.object.order.id > 0) {
                            if (!rdata.object.order.isQuote && $scope.isCodCustomer && rdata.object.requiresPartPayment) {
                                $state.go(".payment", { orderId: rdata.object.order.id }, {});
                                return;
                            }

                            var typeName = (rdata.object.order.isQuote ? "quote" : "order");

                            promptFactory.confirm("Your " + typeName + " has been submitted.  Would you like to export the " + typeName + " report?", function (result) {
                                if (result) {
                                    var reportUrl = (rdata.object.order.isQuote ? "/Report/PpiQuote/" : "/Report/PpiOrder/");
                                    $scope.downloadOrderUrl = reportUrl + (rdata.object.orderIdsCreated || rdata.object.order.id);
                                    $timeout(function () {
                                        document.getElementById('adownloadorder').click();
                                        $timeout(function () {
                                            if (isQuote && $state.href('base.quotes'))
                                                $state.transitionTo('base.quotes', {}, { reload: true });
                                            else
                                                $state.transitionTo('base.orders', {}, { reload: true });
                                        }, 500);
                                    }, 100);
                                } else {
                                    if (isQuote && $state.href('base.quotes'))
                                        $state.transitionTo('base.quotes', {}, { reload: true });
                                    else
                                        $state.transitionTo('base.orders', {}, { reload: true });
                                }
                            });
                        }
                    }

                    if (isQuote) {
                        $scope.quoteButtonText = "Create Quote";
                    } else {
                        $scope.submitButtonTxt = "Submit Order";
                    }
                    $scope.disableSubmitButton = false;
                });
            };

            function openEventDate($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openEvent = true;
            };

            function openPreProductionDate($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openPreProduction = true;
            };

            function openDeliveryDate($event, cf) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.opened = true;
            };

            function openStockDueDate($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openStockDueDatePicker = true;
            };

            function editDeliveryAddress(delivery) {
                ppiOrderFactory.editDeliveryAddress($scope.order, delivery);
            }

            function formValid(validateForQuote) {
                var customerId = $rootScope.impersonate ? $rootScope.impersonate.customerId : $rootScope.user.customerId;
                $scope.itemsValid = ppiOrderFactory.validateItems($scope.order);
                return customerId && ppiOrderFactory.formValid($scope.order, $scope.form, validateForQuote, $scope.deliveryRequired);
            }

            function displaySplitDeliveries() {
                ppiOrderFactory.displaySplitDeliveries($scope.order, $scope.deliveryRequired);
            }

            function getGrandTotal() {
                var total = 0;
                var discount = 0;
                var additionalItemsTotal = 0;
                angular.forEach($scope.order.items, function (item) {
                    if (typeof item.total !== "undefined") {
                        var itemTotal = (item.config.selectedPrintTypeConfig.overridePricing ? item.config.selectedPrintTypeConfig.overriddenTotal : item.total);

                        if (item.config.discountPercentage && !item.config.selectedPrintTypeConfig.overridePricing) {
                            item.config.discountAmount = itemTotal * (item.config.discountPercentage / 100);
                            discount += item.config.discountAmount;
                        } else {
                            item.config.discountAmount = 0;
                        }
                        total = total + itemTotal;
                    }
                });
                angular.forEach($scope.order.items, function (item) {
                    if (typeof item.total !== "undefined") {
                        additionalItemsTotal += item.config.additionalItemsTotalPrice;
                    }
                });

                if ($scope.deliveryRequired === 'Yes' && $scope.order.uiData && !$scope.order.uiData.deliveryInvalid && $scope.order.uiData.deliverySplits) {
                    angular.forEach($scope.order.uiData.deliverySplits, function (deliverySplit) {
                        if (deliverySplit.freightResult && deliverySplit.freightResult.total) {
                            total = total + (deliverySplit.freightResult.totalOverridden ? deliverySplit.freightResult.overriddenTotal : deliverySplit.freightResult.total);
                        }
                    });
                }

                $scope.grandTotal = (total - discount) + additionalItemsTotal;
                return $scope.grandTotal;
            }

            $scope.tempEmailAddress = "";
            $scope.addNotification = function (email) {
                if (window.isValidEmailAddress(email)) {
                    if ($scope.order.notifications.indexOf(email) < 0)
                        $scope.order.notifications.push(angular.copy(email));
                    $scope.tempEmailAddress = "";
                }
            };
            $scope.deleteNotification = function (email) {
                for (var i = 0; i < $scope.order.notifications.length; i++) {
                    if ($scope.order.notifications[i] === email) {
                        $scope.order.notifications.splice(i, 1);
                        break;
                    }
                }
            };

            $scope.$onRootScope(CART_CONSTANTS.UPDATE_CART, function (args1, args2) {
                if (args2 && args2.overwriteOverriddenPrices)
                    initItems(true);
                shoppingCartFactory.updateCart($scope.order.items, true);

                // CLEAR ORIGINAL FREIGHT PRICE
                angular.forEach($scope.order.uiData.deliverySplits, function (split) {
                    split.freightResult = null;
                });

                if ($scope.deliveryRequired === 'Yes')
                    ppiOrderFactory.updateFreight($scope.order);
            });

            $scope.$onRootScope(CART_CONSTANTS.CART_UPDATED, function (e, shoppingCart) {
                shoppingCartFactory.getShoppingCartWithConfiguration().then(function (items) {
                    ppiOrderFactory.updateFreight($scope.order);
                });
            });

            $scope.$onRootScope(CART_CONSTANTS.REMOVE_ITEM_FROM_CART, function (e, item) {
                shoppingCartFactory.removeItemFromCart(item, $scope.order.items);
                ppiOrderFactory.updateFreight($scope.order);

                if (!$scope.order.items || $scope.order.items.length === 0) {
                    $state.go('base.catalog', {});
                }
            });
            $scope.$onRootScope(CART_CONSTANTS.REMOVE_ITEM_FROM_CART_SUBMIT, function (e, item) {
                shoppingCartFactory.removeItemFromCart(item, $scope.order.items);
                ppiOrderFactory.updateFreight($scope.order);
            });
        }
    ]);



(function () {
    'use strict';
    angular.module('appCatalogue').controller('checkoutFreight', checkoutFreight);
    checkoutFreight.$inject = ['$scope', '$timeout', 'baseFactory', 'FREIGHT_CONSTANTS', 'freightFactory'];
    function checkoutFreight($scope, $timeout, baseFactory, FREIGHT_CONSTANTS, freightFactory) {

        $scope.getPrice = getPrice;
        $scope.freightPrice = null;

        $scope.$onRootScope(FREIGHT_CONSTANTS.REGENERATE_PRICE, getPrice);

        $scope.$on(FREIGHT_CONSTANTS.UPDATE_FREIGHT_PRICE, function (ev, p) {
            if ($scope.freightPrice === null) {
                var deliverySplits = angular.fromJson($scope.order.uiData).deliverySplits;
                if (deliverySplits.length > 0) {
                    $scope.price = deliverySplits[0].freightResult;
                }
            }
            $scope.freightPrice = p.price;
        });

        function getPrice(ev, item) {
            $scope.price = null;
            $scope.freightLoading = true;
            freightFactory.getCheckoutFreightPrice($scope.order, $scope.price, typeof item == 'undefined' ? undefined : item.itemNumber, typeof item == 'undefined' ? undefined : item.quantity)
                .then(function (result) {
                    $scope.order = result.order;
                    $scope.price = result.price;
                    $scope.freightPrice = $scope.price.total;
                    $scope.freightLoading = false;
                    $scope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, { price: $scope.freightPrice, data: result });
                }, function () {
                    $scope.freightLoading = false;
                });
        }

        $scope.priceChanged = function (v) {
            $scope.$emit(FREIGHT_CONSTANTS.OVERRIDE_PRICE_DONE, { price: v });
        };
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('paymentCtrl', ctrl);
    ctrl.$inject = ["$scope", "$rootScope", "$state", "$stateParams", "$locale", "$sce", "$http", "$timeout", "$filter", "baseFactory", "orderModel", "receiptModel"];
    function ctrl($scope, $rootScope, $state, $stateParams, $locale, $sce, $http, $timeout, $filter, baseFactory, orderModel, receiptModel) {
        // console.log(orderModel)
        // console.log(receiptModel)

        if (!orderModel) {
            $state.go("base.home");
            return;
        }

        $scope.authoriseUrl = "";
        $scope.isPaymentSuccessful = false;
        $scope.receipt = null;
        $scope.messages = [];
        $scope.errorMessages = [];
        $scope.isSubmit = false;
        $scope.isSave = false;
        $scope.isFingerPrintUpdating = false;
        $scope.maskedCreditCard = "";
        var originalAmount = 0;

        function init(newOrderModel, newReceiptModel) {
            $scope.orderModel = newOrderModel;

            $scope.model = angular.extend({}, newOrderModel, newReceiptModel);
            $scope.model.orderId = $scope.orderModel.orderId;
            $scope.model.expiryMonth = newReceiptModel.expiryMonth > 0 ? newReceiptModel.expiryMonth : null;
            $scope.model.expiryYear = newReceiptModel.expiryYear > 0 ? newReceiptModel.expiryYear : null;
            $scope.model.customerId = $scope.orderModel.customerId;

            $scope.model['epS_AMOUNT'] = newOrderModel['epS_AMOUNT'];
            $scope.model['epS_NEWAMOUNT'] = ($filter('number')(newOrderModel['epS_AMOUNT'], 2)).replace(/,/g, "");
            originalAmount = angular.copy($scope.model['epS_AMOUNT']);

            $scope.authoriseUrl = $sce.trustAsResourceUrl(newOrderModel['epS_MERCHANTURL']);

            $scope.currentYear = new Date().getFullYear();
            $scope.currentMonth = new Date().getMonth() + 1;
            $scope.months = [];
            $scope.years = [];

            angular.forEach($locale.DATETIME_FORMATS.MONTH, function (m, indx) {
                var v = indx + 1;
                var str = ('0' + v).slice(-2);
                $scope.months.push({
                    id: str,
                    name: str + '-' + m
                });
            });

            for (var i = $scope.currentYear; i < $scope.currentYear + 20; i++) {
                $scope.years.push({
                    id: i,
                    name: i
                });
            }
            $scope.ccinfo = { type: undefined };
        }

        function save(realPaymentForm, paymentForm, model) {
            // validate credit card
            $scope.isSave = true;

            if ($scope.isFingerPrintUpdating)
                return;

            var isError = false;
            $scope.errorMessages = [];
            if (model['epS_AMOUNT'] > $scope.orderModel.orderTotal) {
                isError = true;
                $scope.errorMessages.push("The amount to be paid must not exceed order's total amount (" + $filter('currency')($scope.orderModel.orderTotal) + ")");
            } else if (model['epS_AMOUNT'] < $scope.orderModel.minAmount) {
                isError = true;
                $scope.errorMessages.push("The amount to be paid must be at least " + $filter('currency')($scope.orderModel.minAmount));
            }

            if (paymentForm.$valid && !isError) {
                console.log('valid')
                $scope.loading = true;
                $scope.isSubmit = true;
                $scope.isSave = false;

                // Mask credit card
                $scope.maskedCreditCard = "";
                var ccn = angular.copy(model.creditCardNumber);
                var arrStr = ccn.split('');
                var maskedArr = [];
                for (var i = 0; i < arrStr.length; i++) {
                    if (i > 3) {
                        maskedArr.push('x');
                    } else {
                        maskedArr.push(arrStr[i]);
                    }
                }
                $scope.maskedCreditCard = maskedArr.join('');

                model['epS_NEWAMOUNT'] = ($filter('number')(model['epS_AMOUNT'], 2)).replace(/,/g, "");
                realPaymentForm.commit();
            }

        }

        $scope.save = save;

        init(angular.copy(orderModel), receiptModel);

        window.nabdirectPostDone = function () {

            if ($scope.isSubmit) {
                var ctr = 0;
                $scope.errorMessages = [];

                var pingServer = function (guid) {
                    $rootScope.showBlanket = true;
                    $scope.loading = true;
                    baseFactory.simplecall("GET", "/api/receipt/getnabreceipt/" + guid).then(function (rdata) {

                        $scope.receipt = rdata.object || null;
                        if ($scope.receipt == null) {
                            if (ctr < 5) {
                                $timeout(function () {
                                    ctr++;
                                    pingServer(guid);
                                }, 1000);
                            } else {
                                $scope.isPaymentSuccessful = false;
                                $scope.loading = false;
                                $scope.isSubmit = false;
                                $scope.errorMessages.push("There is an issue with submitting your payment. Please try again");
                                $rootScope.showBlanket = false;
                            }
                        } else {
                            // console.log(rdata.object);
                            if (rdata.object.summarycode > 1) {
                                $scope.isPaymentSuccessful = false;
                                $scope.loading = false;
                                $scope.isSubmit = false;
                            } else {
                                $scope.isPaymentSuccessful = true;
                                $scope.isSubmit = false;
                            }
                            $rootScope.showBlanket = false;
                        }
                    });
                };

                pingServer($scope.model['epS_REFERENCEID']);
            }
        };

        //
        $scope.isPayCreditCard = false;
        $scope.isPayDirectDeposit = false;
        $scope.payByCreditCard = function () {
            $scope.isPayCreditCard = true;
            $scope.isPayDirectDeposit = false;
        };
        $scope.payByDirectDeposit = function () {
            $scope.isPayCreditCard = false;
            $scope.isPayDirectDeposit = true;
        };
        $scope.cancelPayment = function () {
            $scope.errorMessages = [];
            if (parseFloat(orderModel['epS_AMOUNT']) != $scope.model['epS_AMOUNT']) {
                baseFactory.fetch('/api/PpiOrder/GetOrderPaymentData/' + $stateParams.orderId).then(function (data) {
                    $scope.isPayCreditCard = false;
                    $scope.isPayDirectDeposit = false;
                    // Reinit
                    init(data.object, receiptModel);
                });
            } else {
                $scope.isPayCreditCard = false;
                $scope.isPayDirectDeposit = false;
            }
        };
        $scope.updateFingerPrint = function (realPaymentForm, paymentForm, m) {
            var model = angular.copy(m);
            // console.log(model)
            if (originalAmount != model.epS_AMOUNT) {
                // $scope.isSubmit = true;
                $scope.isFingerPrintUpdating = true;
                baseFactory.fetch('/api/PpiOrder/GetOrderPaymentData/' + $stateParams.orderId, { amount: model.epS_AMOUNT }).then(function (data) {
                    // Reinit
                    var newReceiptModel = angular.copy(receiptModel);
                    newReceiptModel.cardHolderName = model.cardHolderName;
                    newReceiptModel.creditCardNumber = model.creditCardNumber;
                    newReceiptModel.expiryMonth = model.expiryMonth;
                    newReceiptModel.expiryYear = model.expiryYear;
                    newReceiptModel.securityCode = model.securityCode;

                    init(data.object, newReceiptModel);

                    // $scope.isSubmit = false;
                    $scope.isFingerPrintUpdating = false;
                    //
                    if ($scope.isSave)
                        $timeout(function () {
                            save(realPaymentForm, paymentForm, m);
                        }, 500);
                });
            }
        };

    }
})();


(function () {
    'use strict';
    angular.module('appCatalogue').controller('paymentConfirmedCtrl', ctrl);
    ctrl.$inject = ["$scope", "$state", "$locale", "baseFactory"];
    function ctrl($scope, $state, $locale, baseFactory) {
        $timeout(function () {
            shoppingCartFactory.saveShoppingCart([]);
        }, 100);
    }
})();


(function () {

    angular.module('appOrderModule').factory('ppiOrderFactory', ppiOrderFactory);

    ppiOrderFactory.$inject = ['$rootScope', '$modal', 'FREIGHT_CONSTANTS', 'permissionFactory'];

    function ppiOrderFactory($rootScope, $modal, FREIGHT_CONSTANTS, permissionFactory) {
        return {
            formValid: formValid,
            validateItems: validateItems,
            validateDelivery: validateDelivery,
            editDeliveryAddress: editDeliveryAddress,
            displaySplitDeliveries: displaySplitDeliveries,
            updateFreight: updateFreight,
            resetSplitDeliveryItems: resetSplitDeliveryItems
        };

        function formValid(order, form, validateForQuote, deliveryRequired) {

            if (!order || !order.items || order.items.length === 0) {
                return false;
            }

            validateDelivery(order, deliveryRequired);

            if (order.uiData.deliveryInvalid) {
                return false;
            }

            if (validateForQuote) {
                return validateItems(order);
            } else {
                if (!form)
                    return false;

                if (!form.$valid) {
                    return false;
                }

                if (order.purchaseOrderNumber === null || typeof order.purchaseOrderNumber === 'undefined') {
                    return false;
                }
                return validateItems(order);
            }
        }

        function validateItems(order) {

            var itemsValid = true;

            angular.forEach(order.items, function (item) {
                if (!item.savedConfig) {
                    itemsValid = false;
                }
            });

            return itemsValid;
        }

        function validateDelivery(order, deliveryRequired) {
            var isDeliveryRequired = deliveryRequired === 'Yes';

            angular.forEach(order.items, function (orderItem, orderItemIndex) {
                angular.forEach(order.uiData.deliverySplits, function (deliverySplit) {
                    var itemMatched = false;
                    angular.forEach(deliverySplit.items, function (deliverySplitItem) {
                        if (orderItem.itemNumber.toLowerCase().trim() === deliverySplitItem.itemNumber.toLowerCase().trim() && typeof (deliverySplitItem.orderItemIndex) === "undefined" && !itemMatched) {
                            deliverySplitItem.orderItemIndex = orderItemIndex;
                            itemMatched = true;
                        }
                    });
                });
            });

            order.uiData.deliveryInvalid = false;

            if (!order.uiData.deliverySplits || order.uiData.deliverySplits.length === 0) {
                order.uiData.deliveryInvalid = isDeliveryRequired ? false : true;
                return;
            }

            angular.forEach(order.items, function (item, orderItemIndex) {
                if (order.uiData.deliveryInvalid) {
                    return;
                }

                var orderQuantity = 0;

                angular.forEach(order.uiData.deliverySplits, function (deliverySplit) {
                    angular.forEach(deliverySplit.items, function (deliverySplitItem) {
                        if (item.itemNumber.toLowerCase().trim() === deliverySplitItem.itemNumber.toLowerCase().trim() && deliverySplitItem.orderItemIndex === orderItemIndex) {
                            orderQuantity += deliverySplitItem.quantity;
                        }
                    });
                });

                if (item.quantity !== orderQuantity) {
                    order.uiData.deliveryInvalid = isDeliveryRequired ? false : true;
                }
            });
        }

        function editDeliveryAddress(order, delivery) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/catalog/checkout/editDeliveryAddress/deliveryAddress.html',
                controller: 'editDeliveryAddress',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    delivery: function () {
                        return angular.copy(delivery);
                    }
                }
            });

            modalInstance.result.then(function (updatedAddress) {
                order.delivery = updatedAddress;
            });
        }

        function displaySplitDeliveries(order, deliveryRequired) {
            resetSplitDeliveryItems(order);

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/catalog/checkout/modals/splitDeliveriesModal.html',
                controller: 'splitDeliveriesModal',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    order: function () {
                        return angular.copy(order);
                    },
                    canOverridePrice: function () {
                        return permissionFactory.hasPermission(["system.overridePricing.view"]);
                    },
                    deliveryRequired: function () {
                        return deliveryRequired === "Yes";
                    }
                }
            });

            modalInstance.result.then(function (updatedDeliverySplits) {
                order.uiData.deliverySplits = angular.copy(updatedDeliverySplits);
                validateDelivery(order, deliveryRequired);
                updateFreight(order);
            }, function () { });
        }

        function updateFreight(order) {
            resetSplitDeliveryItems(order);
            $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE);
        }

        function resetSplitDeliveryItems(order) {
            setDeliveryItems(order);
            autoSetDeliveryItemQuantityIfApplicable(order);
        }

        function setDeliveryItems(order) {
            if (!order.uiData.deliverySplits) {
                order.uiData.deliverySplits = [];
            }

            // Add any new items that may have been added to the basket
            angular.forEach(order.items, function (orderItem, orderItemIndex) {
                var itemFound = false;

                angular.forEach(order.uiData.deliverySplits, function (deliverySplit) {
                    angular.forEach(deliverySplit.items, function (deliverySplitItem) {
                        if (orderItem.itemNumber.toLowerCase().trim() === deliverySplitItem.itemNumber.toLowerCase().trim() && deliverySplitItem.orderItemIndex === orderItemIndex) {
                            itemFound = true;
                            deliverySplitItem.orderItemIndex = orderItemIndex;
                        }
                    });
                });

                angular.forEach(order.uiData.deliverySplits, function (deliverySplit) {
                    var linkedSets = [];
                    var options = [];

                    if (orderItem.linkedSets) {
                        angular.forEach(orderItem.linkedSets, function (linkedSet) {
                            linkedSets.push(linkedSet.selectedItemId);
                        });
                    }

                    if (orderItem.config && orderItem.config.selectedPrintTypeConfig && orderItem.config.selectedPrintTypeConfig.layoutConfigurations) {
                        angular.forEach(orderItem.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfig) {
                            if (layoutConfig.availableOptions) {
                                angular.forEach(layoutConfig.availableOptions, function (option) {
                                    if (options.indexOf(option.id) < 0 && option.selected) {
                                        options.push(option.id);
                                    }
                                });
                            }
                        });
                    }

                    if (itemFound) {
                        angular.forEach(deliverySplit.items, function (deliverySplitItem) {
                            if (orderItem.itemNumber.toLowerCase().trim() === deliverySplitItem.itemNumber.toLowerCase().trim() && deliverySplitItem.orderItemIndex === orderItemIndex) {
                                //deliverySplitItem.quantity = orderItem.quantity;
                                deliverySplitItem.linkedSets = linkedSets;
                                deliverySplitItem.options = options;
                            }
                        });
                    } else {
                        deliverySplit.items.push({ itemNumber: orderItem.itemNumber, quantity: orderItem.quantity, linkedSets: linkedSets, options: options, orderItemIndex: orderItemIndex });
                    }
                });
            });

            // Remove any new items that may have been added to the basket
            angular.forEach(order.uiData.deliverySplits, function (deliverySplit) {
                var deliverySplitItems = [];

                angular.forEach(order.items, function (orderItem, orderItemIndex) {
                    angular.forEach(deliverySplit.items, function (deliverySplitItem) {
                        if (orderItem.itemNumber.toLowerCase().trim() === deliverySplitItem.itemNumber.toLowerCase().trim() && deliverySplitItem.orderItemIndex === orderItemIndex) {
                            deliverySplitItems.push(deliverySplitItem);
                        }
                    });
                });

                deliverySplit.items = deliverySplitItems;
            });
        }

        function autoSetDeliveryItemQuantityIfApplicable(order) {
            if (order.items && order.uiData && order.uiData.deliverySplits && order.uiData.deliverySplits.length === 1) {
                angular.forEach(order.items, function (orderItem, orderItemIndex) {
                    angular.forEach(order.uiData.deliverySplits[0].items, function (deliverySplitItem) {
                        if (orderItem.itemNumber.toLowerCase().trim() === deliverySplitItem.itemNumber.toLowerCase().trim() && deliverySplitItem.orderItemIndex === orderItemIndex) {
                            deliverySplitItem.quantity = orderItem.quantity;
                        }
                    });
                });
            }
        }
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('checkoutItem', checkoutItem);
    checkoutItem.$inject = ['$scope', '$rootScope', 'modalFactory', 'permissionFactory', 'shoppingCartFactory', 'listFactory', 'CART_CONSTANTS', 'IMPORT_CONSTANTS', 'FREIGHT_CONSTANTS', 'pricingFactory'];

    function checkoutItem($scope, $rootScope, modalFactory, permissionFactory, shoppingCartFactory, listFactory, CART_CONSTANTS, IMPORT_CONSTANTS, FREIGHT_CONSTANTS, pricingFactory) {
        $scope.displayOverridePrice = permissionFactory.hasPermission(["system.overridePricing.view"]);
        $scope.setItemConfig = setItemConfig;
        $scope.openChangePriceModal = openChangePriceModal;
        $scope.removeItem = removeItem;
        $scope.removeArtworkApprovalFile = removeArtworkApprovalFile;
        $scope.selectedPreferencesEditable = false;
        $scope.displayOverrides = true;

        function init() {
            if (!$scope.item.artworkApprovalFiles)
                $scope.item.artworkApprovalFiles = [];

            $scope.importOptions = {
                hideImportButton: true,
                hideLabel: true,
                messageIdentifier: $scope.item.$$hashKey,
                clearAfterImport: true
                //existingDoc: angular.copy($scope.item.artworkApprovalFile)
            };
        }
        init();

        $scope.deliveryRequired = null;
        $scope.freightPrice = null;
        $scope.origFreightPrice = null;
        $scope.$onRootScope(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, function (ev, p) {
            if ($scope.deliveryRequired !== false || $scope.deliveryRequired == null) {
                $scope.origFreightPrice = p.price;
                $scope.freightPrice = angular.copy($scope.origFreightPrice);
            }
        });
        $scope.$onRootScope(FREIGHT_CONSTANTS.OVERRIDE_PRICE_DONE, function (ev, p) {
            if ($scope.deliveryRequired !== false || $scope.deliveryRequired == null) {
                $scope.origFreightPrice = p.price;
                $scope.freightPrice = angular.copy($scope.origFreightPrice);
            }
        });
        $scope.$onRootScope(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, function (ev, res) {
            $scope.deliveryRequired = res;
            $scope.freightPrice = res ? angular.copy($scope.origFreightPrice) : null;
        });

        function setItemConfig() {
            modalFactory.openItemPricingModal($scope.item, $scope.freightPrice).then(function (result) {
                if (result !== null) {
                    var isEditMode = $scope.$parent.isEditMode === true;

                    if (isEditMode) {
                        $scope.item.config = result.item.config;
                        $scope.item.kitNumber = result.item.kitNumber;
                    }

                    $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: result.item.overridePricing });
                }
            });
        }

        function removeItem(remItem) {
            modalFactory.openDeleteModal("item", remItem.itemName, "").result.then(function (rrrdata) {
                $rootScope.$emit(CART_CONSTANTS.REMOVE_ITEM_FROM_CART, remItem);
            });
        }

        function removeArtworkApprovalFile(file) {
            // console.log(file);
            if (!file)
                return;
            listFactory.remove($scope.item.artworkApprovalFiles, file);
            $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: false });
        }

        $scope.$onRootScope(IMPORT_CONSTANTS.FILE_IMPORTED + $scope.item.$$hashKey, function (e, doc) {
            var valid = true;
            angular.forEach($scope.item.artworkApprovalFiles, function (approvalFile) {
                if (doc.fileName.toLowerCase() == approvalFile.fileName.toLowerCase())
                    valid = false;
            });
            if (!valid)
                return false;
            //clear hashes so that duplicates dont appear in artworkApprovalFiles
            doc.$$hashKey = null;
            listFactory.add($scope.item.artworkApprovalFiles, doc);
            $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: false });
        });

        function openChangePriceModal() {
            modalFactory.openChangePriceModal($scope.item).then(function (updatedItem) {
                // console.log(updatedItem);
                if (updatedItem !== null) {
                    $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: updatedItem.overridePricing });
                }
            });
        }
    }
})();
angular.module('appCatalogue').directive('sageCheckoutItem',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            templateUrl: '/app/modules/catalog/checkout/directives/checkoutItem.html',
            controller: 'checkoutItem',
            link: function postLink(scope, elem, attr) {
            }
        };
    }]);
angular.module('appCatalogue').directive('sageCheckoutItemView',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            templateUrl: '/app/modules/catalog/checkout/directives/checkoutItemView.html',
            controller: 'checkoutItem',
            link: function postLink(scope, elem, attr) {
            }
        };
    }]);
(function () {
    "use strict";
    angular.module('appCatalogue').controller("layoutConfigurationPricing", layoutConfigurationPricing);
    layoutConfigurationPricing.$inject = ["$scope", "$rootScope", "$debounce", "pricingFactory", "freightFactory", "listFactory", "PPI_CONSTANTS", "FREIGHT_CONSTANTS"];
    function layoutConfigurationPricing($scope, $rootScope, $debounce, pricingFactory, freightFactory, listFactory, PPI_CONSTANTS, FREIGHT_CONSTANTS) {
        $scope.printTypeConfigIndex = typeof $scope.printTypeConfigIndex === 'undefined' ? 0 : $scope.printTypeConfigIndex;
        $scope.configureNumberOfColours = configureNumberOfColours;
        $scope.addColourToLipPrint = addColourToLipPrint;
        $scope.calculateCustomQuantity = calculateCustomQuantity;
        $scope.calculateAllPricing = calculateAllPricing;
        $scope.calculateLayoutPricing = calculateLayoutPricing;
        $scope.calculateTotal = calculateTotal;
        $scope.setQuantity = setQuantity;
        $scope.selectColour = selectColour;
        $scope.removeColour = removeColour;
        $scope.removeLipPrintColour = removeLipPrintColour;
        $scope.getMaxColours = getMaxColours;
        $scope.calculateAllTotals = calculateAllTotals;
        $scope.lipPrintSelected = lipPrintSelected;
        $scope.lipPrintOnlySelected = lipPrintOnlySelected;
        $scope.printTypeSelected = printTypeSelected;
        $scope.individualNamesSelected = individualNamesSelected;
        $scope.cartonQuantityUpdated = cartonQuantityUpdated;
        $scope.quantityUpdated = quantityUpdated;
        $scope.lipPrintOptionChanged = lipPrintOptionChanged;
        $scope.filterKits = filterKits;
        $scope.setItemConfig = $scope.$parent.setItemConfig;
        $scope.isShowFreightSample = $scope.$parent.isShowFreightSample;

        $rootScope.$on(PPI_CONSTANTS.PRICING_MODAL_SUBMITTED, function (event, submitted) {
            $scope.submitted = submitted;
        });

        init();

        function init() {
            initConfigurations();
            calculateAllPricing();

            if ($scope.item.savedConfig)
                calculateTotal();

            $scope.item.individualNameSize = ["Small", "Large"];
            $scope.item.leftRightHandUses = ["Left", "Right"];
            $scope.item.lipPrintOptions = [
                { value: null, text: "No Lip Print" },
                { value: "Lip Print Left Hand Use", text: "Lip Print Left Hand Use" },
                { value: "Lip Print Right Hand Use", text: "Lip Print Right Hand Use" },
                { value: "Lip Print Only Left Hand Use", text: "Lip Print Only Left Hand Use" },
                { value: "Lip Print Only Right Hand Use", text: "Lip Print Only Right Hand Use" }];
        }

        function cartonQuantityUpdated(printTypeConfig) {
            if (!$scope.item.config)
                return;
            var quantities = pricingFactory.getQuantityFromCarton($scope.item.config, $scope.item.cartonQuantity, printTypeConfig);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
            calculateCustomQuantity();
            calculateTotal(printTypeConfig);

            if ($scope.item.deliveryRequired) {
                $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE, { itemNumber: $scope.item.itemNumber, quantity: quantity });
            } else if ($scope.isShowFreightSample) {
                var fq = freightFactory.calculateFreightPrice($scope.item);
                $scope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, { price: fq });
            }
        }

        function quantityUpdated(printTypeConfig) {
            if (!$scope.item.config)
                return;
            var quantities = pricingFactory.getAndSetCartonQuantityFromQuantity($scope.item.config, $scope.item.quantity, printTypeConfig);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
            calculateCustomQuantity();
            calculateTotal(printTypeConfig);
        }

        function getMaxColours() {
            return pricingFactory.getMaxColoursToShow($scope.item);
        }

        function lipPrintSelected(printTypeConfig, layoutConfiguration) {
            if (layoutConfiguration.lipPrintOption.selected && !layoutConfiguration.lipPrintOption.noColours)
                layoutConfiguration.lipPrintOption.noColours = 1;
            calculateAllTotals(printTypeConfig, layoutConfiguration);
        }

        function lipPrintOnlySelected(printTypeConfig, layoutConfiguration) {
            if (layoutConfiguration.lipPrintOption.lipPrintOnly) {
                layoutConfiguration.lipPrintOption.noColours = 0;
            } else {
                layoutConfiguration.lipPrintOption.noColours = 1;
            }
            calculateAllTotals(printTypeConfig, layoutConfiguration);
        }

        function individualNamesSelected(printTypeConfig, layoutConfiguration) {
            if (layoutConfiguration.individualNamesOption.selected && !layoutConfiguration.individualNamesOption.size) {
                layoutConfiguration.individualNamesOption.size = $scope.item.individualNameSize[0];
            }
            calculateAllTotals(printTypeConfig, layoutConfiguration);
        }

        function calculateAllTotals(printTypeConfig, layoutConfiguration) {
            calculateLayoutPricing(printTypeConfig, layoutConfiguration);
            calculateTotal(printTypeConfig);
        }

        function initConfigurations() {
            pricingFactory.initConfigurations($scope.item);
            angular.forEach($scope.item.config.productPrintTypeConfigurations, function (printTypeConfig) {
                if (printTypeConfig.active)
                    $scope.item.config.selectedPrintTypeConfig = printTypeConfig;
            });
        }

        function calculateAllPricing() {
            pricingFactory.calculateAllPricing($scope.item);
        }

        function calculateLayoutPricing(printTypeConfig, layoutConfiguration) {
            pricingFactory.calculateLayoutPricing($scope.item, layoutConfiguration, printTypeConfig);
        }

        function calculateCustomQuantity() {
            pricingFactory.calculateCustomQuantity($scope.item);
        }

        function setQuantity(quantity) {
            var quantities = pricingFactory.getAndSetCartonQuantityFromQuantity($scope.item.config, quantity);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;

            calculateCustomQuantity();

            if ($scope.item.deliveryRequired) {
                $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE, { itemNumber: $scope.item.itemNumber, quantity: quantity });
            } else if ($scope.isShowFreightSample) {
                var fq = freightFactory.calculateFreightPrice($scope.item);
                $scope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, { price: fq });
            }
        }

        function calculateTotal(printTypeConfig) {
            pricingFactory.calculateTotal($scope.item, printTypeConfig);
        }

        //should select the number of colours for all print types
        function selectColour(printTypeConfig, layoutConfiguration, selectedColour) {
            pricingFactory.selectColour($scope.item, printTypeConfig, layoutConfiguration, selectedColour.id);
            setTimeout(function () {
                $scope.item.config.selectedPrintTypeConfig = printTypeConfig;
            }, 100);
            // $scope.$emit(FREIGHT_CONSTANTS.FREIGHT_TOGGLE);
            // $scope.$emit(FREIGHT_CONSTANTS.FREIGHT_PRICE_TOGGLE);
        }

        function printTypeSelected(printTypeConfig) {
            $scope.item.config.selectedPrintTypeConfig = printTypeConfig;
            pricingFactory.printTypeSelected(printTypeConfig, $scope.item);
        }

        function validateColours(positionName) {
            positionName.error = null;
            angular.forEach(positionName.coloursUsed, function (colour) {
                if (colour.name.toLowerCase() === positionName.colourToAdd.toLowerCase()) {
                    positionName.error = "Colour already added";
                }
            });
            return !positionName.error;
        }

        function configureNumberOfColours(positionName, printTypeConfig, position) {
            printTypeConfig.total = null;
            var noColours = positionName.noColours || 0;

            if (!positionName.coloursUsed) {
                positionName.coloursUsed = [];
            }

            var coloursUsed = [];

            for (var i = 0; i < parseInt(noColours); i++) {
                var colourToAdd;

                if (positionName.coloursUsed.length > i) {
                    colourToAdd = positionName.coloursUsed[i].name;
                } else {
                    colourToAdd = "Colour " + (i + 1).toString();
                }

                listFactory.add(coloursUsed, { name: colourToAdd });
            }

            positionName.coloursUsed = coloursUsed;

            pricingFactory.selectColourFromNoColoursUsed($scope.item, printTypeConfig, position);
        }

        function addColourToLipPrint(positionName, printTypeConfig, layoutConfiguration) {
            if (!layoutConfiguration.lipPrintOption.noColours) {
                layoutConfiguration.lipPrintOption.noColours = 0;
            }

            if (!positionName.coloursUsed) {
                positionName.coloursUsed = [];
            }

            if (!validateColours(positionName)) {
                return;
            }

            listFactory.add(positionName.coloursUsed, { name: positionName.colourToAdd });

            layoutConfiguration.lipPrintOption.noColours = positionName.coloursUsed.length;

            // console.log(positionName);
            positionName.colourToAdd = null;
            pricingFactory.selectColourFromNoColoursUsed($scope.item, printTypeConfig, layoutConfiguration.selectedPosition);
        }
        function removeLipPrintColour(lipPrintOption, colourUsed, printTypeConfig, position) {
            if (!lipPrintOption.noColours) {
                lipPrintOption.noColours = 0;
            }
            removeColour(lipPrintOption, colourUsed, printTypeConfig, position);
            lipPrintOption.noColours = lipPrintOption.coloursUsed.length;
        }
        function removeColour(positionName, colourUsed, printTypeConfig, position) {
            listFactory.remove(positionName.coloursUsed, colourUsed);
            pricingFactory.selectColourFromNoColoursUsed($scope.item, printTypeConfig, position);
        }

        function lipPrintOptionChanged(printTypeConfig, layoutConfiguration) {
            // console.log(printTypeConfig, layoutConfiguration);
            if (layoutConfiguration.lipPrintOption && layoutConfiguration.lipPrintOption.option) {
                layoutConfiguration.lipPrintOption.selected = true;
                layoutConfiguration.lipPrintOption.lipPrintOnly = layoutConfiguration.lipPrintOption.option.indexOf("Only") > -1;
            } else {
                layoutConfiguration.lipPrintOption = layoutConfiguration.lipPrintOption || {};
                layoutConfiguration.lipPrintOption.selected = false;
            }
            lipPrintOnlySelected(printTypeConfig, layoutConfiguration);
        }

        function filterKits(opt) {
            return function (item) {
                if (typeof opt === 'undefined')
                    return true;
                if (typeof opt.description === 'undefined')
                    return true;
                if (typeof item.description === 'undefined')
                    return true;
                if (opt.description === null || item.description === null)
                    return true;

                // Count how many print
                var paragraph = item.description;
                var regex1 = / print/gi;
                var regex2 = / unprint/gi;
                var found1 = paragraph.match(regex1) || [];
                var found2 = paragraph.match(regex2) || [];

                if (opt.description.toLowerCase() === "undecorated") {
                    if (found1.length === 0)
                        return true;
                    if (found1.length > 0 && found2.length > 0)
                        return false;
                    if (found2.length > 0)
                        return true;
                    return false;
                } else if (opt.description.toLowerCase() === "front and rear print") {
                    var regexx1 = /single print|single unprint| rear | fr unprint| fr cover/gi;
                    var foundd1 = paragraph.match(regexx1) || [];
                    if (foundd1.length > 0)
                        return false;
                    var regexx11 = /unprint/gi;
                    var foundd11 = paragraph.match(regexx11) || [];
                    if (foundd11.length > 1)
                        return false;
                    return true;
                } else if (opt.description.toLowerCase() === "rear print only") {
                    var regexx2 = /fr printed|single unprint| fr cover/gi;
                    var foundd2 = paragraph.match(regexx2) || [];
                    if (foundd2.length > 0)
                        return false;
                    var regexx22 = /unprint/gi;
                    var foundd22 = paragraph.match(regexx22) || [];
                    if (foundd22.length > 1)
                        return false;
                    return true;
                } else {
                    return true;
                }
            };
        }

        $scope.updateItemColour = function () {
            $rootScope.$broadcast('$itemColour:updated');
        };

        $scope.openPricingTab = function () {
            $scope.$emit('::OPEN-PRICING-TAB');
        };

        // console.log($scope.printTypeConfig);
        // console.log($scope.layoutConfiguration);
        $scope.configChanged = function () {
            $debounce(function () {
                $scope.$emit("::ITEM-CONFIG-CHANGED");
            }, 500);
        }
    }
})();
angular.module('appCatalogue').directive('sageLayoutConfigurationPricing',
    [
        function () {
            return {
                restrict: 'E',
                replace: true,
                transclude: true,
                scope: {
                    item: '=',
                    printTypeConfig: '=',
                    layoutConfiguration: '=',
                    printTypeConfigIndex: '=?',
                    itemIndex: '=?',
                    isModal: '=?'
                },
                templateUrl: '/app/modules/catalog/checkout/directives/layoutConfigurationPricing.html',
                controller: 'layoutConfigurationPricing',
                link: function (scope, elem, attr) {
                }
            };
        }]);
angular.module('appCatalogue').directive('sageLayoutConfigurationPricingSimple',
    [
        function () {
            return {
                restrict: 'E',
                replace: true,
                transclude: true,
                scope: {
                    item: '=',
                    printTypeConfig: '=',
                    layoutConfiguration: '=',
                    printTypeConfigIndex: '=?',
                    itemIndex: '=?'
                },
                templateUrl: '/app/modules/catalog/checkout/directives/layoutConfigurationPricingSimple.html',
                controller: 'layoutConfigurationPricing',
                link: function (scope, elem, attr) {
                }
            };
        }]);
(function () {
    'use strict';
    angular.module('appCatalogue').controller('selectedPreferencesCtrl', selectedPreferencesCtrl);
    selectedPreferencesCtrl.$inject = ["$rootScope", "$scope", "$filter", "$timeout", "$debounce", "CART_CONSTANTS", "baseFactory", "pricingFactory", "freightFactory", "FREIGHT_CONSTANTS"];
    function selectedPreferencesCtrl($rootScope, $scope, $filter, $timeout, $debounce, CART_CONSTANTS, baseFactory, pricingFactory, freightFactory, FREIGHT_CONSTANTS) {

        $scope.selectedPreferencesEditable = $scope.$parent.selectedPreferencesEditable === true;
        $scope.displayOverrides = $scope.$parent.displayOverrides;
        $scope.isDisplayNumberField = $scope.$parent.printTypeConfig;
        $scope.unitPriceLabel = "Unit Price (Including options and setup)";
        $scope.item.config.additionalItemsTotalPrice = 0;
        $scope.item.additionalItemsTotalPrice = 0;
        $scope.dynamicPopover = {
            html: null
        };
        $scope.freightPrice = null;

        var quantities = pricingFactory.getAndSetCartonQuantityFromQuantity($scope.item.config, $scope.item.quantity, $scope.printTypeConfig);
        $scope.item.cartonQuantity = quantities.cartonQuantity;
        $scope.item.quantity = quantities.quantity;

        $scope.minQuantity = 0;
        if ($scope.item.config.unitPrices.length > 0)
            $scope.minQuantity = $scope.item.config.unitPrices[0].minQuantity;

        if ($scope.item.config.additionalItems)
            if ($scope.item.config.additionalItems.length > 0) {
                angular.forEach($scope.item.config.additionalItems, function (i) {
                    $scope.item.config.additionalItemsTotalPrice += i.totalPrice;
                    $scope.item.additionalItemsTotalPrice += i.totalPrice;
                });
            }

        $scope.showSelectedColour = function (colours) {
            var colour = {
                displayName: ""
            };
            angular.forEach(colours, function (clr) {
                if (clr.selected) {
                    colour = angular.copy(clr);
                }
            });
            return colour.displayName;
        };
        var generateFreightPriceBreakdown = function (arr) {
            var html = [];
            angular.forEach(arr, function (ds, i) {
                var body = [];
                angular.forEach(ds.items, function (item, ii) {
                    if (ds.freightResult) {
                        var cols = [];
                        cols.push('<td class="ellipsis">' + item.itemNumber + '</td>');
                        cols.push('<td class="ellipsis">' + (item.itemName || '') + '</td>');
                        cols.push('<td class="ellipsis text-center">' + item.quantity + '</td>');
                        cols.push('<td class="ellipsis text-center">' + item.cartonQuantity + '</td>');
                        cols.push('<td class="ellipsis text-right">' + $filter('currency')(ds.freightResult.results[ii].totalBeforeTax) + '</td>');
                        cols.push('<td class="ellipsis">' + ds.freightResult.results[ii].fromZone + '</td>');
                        cols.push('<td class="ellipsis">' + ds.freightResult.results[ii].toZone + '</td>');
                        body.push('<tr>' + cols.join('') + '</tr>');
                    }
                });
                var header = [
                    '<tr>',
                    '<th class="text-nowrap">Item #</th>',
                    '<th class="text-nowrap">Item Desc</th>',
                    '<th class="text-nowrap">Quantity</th>',
                    '<th class="text-nowrap">Cartons</th>',
                    '<th class="text-nowrap">Cost</th>',
                    '<th class="text-nowrap">From</th>',
                    '<th class="text-nowrap">To</th>',
                    '</tr>'
                ];
                var phtml = '<h5>Freight to ' + ds.location.description + '</h5>' +
                    '<table class="table table-condensed mBottom0 table-popover">' +
                    '<thead>' + header.join('') + '</thead>' +
                    '<tbody>' + body.join('') + '</tbody>' +
                    '</table>';
                html.push(phtml);
            });
            return html.join('');
        };
        //
        $scope.updateOverridePricing = function (itm, printTypeConfig) {
            if (itm.quantity >= $scope.minQuantity) {
                pricingFactory.calculateAllPricing(itm);
                pricingFactory.calculateTotal(itm, printTypeConfig);

                if ($scope.item.deliveryRequired) {
                    $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE, { itemNumber: itm.itemNumber, quantity: itm.quantity });
                } else if ($scope.$parent.$parent.$parent.isShowFreightSample) {
                    var fq = freightFactory.calculateFreightPrice(itm, function (fq) {
                        $scope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, { price: fq });
                    });
                }
                $debounce(function () {
                    $scope.$emit("::ITEM-CONFIG-CHANGED");
                }, 500);
            }
        };
        $scope.pricePerUnitCalc = function (item, displayOverrides, printTypeConfig) {
            var quantity = item.config.selectedPrintTypeConfig.overridePricing && displayOverrides ? printTypeConfig.overriddenQuantity : item.quantity;
            var grantTotal = $scope.grandTotal(item, displayOverrides, printTypeConfig);
            return grantTotal / quantity;
        };
        $scope.grandTotal = function (item, displayOverrides, printTypeConfig) {
            var total = item.config.selectedPrintTypeConfig.overridePricing && displayOverrides ?
                printTypeConfig.overriddenTotal + item.config.additionalItemsTotalPrice :
                (printTypeConfig.total - item.config.discountAmount) + item.config.additionalItemsTotalPrice;

            $scope.unitPriceLabel = "Unit Price (including options and setup)";
            if ($scope.freightPrice) {
                $scope.unitPriceLabel = "Unit Price (including options, setup and freight)";
                total += $scope.freightPrice;
            }
            // $scope.$emit("::ITEM-CONFIG-CHANGED");
            $scope.paramExport.grandTotal = total;
            return total;
        };
        $scope.$watchCollection('item', function (v) {
            // console.log('item changed');
        });
        $scope.$watchCollection('printTypeConfig', function (v) {
            $debounce(function () {
                $scope.$emit("::ITEM-CONFIG-CHANGED");
                // update unitPrice
                $scope.paramExport.up = $scope.item.config.selectedPrintTypeConfig.overridePricing && $scope.displayOverrides ? parseFloat(v.overriddenUnitPrice.toFixed(3)) : parseFloat(v.unitPrice.toFixed(3));
                $scope.paramExport.sf = $scope.item.config.selectedPrintTypeConfig.overridePricing && $scope.displayOverrides ? parseFloat(v.overriddenSetupTotal.toFixed(3)) : parseFloat(v.setupTotal.toFixed(3));
                $scope.paramExport.fr = parseFloat($scope.freightPrice.toFixed(3));
            }, 500);
        });
        $scope.$watchCollection('freightPrice', function (v) {
            $debounce(function () {
                $scope.$emit("::ITEM-CONFIG-CHANGED");
                $scope.paramExport.fr = parseFloat($scope.freightPrice.toFixed(3));
            }, 500);
        });

        var getFreightItemPrice = function (splits) {
            var total = 0;
            for (var i = 0; i < splits.length; i++) {
                for (var ii = 0; ii < splits[i].items.length; ii++) {
                    var itm = splits[i].items[ii];
                    // console.log('a', $scope.item.itemNumber, itm.itemNumber, $scope.item.quantity, itm.quantity);
                    if ($scope.item.itemNumber === itm.itemNumber && $scope.item.quantity === itm.quantity) {
                        total = angular.copy(splits[i].freightResult.results[ii].totalBeforeTax);
                        break;
                    }
                }
            }
            return total;
        };

        $scope.paramExport = {
            itemNumber: $scope.item.itemNumber,
            up: null,
            sf: null,
            fr: null,
            upm: null,
            sfm: null,
            frm: null,
            loc: null,
            advanced: true,
            issave: false,
            fileFolder: null,
            fileName: null,
            photoThumbnailUrl: null,
            isUploaded: false
        };
        if ($rootScope.user.impersonateCustomerId || $rootScope.user.customerId) {
            baseFactory.fetch('/api/customer/get/' + ($rootScope.user.impersonateCustomerId || $rootScope.user.customerId)).then(function (rdata) {
                $scope.paramExport.customerId = $rootScope.user.impersonateCustomerId || $rootScope.user.customerId;
                $scope.paramExport.photoThumbnailUrl = rdata.object.details.photoThumbnailUrl;
                $scope.paramExport.isUploaded = rdata.object.details.photoThumbnailUrl !== null;
                if ($scope.paramExport.isUploaded) {
                    $scope.paramExport.fileName = rdata.object.details.photoThumbnailUrl;
                }
            });
        }
        $scope.disabledExportButton = false;
        $scope.exportBtnTxt = "Export Report";
        $scope.exportReport = function (item, printTypeConfig, displayOverrides, fr, loc, pe) {
            // console.log($rootScope.user);
            var dataToSend = {
                customerId: pe.customerId,
                itemNumber: item.itemNumber,
                quantity: item.quantity,
                cartonQuantity: item.cartonQuantity,
                unitPrice: pe.up,
                unitPriceMarkUp: pe.upm,
                logo: null,
                isSaveCompanyLogo: pe.issave,
                grandTotal: parseFloat(pe.grandTotal.toFixed(3)),
                additionalItems: [],
                layoutConfigurations: []
            };
            if (pe.fileName !== null && pe.fileFolder !== null && pe.isUploaded) {
                dataToSend.logo = {
                    fileFolder: pe.fileFolder,
                    fileName: pe.fileName
                };
            }
            //
            if (fr !== null && fr > 0) {
                dataToSend.freight = null;
                dataToSend.freight = fr;
                dataToSend.freightMarkUp = pe.frm;
                dataToSend.freightLocation = loc;
            }
            if (item.isRepeat) {
                dataToSend.setupFee = null;
                dataToSend.setupFeeMarkUp = null;
                dataToSend.repeatFee = pe.sf;
                dataToSend.repeatFeeMarkUp = pe.sfm;
            } else {
                dataToSend.setupFee = pe.sf;
                dataToSend.setupFeeMarkUp = pe.sfm;
                dataToSend.repeatFee = null;
                dataToSend.repeatFeeMarkUp = null;
            }
            //
            if (typeof item.config.selectedPrintTypeConfig !== 'undefined' &&
                item.config.selectedPrintTypeConfig.overridePricing && displayOverrides) {
                dataToSend.quantity = printTypeConfig.overriddenQuantity;
                dataToSend.unitPrice = printTypeConfig.overriddenUnitPrice;
                if (item.isRepeat) {
                    dataToSend.repeatFee = printTypeConfig.overriddenSetupTotal;
                } else {
                    dataToSend.setupFee = printTypeConfig.overriddenSetupTotal;
                }
            }
            //
            if (item.config.discountAmount) {
                dataToSend.discountAmount = item.config.discountAmount;
            }
            //
            var i = 0;
            if (item.config.additionalItems !== null && item.config.additionalItems.length > 0) {
                for (i = 0; i < item.config.additionalItems.length; i++)
                    dataToSend.additionalItems.push({
                        itemNumber: item.config.additionalItems[i].itemNumber,
                        itemName: item.config.additionalItems[i].itemName,
                        totalPrice: item.config.additionalItems[i].totalPrice
                    });
            }
            if (printTypeConfig.layoutConfigurations !== null && printTypeConfig.layoutConfigurations.length > 0) {
                for (i = 0; i < printTypeConfig.layoutConfigurations.length; i++) {
                    var lc = printTypeConfig.layoutConfigurations[i];
                    var nlc = {
                        name: lc.name,
                        position: lc.selectedPosition.description,
                        colours: $scope.showSelectedColour(lc.selectedPosition.colours, $scope.$parent),
                        colourPrints: [],
                        metallicPaints: [],
                        selectedOptions: []
                    };
                    var z = 0;
                    //
                    if (typeof printTypeConfig.printTypeDescription !== 'undefined') {
                        nlc.colours = printTypeConfig.printTypeDescription + ' - ' + nlc.colours;
                    }
                    //
                    if (typeof lc.selectedPosition !== 'undefined')
                        if (lc.selectedPosition.positionNames !== null && lc.selectedPosition.positionNames.length > 0) {
                            for (z = 0; z < lc.selectedPosition.positionNames.length; z++) {
                                var pn = lc.selectedPosition.positionNames[z];
                                if (pn.noMetallicPaints > 0) {
                                    var mp = {
                                        name: pn.name + " Metallic Colours",
                                        count: pn.noMetallicPaints
                                    };
                                    nlc.metallicPaints.push(mp);
                                } else if (lc.selectedPosition.selectedColour.coloursRequired && typeof lc.lipPrintOption === 'undefined') {
                                    var cp = {
                                        name: pn.name,
                                        count: pn.noColours,
                                        colours: []
                                    };
                                    if (pn.coloursUsed !== null && pn.noColours > 0) {
                                        for (var x = 0; x < pn.coloursUsed.length; x++) {
                                            cp.colours.push(pn.coloursUsed[x].name);
                                        }
                                        nlc.colourPrints.push(cp);
                                    }
                                }
                            }
                        }
                    //
                    if (typeof lc.availableOptions !== 'undefined' && lc.availableOptions.length > 0) {
                        for (z = 0; z < lc.availableOptions.length; z++) {
                            if (lc.availableOptions[z].selected)
                                nlc.selectedOptions.push(lc.availableOptions[z].description);
                        }
                    }
                    //
                    if (typeof lc.lipPrintOption !== 'undefined')
                        if (lc.lipPrintOption.selected) {
                            nlc.lipPrint = {
                                name: lc.lipPrintOption.option,
                                count: lc.lipPrintOption.noColours,
                                colours: []
                            };
                            if (lc.lipPrintOption.noColours > 0) {
                                for (z = 0; z < lc.lipPrintOption.coloursUsed.length; z++) {
                                    nlc.lipPrint.colours.push(lc.lipPrintOption.coloursUsed[z].name);
                                }
                            }
                        }
                    //
                    if (typeof lc.individualNamesOption !== 'undefined')
                        if (lc.individualNamesOption.selected) {
                            nlc.individualNames = lc.individualNamesOption.size;
                        }
                    dataToSend.layoutConfigurations.push(nlc);
                }
            }
            //
            if ($scope.isShowPricePerUnit) {
                dataToSend.unitPriceLabel = {
                    name: $scope.unitPriceLabel,
                    price: parseFloat($scope.pricePerUnitCalc(item, displayOverrides, printTypeConfig).toFixed(3))
                };
            }

            $scope.disabledExportButton = true;
            $scope.exportBtnTxt = "Exporting...";
            baseFactory.post('/report/ppiexportproductdata', dataToSend).then(function (data) {
                if (!data.isErrored) {
                    window.location.href = '/report/ppiexportproduct?' + $rootScope.jsonToQueryString({ fileName: data.Object.FileName, fileFolder: data.Object.FileFolder });
                }
                $scope.disabledExportButton = false;
                $scope.exportBtnTxt = "Export Report";
            });
        };
        var isImageValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["png", "jpg", "jpeg"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.onImageSelect = function ($files) {
            if (isImageValid($files[0].name)) {
                $scope.disabledExportButton = false;
                $scope.exportBtnTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.paramExport.fileFolder = data.object.fileFolder;
                            $scope.paramExport.fileName = data.object.fileName;
                            $scope.paramExport.isUploaded = true;
                        }
                        $scope.disabledExportButton = false;
                        $scope.exportBtnTxt = "Export Report";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        $scope.changeFile = function () {
            $scope.paramExport.isUploaded = false;
            $scope.paramExport.fileFolder = "";
            $scope.paramExport.fileName = "";
            $scope.resetInputFile();
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file' && elems[i].name === 'photoFile') {
                    elems[i].value = null;
                }
            }
        };

        var f1 = $scope.$onRootScope(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, function (ev, res) {
            $scope.freightPrice = res.price;
            if (res.data) {
                $scope.dynamicPopover.html = generateFreightPriceBreakdown(res.data.order.uiData.deliverySplits);
            }
        });
        var f2 = $scope.$onRootScope(FREIGHT_CONSTANTS.TEMP_UPDATE_FREIGHT_PRICE, function (ev, res) {
            $scope.freightPrice = res.price;
        });
        var f3 = $scope.$onRootScope(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, function (ev, res) {
            if (!res) {
                $scope.freightPrice = null;
                $scope.freightTotalPrice = null;
            }
        });
        $scope.$on('$destroy', function () {
            f1;
            f2;
            f3;
        });
    }
})();
angular.module('appCatalogue').directive('selectedPreferences',
    [
        function () {
            return {
                restrict: 'E',
                replace: true,
                scope: {
                    printTypeConfig: '=',
                    item: '=',
                    isShowPricePerUnit: '=?',
                    freightPrice: '=?',
                    showProductExport: '=?'
                },
                templateUrl: function (tElement, tAttrs) {
                    if (typeof tAttrs.showProductExport !== 'undefined')
                        return '/app/modules/catalog/checkout/directives/selectedPreferencesWithExport.html';
                    else
                        return '/app/modules/catalog/checkout/directives/selectedPreferences.html';
                },
                controller: 'selectedPreferencesCtrl'
            };
        }
    ]);
(function () {
    angular.module('appCatalogue').controller('editDeliveryAddress', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'delivery'];

    function ctrl($scope, $rootScope, $modalInstance, baseFactory, delivery) {
        $scope.getLocations = getLocations;
        $scope.delivery = delivery;

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        function getLocations(filterStr) {
            return baseFactory.typeAheadFetch('/api/locations/Get', filterStr);
        };
        
        if (delivery != null && $scope.delivery.state != null) {
            $scope.delivery.state = $scope.delivery.state.replace(/\s+/g, '');
        }
        
        $scope.ok = function (delivery) {
            $modalInstance.close(delivery);
        }

    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('changePriceModal', changePriceModal);
    changePriceModal.$inject = ['$scope', '$modalInstance', 'pricingFactory', 'item'];

    function changePriceModal($scope, $modalInstance, pricingFactory, item) {
        // console.log(item)
        $scope.save = save;
        $scope.cancel = cancel;
        init();

        function init() {
            $scope.item = angular.copy(item);
            $scope.item.config.selectedPrintTypeConfig.overriddenUnitPrice = parseFloat(($scope.item.config.selectedPrintTypeConfig.overriddenUnitPrice).toFixed(3));
            $scope.item.config.selectedPrintTypeConfig.overriddenSetupTotal = parseFloat(($scope.item.config.selectedPrintTypeConfig.overriddenSetupTotal).toFixed(3));
            $scope.item.config.selectedPrintTypeConfig.overriddenQuantity = parseInt(item.config.selectedPrintTypeConfig.overriddenQuantity || item.quantity);
        }

        function cancel() {
            $modalInstance.dismiss('cancel');
        }

        function save(form) {
            $scope.submitted = true;

            if (!form.$valid)
                return;

            // As we are saving, update the properties on the original (not copied) item passed into this controller
            item.overridePricing = $scope.item.config.selectedPrintTypeConfig.overridePricing;
            item.config.selectedPrintTypeConfig.overridePricing = $scope.item.config.selectedPrintTypeConfig.overridePricing;
            item.config.selectedPrintTypeConfig.overriddenUnitPrice = $scope.item.config.selectedPrintTypeConfig.overriddenUnitPrice;
            item.config.selectedPrintTypeConfig.overriddenSetupTotal = $scope.item.config.selectedPrintTypeConfig.overriddenSetupTotal;
            item.config.selectedPrintTypeConfig.overriddenTotal = parseFloat($scope.item.config.selectedPrintTypeConfig.overriddenQuantity) * parseFloat(item.config.selectedPrintTypeConfig.overriddenUnitPrice) + parseFloat(item.config.selectedPrintTypeConfig.overriddenSetupTotal);
            item.config.selectedPrintTypeConfig.overriddenQuantity = $scope.item.config.selectedPrintTypeConfig.overriddenQuantity;
            //item.quantity = $scope.item.config.selectedPrintTypeConfig.overriddenQuantity;

            $modalInstance.close(item);
        }
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('productConfigModal', productConfigModal);
    productConfigModal.$inject = ['$scope', '$rootScope', '$modalInstance', '$controller', 'item', 'freight', 'isShowFreightSample'];
    function productConfigModal($scope, $rootScope, $modalInstance, $controller, item, freight, isShowFreightSample) {
        angular.extend(this, $controller('ProductConfigModalAdvacedCtrl', {
            $scope: $scope,
            item: item,
            freight: freight,
            isShowFreightSample: isShowFreightSample
        }));

        $scope.cancelModal = function () {
            $modalInstance.dismiss('cancel');
        };
        $scope.saveAndClose = function (config) {
            $modalInstance.close({ config: config, item: $scope.item, itemConfig: $scope.item.config });
        };
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('ProductConfigModalAdvacedCtrl', productConfigModal);
    productConfigModal.$inject = ['$scope', '$rootScope', '$timeout', 'baseFactory', 'pricingFactory', 'permissionFactory', 'item', 'freight', 'isShowFreightSample', 'PPI_CONSTANTS', 'FREIGHT_CONSTANTS'];
    function productConfigModal($scope, $rootScope, $timeout, baseFactory, pricingFactory, permissionFactory, item, freight, isShowFreightSample, PPI_CONSTANTS, FREIGHT_CONSTANTS) {
        var userRoles = angular.copy($rootScope.user.roles);
        for (var i = 0; i < userRoles.length; i++) {
            userRoles[i] = userRoles[i].toLowerCase();
        }

        var grandTotalPrice = 0;
        $scope.mForm = {};
        $scope.save = save;
        $scope.applySave = save;
        $scope.cancel = cancel;
        $scope.printTypeSelected = printTypeSelected;
        $scope.selectedPreferencesEditable = true;
        $scope.displayOverrides = false;
        $scope.activeTab = null;
        $scope.enableAddItems = $rootScope.clientName && ($rootScope.clientName.toLowerCase() === "ppi" ||
            $rootScope.clientName.toLowerCase() === "kingpin" || ($rootScope.user.isSysAdmin || userRoles.indexOf('company admin') >= 0 || userRoles.indexOf('company user') >= 0));
        if (permissionFactory.isClient())
            $scope.enableAddItems = false;
        $scope.sageItems = []; //order.sageItems;
        $scope.orderItem = {};
        $scope.totalPrice = 0;
        $scope.isLoading = false;
        $scope.isFreightLookup = false;
        $scope.isModal = typeof $scope.itemPricingOnSave === 'undefined';
        // console.log($scope.isModal);

        if ($scope.enableAddItems) {
            $scope.isLoading = true;
            baseFactory.fetch('/api/order/GetCreateUpdateOrderModel').then(function (data) {
                if (!data.isErrored) {
                    // console.log(data.object)
                    $scope.sageItems = data.object.sageItems;
                    init();
                }
            });
        } else {
            init();
        }

        function init() {
            $scope.deliveryRequired = false;
            $scope.origFreightPrice = angular.copy(freight);
            $scope.freightPrice = angular.copy(freight);
            $scope.item = angular.copy(item);
            $scope.item.deliveryRequired = freight ? true : false;
            $scope.isShowFreightSample = isShowFreightSample;
            if (typeof $scope.item.config !== "undefined") {
                if ($scope.item.config.productPrintTypeConfigurations == null)
                    $scope.item.config.productPrintTypeConfigurations = [];
                if ($scope.item.config.productPrintTypeConfigurations.length > 0) {
                    if (!$scope.item.config.selectedPrintTypeConfig)
                        $scope.item.config.selectedPrintTypeConfig = $scope.item.config.productPrintTypeConfigurations[0];
                    $scope.activeTab = angular.copy($scope.item.config.selectedPrintTypeConfig);
                }
            }

            if (!$scope.item.config) {
                var itemNumbers = [];

                var linkedItemNumber;
                if ($scope.item.linkedSets) {
                    angular.forEach($scope.item.linkedSets, function (linkedSet) {
                        //need to get the pricing from the linked item
                        if (linkedSet.pricingOnLinkedItem)
                            linkedItemNumber = linkedSet.selectedItemId;
                    });
                }
                itemNumbers.push({
                    itemNumber: item.itemNumber,
                    pricingLinkedItemNumber: linkedItemNumber
                });

                return baseFactory.call('/api/productConfigurations/RetrieveProductConfigurations', itemNumbers).then(function (data) {
                    if (!data.isErrored) {
                        angular.forEach(data.object, function (config) {
                            if ($scope.item.itemNumber === config.id) {
                                $scope.item.config = config;
                                selectLinkedItems($scope.item);
                            }
                        });
                        $scope.item.config.readonly = false;
                        if (typeof $scope.item.config.additionalItems === "undefined") {
                            $scope.item.config.additionalItems = [];
                            $scope.item.config.additionalItemsTotalPrice = 0;
                        } else {
                            $scope.item.config.additionalItemsTotalPrice = 0;
                            angular.forEach($scope.item.config.additionalItems, function (i) {
                                $scope.item.config.additionalItemsTotalPrice += i.totalPrice;
                            });
                        }
                        setWatchers();
                    }

                    $scope.isLoading = false;
                });
            } else {
                $scope.item.config.readonly = false;
                if (typeof $scope.item.config.additionalItems === "undefined") {
                    $scope.item.config.additionalItems = [];
                    $scope.item.config.additionalItemsTotalPrice = 0;
                } else {
                    $scope.item.config.additionalItemsTotalPrice = 0;
                    angular.forEach($scope.item.config.additionalItems, function (i) {
                        $scope.item.config.additionalItemsTotalPrice += i.totalPrice;
                    });
                }
                setWatchers();

                $scope.isLoading = false;
            }
        }

        function selectLinkedItems(item) {
            if (item.config.linkedSets && item.linkedSets) {
                angular.forEach(item.config.linkedSets, function (configLinkedSet) {
                    angular.forEach(item.linkedSets, function (linkedSet) {
                        if (configLinkedSet.id == linkedSet.setId) {
                            angular.forEach(configLinkedSet.linkedItems, function (linkedItem) {
                                if (linkedItem.id == linkedSet.selectedItemId)
                                    configLinkedSet.selectedLinkedItem = linkedItem;
                            });
                        }
                    });
                });
            }
        }

        function cancel() {
            if (typeof $scope.onDismiss !== 'undefined') {
                $scope.onDismiss();
            } else {
                $scope.cancelModal();
            }
        }

        function calculateTotal(printTypeConfig) {
            $scope.item.quantity = angular.copy($scope.item.quantity || item.quantity);
            pricingFactory.calculateTotal($scope.item, printTypeConfig);
        }

        function validate(config) {
            $scope.error = null;

            if (config.quantity <= 0) {
                $scope.error = 'Quantity must be a positive number';
            }

            angular.forEach(config.layoutConfigs, function (layoutConfig) {
                var noColours = 0;
                var totalMetallicsUsed = 0;
                angular.forEach(layoutConfig.positionNames, function (positionName) {
                    if (positionName.noColours && !isNaN(positionName.noColours))
                        noColours += parseInt(positionName.noColours);
                    if (positionName.noMetallicPaints && !isNaN(positionName.noMetallicPaints))
                        totalMetallicsUsed += parseInt(positionName.noMetallicPaints);
                });

                if (noColours < totalMetallicsUsed) {
                    $scope.error = 'You cannot have more metallic colours than colours';
                }
            });

            return !$scope.error;
        }

        function printTypeSelected(printTypeConfig) {
            if (printTypeConfig === null) {
                $scope.activeTab = null;
            } else {
                // THIS IS TO RESET FROM ITS ORIGINAL QUANTITY BEFORE ITS BEEN MODIFIED BASED ON PRINTTYPECONFIG
                $scope.item.cartonQuantity = angular.copy(item.cartonQuantity);
                $scope.item.quantity = angular.copy(item.quantity);
                //
                $scope.activeTab = printTypeConfig;
                pricingFactory.printTypeSelected(printTypeConfig, $scope.item);

                // Update quantities
                $scope.item.quantities = [];
                angular.forEach(printTypeConfig.layoutConfigurations[0].selectedPosition.colours[0].tablePrices, function (tp) {
                    $scope.item.quantities.push({ quantity: tp.minQuantity, price: null });
                });
                if ($scope.item.deliveryRequired)
                    $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE, { itemNumber: $scope.item.itemNumber, quantity: $scope.item.quantity });
            }
        }

        $scope.$onRootScope(FREIGHT_CONSTANTS.TEMP_UPDATE_FREIGHT_PRICE, function (ev, res) {
            $scope.isFreightLookup = res.price !== null;
        });

        $scope.printTypeClicked = function () {
            $scope.$emit(FREIGHT_CONSTANTS.FREIGHT_PRICE_TOGGLE);
        };
        function save(form, addToCart) {
            $scope.submitted = true;
            $rootScope.$emit(PPI_CONSTANTS.PRICING_MODAL_SUBMITTED, $scope.submitted);

            if (!form.$valid)
                return;
            try {
                addToCart = typeof addToCart === 'undefined' ? true : addToCart;
                // This config ends up becomming the savedConfig on the object posted to the server. I.e. order.items[i].savedConfig
                var config = {
                    quantity: $scope.item.quantity,
                    cartonQuantity: $scope.item.cartonQuantity,
                    printTypeId: $scope.item.config.selectedPrintTypeConfig.printTypeId,
                    isRepeat: $scope.item.isRepeat,
                    total: $scope.item.config.selectedPrintTypeConfig.total,
                    layoutConfigs: [],
                    kitNumber: $scope.item.kitNumber
                };

                angular.forEach($scope.item.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfig) {
                    var layoutConfigToSave = {
                        name: layoutConfig.name,
                        positionId: layoutConfig.selectedPosition.id,
                        positionNames: layoutConfig.selectedPosition.positionNames,
                        noColours: layoutConfig.selectedPosition.selectedColour.noColours,
                        overriddenUnitPrice: layoutConfig.selectedPosition.selectedColour.overriddenUnitPrice,
                        overriddenSetupTotal: layoutConfig.overriddenSetupTotal,
                        colourId: layoutConfig.selectedPosition.selectedColour.id,
                        options: [],
                        total: layoutConfig.total,
                        lipPrintOption: layoutConfig.lipPrintOption && layoutConfig.lipPrintOption.selected ? layoutConfig.lipPrintOption : null,
                        individualNamesOption: layoutConfig.individualNamesOption && layoutConfig.individualNamesOption.selected ? layoutConfig.individualNamesOption : null,
                        leftRightHandUseSelectedOption: layoutConfig.leftRightHandUseSelectedOption
                    };

                    angular.forEach(layoutConfig.availableOptions, function (option) {
                        if (option.selected) {
                            layoutConfigToSave.options.push(option.id);
                        }
                    });

                    config.layoutConfigs.push(layoutConfigToSave);
                });

                if (validate(config)) {
                    if (!$scope.isModal) {
                        $scope.itemPricingOnSave({ config: config, item: $scope.item, itemConfig: $scope.item.config }, addToCart);
                    } else {
                        $scope.saveAndClose(config);
                    }
                }
            } catch (er) {
            }
        }

        function setWatchers() {
            $scope.$watch('item.isRepeat', function () {
                if ($scope.item.config.selectedPrintTypeConfig) {
                    angular.forEach($scope.item.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfig) {
                        layoutConfig.overriddenSetupTotal = undefined;
                    });
                } else if ($scope.item.config.productPrintTypeConfigurations) {
                    angular.forEach($scope.item.config.productPrintTypeConfigurations.layoutConfigurations, function (layoutConfig) {
                        layoutConfig.overriddenSetupTotal = undefined;
                    });
                }
                calculateTotal();
            });
            $scope.$watch('item.deliveryRequired', function (res) {
                $rootScope.$emit(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, res);
            });
            var f2 = $scope.$onRootScope(FREIGHT_CONSTANTS.REGENERATE_PRICE_DONE, function (ev, p) {
                if ($scope.deliveryRequired) {
                    $scope.origFreightPrice = p.price;
                    $scope.freightPrice = angular.copy($scope.origFreightPrice);
                }
            });
            var f3 = $scope.$onRootScope(FREIGHT_CONSTANTS.OVERRIDE_PRICE_DONE, function (ev, p) {
                if ($scope.deliveryRequired) {
                    $scope.origFreightPrice = p.price;
                    $scope.freightPrice = angular.copy($scope.origFreightPrice);
                }
            });
            var f4 = $scope.$onRootScope(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, function (ev, res) {
                $scope.deliveryRequired = res;
                $scope.freightPrice = res ? angular.copy($scope.origFreightPrice) : null;
            });
            var f1;
            if (!$scope.isModal)
                f1 = $scope.$on("::ITEM-CONFIG-CHANGED", function (ev, p) {
                    save($scope.mForm.form, false);
                });
            $scope.$on('$destroy', function () {
                f1;
                f2;
                f3;
                f4;
            });
        }

        // Additional Items
        $scope.containsTokens = function (state, viewValue) {
            if (!state || typeof state !== "string") {
                return false;
            }

            var matches = [];
            var tokens = viewValue.split(" ");

            for (var i = 0; i < tokens.length; i++) {
                if (state.toLowerCase().trim().indexOf(tokens[i].toLowerCase().trim()) > -1) {
                    matches.push(true);
                } else {
                    matches.push(false);
                }
            }

            var allMatch = true;

            for (var j = 0; j < matches.length; j++) {
                if (!matches[j]) {
                    allMatch = false;
                }
            }

            return allMatch;
        };

        $scope.addOrderItem = function () {
            if (!$scope.orderItem.currentItem || !$scope.orderItem.currentItem.itemNumber || !$scope.orderItem.currentQty || $scope.orderItem.currentQty == 0) {
                return;
            }
            var item = $scope.orderItem.currentItem;
            var qty = $scope.orderItem.currentQty;
            var itemExist = false;
            //
            angular.forEach($scope.item.config.additionalItems, function (i) {
                if (item.itemNumber === i.itemNumber) {
                    itemExist = true;
                }
            });

            var newItem = {
                itemNumber: item.itemNumber,
                itemName: item.description,
                category: null,
                quantity: qty,
                unitPrice: item.unitPrice,
                totalPrice: item.unitPrice * qty,
                imageUrl: item.imageUrl,
                kitting: item.kitting,
                kits: []
            };

            if ($rootScope.clientName && $rootScope.clientName.toLowerCase() === "ppi" || $rootScope.clientName.toLowerCase() === "kingpin") {
                baseFactory.fetch('/api/item/getItemDetails?itemNumber=' + newItem.itemNumber).then(function (rrdata) {
                    if (!rrdata.isErrored) {
                        var nItem = rrdata.object;
                        newItem.config = nItem.config;
                        baseFactory.fetch("/api/order/getItemSetup?itemNumber=" + newItem.itemNumber).then(function (data) {
                            if (!data.isErrored) {
                                newItem.kits = data.object.kitNumbers;
                                newItem.category = data.object.category;
                            }
                        });
                    }
                });
            } else {
                baseFactory.fetch("/api/Order/GetKitNumbers?itemNumber=" + newItem.itemNumber).then(function (data) {
                    newItem.kits = data.object;
                });
            }

            $scope.item.config.additionalItems.push(newItem);
            $scope.updateTotalPrice();
            $scope.orderItem.currentItem = null;
        };

        $scope.removeOrderItem = function (item) {
            var indx = -1;
            angular.forEach($scope.item.config.additionalItems, function (i, itemIndex) {
                if (item.itemNumber === i.itemNumber) {
                    indx = itemIndex;
                }
            });

            if (indx >= 0) {
                $scope.item.config.additionalItems.splice(indx, 1);
                $scope.updateTotalPrice();
            }
        }

        $scope.removeItemImage = function (item) {
            item.uploadedDocumentId = -1;
            item.imageUrl = null;
        };
        $scope.changeItemImage = function (index) {
            document.getElementById('fileSelectUpload' + index).click();
        };
        $scope.onItemFileSelect = function ($files, item) {
            if (isFileValid($files[0].name)) {
                $scope.isFileUploading = true;
                $scope.progress = 0;

                baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                    })
                    .success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            // temporary folder
                            $scope.fileModel = data.object;

                            var doc = {
                                id: 0,
                                permissions: []
                            };

                            doc.fileFolder = $scope.fileModel.fileFolder;
                            doc.fileName = $scope.fileModel.fileName;
                            doc.name = $files[0].name;
                            doc.isUploaded = true;
                            doc.isNew = true;
                            doc.docTypeId = 2;

                            // Save
                            baseFactory.post("/api/documents/save", doc).then(function (rrdata) {
                                if (!rrdata.isErrored && rrdata.object) {
                                    item.imageUrl = rrdata.object.cdnPath;
                                    item.uploadedDocumentId = rrdata.object.id;
                                }
                            });
                        }
                    });
            }
        };

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();

            var fType = ['jpg', 'jpeg', 'gif', 'png'];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.errorMessage = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.errorMessage = null;
            }, 2500);

            return result;
        };

        $scope.updateTotalPrice = function (item, fld) {
            if ($rootScope.clientName.toLowerCase() === "ppi") {
                if (item)
                    item.totalPrice = item.quantity * item.unitPrice;
            } else {
                if (item) {
                    var calculatedUnitPrice = pricingFactory.calculateUnitPrice(item);
                    if (calculatedUnitPrice > 0 && fld == 1)
                        item.unitPrice = calculatedUnitPrice;
                    item.totalPrice = parseFloat((item.quantity * item.unitPrice).toFixed(2));
                }
            }

            $scope.totalPrice = 0;
            angular.forEach($scope.item.config.additionalItems, function (i) {
                $scope.totalPrice += i.totalPrice;
            });
            $scope.item.config.additionalItemsTotalPrice = $scope.totalPrice;
        };
    }
})();
(function () {
    "use strict";
    angular.module('appCatalogue').controller("splitDeliveriesModal", splitDeliveriesModal);
    splitDeliveriesModal.$inject = ["$scope", "$modalInstance", "$modal", "freightFactory", "order", "canOverridePrice", "deliveryRequired"];

    function splitDeliveriesModal($scope, $modalInstance, $modal, freightFactory, order, canOverridePrice, deliveryRequired) {

        var isRecalculate = false;
        // Init
        // delete items not needed
        angular.forEach(order.uiData.deliverySplits, function (ds, dsi) {
            var items = [];
            for (var x = 0; x < order.items.length; x++) {
                if (order.items[x] && order.items[x].config && order.items[x].config.selectedPrintTypeConfig && order.items[x].config.selectedPrintTypeConfig.overridePricing) {
                    if (ds.items[x].quantity !== angular.copy(order.items[x].config.selectedPrintTypeConfig.overriddenQuantity)) {
                        isRecalculate = true;
                        // console.log('isRecalculate');
                        ds.items[x].quantity = angular.copy(order.items[x].config.selectedPrintTypeConfig.overriddenQuantity);
                    }
                }
                items.push(ds.items[x]);
            }
            order.uiData.deliverySplits[dsi].items = items;
        });

        $scope.order = order;
        $scope.canOverridePrice = canOverridePrice;
        $scope.deliveryRequired = deliveryRequired;

        $scope.isFormInvalid = true;
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.addNewDeliverylocation = addNewDeliverylocation;
        $scope.removeDeliverySplit = removeDeliverySplit;
        $scope.editDeliveryAddress = editDeliveryAddress;
        $scope.checkIfValid = checkIfValid;
        $scope.calculateFreight = calculateFreight;

        function cancel() {
            $modalInstance.dismiss("cancel");
        }

        function save(form, orderr) {
            if (form.$invalid) {
                return;
            }

            var orderToSend = angular.copy(orderr);

            angular.forEach(orderToSend.uiData.deliverySplits, function (deliverySplit) {
                if (deliverySplit.freightResult) {
                    deliverySplit.freightResult.overriddenTotal = deliverySplit.freightResult.overriddenTotal || 0;
                }
            });

            $modalInstance.close(orderToSend.uiData.deliverySplits);
        }

        function checkIfValid(form) {
            $scope.isFormInvalid = false;

            angular.forEach($scope.order.items, function (orderItem, indx) {
                var invalid = false;
                var totalCount = 0;

                angular.forEach($scope.order.uiData.deliverySplits, function (deliverySplit) {
                    if (!deliverySplit.items[indx].quantity) {
                        deliverySplit.items[indx].quantity = 0;
                    }

                    deliverySplit.items[indx].quantity = parseInt(deliverySplit.items[indx].quantity, 10);

                    totalCount += deliverySplit.items[indx].quantity;
                });

                try {
                    var itemQuantity = orderItem.config.selectedPrintTypeConfig.overriddenQuantity || orderItem.quantity;
                    if (totalCount.toString() !== itemQuantity.toString()) {
                        invalid = true;
                    }
                } catch (er) {

                }

                angular.forEach($scope.order.uiData.deliverySplits, function (deliverySplit) {
                    deliverySplit.items[indx].invalid = invalid || deliverySplit.items[indx].quantity < 0;
                });

                if (invalid)
                    $scope.isFormInvalid = true;
            });

            if (typeof form !== "undefined") {
                if (form.$invalid) {
                    $scope.isFormInvalid = true;
                }
            }
        }

        function addNewDeliverylocation(form) {
            var items = [];

            // Items should always be in the same order as the items on the order itself
            angular.forEach($scope.order.items, function (item) {
                var linkedSets = [];
                var options = [];

                if (item.linkedSets) {
                    angular.forEach(item.linkedSets, function (linkedSet) {
                        linkedSets.push(linkedSet.selectedItemId);
                    });
                }

                if (item.config && item.config.selectedPrintTypeConfig && item.config.selectedPrintTypeConfig.layoutConfigurations) {
                    angular.forEach(item.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfig) {
                        if (layoutConfig.availableOptions) {
                            angular.forEach(layoutConfig.availableOptions, function (option) {
                                if (options.indexOf(option.id) < 0 && option.selected) {
                                    options.push(option.id);
                                }
                            });
                        }
                    });
                }

                items.push({ itemNumber: item.itemNumber, quantity: 0, linkedSets: linkedSets, options: options });
            });

            $scope.order.uiData.deliverySplits.push({ unprocessed: true, items: items });
            checkIfValid(form);
        }

        function removeDeliverySplit(deliverySplit) {
            $scope.order.uiData.deliverySplits.splice($scope.order.uiData.deliverySplits.indexOf(deliverySplit), 1);
        }

        function editDeliveryAddress(deliverySplit) {
            var modalInstance = $modal.open({
                templateUrl: "/app/modules/catalog/checkout/editDeliveryAddress/deliveryAddress.html",
                controller: "editDeliveryAddress",
                size: "md",
                backdrop: "static",
                windowClass: "app-modal-window-sm",
                resolve: {
                    delivery: function () {
                        return angular.copy(deliverySplit);
                    }
                }
            });

            modalInstance.result.then(function (updatedAddress) {
                deliverySplit.address = updatedAddress.address;
                deliverySplit.address1 = deliverySplit.address;
                deliverySplit.address2 = updatedAddress.address2;
                deliverySplit.details = updatedAddress.details;
                deliverySplit.location = angular.copy(updatedAddress.location);
            });
        }

        function calculateFreight() {
            angular.forEach($scope.order.uiData.deliverySplits, function (split) {
                split.freightResult = null;
            });
            freightFactory.getCheckoutFreightPrice($scope.order, null);
        }

        checkIfValid();
        if (isRecalculate) {
            calculateFreight();
        }
    }
})();
angular.module('appCatalogue').controller('confirmPaymentCtrl',
['$scope', 'baseFactory', '$modal', '$locale',
    function ($scope, baseFactory, $modal, $locale) {

        $scope.currentYear = new Date().getFullYear();
        $scope.currentMonth = new Date().getMonth() + 1;
        $scope.months = $locale.DATETIME_FORMATS.MONTH;
        $scope.ccinfo = { type: undefined }
        $scope.save = function (data) {
            if ($scope.paymentForm.$valid) {
                console.log(data); // valid data saving stuff here
            }
        }
       

    }
]);



(function () {
    'use strict';
    angular.module('appCatalogue').factory('freightFactory', freightFactory);
    freightFactory.$inject = ['baseFactory', '$q'];

    function freightFactory(baseFactory, $q) {
        return {
            getPrice: getPrice,
            getCheckoutFreightPrice: getCheckoutFreightPrice,
            calculateFreightPrice: calculateFreightPrice,
            getFreightPrices: getFreightPrices,
            calculateFreightPriceByQuantites: calculateFreightPriceByQuantites
        };

        function getPrice(items) {
            var deferred = $q.defer();
            if (!items || items.length == 0) {
                deferred.resolve(null);
                return deferred.promise;
            }
            baseFactory.call('/api/freightPricing/RetrieveCheapestPrice', items)
                .then(function (data) {
                    if (!data.isErrored) {
                        deferred.resolve(data.object);
                        return;
                    }
                    deferred.resolve(null);
                }, function () {
                    deferred.resolve(null);
                });
            return deferred.promise;
        }

        function getCheckoutFreightPrice(order, price, itemNumber, customQuantity) {
            var deferred = $q.defer();
            price = null;

            if (!order || order.uiData.deliveryInvalid || !order.uiData.deliverySplits || order.uiData.deliverySplits.length === 0 || !order.items || order.items.length === 0) {
                deferred.reject(null);
                return deferred.promise;
            }

            //$scope.freightLoading = true;
            angular.forEach(order.uiData.deliverySplits, function (deliverySplit, index) {
                deliverySplit.clientReference = index.toString();
                if (deliverySplit.freightResult) {
                    if (deliverySplit.freightResult.total !== deliverySplit.freightResult.overriddenTotal) {
                        deliverySplit.freightResult.totalOverridden = true;
                    } else {
                        deliverySplit.freightResult.totalOverridden = false;
                    }
                }
            });

            var originalSplits = angular.copy(order.uiData.deliverySplits);
            var deliverySplits = angular.copy(order.uiData.deliverySplits);

            angular.forEach(order.items, function (orderItem) {
                var additionalItems = [];

                if (typeof orderItem.additionalItems !== 'undefined')
                    additionalItems = orderItem.additionalItems || [];

                if (typeof orderItem.config !== 'undefined')
                    if (typeof orderItem.config.additionalItems !== 'undefined')
                        additionalItems = orderItem.config.additionalItems || [];

                if (additionalItems.length > 0) {
                    var itemNumbers = [];
                    for (var i = 0; i < deliverySplits[0].items.length; i++) {
                        itemNumbers.push(deliverySplits[0].items[i].itemNumber);
                    }
                    var ctr = deliverySplits[0].items.length - additionalItems.length;
                    angular.forEach(additionalItems, function (ai, aiIndex) {
                        var additionItemIndex = itemNumbers.indexOf(ai.itemNumber);
                        if (additionItemIndex < 0) {
                            deliverySplits[0].items.push({ itemNumber: ai.itemNumber, quantity: parseInt(ai.quantity), linkedSets: [], options: [], orderItemIndex: aiIndex });
                        } else {
                            deliverySplits[0].items[ctr + aiIndex].quantity = parseInt(ai.quantity);
                        }
                    });
                }
                //
                for (var k = 0; k < deliverySplits.length; k++) {
                    for (var j = 0; j < deliverySplits[k].items.length; j++) {
                        if (deliverySplits[k].items[j].itemNumber == orderItem.itemNumber) {
                            deliverySplits[k].items[j].cartonQuantity = orderItem.cartonQuantity;
                            deliverySplits[k].items[j].itemName = orderItem.itemName;
                        }
                    }
                }
            });

            if (typeof itemNumber !== 'undefined' && typeof customQuantity !== 'undefined')
                angular.forEach(deliverySplits, function (ds) {
                    angular.forEach(ds.items, function (item) {
                        if (item.itemNumber == itemNumber) {
                            item.quantity = customQuantity;
                        }
                    });
                });

            baseFactory.call('/api/freightPricing/RetrieveCheapestPrice', deliverySplits)
                .then(function (data) {
                    if (!data.isErrored) {
                        order.uiData.deliverySplits = angular.copy(data.object);
                        price = { total: 0 };
                        var carriers = [];
                        var services = [];

                        for (var i = 0; i < order.uiData.deliverySplits.length; i++) {
                            var deliverySplit = order.uiData.deliverySplits[i];

                            if (deliverySplit.freightResult) {
                                for (var j = 0; j < originalSplits.length; j++) {
                                    var originalSplit = originalSplits[j];
                                    if (originalSplit.clientReference === deliverySplit.clientReference) {
                                        deliverySplit.freightResult.totalOverridden = !originalSplit.freightResult ? false : originalSplit.freightResult.totalOverridden === true;

                                        if (originalSplit.freightResult && originalSplit.freightResult.totalOverridden && originalSplit.clientReference) {
                                            deliverySplit.freightResult.overriddenTotal = originalSplit.freightResult.overriddenTotal;
                                        }
                                    }
                                }
                                if (typeof itemNumber === 'undefined' && typeof customQuantity === 'undefined') {
                                    price.total += deliverySplit.freightResult.overriddenTotal;
                                } else {
                                    price.total += deliverySplit.freightResult.totalBeforeTax;
                                }
                                for (var k = 0; k < deliverySplit.freightResult.results.length; k++) {
                                    var result = deliverySplit.freightResult.results[k];
                                    if (carriers.indexOf(result.carrier) === -1) {
                                        carriers.push(result.carrier);
                                    }

                                    if (services.indexOf(result.carrierService) === -1) {
                                        services.push(result.carrierService);
                                    }
                                }
                            }
                        }

                        if (carriers.length > 1) {
                            price.carrier = "Multiple Carriers";
                        } else if (carriers.length === 1) {
                            price.carrier = carriers[0];
                        }

                        if (services.length > 1) {
                            price.carrierService = "Multiple Carriers";
                        } else if (services.length === 1) {
                            price.carrierService = services[0];
                        }
                    }

                    deferred.resolve({ order: order, price: price });
                });

            return deferred.promise;
        }

        function calculateFreightPrice(item, callback) {
            if (typeof callback === 'undefined') {
                var freightPrice = 0;
                var minQuantity = 1;

                if (item.quantities) {
                    for (var i = 0; i < item.quantities.length; i++) {
                        if (item.quantity >= minQuantity && item.quantity <= item.quantities[i].quantity && item.quantities[i].price) {
                            freightPrice = item.quantities[i].price[0].freightResult.totalBeforeTax;
                            break;
                        }
                        minQuantity = item.quantities[i].quantity + 1;
                    }
                    if (item.quantity > item.quantities[item.quantities.length - 1].quantity) {
                        freightPrice = item.quantities[item.quantities.length - 1].price[0].freightResult.totalBeforeTax;
                    }
                }
                return freightPrice;
            } else {
                var deliverySplits = [{
                    location: item.location,
                    items: [{
                        itemNumber: item.itemNumber,
                        itemName: item.itemName,
                        cartonQuantity: item.cartonQuantity,
                        quantity: item.quantity,
                        linkedSets: []
                    }]
                }];
                if (item.config && item.config.linkedSets) {
                    angular.forEach(item.config.linkedSets, function (linkedSet) {
                        if (linkedSet.selectedLinkedItem) {
                            deliverySplits[0].items[0].linkedSets.push(linkedSet.selectedLinkedItem.id);
                        }
                    });
                }
                return getPrice(deliverySplits).then(function (rdata) {
                    return callback(rdata[0].freightResult.totalBeforeTax);
                });
            }
        }

        function calculateFreightPriceByQuantites(quantities, quantity) {
            var freightPrice = 0;
            if (typeof quantities !== 'undefined') {
                var minQuantity = 1;
                for (var i = 0; i < quantities.length; i++) {
                    if (quantity >= minQuantity && quantity <= quantities[i].quantity && quantities[i].price) {
                        freightPrice = quantities[i].price[0].freightResult.totalBeforeTax;
                        break;
                    }
                    minQuantity = quantities[i].quantity + 1;
                }
            }
            return freightPrice;
        }

        function getFreightPrices(item, isByQuantity, callback) {
            if (!item.location || !item.location.id) {
                return callback(null);
            }

            isByQuantity = isByQuantity || false;

            if (item.config &&
                item.config.selectedPrintTypeConfig &&
                item.config.selectedPrintTypeConfig.layoutConfigurations[0].selectedPosition) {
                item.quantities = [];

                angular.forEach(item.config.selectedPrintTypeConfig.layoutConfigurations[0].selectedPosition.colours[0].tablePrices, function (tp) {
                    item.quantities.push({ quantity: tp.minQuantity });
                });
            }

            var results = [];
            angular.forEach(item.quantities, function (quantity) {
                var deliverySplits = [{
                    location: item.location,
                    items: [{
                        itemNumber: item.itemNumber,
                        itemName: item.itemName,
                        cartonQuantity: item.cartonQuantity,
                        quantity: quantity.quantity,
                        linkedSets: []
                    }]
                }];
                if (item.config && item.config.linkedSets) {
                    angular.forEach(item.config.linkedSets, function (linkedSet) {
                        if (linkedSet.selectedLinkedItem) {
                            deliverySplits[0].items[0].linkedSets.push(linkedSet.selectedLinkedItem.id);
                        }
                    });
                }
                quantity.price = null;
                results.push(getPrice(deliverySplits));
            });

            $q.all(results).then(function (results) {
                var i = 0;
                while (i < item.quantities.length) {
                    item.quantities[i].price = results[i];
                    i++;
                }

                if (isByQuantity) {
                    var tempFreightData = calculateFreightPrice(item);
                    return callback(tempFreightData);
                } else {
                    return callback(null);
                }
            });
        }
    }
})();
(function () {
    'use strict';
    angular.module('appSharedModule').factory('pricingFactory', pricingFactory);
    pricingFactory.$inject = ['PPI_CONSTANTS'];

    function pricingFactory(PPI_CONSTANTS) {
        return {
            getPrice: getPrice,
            calculateLayoutTotalPrice: calculateLayoutTotalPrice,
            calculateTotalPrice: calculateTotalPrice,
            initConfigurations: initConfigurations,
            calculateLayoutPricing: calculateLayoutPricing,
            calculateAllPricing: calculateAllPricing,
            calculateCustomQuantity: calculateCustomQuantity,
            calculateUnitPrice: calculateUnitPrice,
            calculateTotal: calculateTotal,
            selectColour: selectColour,
            selectColourFromNoColoursUsed: selectColourFromNoColoursUsed,
            getMaxColoursToShow: getMaxColoursToShow,
            printTypeSelected: printTypeSelected,
            getQuantityFromCarton: getQuantityFromCarton,
            getAndSetCartonQuantityFromQuantity: getAndSetCartonQuantityFromQuantity
        };

        function getMaxColoursToShow(item) {
            if (item.config.readonly)
                return 4;
            return 9999;
        }

        function selectColourFromNoColoursUsed(item, printTypeConfig, position) {
            var totalColoursUsed = getTotalColoursUsed(position);

            angular.forEach(position.colours, function (colour) {
                if (totalColoursUsed === colour.noColours) {
                    colour.selected = true;
                    position.selectedColour = colour;
                } else
                    colour.selected = false;
            });
            calculateAllPricing(item);
            calculateTotal(item, printTypeConfig);
        }

        function getTotalColoursUsed(position) {
            var coloursUsed = [];
            angular.forEach(position.positionNames, function (positionName) {
                angular.forEach(positionName.coloursUsed, function (colour) {
                    //every colour on every side is always added
                    if (!position.productAdditionalPrint || (position.productAdditionalPrint && position.productAdditionalPrint.perColour))
                        coloursUsed.push(colour);
                    else {
                        //see if the colour has already been added
                        //only add it if it hasnt been added already
                        var exists = false;
                        angular.forEach(coloursUsed, function (existingColour) {
                            if (existingColour.name.toLowerCase() == colour.name.toLowerCase())
                                exists = true;
                        });
                        if (!exists)
                            coloursUsed.push(colour);
                    }
                });
            });
            return coloursUsed.length;
        }

        function selectColour(item, printTypeConfig, layoutConfiguration, selectedColourId) {
            angular.forEach(layoutConfiguration.positions, function (position) {
                angular.forEach(position.colours, function (colour) {
                    if (selectedColourId == colour.id) {
                        colour.selected = true;
                        position.selectedColour = colour;
                    } else
                        colour.selected = false;
                });
            });

            calculateAllPricing(item);

            calculateTotal(item, printTypeConfig);
        }

        function calculateTotal(item, printTypeConfig) {
            if (!printTypeConfig) {
                angular.forEach(item.config.productPrintTypeConfigurations, function (printTypeConfig) {
                    calculateTotalPrice(printTypeConfig, item);
                });
                return;
            }
            calculateTotalPrice(printTypeConfig, item);
        }

        function calculateAllPricing(item) {
            angular.forEach(item.config.productPrintTypeConfigurations, function (printTypeConfig) {
                angular.forEach(printTypeConfig.layoutConfigurations, function (layoutConfiguration) {
                    calculateLayoutPricing(item, layoutConfiguration, printTypeConfig);
                });
            });
        }

        function getNoMetallicPaints(position) {
            var noMetallicPaints = 0;
            angular.forEach(position.positionNames, function (positionName) {
                if (positionName.noMetallicPaints && positionName.noMetallicPaints > 0) {
                    noMetallicPaints += parseInt(positionName.noMetallicPaints);
                }
            });
            return noMetallicPaints;
        }

        function calculateLayoutPricing(item, layoutConfiguration, printTypeConfig) {

            angular.forEach(layoutConfiguration.positions, function (position) {

                angular.forEach(position.colours, function (colour) {
                    colour.tablePrices = [];
                    var unitPrices = [];
                    //we use the units price breaks.
                    if (!colour.useColourPriceBreaks)
                        unitPrices = item.config.unitPrices;
                    //need to take into account the colour price breaks
                    //only push the unit price breaks once they are within the minimum colour price breaks
                    else {
                        angular.forEach(item.config.unitPrices, function (unitPrice) {

                            //change minimum quantity to the colour minimum quantity
                            if (unitPrice.minQuantity < colour.unitPrices[0].minQuantity
                                && unitPrice.maxQuantity > colour.unitPrices[0].minQuantity
                                && unitPrice.maxQuantity <= colour.unitPrices[0].maxQuantity) {
                                var tableUnitPrice = angular.copy(unitPrice);
                                tableUnitPrice.minQuantity = colour.unitPrices[0].minQuantity;
                                unitPrices.push(tableUnitPrice);
                                return;
                            }
                            if (unitPrice.minQuantity >= colour.unitPrices[0].minQuantity)
                                unitPrices.push(unitPrice);
                        });
                    }
                    var unitPricess = colour.useColourPriceBreaks ? colour.unitPrices : item.config.unitPrices;
                    angular.forEach(unitPricess, function (productUnitPrice) {
                        if (productUnitPrice.minQuantity < printTypeConfig.minQuantity)
                            return;
                        colour.tablePrices.push({
                            calcPrice: getPrice(item.config, printTypeConfig, layoutConfiguration, position, productUnitPrice.minQuantity, colour.noColours, colour.id),
                            minQuantity: productUnitPrice.minQuantity
                        });
                    });

                    colour.customCalcPrice = getPrice(item.config, printTypeConfig, layoutConfiguration, position, item.quantity, colour.noColours, colour.id);
                    colour.setupPrice = getSetupRepeatCost(layoutConfiguration.printTypeSetup, colour.noColours);
                    colour.repeatPrice = getSetupRepeatCost(layoutConfiguration.printTypeRepeat, colour.noColours);
                });
            });
        }

        function calculateCustomQuantity(item) {
            angular.forEach(item.config.productPrintTypeConfigurations, function (printTypeConfig) {
                angular.forEach(printTypeConfig.layoutConfigurations, function (layoutConfiguration) {

                    angular.forEach(layoutConfiguration.positions, function (position) {
                        angular.forEach(position.colours, function (colour) {
                            colour.customCalcPrice = getPrice(item.config, printTypeConfig, layoutConfiguration, position, item.quantity, colour.noColours, colour.id);
                            colour.setupPrice = getSetupRepeatCost(layoutConfiguration.printTypeSetup, colour.noColours);
                            colour.repeatPrice = getSetupRepeatCost(layoutConfiguration.printTypeRepeat, colour.noColours);
                        });
                    });
                });
            });
        }

        function initConfigurations(item) {
            if (item.savedConfig) {
                item.isRepeat = item.savedConfig.isRepeat;
            }
            var quantities = getAndSetCartonQuantityFromQuantity(item.config, item.quantity);
            item.cartonQuantity = quantities.cartonQuantity;
            item.quantity = quantities.quantity;

            angular.forEach(item.config.productPrintTypeConfigurations, function (printTypeConfig) {
                if (item.savedConfig && printTypeConfig.printTypeId == item.savedConfig.printTypeId) {
                    printTypeConfig.active = true;
                }
                initLayoutConfigurations(item, printTypeConfig.layoutConfigurations);
            });
        }

        function initLayoutConfigurations(item, layoutConfigurations) {
            //only the first layout should have the unit price included in the price
            //all subsequent layouts should only have paint prices
            var isFirstLayout = true;
            angular.forEach(layoutConfigurations, function (layoutConfiguration) {
                var savedLayoutConfig;
                if (item.savedConfig) {
                    angular.forEach(item.savedConfig.layoutConfigs, function (layoutConfig) {
                        if (layoutConfiguration.name === layoutConfig.name)
                            savedLayoutConfig = layoutConfig;
                    });
                }
                if (isFirstLayout) {
                    layoutConfiguration.isFirstLayout = true;
                    isFirstLayout = false;
                }
                if (savedLayoutConfig) {

                    layoutConfiguration.lipPrintOption = layoutConfiguration.lipPrintOption == null && savedLayoutConfig.lipPrintOption == null ? null :
                        angular.extend(layoutConfiguration.lipPrintOption || {}, savedLayoutConfig.lipPrintOption || {});
                    layoutConfiguration.individualNamesOption = layoutConfiguration.individualNamesOption == null && savedLayoutConfig.individualNamesOption == null ? null :
                        angular.extend(layoutConfiguration.individualNamesOption || {}, savedLayoutConfig.individualNamesOption || {});
                    //layoutConfiguration.leftRightHandUseSelectedOption = layoutConfiguration.leftRightHandUseSelectedOption == null && savedLayoutConfig.leftRightHandUseSelectedOption == null ? null :
                    //    angular.extend(layoutConfiguration.leftRightHandUseSelectedOption || {}, savedLayoutConfig.leftRightHandUseSelectedOption || {});
                }
                initPositions(savedLayoutConfig, layoutConfiguration);
                initOptions(savedLayoutConfig, layoutConfiguration);
            });
        }

        function initPositions(savedLayoutConfig, layoutConfiguration) {
            if (layoutConfiguration.positions.length > 0)
                layoutConfiguration.selectedPosition = layoutConfiguration.positions[0];

            angular.forEach(layoutConfiguration.positions, function (position) {
                position.colours = angular.copy(layoutConfiguration.colours);
                if (savedLayoutConfig && savedLayoutConfig.positionId === position.id) {
                    layoutConfiguration.selectedPosition = position;
                    layoutConfiguration.selectedPosition.positionNames = savedLayoutConfig.positionNames;
                }
                angular.forEach(position.colours, function (colour) {

                    if (savedLayoutConfig && colour.noColours === savedLayoutConfig.noColours && (!savedLayoutConfig.colourId || colour.id === savedLayoutConfig.colourId)) {
                        colour.selected = true;
                        position.selectedColour = colour;
                    }
                });
                angular.forEach(position.positionNames, function (positionName) {
                    if (!positionName.noMetallicPaints)
                        positionName.noMetallicPaints = 0;
                });
            });
        }

        function initOptions(savedLayoutConfig, layoutConfiguration) {
            layoutConfiguration.availableOptions = [];
            angular.forEach(layoutConfiguration.options, function (option) {
                //metallic colour and 'individual names / lip print' is a special option 
                //and should not be added to the list of available options.
                if (option.description.indexOf(PPI_CONSTANTS.ITEM_NAME_METALLIC_COLOUR) === -1
                    && option.description.indexOf(PPI_CONSTANTS.ITEM_NAME_LIP_INDIVIDUAL) === -1) {
                    if (savedLayoutConfig && savedLayoutConfig.options && savedLayoutConfig.options.length > 0) {
                        angular.forEach(savedLayoutConfig.options, function (savedOptionId) {
                            if (savedOptionId == option.id)
                                option.selected = true;
                        });
                    }
                    layoutConfiguration.availableOptions.push(option);
                }
            });
        }


        function getPrice(productConfiguration, printTypeConfig, layoutConfiguration, position, quantity, noColours, colourItemNo) {
            if (!quantity || quantity <= 0 || quantity < layoutConfiguration.minimumColourQuantity)
                return 0;

            var productUnitPrice = getProductUnitPrice(productConfiguration, quantity);
            var colourUnitPrice = getColourAndAdditionalUnitPrice(printTypeConfig, layoutConfiguration, position, quantity, noColours, colourItemNo);
            var metallicUnitPrice = getMetallicColoursUnitPrice(layoutConfiguration.colours, colourItemNo, layoutConfiguration.metallicPaintItemCost, position);
            var optionsUnitPrice = getOptionsPrice(productConfiguration, layoutConfiguration, quantity);
            var additionalPrintCostUnitPrice = getAdditionalPrintCost(quantity, printTypeConfig, layoutConfiguration, position, noColours);

            var unitPrice = colourUnitPrice + metallicUnitPrice + optionsUnitPrice + additionalPrintCostUnitPrice;
            if (layoutConfiguration.isFirstLayout)
                unitPrice += productUnitPrice;

            return unitPrice;
        }

        function calculateLayoutTotalPrice(layoutConfiguration, item) {
            if (!layoutConfiguration.selectedPosition || !layoutConfiguration.selectedPosition.selectedColour)
                return;
            layoutConfiguration.total = layoutConfiguration.selectedPosition.selectedColour.customCalcPrice * item.quantity;
            calculateLayoutSetupRepeatFee(layoutConfiguration, item);

            layoutConfiguration.total += layoutConfiguration.setupTotal;
        }

        function calculateLayoutSetupRepeatFee(layoutConfiguration, item) {
            layoutConfiguration.setupTotal = item.isRepeat ? layoutConfiguration.selectedPosition.selectedColour.repeatPrice : layoutConfiguration.selectedPosition.selectedColour.setupPrice;
            layoutConfiguration.setupTotal += calculateSelectedOptionsSetupRepeatPrice(layoutConfiguration, item);
        }

        function calculateSelectedOptionsSetupRepeatPrice(layoutConfiguration, item) {

            var optionSetupTotal = 0;
            //setup cost for lip print is setup * the number of colours used for the lip print
            if (layoutConfiguration.lipPrintOption && layoutConfiguration.lipPrintOption.selected &&
                layoutConfiguration.lipPrintOption.noColours && !layoutConfiguration.lipPrintOption.lipPrintOnly) {
                optionSetupTotal += getSetupRepeatCost(item.isRepeat ? layoutConfiguration.printTypeRepeat : layoutConfiguration.printTypeSetup, layoutConfiguration.lipPrintOption.noColours);
            }

            //individual names print
            if (layoutConfiguration.individualNamesOption && layoutConfiguration.individualNamesOption.selected) {
                //the setup fee for individual names needs to be applied per sheet of names.
                //small names can fit 50 per page while large names can only fit 30
                var itemsPerSheet = layoutConfiguration.individualNamesOption.size == 'Large'
                    ? PPI_CONSTANTS.ITEM_INDIVIDUAL_LARGE_SIZE_QTY
                    : PPI_CONSTANTS.ITEM_INDIVIDUAL_SMALL_SIZE_QTY;
                //setup is number of sheets * the setup cost
                //if 50 names fit on a sheet, and 51 things are being printed then this would be 2 * setup cost
                optionSetupTotal += Math.ceil(item.quantity / itemsPerSheet) * layoutConfiguration.printTypeSetup.cost;
            }

            //backstamp just has a single setup/repeat fee
            angular.forEach(layoutConfiguration.options, function (option) {
                if (option.selected && option.description.indexOf(PPI_CONSTANTS.ITEM_NAME_BACKSTAMP) >= 0) {
                    optionSetupTotal += item.isRepeat ? layoutConfiguration.printTypeRepeat.cost : layoutConfiguration.printTypeSetup.cost;
                }
            });

            return optionSetupTotal;
        }


        function calculateTotalPrice(printTypeConfig, item) {
            printTypeConfig.total = 0;
            printTypeConfig.unitPrice = 0;
            printTypeConfig.setupTotal = 0;
            angular.forEach(printTypeConfig.layoutConfigurations, function (layoutConfiguration) {
                calculateLayoutTotalPrice(layoutConfiguration, item);
                if (layoutConfiguration.selectedPosition) {
                    printTypeConfig.unitPrice += layoutConfiguration.selectedPosition.selectedColour ? layoutConfiguration.selectedPosition.selectedColour.customCalcPrice : 0;
                    printTypeConfig.setupTotal += layoutConfiguration.setupTotal;
                    printTypeConfig.total += layoutConfiguration.total;
                }
            });

            if (item.config.discountPercentage) {
                item.config.discountAmount = printTypeConfig.total * (item.config.discountPercentage / 100);
            } else {
                item.config.discountAmount = 0;
            }

            // TODO: confirm setting unit price and setup total is the correct thing to do here NM 2015-11-12
            if (!printTypeConfig.overridePricing) {
                printTypeConfig.overriddenUnitPrice = printTypeConfig.unitPrice;
                printTypeConfig.overriddenSetupTotal = printTypeConfig.setupTotal;
            }
        }

        function getPriceFromUnitPrices(unitPrices, quantity) {
            var price = 0;
            angular.forEach(unitPrices, function (unitPrice) {
                if (quantity >= unitPrice.minQuantity && (!unitPrice.maxQuantity || quantity <= unitPrice.maxQuantity))
                    price = unitPrice.cost;
            });
            return price;
        }

        function getColourUnitPrice(noColours, colours, quantity, colourItemNo) {
            var colourPrice = 0;
            angular.forEach(colours, function (colour) {
                if (noColours != colour.noColours || (colourItemNo && colourItemNo !== colour.id))
                    return;
                colourPrice = getPriceFromUnitPrices(colour.unitPrices, quantity);
            });
            return colourPrice;
        }

        function getProductUnitPrice(productConfiguration, quantity) {
            return getPriceFromUnitPrices(productConfiguration.unitPrices, quantity);
        }

        function getColourAndAdditionalUnitPrice(printTypeConfig, layoutConfiguration, position, quantity, noColours, colourItemNo) {
            if (noColours == 0)
                return 0;

            var hitCurrentLayoutConfiguration = false;
            var colourAlreadyAddedOnOtherTemplate = false;
            angular.forEach(printTypeConfig.layoutConfigurations, function (currLayoutConfiguration) {
                if (hitCurrentLayoutConfiguration)
                    return;
                //this is the current layout
                if (currLayoutConfiguration.name == layoutConfiguration.name) {
                    hitCurrentLayoutConfiguration = true;
                    return;
                }

                //check if the currLayoutConfig has a colour applied
                if (currLayoutConfiguration.selectedPosition.selectedColour && currLayoutConfiguration.selectedPosition.selectedColour.noColours >= 1)
                    colourAlreadyAddedOnOtherTemplate = true;
            });

            //colour has already been added on a previous layout
            //if colours have already been added on a previous layout then we do not need to worry about multiple positions.
            //all colours are * by the unit prices of the additional print
            if (colourAlreadyAddedOnOtherTemplate && position.productAdditionalPrint
                && position.productAdditionalPrint.unitPrices) {
                return getPriceFromUnitPrices(position.productAdditionalPrint.unitPrices, quantity) * noColours;
            }

            var multiplePositions = position.noPositions > 1 && position.productAdditionalPrint && position.productAdditionalPrint.perColour;
            if (!multiplePositions) {
                return getColourUnitPrice(noColours, layoutConfiguration.colours, quantity, colourItemNo);
            }

            //multiple positions means that a charge is added per additional position and per colour.
            //Pricing works as a base charge then a constant increase for each additional colour.
            //price the first colour then multiply the additional charge for every extra colour
            if (!layoutConfiguration.colours)
                return 0;

            //get the price for 1 colour
            var firstColour;
            angular.forEach(layoutConfiguration.colours, function (colour) {
                if (colour.noColours == 1 && colour.displayName.toLowerCase() !== 'mock etch' && colour.displayName.toLowerCase() !== 'unprinted')
                    firstColour = colour;
            });
            if (!firstColour)
                return 0;

            var colourPrice = getColourUnitPrice(1, layoutConfiguration.colours, quantity, firstColour.id);
            var additionalPrintCost = position.productAdditionalPrint.usePricingBreaks
                ? getPriceFromUnitPrices(position.productAdditionalPrint.unitPrices, quantity)
                : position.productAdditionalPrint.cost;

            var additionalColourPrice = additionalPrintCost * (noColours - 1);
            return colourPrice + additionalColourPrice;
        }

        function getMetallicColoursUnitPrice(colours, colourItemNo, metallicPaintItemCost, position) {
            //if this is a mock etch then never apply metallic costs
            var ignore = false;
            angular.forEach(colours, function (colour) {
                if (colour.id == colourItemNo && (colour.displayName.toLowerCase() === 'mock etch' || colour.displayName.toLowerCase() === 'unprinted'))
                    ignore = true;
            });
            if (ignore)
                return 0;

            var noMetallicColours = getNoMetallicPaints(position);

            if (!noMetallicColours || noMetallicColours <= 0 || metallicPaintItemCost == 0)
                return 0;

            return metallicPaintItemCost * noMetallicColours * position.multiplier;
        }

        function getOptionsPrice(productConfiguration, layoutConfiguration, quantity) {
            var optionsPrice = 0;

            angular.forEach(layoutConfiguration.options, function (option) {
                if (option.selected) {

                    //only 1 price set
                    if (option.unitPrices && option.unitPrices.length == 1 && !option.unitPrices[0].quantity) {
                        optionsPrice += option.unitPrices[0].cost;
                        return;
                    }
                    optionsPrice += getPriceFromUnitPrices(option.unitPrices, quantity);

                }
            });

            if (!layoutConfiguration.isFirstLayout)
                return optionsPrice;

            //handle lip prints
            //these should only be applied to the first layout
            if (layoutConfiguration.lipPrintOption
                && layoutConfiguration.lipPrintOption.selected
                && !layoutConfiguration.lipPrintOption.lipPrintOnly
                && layoutConfiguration.lipPrintOption.noColours > 0) {
                optionsPrice += layoutConfiguration.lipPrintIndividualNameItemCost;
                //additional colour only gets added for each ADDITIONAL COLOUR. Dont include the initial colour
                if (layoutConfiguration.lipPrintOption.noColours > 1)
                    optionsPrice += (layoutConfiguration.lipPrintOption.noColours - 1) * productConfiguration.lipPrintAdditionalColourCost;
            }

            //handle individual names
            if (layoutConfiguration.individualNamesOption
                && layoutConfiguration.individualNamesOption.selected) {
                //individual names get a charge per unit
                optionsPrice += layoutConfiguration.lipPrintIndividualNameItemCost;
            }

            return optionsPrice;
        }

        //print type changed. if the current quantity is less than the colour min quantity
        //then update the quantity to the minimum for the current print config
        function printTypeSelected(printTypeConfig, item) {
            if (item.quantity >= printTypeConfig.minQuantity)
                return;
            item.quantity = printTypeConfig.minQuantity;
            calculateCustomQuantity(item);
            calculateTotal(item, printTypeConfig);
        }

        function getAdditionalPrintCost(quantity, printTypeConfig, layoutConfiguration, position, noColours) {
            var noPositions = getNumberOfChargeableAdditionalPositions(printTypeConfig, layoutConfiguration, position, noColours);
            if (noPositions == 0)
                return 0;
            var multiplier = position.multiplier > 1 ? position.multiplier - 1 : position.multiplier;

            var additionalPrintCost = position.productAdditionalPrint.usePricingBreaks
                ? getPriceFromUnitPrices(position.productAdditionalPrint.unitPrices, quantity)
                : position.productAdditionalPrint.cost;

            return noPositions * additionalPrintCost * multiplier;
        }

        function getNumberOfChargeableAdditionalPositions(printTypeConfig, layoutConfiguration, position, noColours) {
            var noPositions;

            if (position.multiplier < 1
                //no print means no additional cost
                || noColours <= 0
                //only 1 layout OR its the first layout AND there are no additional charges per position
                || ((printTypeConfig.layoutConfigurations.length === 1 || layoutConfiguration.isFirstLayout) && !position.productAdditionalPrint.perPosition))
                return 0;



            if ((position.noPositions <= 1 && position.multiplier <= 1)
                //no additional cost per position. We only need to get an additional cost for each additional layout
                || !position.productAdditionalPrint.perPosition)
                noPositions = 0;
            else
                //first position is always included in the colour price. 
                //position.noPositions - 1 takes away the initial position
                noPositions = position.noPositions > 1 ? position.noPositions - 1 : position.noPositions;

            return noPositions;
        }

        function getSetupRepeatCost(printTypeSetupRepeat, noColours) {
            if (!printTypeSetupRepeat || !printTypeSetupRepeat.cost || !printTypeSetupRepeat.multiplier || noColours <= 0)
                return 0;
            return printTypeSetupRepeat.cost * noColours * printTypeSetupRepeat.multiplier;
        }

        //get the unit quantity from the carton quantity
        function getQuantityFromCarton(config, cartonQuantity, printTypeConfig) {
            if (!config || !config.cartonQuantity || !cartonQuantity)
                return {
                    cartonQuantity: null,
                    quantity: null
                };

            var minQuantity = printTypeConfig ? printTypeConfig.minQuantity : config.minQuantity;

            var quantity = config.cartonQuantity * cartonQuantity;
            if (quantity < minQuantity) {
                quantity = minQuantity;
                return getAndSetCartonQuantityFromQuantity(config, quantity, printTypeConfig);
            }
            return {
                cartonQuantity: cartonQuantity,
                quantity: quantity
            };
        }

        //get the carton and unit quantity from the quantity
        function getAndSetCartonQuantityFromQuantity(config, quantity, printTypeConfig) {
            if (!config || !config.cartonQuantity || !quantity)
                return {
                    cartonQuantity: null,
                    quantity: null
                };

            var minQuantity = printTypeConfig ? printTypeConfig.minQuantity : config.minQuantity;
            if (quantity < minQuantity)
                quantity = minQuantity;

            var cartonQuantity = quantity / config.cartonQuantity;

            //qty doesnt fit exactly into cartons.
            //set the quantity to the ceiling of the carton
            if (cartonQuantity % 1 !== 0) {
                cartonQuantity = Math.ceil(cartonQuantity);
                quantity = config.cartonQuantity * cartonQuantity;
            }
            return {
                cartonQuantity: cartonQuantity,
                quantity: quantity
            };
        }

        function calculateUnitPrice(item) {
            var unitPrice = item.unitPrice;
            if (typeof item.config !== 'undefined')
                if (typeof item.config.unitPrices !== 'undefined' && item.config.unitPrices !== null)
                for (var i = 0; i < item.config.unitPrices.length; i++) {
                    if (item.quantity >= item.config.unitPrices[i].minQuantity && item.config.unitPrices[i].maxQuantity === null) {
                        unitPrice = item.config.unitPrices[i].cost;
                        break;
                    } else if (item.quantity >= item.config.unitPrices[i].minQuantity && item.quantity <= item.config.unitPrices[i].maxQuantity) {
                        unitPrice = item.config.unitPrices[i].cost;
                        break;
                    }
                }
            return unitPrice;
        }
    }
})();
(function () {
    "use strict";
    angular.module('appCatalogue').controller("addItemToExistingOrderModal", addItemToExistingOrderModal);
    addItemToExistingOrderModal.$inject = ["$rootScope", "$scope", "$modalInstance", "$state", "sharedFactory", "orderFactory", "shoppingCartFactory", "item"];

    function addItemToExistingOrderModal($rootScope, $scope, $modalInstance, $state, sharedFactory, orderFactory, shoppingCartFactory, item) {
        $scope.save = save;
        $scope.cancel = cancel;
        $scope.getOrder = getOrder;
        $scope.onSelect = onSelect;
        init();

        function init() {
            $scope.model = {
                //item: angular.copy(item),
                order: null,
                title: ""
            };
        }

        function cancel() {
            $modalInstance.dismiss("cancel");
        }

        function save(form) {

            if (!$scope.model.order || !$scope.model.order.id) {
                $scope.model.order = undefined;
                $scope.model.title = undefined;
                return;
            }

            if (!form.$valid)
                return;
            $scope.loading = true;

            var cart = {
                userId: $rootScope.user.userId,
                shoppingCart: angular.toJson([shoppingCartFactory.createShoppingCartItem(item)])
            };

            $scope.model.item = cart;

            orderFactory.replaceOrderItem($scope.model).then(function (result) {
                if (result != null) {
                    $modalInstance.close($scope.model);
                    $state.go("base.orders.catalogedit", { id: $scope.model.order.id });
                } else {
                    $scope.loading = false;
                }
            });

        }

        function getOrder(val) {
            return sharedFactory.searchOrder(val).then(function (data) {
                return data;
            });
        };

        function onSelect($item, $model, $label) {
            $scope.model.order = $item;
            $scope.model.title = ($item.orderNumber || ("PO: " + $item.purchaseOrderNumber)) + " - " + $item.itemName;
        };
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('itemDetailsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$location', '$sce', '$state', '$stateParams', '$timeout', '$modal', 'toaster', 'Lightbox', 'baseFactory', 'pricingFactory', 'membershipFactory', 'shoppingCartFactory',
        'item', 'categories', 'PPI_CONSTANTS'];
    function ctrl($scope, $rootScope, $location, $sce, $state, $stateParams, $timeout, $modal, toaster, Lightbox, baseFactory, pricingFactory, membershipFactory, shoppingCartFactory,
        item, categories, PPI_CONSTANTS) {
        if (!item) {
            $state.go("^");
            return;
        }

        $scope.currentProduct = typeof item.parentItem !== 'undefined' ? angular.copy(item) : null;
        $scope.parentProduct = typeof item.parentItem !== 'undefined' ? angular.copy(item.parentItem) : angular.copy(item);

        $scope.parentItem = item.parentItem;
        $scope.categories = categories;
        $scope.itemSelected = itemSelected;
        $scope.changeCategory = changeCategory;
        $scope.openLightboxModal = openLightboxModal;
        $scope.showImage = showImage;
        $scope.updateShoppingCart = updateShoppingCart;
        $scope.getMaxColours = getMaxColours;
        $scope.quantityUpdated = quantityUpdated;
        $scope.cartonQuantityUpdated = cartonQuantityUpdated;
        $scope.cartonQuantityUpdatedSingle = cartonQuantityUpdatedSingle;
        $scope.linkedSetSelected = linkedSetSelected;
        $scope.showFreight = showFreight;
        $scope.openAddToExistingOrderModal = openAddToExistingOrderModal;
        $scope.isAdding = false;
        $scope.itemName = "";
        $scope.minimumPrice = null;
        $scope.maximumPrice = null;

        function getMaxColours() {
            return pricingFactory.getMaxColoursToShow($scope.item);
        }

        function changeCategory(param) {
            $state.go($rootScope.currentRootState + '.catalog.category', { id: param.id });
        }

        function openLightboxModal(index) {
            Lightbox.openModal($scope.images, index);
        };

        function showImage(indx) {
            for (var x = 0; x < $scope.images.length; x++) {
                $scope.images[x].isActive = indx == x;
            }
        }

        function updateShoppingCart() {
            if ($scope.item.quantity <= 0 || $scope.item.quantity === null)
                return;

            var isError = validate();

            if (!isError) {
                $rootScope.$broadcast('$sageItemAdding', $scope.item);

                shoppingCartFactory.getShoppingCart().then(function (shoppingCart) {
                    shoppingCartFactory.addItemToCart($scope.item, shoppingCart);
                    $rootScope.$broadcast('$sageItemAdded', $scope.item);
                });
            }
        }

        function validate() {
            var isError = false;

            // Check linkSets
            angular.forEach($scope.item.config.linkedSets, function (linkedSet) {
                if (typeof linkedSet.selectedLinkedItem === "undefined") {
                    toaster.error("Please select a " + linkedSet.name + " before adding to cart");
                    isError = true;
                }
            });

            return isError;
        }

        function cartonQuantityUpdated() {
            if (!$scope.item.config)
                return;
            var quantities = pricingFactory.getQuantityFromCarton($scope.item.config, $scope.item.cartonQuantity);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
            pricingFactory.calculateAllPricing($scope.item);
        }

        function cartonQuantityUpdatedSingle() {
            if (!$scope.item.config)
                return;
            pricingFactory.calculateAllPricing($scope.item);
            //
            if (typeof $scope.item.config.unitPrices !== 'undefined' && $scope.item.config.unitPrices !== null && $rootScope.clientName == 'KINGPIN') {
                for (var i = 0; i < $scope.item.config.unitPrices.length; i++) {
                    if ($scope.item.config.unitPrices[i].minQuantity <= $scope.item.quantity && $scope.item.quantity <= $scope.item.config.unitPrices[i].maxQuantity) {
                        $scope.item.itemPrice = $scope.item.config.unitPrices[i].cost;
                        break;
                    } else if ($scope.item.config.unitPrices[i].minQuantity == null && $scope.item.quantity <= $scope.item.config.unitPrices[i].maxQuantity) {
                        $scope.item.itemPrice = $scope.item.config.unitPrices[i].cost;
                        break;
                    } else if ($scope.item.config.unitPrices[i].minQuantity <= $scope.item.quantity && $scope.item.config.unitPrices[i].maxQuantity == null) {
                        $scope.item.itemPrice = item.config.unitPrices[i].cost;
                        break;
                    }
                }
            }
        }

        function quantityUpdated() {
            if (!$scope.item.config)
                return;
            var quantities = pricingFactory.getAndSetCartonQuantityFromQuantity($scope.item.config, $scope.item.quantity);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
            pricingFactory.calculateCustomQuantity($scope.item);
            pricingFactory.calculateAllPricing($scope.item);
        }

        function linkedSetSelected(linkedSet) {
            if (!linkedSet.pricingOnLinkedItem)
                return;

            //pricing is on the linked item.
            //get the config from the linked item
            baseFactory.fetch('/api/productConfigurations/GetLinkedProductConfiguration?itemNumber=' + $scope.model.selectedItem.itemNumber + '&linkedItemNumber=' + linkedSet.selectedLinkedItem.id).then(function (data) {
                $scope.item.config.productPrintTypeConfigurations = data.object.productPrintTypeConfigurations;
                initItemConfig();
                $scope.item.config.linkedItemSelected = true;
                pricingFactory.printTypeSelected($scope.item.config.selectedPrintTypeConfig, $scope.item);
            });
        }

        function initItem(itemToDisplay) {
            $scope.item = itemToDisplay;
            $scope.images = [];
            $scope.documents = [];
            $scope.mediaList = [];
            $scope.primaryImage = "";
            $scope.itemTabIndex = 1;

            $scope.itemDescription = $sce.trustAsHtml(itemToDisplay.description);
            $scope.itemSubText = itemToDisplay.itemSubText == null ? null : $sce.trustAsHtml(itemToDisplay.itemSubText);

            initItemConfig();

            if (itemToDisplay.documents.length < 1) {
                $scope.images.push({
                    url: '/content/img/placeholder.png',
                    thumbUrl: '/content/img/placeholder.png',
                    photoUrl: '/content/img/placeholder.png',
                    isActive: true
                });
            }

            angular.forEach(itemToDisplay.documents, function (value) {
                if (value.isImage) {
                    var newImage = {
                        name: value.name,
                        url: value.link,
                        thumbUrl: value.link,
                        photoUrl: value.link,
                        isActive: value.isPrimary
                    };
                    if (value.isPrimary) {
                        $scope.primaryImage = value.link;
                        $scope.item.imageUrl = value.link;
                        $scope.images.unshift(newImage);
                    } else {
                        $scope.images.push(newImage);
                    }
                } else if (value.isVideo) {
                    $scope.mediaList.push(value);
                } else {
                    var newDocument = {
                        name: value.name,
                        url: value.link
                    };
                    $scope.documents.push(newDocument);
                }
            });
        }

        function init() {
            $scope.dataToSend = [];

            initItem(item);

            $scope.model = {
                selectedItem: item,
                isGroup: item ? item.isGroup : false,
                variances: [],
                groupDisplayName: item.groupDisplayName
            };

            if (item) {
                var parent = typeof item.parentItem !== 'undefined' ? item.parentItem : item;
                if (parent.varianceConfiguration.varianceList.length > 0) {
                    var options = parent.varianceConfiguration.varianceList[0].options;
                    for (var j = 0; j < parent.items.length; j++) {
                        var sortOrder = 0;
                        for (var i = 0; i < options.length; i++)
                            if (options[i].name == parent.items[j].groupDisplayName) {
                                sortOrder = options[i].sortOrder;
                                break;
                            }

                        var vItem = angular.copy(parent.items[j]);
                        vItem.sortOrder = sortOrder;
                        $scope.model.variances.push(vItem);
                    }
                }
            }
        }

        function initItemConfig() {
            //Setting min Value for Quantity
            if ($scope.item.config) {
                $scope.item.quantity = angular.copy($scope.item.config.minQuantity);
                $scope.item.cartonQuantity = $scope.item.config.minCartonQuantity;
                //pricing should only be read only when viewing from the item details page
                $scope.item.config.readonly = true;

                if ($scope.item.config.productPrintTypeConfigurations && $scope.item.config.productPrintTypeConfigurations.length > 0) {
                    $scope.item.config.selectedPrintTypeConfig = $scope.item.config.productPrintTypeConfigurations[0];
                    angular.forEach($scope.item.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfiguration) {
                        layoutConfiguration.selectedPosition = layoutConfiguration.positions[0];
                    });
                }
                pricingFactory.initConfigurations($scope.item);
                pricingFactory.calculateAllPricing($scope.item);

                //freighting
                $scope.item.quantities = [];
                angular.forEach($scope.item.config.unitPrices, function (up) {
                    $scope.item.quantities.push({ quantity: up.minQuantity });

                    if ($scope.minimumPrice === null) {
                        $scope.minimumPrice = up.cost;
                        $scope.maximumPrice = up.cost;
                    } else if ($scope.minimumPrice > up.cost) {
                        $scope.minimumPrice = up.cost;
                    } else if ($scope.maximumPrice < up.cost) {
                        $scope.maximumPrice = up.cost;
                    }
                });
                if ($scope.minimumPrice === $scope.maximumPrice) {
                    $scope.maximumPrice = null;
                }
            }
        }

        function itemSelected() {
            baseFactory.fetch('/api/item/GetItemDetails?itemNumber=' + $scope.model.selectedItem.itemNumber).then(function (data) {
                initItem(data.object);
            });
        };

        function showFreight() {
            if (!item.config)
                return false;

            if (!item.config.linkedSets || item.config.linkedSets.length === 0)
                return true;

            //only show freight if every linked item is selected
            var allLinkedSetsSelected = true;
            angular.forEach(item.config.linkedSets, function (linkedSet) {
                if (!linkedSet.selectedLinkedItem)
                    allLinkedSetsSelected = false;
            });
            return allLinkedSetsSelected;
        }

        function openAddToExistingOrderModal() {
            if ($scope.item.quantity <= 0)
                return;

            var isError = validate();

            if (isError) {
                return;
            }

            $modal.open({
                templateUrl: '/app/modules/catalog/itemDetails/addItemToExistingOrderModal.html',
                controller: 'addItemToExistingOrderModal',
                resolve: {
                    item: function () {
                        return $scope.item;
                    }
                }
            });
        }

        $scope.openVideo = function (m) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editVideoGalleryModal/viewSimpleMediaModal.html',
                controller: 'ViewSimpleMediaModalCtrl',
                size: 'lg',
                resolve: {
                    SimpleMediaModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcViewSimpleMediaCtrl');
                    }],
                    doc: function () {
                        return m;
                    },
                }
            });

            modalInstance.result.then(function (c) {
            }, function (r) {
            });
        };
        $scope.addQuantity = function (isAdd) {
            if ($scope.item.quantity === null)
                $scope.item.quantity = $scope.item.config.minQuantity;
            //
            if (isAdd) {
                $scope.item.quantity++;
            } else if ($scope.item.quantity > $scope.item.config.minQuantity) {
                $scope.item.quantity--;
            }
        };

        //
        init();

        $scope.currentTab = 1;
        $scope.setItemTab = function (id) {
            $scope.currentTab = id;
        };

        $scope.$on('::OPEN-PRICING-TAB', function (v) {
            $scope.currentTab = 5;
        });
        $scope.itemPricingUpdateShoppingCart = function (v, addToCart) {
            if (addToCart)
                updateShoppingCart();
        };
        //

        $scope.generateProductExport = function (doc) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/catalog/itemDetails/modals/manageProductExportModal.html',
                controller: 'ManageProductExportModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    doc: function () {
                        return doc;
                    }
                }
            });
            modalInstance.result.then(function (c) {
            }, function (r) {
            });
        };
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('itemDetailsFreight', itemDetailsFreight);
    itemDetailsFreight.$inject = ['$scope', '$q', 'baseFactory', 'freightFactory', 'FREIGHT_CONSTANTS'];

    function itemDetailsFreight($scope, $q, baseFactory, freightFactory, FREIGHT_CONSTANTS) {

        $scope.item.isAddFreight = false;
        var tempFeightData = null;
        $scope.isReady = false;
        $scope.getLocations = getLocations;
        $scope.getPrices = getPrices;
        $scope.applyFreight = applyFreight;
        $scope.toggleFreight = toggleFreight;
        $scope.getFreightPriceBasedOnQuantity = getFreightPriceBasedOnQuantity;

        function getLocations(filterStr) {
            return baseFactory.typeAheadFetch('/api/locations/Get', filterStr);
        }

        function getPrices(itemm, isByQuantity) {
            if (!$scope.item.location || !$scope.item.location.id) {
                return null;
            }

            isByQuantity = isByQuantity || false;
            $scope.loading = true;

            if ($scope.item.config &&
                $scope.item.config.selectedPrintTypeConfig &&
                $scope.printTypeConfig &&
                $scope.printTypeConfig.layoutConfigurations[0].colours) {
                $scope.item.quantities = [];
                angular.forEach($scope.item.config.selectedPrintTypeConfig.layoutConfigurations[0].selectedPosition.colours[0].tablePrices, function (upr) {
                    $scope.item.quantities.push({ quantity: upr.minQuantity });
                });
            }

            var results = [];
            angular.forEach($scope.item.quantities, function (quantity) {
                var deliverySplits = [{
                    location: $scope.item.location,
                    items: [{
                        itemNumber: $scope.item.itemNumber,
                        quantity: quantity.quantity,
                        linkedSets: []
                    }]
                }];
                if ($scope.item.config && $scope.item.config.linkedSets) {
                    angular.forEach($scope.item.config.linkedSets, function (linkedSet) {
                        if (linkedSet.selectedLinkedItem) {
                            deliverySplits[0].items[0].linkedSets.push(linkedSet.selectedLinkedItem.id);
                        }
                    });
                }
                quantity.price = null;
                results.push(freightFactory.getPrice(deliverySplits));
            });

            $q.all(results).then(function (results) {
                var i = 0;
                while (i < $scope.item.quantities.length) {
                    $scope.item.quantities[i].price = results[i];
                    i++;
                }

                if (isByQuantity) {
                    tempFeightData = freightFactory.calculateFreightPrice($scope.item);
                    $scope.isReady = true;
                    applyFreight();
                }
                $scope.loading = false;
            });
        }

        function applyFreight() {
            var isThereData =$scope.item.isAddFreight && tempFeightData && $scope.isReady;
            $scope.$emit(FREIGHT_CONSTANTS.TEMP_UPDATE_FREIGHT_PRICE,
                { price: isThereData ? tempFeightData : null });
        }

        function toggleFreight() {
            if ($scope.item.isAddFreight || $scope.item.deliveryRequired)
                getPrices(null, true);
            $scope.$emit(FREIGHT_CONSTANTS.TEMP_UPDATE_FREIGHT_PRICE,
                { price:$scope.item.isAddFreight ? tempFeightData : null });
        }

        function getFreightPriceBasedOnQuantity(location) {
            $scope.isReady = false;
            if (!$scope.item.location || !$scope.item.location.id) {
                return null;
            }
            $scope.loading = true;

            var deliverySplits = [{
                location: $scope.item.location,
                items: [{
                    itemNumber: $scope.item.itemNumber,
                    quantity: $scope.item.config.selectedPrintTypeConfig.overridePricing && $scope.displayOverrides ? $scope.printTypeConfig.overriddenQuantity : $scope.item.quantity,
                    linkedSets: []
                }]
            }];
            if ($scope.item.config && $scope.item.config.linkedSets) {
                angular.forEach($scope.item.config.linkedSets, function (linkedSet) {
                    if (linkedSet.selectedLinkedItem) {
                        deliverySplits[0].items[0].linkedSets.push(linkedSet.selectedLinkedItem.id);
                    }
                });
            }
            freightFactory.getPrice(deliverySplits).then(function (results) {
                $scope.loading = false;
                tempFeightData = results[0].freightResult.totalBeforeTax;
                $scope.isReady = true;
                applyFreight();
            });
        }

        $scope.$onRootScope(FREIGHT_CONSTANTS.FREIGHT_PRICE_TOGGLE, function (ev) {
            toggleFreight();
        });
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('itemDetailsPricing', itemDetailsPricing);
    itemDetailsPricing.$inject = ['$scope', 'modalFactory', 'pricingFactory'];

    function itemDetailsPricing($scope, modalFactory, pricingFactory) {
        $scope.setItemConfig = setItemConfig;
        $scope.printTypeSelected = printTypeSelected;
        //console.log($scope.item);

        function printTypeSelected() {
            pricingFactory.printTypeSelected($scope.item.config.selectedPrintTypeConfig, $scope.item);
        }

        function setItemConfig() {
            // Set location
            $scope.item.location = null;
            modalFactory.openItemPricingModal($scope.item, null, true).then(function (result) {
                if (result !== null) {
                    if (typeof $scope.item.config === "undefined")
                        $scope.item.config = {
                            additionalItems: [],
                            additionalItemsTotalPrice: 0
                        };

                    $scope.item.config.additionalItems = result.itemConfig.additionalItems;
                    $scope.item.config.additionalItemsTotalPrice = result.itemConfig.additionalItemsTotalPrice;
                    $scope.item.kitNumber = result.item.kitNumber;
                }
            });
        }
    }
})();
(function () {
    'use strict';
    angular.module('appCatalogue').controller('itemDetailsSearch', itemDetailsSearch);
    itemDetailsSearch.$inject = ['$scope', '$rootScope', '$state', '$modal', 'shoppingCartFactory', 'pricingFactory', 'baseFactory'];
    function itemDetailsSearch($scope, $rootScope, $state, $modal, shoppingCartFactory, pricingFactory, baseFactory) {
        $scope.updateShoppingCart = updateShoppingCart;
        $scope.cartonQuantityUpdated = cartonQuantityUpdated;
        $scope.quantityUpdated = quantityUpdated;
        $scope.$parent.$parent.$parent.$watch('gridView', function (v) {
            $scope.gridView = v;
        });

        var config;
        init();

        function init() {
            config = {
                minQuantity: $scope.item.minQuantity,
                cartonQuantity: $scope.item.quantityPerCarton
            };
            $scope.item.quantity = $scope.item.minimumQuantity;
            quantityUpdated();
        }

        function updateShoppingCart() {
            $state.go('anonymous.shop.item', { id: $scope.item.itemAlias });
        }

        function cartonQuantityUpdated() {
            var quantities = pricingFactory.getQuantityFromCarton(config, $scope.item.cartonQuantity);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
        }

        function quantityUpdated() {
            var quantities = pricingFactory.getAndSetCartonQuantityFromQuantity(config, $scope.item.quantity);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
        }

        $scope.stateLink = 'anonymous.shop.item({id: item.itemAlias})';


        function initItemConfig(itm, callback) {
            //Setting min Value for Quantity
            if (itm.config) {
                itm.quantity = itm.config.minQuantity;
                itm.cartonQuantity = itm.config.minCartonQuantity;
                //pricing should only be read only when viewing from the item details page
                itm.config.readonly = true;


                if (itm.config.productPrintTypeConfigurations && itm.config.productPrintTypeConfigurations.length > 0) {
                    itm.config.selectedPrintTypeConfig = itm.config.productPrintTypeConfigurations[0];
                    angular.forEach(itm.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfiguration) {
                        layoutConfiguration.selectedPosition = layoutConfiguration.positions[0];
                    });
                }
                pricingFactory.initConfigurations(itm);
                pricingFactory.calculateAllPricing(itm);

                //freighting
                itm.quantities = [];
                angular.forEach(itm.config.unitPrices, function (unitPrice) {
                    itm.quantities.push({ quantity: unitPrice.minQuantity });
                });
            }
            if (typeof callback !== 'undefined')
                callback();
        }

        $scope.quickView = function (alias) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/catalog/qodo/modals/quickView.html',
                controller: ['$scope', '$modalInstance', '$controller', '$timeout', '$sce', 'item',
                    function ($scope, $modalInstance, $controller, $timeout, $sce, item) {
                        angular.extend(this, $controller('CatalogItemCtrl', { $scope: $scope, item: item, categories: [] }));
                        $scope.cancel = function () {
                            $modalInstance.dismiss('cancel');
                        };
                    }],
                size: 'lg',
                resolve: {
                    CatalogModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcCatalogCtrl');
                    }],
                    item: function () {
                        return baseFactory.fetch('/api/item/GetItemDetails?itemAlias=' + alias).then(function (rrdata) {
                            return rrdata.object === null ? {} : rrdata.object;
                        });
                    }
                }
            });

            modalInstance.result.then(function (c) {
            }, function (r) {
            });
        };
        $scope.addToCart = function (itemNumber) {
            baseFactory.fetch('/api/item/GetItemDetails?itemNumber=' + itemNumber).then(function (rrdata) {
                var item = rrdata.object;
                initItemConfig(item, function () {
                    angular.forEach(item.documents, function (value) {
                        if (value.isImage) {
                            if (value.isPrimary) {
                                item.imageUrl = value.link;
                            } else {
                                newImage.name = value.name;
                            }
                        }
                    });

                    $rootScope.$broadcast('$sageItemAdding', item);

                    shoppingCartFactory.getShoppingCart().then(function (shoppingCart) {
                        shoppingCartFactory.addItemToCart(item, shoppingCart);
                        $rootScope.$broadcast('$sageItemAdded', item);
                    });
                });
            });
        };
        $scope.showImage = function (item) {
            for (var x = 0; x < $scope.images.length; x++) {
                $scope.images[x].isActive = item.id === $scope.images[x].id;
            }
        };
    }
})();
catalogue
    .directive('sageItemDetailsSearchAnonymous', [function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            templateUrl: '/app/modules/catalog/itemDetails/itemDetailsSearchAnonymous.html',
            controller: 'itemDetailsSearch'
        };
    }])
    .directive('sageItemDetailsSearchAnonymousAdvanced', ['$compile', function ($compile) {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            controller: 'itemDetailsSearch',
            link: function (scope, ele, attrs) {
                var templateUrl = '/app/modules/catalog/itemDetails/itemDetailsSearchAnonymous.html';
                if (typeof attrs.templateUrl !== 'undefined') {
                    templateUrl = attrs.templateUrl
                }
                ele.html('<div ng-include="\'' + attrs.templateUrl + '\'"></div>');
                $compile(ele.contents())(scope);
            }
        };
    }]);
sharedModule
    .directive('sageItemDetailsSearch', [function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            templateUrl: '/app/modules/catalog/itemDetails/itemDetailsSearch.html',
            controller: 'itemDetailsSearch'
        };
    }])
    .directive('sageItemDetailsSearchAdvanced', ['$compile', function ($compile) {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            controller: 'itemDetailsSearch',
            link: function (scope, ele, attrs) {
                var templateUrl = '/app/modules/catalog/itemDetails/itemDetailsSearch.html';
                if (typeof attrs.templateUrl !== 'undefined') {
                    templateUrl = attrs.templateUrl
                }
                ele.html('<div ng-include="\'' + attrs.templateUrl + '\'"></div>');
                $compile(ele.contents())(scope);
            }
        };
    }]);

(function () {
    'use strict';

    angular.module('appCatalogue').controller('itemDetailsWithGroupCtrl', ctrl);

    ctrl.$inject = ['$scope', '$rootScope', '$controller', '$location', '$state', 'item'];
    function ctrl($scope, $rootScope, $controller, $location, $state, item) {

        var categories = $scope.$parent.categories;
        item.parentItem = angular.copy($scope.$parent.item);
        angular.extend(this, $controller('itemDetailsCtrl', { $scope: $scope, item: item, categories: categories }));
    }
})();



angular.module('appCatalogue').directive('relatedItemCarousel',
    [
    function () {
        return {
            restrict: 'AE',
            replace: true,
            scope: {
                relatedItems: '='
            },
            templateUrl: '/app/modules/catalog/itemDetails/directives/relatedItemsCarousel.html',
            controller: ['$scope', 'QodoCarouselFactory', '$timeout', function ($scope, QodoCarouselFactory, $timeout) {
                if ($scope.relatedItems != null && $scope.relatedItems.length > 0) {
                    $timeout(function () {
                        $scope.relatedItemCarousel = new QodoCarouselFactory({
                            carousel: '.relatedItemCarousel',
                            slide: '.slide',
                            oneByOne: true
                        });
                    }, 10);
                }
            }],
            link: function postLink(scope, elem, attr) {
            }
        };
    }]);
angular.module('appCatalogue').directive('sageItemPricingData',
    [
        function () {
            return {
                restrict: 'AE',
                replace: true,
                transclude: false,
                scope: {
                    itemData: '=item',
                    freightData: '=?freight',
                    isShowFreightSampleData: '=?isFreight',
                    onDataSave: '&onSave'
                },
                templateUrl: '/app/modules/catalog/checkout/modals/productConfigTemplate.html',
                controller: ['$scope', '$controller', function ($scope, $controller) {
                    $scope.itemPricingOnSave = function (result, addToCart) {
                        if (!$scope.itemData.config && result.itemConfig) {
                            $scope.itemData.config = result.itemConfig;
                        }
                        $scope.itemData.savedConfig = result.config;
                        $scope.itemData.quantity = result.config.quantity;
                        $scope.itemData.cartonQuantity = result.config.cartonQuantity;
                        $scope.itemData.total = result.config.total;
                        if ($scope.itemData.config.selectedPrintTypeConfig !== undefined) {
                            $scope.itemData.config.selectedPrintTypeConfig.overridePricing = false;
                        }

                        if (result !== null) {
                            if (typeof $scope.itemData.config === "undefined")
                                $scope.itemData.config = {
                                    additionalItems: [],
                                    additionalItemsTotalPrice: 0
                                };

                            $scope.itemData.config.additionalItems = result.itemConfig.additionalItems;
                            $scope.itemData.config.additionalItemsTotalPrice = result.itemConfig.additionalItemsTotalPrice;
                            $scope.itemData.kitNumber = result.item.kitNumber;
                            $scope.onDataSave({ $itemData: $scope.itemData, $addToCart: addToCart });
                        }
                    };
                    angular.extend({}, $controller('ProductConfigModalAdvacedCtrl', {
                        $scope: $scope,
                        item: angular.copy($scope.itemData),
                        freight: angular.copy($scope.freightData || null),
                        isShowFreightSample: $scope.isShowFreightSampleData || false
                    }));
                }],
                link: function (scope, elem, attr) {
                }
            };
        }]);
(function () {
    'use strict';
    homeModule.controller('ManageProductExportModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'doc',
            function ($scope, $rootScope, $modalInstance, $timeout, baseFactory, doc) {
                $scope.doc = angular.copy(doc);
                $scope.m = {};
                $scope.disableSubmitButton = false;
                $scope.submitTxt = 'Generate';

                $scope.save = function (mForm, pr) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        var link = doc.url + '&' + window.jsonToQueryString(pr);
                        window.location.href = link;
                    }
                };

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };

                var isImageValid = function (filename) {
                    var extAr = filename.split('.');
                    var ext = extAr[extAr.length - 1];
                    ext = ext.toLocaleLowerCase();
                    var fType = ["png", "jpg", "jpeg"];
                    var result = fType.indexOf(ext) >= 0;

                    if (!result)
                        $scope.message = "The file " + filename + " is not valid.";

                    $timeout(function () {
                        $scope.message = null;
                    }, 2500);

                    return result;
                };
                $scope.onImageSelect = function ($files) {
                    if (isImageValid($files[0].name)) {
                        $scope.disableSubmitButton = true;
                        $scope.submitTxt = "Uploading...";
                        $scope.progress = 0;
                        $scope.upload = baseFactory
                            .upload('/api/upload/media', { oldfolder: '' }, $files)
                            .progress(function (evt) {
                                $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                            }).success(function (data, status, headers, config) {
                                if (!data.isErrored) {
                                    $scope.m.fileFolder = data.object.fileFolder;
                                    $scope.m.fileName = data.object.fileName;
                                    $scope.m.isUploaded = true;
                                }
                                $scope.disableSubmitButton = false;
                                $scope.submitTxt = 'Generate';
                            });
                    } else {
                        $scope.resetInputFile();
                        $scope.changeFile();
                    }
                };

                $scope.changeFile = function () {
                    $scope.m.isUploaded = false;
                    $scope.m.fileFolder = "";
                    $scope.m.fileName = "";
                    $scope.resetInputFile();
                };
                $scope.resetInputFile = function () {
                    var elems = document.getElementsByTagName('input');
                    for (var i = 0; i < elems.length; i++) {
                        if (elems[i].type === 'file' && elems[i].name === 'photoFile') {
                            elems[i].value = null;
                        }
                    }
                };
            }]);
})();
(function () {
    'use strict';

    angular.module('appCatalogue').controller('CatalogItemCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$location', '$sce', '$state', '$stateParams', '$timeout', '$modal', '$filter',
        'toaster', 'Lightbox', 'baseFactory', 'pricingFactory', 'shoppingCartFactory', 'QodoCarouselFactory', 'Carousel',
        'item', 'categories', 'PPI_CONSTANTS'];
    function ctrl($scope, $rootScope, $location, $sce, $state, $stateParams, $timeout, $modal, $filter,
        toaster, Lightbox, baseFactory, pricingFactory, shoppingCartFactory, QodoCarouselFactory, Carousel,
        item, categories, PPI_CONSTANTS) {
        $scope.Carousel = Carousel;

        $scope.productCarousel = "productCarousel" + window.randomString();
        $scope.groupByCount = function (items, cnt) {
            var ctr = 0;
            var groupCtr = 1;
            var group = [];
            var results = [];

            for (var x = 0; x < items.length; x++) {
                items[x].id = x;
                if (ctr >= cnt) {
                    results.push({
                        id: groupCtr,
                        items: group
                    });
                    group = [];
                    ctr = 0;
                    groupCtr++;
                }

                group.push(items[x]);
                ctr++;
            }
            if (group.length > 0) {
                results.push({
                    id: groupCtr,
                    items: group
                });
            }
            return results;
        };
        $scope.addQuantity = function (isAdd) {
            if (isAdd) {
                $scope.item.quantity++;
            } else if ($scope.item.quantity > 0) {
                $scope.item.quantity--;
            }
        };

        if (!item) {
            $state.go("^");
            return;
        }

        $scope.currentProduct = typeof item.parentItem !== 'undefined' ? angular.copy(item) : null;
        $scope.parentProduct = typeof item.parentItem !== 'undefined' ? angular.copy(item.parentItem) : angular.copy(item);

        if (item && item.items != null) {
            var variantPriorities = ['kit'];
            var arr = $filter('orderBy')(item.items, 'groupDisplayName');
            var variantLowerCase = function (str) {
                if (str != null) {
                    return str.toLowerCase();
                }
                return str;
            };
            for (var i = 0; i < arr.length; i++) {
                if (variantPriorities.indexOf(variantLowerCase(arr[i].groupDisplayName)) >= 0 ||
                    variantPriorities.indexOf(variantLowerCase(arr[i].variance2)) >= 0 ||
                    variantPriorities.indexOf(variantLowerCase(arr[i].variance3)) >= 0) {
                    $state.go("anonymous.shop.item.singleItem", { id: item.itemAlias, v: arr[i].itemAlias });
                    break;
                }
            }
        }

        $scope.categories = categories;
        $scope.itemSelected = itemSelected;
        $scope.changeCategory = changeCategory;
        $scope.openLightboxModal = openLightboxModal;
        $scope.showImage = showImage;
        $scope.updateShoppingCart = updateShoppingCart;
        $scope.getMaxColours = getMaxColours;
        $scope.quantityUpdated = quantityUpdated;
        $scope.cartonQuantityUpdated = cartonQuantityUpdated;
        $scope.linkedSetSelected = linkedSetSelected;
        $scope.showFreight = showFreight;
        $scope.openAddToExistingOrderModal = openAddToExistingOrderModal;
        $scope.isAdding = false;
        $scope.itemName = "";
        $scope.itemTabIndex = 2;

        function getMaxColours() {
            return pricingFactory.getMaxColoursToShow($scope.item);
        }

        function changeCategory(param) {
            $state.go($rootScope.currentRootState + '.catalog.category', { id: param.id });
        }

        function openLightboxModal(index) {
            Lightbox.openModal($scope.images, index);
        };

        function showImage(item) {
            for (var x = 0; x < $scope.images.length; x++) {
                $scope.images[x].isActive = item.id == $scope.images[x].id;
            }
        }

        function updateShoppingCart(mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $rootScope.$broadcast('$sageItemAdding', m);

                shoppingCartFactory.getShoppingCart().then(function (shoppingCart) {
                    shoppingCartFactory.addItemToCart(m, shoppingCart);
                    $rootScope.$broadcast('$sageItemAdded', m);
                });
            }
        }

        function cartonQuantityUpdated() {
            if (!$scope.item.config)
                return;
            pricingFactory.calculateAllPricing($scope.item);
        }

        function quantityUpdated() {
            if (!$scope.item.config)
                return;
            var quantities = pricingFactory.getAndSetCartonQuantityFromQuantity($scope.item.config, $scope.item.quantity);
            $scope.item.cartonQuantity = quantities.cartonQuantity;
            $scope.item.quantity = quantities.quantity;
            pricingFactory.calculateCustomQuantity($scope.item);
            pricingFactory.calculateAllPricing($scope.item);
        }

        function linkedSetSelected(linkedSet) {
            if (!linkedSet.pricingOnLinkedItem)
                return;

            //pricing is on the linked item.
            //get the config from the linked item
            baseFactory.fetch('/api/productConfigurations/GetLinkedProductConfiguration?itemNumber=' + $scope.model.selectedItem.itemNumber + '&linkedItemNumber=' + linkedSet.selectedLinkedItem.id).then(function (data) {
                $scope.item.config.productPrintTypeConfigurations = data.object.productPrintTypeConfigurations;
                initItemConfig();
                $scope.item.config.linkedItemSelected = true;
                pricingFactory.printTypeSelected($scope.item.config.selectedPrintTypeConfig, $scope.item);
            });
        }

        function initItem(itemToDisplay) {
            $scope.item = itemToDisplay;
            $scope.images = [];
            $scope.documents = [];
            $scope.mediaList = [];
            $scope.primaryImage = "";

            $scope.itemDescription = $sce.trustAsHtml(itemToDisplay.description);

            initItemConfig();

            if (itemToDisplay.documents.length < 1) {
                $scope.images.push({
                    url: '/content/img/placeholder.png',
                    thumbUrl: '/content/img/placeholder.png',
                    photoUrl: '/content/img/placeholder.png',
                    isActive: true
                });
            }

            angular.forEach(itemToDisplay.documents, function (value) {
                if (value.isImage) {
                    var newImage = {
                        id: $scope.images.length + 1,
                        url: value.link,
                        thumbUrl: value.link,
                        photoUrl: value.link,
                        isImage: true,
                        name: value.name,
                        isActive: value.isPrimary
                    };
                    if (value.isPrimary) {
                        $scope.primaryImage = value.link;
                        $scope.item.imageUrl = value.link;
                        $scope.images.unshift(newImage);
                    } else {
                        $scope.images.push(newImage);
                        newImage.name = value.name;
                        $scope.documents.push(newImage);
                    }
                } else if (value.isVideo) {
                    $scope.mediaList.push({
                        url: value.link,
                        thumbUrl: value.thumbnail,
                        photoUrl: value.thumbnail,
                        isImage: false,
                        isActive: false,
                        data: value
                    });
                } else {
                    var newDocument = {
                        name: value.name,
                        url: value.link
                    };
                    $scope.documents.push(newDocument);
                }
            });
            var items = $scope.images;
            for (var i = 0; i < $scope.mediaList.length; i++) {
                items.push($scope.mediaList[i]);
            }

            $scope.slider = $scope.groupByCount(items, 3);
        };

        function initItemConfig() {
            //Setting min Value for Quantity
            if ($scope.item.config) {
                $scope.item.quantity = $scope.item.config.minQuantity;
                $scope.item.cartonQuantity = $scope.item.config.minCartonQuantity;
                //pricing should only be read only when viewing from the item details page
                $scope.item.config.readonly = true;


                if ($scope.item.config.productPrintTypeConfigurations && $scope.item.config.productPrintTypeConfigurations.length > 0) {
                    $scope.item.config.selectedPrintTypeConfig = $scope.item.config.productPrintTypeConfigurations[0];
                    angular.forEach($scope.item.config.selectedPrintTypeConfig.layoutConfigurations, function (layoutConfiguration) {
                        layoutConfiguration.selectedPosition = layoutConfiguration.positions[0];
                    });
                }
                pricingFactory.initConfigurations($scope.item);
                pricingFactory.calculateAllPricing($scope.item);

                //freighting
                $scope.item.quantities = [];
                angular.forEach($scope.item.config.unitPrices, function (unitPrice) {
                    $scope.item.quantities.push({ quantity: unitPrice.minQuantity });
                });
            }
        }

        function itemSelected() {
            baseFactory.fetch('/api/item/GetItemDetails?itemNumber=' + $scope.model.selectedItem.itemNumber).then(function (data) {
                initItem(data.object);
            });
        };

        function showFreight() {
            if (!item.config)
                return false;

            if (!item.config.linkedSets || item.config.linkedSets.length === 0)
                return true;

            //only show freight if every linked item is selected
            var allLinkedSetsSelected = true;
            angular.forEach(item.config.linkedSets, function (linkedSet) {
                if (!linkedSet.selectedLinkedItem)
                    allLinkedSetsSelected = false;
            });
            return allLinkedSetsSelected;
        }

        function openAddToExistingOrderModal() {
            if ($scope.item.quantity <= 0)
                return;

            var isError = validate();

            if (isError) {
                return;
            }

            $modal.open({
                templateUrl: '/app/modules/catalog/itemDetails/addItemToExistingOrderModal.html',
                controller: 'addItemToExistingOrderModal',
                resolve: {
                    item: function () {
                        return $scope.item;
                    }
                }
            });
        }

        $scope.setItemTab = function (indx) {
            $scope.itemTabIndex = indx;
        };

        $scope.openVideo = function (m) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editVideoGalleryModal/viewSimpleMediaModal.html',
                controller: 'ViewSimpleMediaModalCtrl',
                size: 'lg',
                resolve: {
                    SimpleMediaModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcViewSimpleMediaCtrl');
                    }],
                    doc: function () {
                        return m;
                    },
                }
            });

            modalInstance.result.then(function (c) {
            }, function (r) {
            });
        };
        $scope.ngRepeatFinished = function () {
            console.log('fire');
            $scope.relatedItemCarousel = new QodoCarouselFactory({
                carousel: '.relatedItemCarousel',
                slide: '.slide',
                oneByOne: true
            });
        };
        
        function init() {
            $scope.dataToSend = [];

            initItem(item);

            // console.log($scope.item.relatedItems);

            // Set Item Tab
            if ($scope.item.relatedItems && $scope.item.relatedItems.length > 0) {
                $scope.itemTabIndex = 0;
                //console.log($scope.item.relatedItems);
                //setTimeout(function () {
                //    $scope.relatedItemCarousel = new QodoCarouselFactory({
                //        carousel: '#relatedItemCarousel',
                //        slide: '.slide',
                //        oneByOne: true
                //    });
                //}, 100);
            } else if ($scope.item.customFields && $scope.item.customFields.length > 0) {
                $scope.itemTabIndex = 1;
            }
            //
        }

        init();
    }
})();
angular.module('appCatalogue').controller('CheckoutCtrl',
    [
        '$scope', 'baseFactory', '$modal', '$locale', '$rootScope', 'shoppingCartFactory', 'promptFactory',
        'order', 'orderCustomFields', 'itemCustomField', '$timeout', '$state', '$window', 'printers', 'items',
        'FREIGHT_CONSTANTS', 'CART_CONSTANTS', 'pricingFactory', 'customerContacts', 'ppiOrderFactory',
        function ($scope, baseFactory, $modal, $locale, $rootScope, shoppingCartFactory, promptFactory,
            order, orderCustomFields, itemCustomField, $timeout, $state, $window, printers, items,
            FREIGHT_CONSTANTS, CART_CONSTANTS, pricingFactory, customerContacts, ppiOrderFactory) {
            try {
                $window.fbq('track', 'AddToCart');
            } catch (er) {}

            // DECLARATIONS
            $scope.displayImpersonate = $rootScope.user ? !isNullOrEmpty($rootScope.user.customerId) : null;
            $scope.isRequired = true;
            $scope.step = 1;
            $scope.submitTxt = "Pay for Order";
            $scope.submitOrderTxt = "Submit Order";
            $scope.disableSubmitButton = false;
            $scope.disableSubmitOrderButton = false;
            $scope.info = {
                isCopyInfo: false
            };
            $scope.freight = 0;
            $scope.isPoRequired = $rootScope.isAthenticated;

            function isNullOrEmpty(str) {
                return str === null && str === '';
            }

            //
            function init() {
                $scope.order = angular.copy(order);
                $scope.order.total = 0;

                if (!$scope.order.customerId) {
                    $scope.order.customerId = $rootScope.user ? isNullOrEmpty($rootScope.user.impersonateCustomerId) ? null : $rootScope.user.impersonateCustomerId : null;
                    $scope.order.customerName = $rootScope.user ? $rootScope.user.impersonateCustomerName : null;
                }
                $scope.doc = {
                    id: 0,
                    permissions: []
                };

                $scope.order.deliveryDate = order.deliveryDate === null ? new Date() : order.deliveryDate;
                $scope.order.customerContacts = customerContacts;
                $scope.order.subTotal = $scope.order.total;
                $scope.info = angular.fromJson($scope.order.uiData);
                if ($scope.info.firstName && $scope.info.surname)
                    $scope.info.fullName = $scope.info.firstName + ' ' + $scope.info.surname;

                if ($scope.order.artwork) {
                    $scope.doc = {
                        id: $scope.order.artwork.id,
                        permissions: [],
                        fileName: $scope.order.artwork.fileName,
                        link: $scope.order.artwork.link,
                        isUploaded: true,
                        isDownload: true,
                        downloadLink: $scope.order.artwork.link
                    };
                } else {
                    $scope.doc = {
                        id: 0,
                        permissions: []
                    };
                }
            }

            $scope.expiration = {
                months: [
                    { id: null, name: "Month" },
                    { id: "01", name: "Jan (01)" },
                    { id: "02", name: "Feb (02)" },
                    { id: "03", name: "Mar (03)" },
                    { id: "04", name: "Apr (04)" },
                    { id: "05", name: "May (05)" },
                    { id: "06", name: "Jun (06)" },
                    { id: "07", name: "Jul (07)" },
                    { id: "08", name: "Aug (08)" },
                    { id: "09", name: "Sep (09)" },
                    { id: "10", name: "Oct (10)" },
                    { id: "11", name: "Nov (11)" },
                    { id: "12", name: "Dec (12)" },
                ],
                years: [{ id: null, name: "Year" }]
            };
            var cy = parseInt(moment().format('YYYY'));
            for (var y = cy; y <= (cy + 5); y++) {
                $scope.expiration.years.push({ id: y.toString(), name: y });
            }
            $scope.states = [
                {
                    id: null,
                    name: 'State'
                }, {
                    id: 'ACT', // 4,
                    name: 'ACT'
                }, {
                    id: 'NSW', // 5,
                    name: 'NSW'
                }, {
                    id: 'NT', // 7,
                    name: 'NT'
                }, {
                    id: 'QLD', // 8,
                    name: 'QLD'
                }, {
                    id: 'SA', // 3,
                    name: 'SA'
                }, {
                    id: 'TAS', // 6,
                    name: 'TAS'
                }, {
                    id: 'VIC', // 1,
                    name: 'VIC'
                }, {
                    id: 'WA', // 2,
                    name: 'WA'
                }
            ];

            // PUBLIC
            $scope.itemQuantityChanged = function (item) {
                getSubTotal($scope.order.items);
            };
            $scope.removeItem = function (item, indx) {
                shoppingCartFactory.removeItemFromCart(item, $scope.shoppingCart).then(function () {
                    $scope.order.items.splice(indx, 1);
                    getSubTotal($scope.order.items);
                });
            };
            $scope.nextStep = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.step = 2;
                }
            };
            $scope.submitOrder = function (mForm, m, info) {
                m.isPayLater = true; // Waiting for payment
                $scope.disableSubmitOrderButton = true;
                $scope.saveOrder(mForm, m, info);
            };
            $scope.saveOrder = function (mForm, m, info) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    if (!$scope.disableSubmitOrderButton) {
                        $scope.submitTxt = "Processing...";
                    } else {
                        $scope.submitOrderTxt = "Saving...";
                    }
                    $scope.disableSubmitButton = true;
                    $scope.disableSubmitOrderButton = true;

                    var dataToSend = angular.copy(m);
                    dataToSend.artworkFile = $scope.doc;
                    dataToSend.uiData = angular.toJson(info);
                    dataToSend.total = angular.copy(dataToSend.subTotal);
                    delete dataToSend.customerContacts;
                    delete dataToSend.subTotal;

                    var saveUrl = '/api/order/save';

                    if (($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") && !$rootScope.user) {
                        saveUrl = '/api/order/anonymous';
                        dataToSend.customerId = "4REWA1-16"; // Test only
                        dataToSend.customerName = "****Reward Hospitality- Perth"; // Test only
                    }
                    //
                    baseFactory.post(saveUrl, dataToSend).then(function (rdata) {
                        if (!rdata.isErrored) {
                            // Redirect
                            if (m.isPayLater) {
                                // Clear cart
                                shoppingCartFactory.saveShoppingCart([]).then(function () {
                                    $state.transitionTo('base.orders', {}, { reload: true });
                                });
                            } else {
                                var uiData = angular.fromJson(rdata.object.uiData);
                                if (!uiData.isError)
                                    window.location.replace(uiData.requestUri);
                            }
                        }
                        //
                        $scope.submitTxt = "Pay for Order";
                        $scope.submitOrderTxt = "Submit Order";
                        $scope.disableSubmitButton = false;
                        $scope.disableSubmitOrderButton = false;
                    });
                }
                else {
                    m.isPayLater = false;
                    $scope.disableSubmitButton = false;
                    $scope.disableSubmitOrderButton = false;
                }
            };

            //Upload Document
            $scope.onFileSelect = onFileSelect;
            $scope.changeFile = changeFile;
            $scope.resetInputFile = resetInputFile;
            var isDocument = true;
            var isMedia = true;
            $scope.fileModel = {
                FileName: "",
                FileFolder: ""
            };

            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = [];
                var result = false;

                if (isDocument || isMedia) {
                    fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg"];
                    result = fType.indexOf(ext) >= 0;

                    if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                        $scope.doc.docTypeId = 2;
                    } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                        $scope.doc.docTypeId = 3;
                    } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                        $scope.doc.docTypeId = 5;
                    }
                }

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                if (result) {
                    if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                        $scope.doc.name = filename;
                    }
                }

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };

            function onFileSelect($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitOrderButton = true;
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.doc.isError = false;
                    $scope.progress = 0;

                    $scope.upload = baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) {
                            $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                        }).success(function (data, status, headers, config) {
                            if (!data.isErrored) {
                                $scope.resetInputFile();
                                $scope.fileModel = data.object;
                                $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                                $scope.doc.fileName = $scope.fileModel.fileName;
                                $scope.doc.isUploaded = true;
                                $scope.doc.isNew = true;
                            }
                            $scope.disableSubmitOrderButton = false;
                            $scope.disableSubmitButton = false;
                            $scope.submitTxt = "Save";
                        }).error(function () {
                            $scope.resetInputFile();
                            $scope.changeFile();

                            $scope.disableSubmitOrderButton = false;
                            $scope.disableSubmitButton = false;
                            $scope.submitTxt = "Save";
                            $scope.doc.isError = true;
                        });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };

            function changeFile() {
                $scope.doc.isUploaded = false;
                $scope.doc.fileFolder = "";
                $scope.doc.fileName = "";
                $scope.doc.link = "";
                $scope.doc.isNew = true;
            };

            function resetInputFile() {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };
            //End of Upload Document

            $scope.couponSubmitButton = "Apply";
            $scope.couponChanged = function (code) {
                $scope.couponSubmitButton = "Applying...";
                var arr = [];
                for (var i = 0; i < $scope.order.items.length; i++) {
                    arr.push($scope.order.items[i].itemNumber);
                }
                baseFactory.fetch('/api/coupon/getdiscount/' + code, { items: arr.join() }).then(function (rrdata) {
                    $scope.couponSubmitButton = "Apply";
                    $scope.info.coupon = rrdata.isErrored ? null : rrdata.object;
                });
            };
            $scope.removeCoupon = function () {
                $scope.couponSubmitButton = "Apply";
                $scope.info.discountCode = null;
                $scope.info.coupon = null;
            };

            // INIT
            init();
            var getSubTotal = function (items) {
                $scope.order.subTotal = 0;
                $scope.order.quantity = 0;
                $scope.freight = 0;
                var isFreightItemPresent = false;
                var isDownloadablePresent = true;
                angular.forEach(items, function (item) {
                    // Downloadable
                    if (['86500'].indexOf(item.itemNumber) < 0)
                        isDownloadablePresent = false;
                    //
                    if (item.itemNumber !== 'DC') {
                        if (item.itemNumber === 'FH')
                            isFreightItemPresent = true;
                        item.totalPrice = (parseFloat(item.unitPrice) * parseFloat(item.quantity));
                        $scope.order.subTotal = $scope.order.subTotal + item.totalPrice;
                        $scope.order.quantity = $scope.order.quantity + parseFloat(item.quantity);
                    }
                });
                //
                if (!isFreightItemPresent && !isDownloadablePresent)
                    $scope.freight = $scope.order.subTotal > 50 ? 0 : 10;
            };
            $scope.gstTotal = function () {
                var gTotal = ($scope.order.subTotal + $scope.freight);
                if ($scope.info.coupon) {
                    var total = 0;
                    var discount = 0;
                    var gst = 0;
                    if ($scope.info.coupon.couponAmount) {
                        discount = $scope.info.coupon.couponAmount;
                        total = gTotal - discount;
                        gst = total * 0.10;
                        return gst;
                    } else {
                        discount = gTotal * $scope.info.coupon.couponPercentage;
                        total = gTotal - discount;
                        gst = total * 0.10;
                        return gst;
                    }
                } else {
                    gst = gTotal * 0.10;
                    return gst;
                }
            };
            $scope.discountTotalValue = 0;
            $scope.discountTotal = function () {
                $scope.discountTotalValue = 0;
                var gTotal = $scope.order.subTotal + $scope.freight;
                if ($scope.info.coupon) {
                    if ($scope.info.coupon.couponAmount) {
                        $scope.discountTotalValue = $scope.info.coupon.couponAmount * -1;
                        return $scope.discountTotalValue;
                    } else {
                        var discount = gTotal * $scope.info.coupon.couponPercentage;
                        $scope.discountTotalValue = discount * -1;
                        return $scope.discountTotalValue;
                    }
                }
                return 0;
            };
            $scope.grandTotal = function () {
                var gTotal = ($scope.order.subTotal + $scope.freight);
                if ($scope.info.coupon) {
                    var total = 0;
                    var discount = 0;
                    var gst = 0;
                    if ($scope.info.coupon.couponAmount) {
                        discount = $scope.info.coupon.couponAmount;
                        total = gTotal - discount;
                        gst = total * 0.10;
                        return total >= 0 ? total + gst : 0;
                    } else {
                        discount = gTotal * $scope.info.coupon.couponPercentage;
                        total = gTotal - discount;
                        gst = total * 0.10;
                        return total >= 0 ? total + gst : 0;
                    }
                } else {
                    gst = gTotal * 0.10;
                    return gTotal + gst;
                }
            };

            if (order.id == 0) {
                shoppingCartFactory.getShoppingCart().then(function (items) {
                    angular.forEach(items, function (item) {
                        $scope.order.items.push(item);
                    });
                    getSubTotal($scope.order.items);
                });
            } else {
                if ($scope.order.total == 0)
                    getSubTotal($scope.order.items);
            }

            if ($rootScope.user)
                $rootScope.$watchCollection('user', function (v) {
                    // $scope.isRequired = typeof v === 'undefined' || v == null;
                    if (typeof v !== 'undefined' || v !== null) {
                        if ($scope.info === null)
                            $scope.info = {
                                isCopyInfo: false,
                                fullName: v.fullName,
                                email: v.email,
                                state: null,
                                postalcode: null
                            };
                    }
                });

            $scope.$watchCollection('info', function (v) {
                if (v.isCopyInfo) {
                    v['shippingFullName'] = angular.copy(v['fullName']);
                    v['shippingAddress'] = angular.copy(v['address']);
                    v['shippingCity'] = angular.copy(v['city']);
                    v['shippingState'] = angular.copy(v['state']);
                    v['shippingPostalcode'] = angular.copy(v['postalcode']);
                    v['shippingEmail'] = angular.copy(v['email']);
                    v['shippingPhone'] = angular.copy(v['phone']);
                }
            });
        }
    ]);
angular.module('appCatalogue').controller('ConfirmPaymentQodoCtrl',
['$scope', 'baseFactory', 'receipt',
    function ($scope, baseFactory, receipt) {
        $scope.order = receipt.order;
        $scope.info = angular.fromJson($scope.order.uiData);
        $scope.receipt = receipt;
    }
]);



angular.module('appCatalogue').directive('qodoCatalogItem',
    [
        function () {
            return {
                restrict: 'E',
                replace: true,
                scope: {
                    parentItem: '=',
                    currentItem: '=?'
                },
                templateUrl: '/app/modules/catalog/qodo/directives/qodoCatalogItem.html',
                controller: ['$scope', '$filter', function ($scope, $filter) {
                    var recommendedArr = ['kit'];
                    $scope.recommendations = [];

                    // Normalize
                    var parent = {
                        itemNumber: $scope.parentItem.itemNumber,
                        itemAlias: $scope.parentItem.itemAlias,
                        items: [],
                        variant1: $scope.parentItem.groupDisplayName || 'Variances',
                        variant2: $scope.parentItem.variance2 || 'Variances 2',
                        variant3: $scope.parentItem.variance3 || 'Variances 3'
                    };
                    if ($scope.parentItem.items) {
                        for (var i = 0; i < $scope.parentItem.items.length; i++) {
                            var item = $scope.parentItem.items[i];
                            var nItem = {
                                itemNumber: item.itemNumber,
                                itemAlias: item.itemAlias,
                                colour: item.colour || null,
                                variant1: item.groupDisplayName,
                                variant2: item.variance2 !== null && item.variance2 !== "" ? item.variance2 : null,
                                variant3: item.variance3 !== null && item.variance3 !== "" ? item.variance3 : null
                            };
                            parent.items.push(nItem);
                        }
                    }
                    //
                    var currentItem = null;

                    if ($scope.currentItem !== null) {
                        currentItem = {
                            itemNumber: $scope.currentItem.itemNumber,
                            itemAlias: $scope.currentItem.itemAlias,
                            variant1: $scope.currentItem.groupDisplayName,
                            variant2: $scope.currentItem.variance2 !== null && $scope.currentItem.variance2 !== "" ? $scope.currentItem.variance2 : null,
                            variant3: $scope.currentItem.variance3 !== null && $scope.currentItem.variance3 !== "" ? $scope.currentItem.variance3 : null
                        };
                    } else if (parent.items.length > 0) {
                        currentItem = {
                            itemNumber: parent.items[0].itemNumber,
                            itemAlias: parent.items[0].itemAlias,
                            variant1: parent.items[0].variant1,
                            variant2: parent.items[0].variant2 !== null && parent.items[0].variant2 !== "" ? parent.items[0].variant2 : null,
                            variant3: parent.items[0].variant3 !== null && parent.items[0].variant3 !== "" ? parent.items[0].variant3 : null
                        };
                    }

                    $scope.varianceTypes = [];

                    // VARIANCEs
                    var variance1 = {
                        name: parent.variant1,
                        variances: [],
                        arr: []
                    };
                    var variance2 = {
                        name: parent.variant2,
                        variances: [],
                        arr: []
                    };
                    var variance3 = {
                        name: parent.variant3,
                        variances: [],
                        arr: []
                    };

                    var checkForRecommendations = function (variance, itm, variant) {
                        if (recommendedArr.indexOf(item[variant].toLowerCase()) >= 0) {
                            $scope.recommendations.push({
                                parentItemNumber: parent.itemNumber,
                                parentItemAlias: parent.itemAlias,
                                itemNumber: itm.itemNumber,
                                itemAlias: itm.itemAlias,
                                variant: item[variant],
                                colour: itm.colour
                            });
                        } else {
                            // Find SortOrder
                            var indx = 0;
                            if (variant === 'variant2')
                                indx = 1;
                            if (variant === 'variant3')
                                indx = 2;
                            var options = $scope.parentItem.varianceConfiguration.varianceList[indx].options;
                            options = options.length > 0 ? $filter('orderBy')(options, 'sortOrder') : [];
                            var arrOptions = [];
                            for (var z = 0; z < options.length; z++)
                                arrOptions.push(options[z].name.toLowerCase());

                            variance.variances.push({
                                parentItemNumber: parent.itemNumber,
                                parentItemAlias: parent.itemAlias,
                                itemNumber: itm.itemNumber,
                                itemAlias: itm.itemAlias,
                                variant: item[variant],
                                colour: itm.colour,
                                sortOrder: arrOptions.indexOf(item[variant].toLowerCase())
                            });
                            variance.arr.push(item[variant]);
                        }
                    };

                    var arr = [];
                    for (var i = 0; i < parent.items.length; i++) {
                        var item = parent.items[i];

                        if (currentItem !== null) {
                            // Variant 1
                            if (currentItem.variant1 === item.variant1) {
                                if (currentItem.itemNumber === item.itemNumber) {
                                    checkForRecommendations(variance1, item, 'variant1');
                                }

                                // Variant 2
                                if (currentItem.variant2 !== null)
                                    if (currentItem.variant2 === item.variant2) {
                                        if (currentItem.itemNumber === item.itemNumber) {
                                            checkForRecommendations(variance2, item, 'variant2');
                                        }

                                        // Variant 3
                                        if (currentItem.variant3 !== null)
                                            if (currentItem.variant3 === item.variant3) {
                                                if (currentItem.itemNumber === item.itemNumber) {
                                                    checkForRecommendations(variance3, item, 'variant3');
                                                }
                                            } else if (variance3.arr.indexOf(item.variant3) < 0) {
                                                checkForRecommendations(variance3, item, 'variant3');
                                            }

                                    } else if (variance2.arr.indexOf(item.variant2) < 0 && currentItem.variant3 === item.variant3) {
                                        checkForRecommendations(variance2, item, 'variant2');
                                    }

                            } else if (variance1.arr.indexOf(item.variant1) < 0 && currentItem.variant2 === item.variant2) {
                                checkForRecommendations(variance1, item, 'variant1');
                            }
                        }
                    }

                    // check if Group Variant is Colour
                    var checkvarianceTypes = function (varianceTypes) {
                        angular.forEach(varianceTypes, function (variance) {
                            if (variance.isRecommendations) {
                                angular.forEach(variance.variances, function (v) {
                                    v.cssClass = 'btn-lg';
                                    v.colour = null;
                                });
                            }
                            if (variance.name.toLowerCase() !== "colour") {
                                angular.forEach(variance.variances, function (v) {
                                    v.colour = null;
                                });
                            }
                            if (variance.name.toLowerCase() === "day of week") {
                                angular.forEach(variance.variances, function (v) {
                                    switch (v.variant.toLowerCase()) {
                                        case "monday":
                                        case "mon":
                                            v.cssClass = 'dow-mon';
                                            break;
                                        case "tuesday":
                                        case "tue":
                                            v.cssClass = 'dow-tue';
                                            break;
                                        case "wednesday":
                                        case "wed":
                                            v.cssClass = 'dow-wed';
                                            break;
                                        case "thursday":
                                        case "thu":
                                            v.cssClass = 'dow-thu';
                                            break;
                                        case "friday":
                                        case "fri":
                                            v.cssClass = 'dow-fri';
                                            break;
                                        case "saturday":
                                        case "sat":
                                            v.cssClass = 'dow-sat';
                                            break;
                                        case "sunday":
                                        case "sun":
                                            v.cssClass = 'dow-sun';
                                            break;
                                        case "kit":
                                            v.cssClass = 'dow-any';
                                            break;
                                    }
                                });
                            }

                            for (var i = 0; i < variance.variances.length; i++) {
                                var v = variance.variances[i];
                                if (!variance.isRecommendations)
                                    v.style = { 'background': v.colour, 'width': v.colour ? 30 : 'auto', 'height': 30, 'font-size': 12 };
                            }
                        });

                        return varianceTypes;
                    };

                    //
                    if ($scope.recommendations.length > 0) {
                        $scope.varianceTypes.push({
                            name: '',
                            variances: $scope.recommendations,
                            arr: [],
                            isRecommendations: true
                        });
                    }
                    if (variance1.variances.length > 0) {
                        $scope.varianceTypes.push(variance1);
                    }
                    if (variance2.variances.length > 0) {
                        $scope.varianceTypes.push(variance2);
                    }
                    if (variance3.variances.length > 0) {
                        $scope.varianceTypes.push(variance3);
                    }
                    //
                    checkvarianceTypes($scope.varianceTypes);
                }],
                link: function (scope, elem, attr) {
                }
            };
        }]);
angular.module('appCatalogue').controller('searchCtrl',
    ['$scope', '$state', '$rootScope', '$stateParams', 'categories', 'customFields', 'stockStatuses', 'itemBrands', 'baseFactory',
        function ($scope, $state, $rootScope, $stateParams, categories, customFields, stockStatuses, itemBrands, baseFactory) {
            //
            $scope.categories = angular.copy(categories);
            $scope.customFields = angular.copy(customFields);
            $scope.stockStatuses = angular.copy(stockStatuses);
            $scope.itemBrands = angular.copy(itemBrands);
            $scope.search = {};
            $scope.search.advancedSearch = "";
            $scope.isLoading = true;
            $scope.startIndex = 1;
            $scope.pageSize = 20;
            $scope.url = "/api/item/SearchItems";
            $scope.dataToSend = {};
            $scope.items = [];
            $scope.tempItems = [];
            $scope.searchUpdate = searchUpdate;
            $scope.searchItems = searchItems;
            $scope.totalRows = 0;
            $scope.pageCategory = null;
            $scope.subPageCategory = null;
            var arrItems = [];
            var temporaryCategoryIds = [];
            var temporaryFilters = [];
            var temporaryStockStatuses = [];
            var temporaryItembrands = [];

            function setAndCheckCategories() {
                temporaryCategoryIds = [];
                $scope.search.searchCategories = [];
                angular.forEach(categories, function (v) {
                    v.selected = typeof $stateParams.c !== 'undefined' ? $stateParams.c == v.alias : false;
                    v.partial = null;
                    angular.forEach(v.subCategories, function (vv) {
                        vv.selected = false;
                        if (typeof $stateParams.sc !== 'undefined') {
                            vv.selected = $stateParams.sc == vv.alias;
                            if (vv.selected) {
                                $scope.pageCategory = vv.name;
                                $scope.subPageCategory = vv.description;
                                $scope.category = vv;
                                temporaryCategoryIds.push(vv.id);
                                v.partial = true;
                            }
                        } else if (v.selected) {
                            temporaryCategoryIds.push(vv.id);
                        }
                    });
                    if (v.selected) {
                        if (!v.partial) {
                            $scope.pageCategory = v.name;
                            $scope.subPageCategory = v.description;
                        }
                        $scope.parentCategory = v;
                        temporaryCategoryIds.push(v.id);
                    }

                    $scope.search.searchCategories.push(v);
                });
            }
            function setAndCheckCustomFields() {
                temporaryFilters = [];
                $scope.search.searchCustomFields = [];

                angular.forEach(customFields, function (cf) {
                    if (cf.options !== null && cf.options.length > 0) {
                        var filterOptions = [];
                        var options = angular.copy(angular.fromJson(cf.options));
                        var ncf = angular.copy(cf);
                        ncf.cfAlias = cf.name.toLowerCase().replaceAll(" - ", "-").replaceAll(" ", "-");
                        ncf.options = [];
                        angular.forEach(options, function (v, indx) {
                            var optAlias = v.toLowerCase().replaceAll(" - ", "-").replaceAll(" ", "-");
                            var tempOption = {
                                id: indx,
                                name: v,
                                cfAlias: ncf.cfAlias,
                                optAlias: optAlias,
                                value: {},
                                selected: false
                            };
                            if (typeof $stateParams.f !== 'undefined' && typeof $stateParams.v !== 'undefined')
                                tempOption.selected = $stateParams.f === ncf.cfAlias && $stateParams.v === optAlias;
                            if (tempOption.selected)
                                filterOptions.push(v);
                            ncf.options.push(tempOption);
                        });
                        //
                        if (filterOptions.length > 0)
                            $scope.pageCategory = ncf.name + ' - ' + filterOptions.join();
                        temporaryFilters.push(ncf.id + ':' + filterOptions.join() + ';');
                        //
                        $scope.search.searchCustomFields.push(ncf);
                    }
                });
            }
            function setAndCheckStockStatuses() {
                temporaryStockStatuses = [];
                $scope.search.stockStatuses = [];
                angular.forEach(stockStatuses, function (v) {
                    var alias = v.name.toLowerCase().replaceAll(" - ", "-").replaceAll(" ", "-");
                    var ss = {
                        id: v.id,
                        name: v.name,
                        alias: alias,
                        selected: false
                    };
                    if (typeof $stateParams.s !== 'undefined')
                        ss.selected = alias == $stateParams.s;
                    if (ss.selected) {
                        $scope.pageCategory = ss.name;
                        temporaryStockStatuses.push(ss.id);
                    }
                    $scope.search.stockStatuses.push(ss);
                });
            }
            function setAndCheckItemBrands() {
                temporaryItemBrands = [];
                $scope.search.itemBrands = [];
                angular.forEach(itemBrands, function (v) {
                    var ss = {
                        id: v.id,
                        name: v.name,
                        alias: v.alias,
                        selected: false
                    };
                    if (typeof $stateParams.b !== 'undefined')
                        ss.selected = v.alias === $stateParams.b;
                    if (ss.selected) {
                        $scope.pageCategory = ss.name;
                        temporaryItemBrands.push(ss.id);
                    }
                    $scope.search.itemBrands.push(ss);
                });
            }

            function init() {
                $scope.isLoading = true;

                searchItems();
            };

            function searchUpdate() {
                $scope.currentCategory = null;
                $scope.isLoading = true;
                $scope.items = [];
                $scope.startIndex = 1;
                var categoryIdArr = [];
                var statusIdArr = [];
                var customFieldArr = [];

                // Categories
                angular.forEach($scope.search.searchCategories, function (value, index) {
                    if (value.subCategories.length > 0) {
                        angular.forEach(value.subCategories, function (v) {
                            if (v.selected && categoryIdArr.indexOf(v.id) < 0)
                                categoryIdArr.push(v.id);
                        });
                    }
                    if (value.selected && categoryIdArr.indexOf(value.id) < 0) {
                        categoryIdArr.push(value.id);
                    }
                });

                // Statuses
                angular.forEach($scope.search.stockStatuses, function (value, index) {
                    if (value.selected) {
                        statusIdArr.push(value.id);
                    }
                });

                // CustomFields
                angular.forEach($scope.search.searchCustomFields, function (cf) {
                    var cfStr = cf.id.toString();
                    var cfArr = [];
                    angular.forEach(cf.options, function (v) {
                        if (v.selected) {
                            cfArr.push(v.name);
                        }
                    });

                    if (cfArr.length > 0)
                        customFieldArr.push(cfStr + ':' + cfArr.join(',') + ';');
                });

                var dataToSend = {
                    f: customFieldArr.join('_'),
                    q: $scope.search.advancedSearch,
                    s: statusIdArr.join(','),
                    c: categoryIdArr.join(',')
                };
                // console.log(dataToSend)
                $state.go($rootScope.currentRootState + '.catalog', dataToSend);
            }

            function searchItems() {
                // SearchText
                $scope.search.advancedSearch = typeof $stateParams.q === "undefined" ? '' : $stateParams.q;

                // Categories
                setAndCheckCategories();

                // CustomFields
                setAndCheckCustomFields();

                // Stock Status
                setAndCheckStockStatuses();

                // ItemBrands
                setAndCheckItemBrands();

                var dataToSend = {
                    filter: temporaryFilters.length > 0 ? temporaryFilters.join('') : null,
                    searchText: $stateParams.q,
                    statuses: temporaryStockStatuses.length > 0 ? temporaryStockStatuses.join('') : null,
                    brands: temporaryItemBrands.length > 0 ? temporaryItemBrands.join('') : null,
                    retrieveSize: 20,
                    categoryIds: temporaryCategoryIds.length > 0 ? jQuery.unique(temporaryCategoryIds).join() : $stateParams.c
                };
                temporaryCategoryIds = [];
                dataToSend.startIndex = $scope.startIndex;
                dataToSend.includeMinimumQuantity = true;
                dataToSend.sort = 'name';
                baseFactory.fetch($scope.url, dataToSend).then(function (rrdata) {
                    angular.forEach(rrdata.object, function (value, index) {
                        $scope.totalRows = value.totalRows;
                        if (arrItems.indexOf(value.itemNumber) < 0) {
                            arrItems.push(value.itemNumber);
                            $scope.items.push(value);
                        }
                    });
                    $scope.isLoading = false;
                });
            };

            $scope.updateCategories = function (nvid) {
                var cat = [];

                angular.forEach($scope.search.searchCategories, function (v) {
                    if (v.subCategories.length > 0) {
                        var ctr = 0;
                        angular.forEach(v.subCategories, function (vv) {
                            if (v.id == nvid)
                                vv.selected = v.selected;

                            if (vv.selected) {
                                cat.push({ categoryId: vv.id });
                                ctr++;
                            }
                        });

                        if (ctr > 0) {
                            if (v.subCategories.length == ctr) {
                                v.partial = false;
                                v.selected = true;
                            } else {
                                v.partial = true;
                            }
                        } else {
                            v.partial = false;
                            v.selected = false;
                        }
                    }

                    if (v.selected)
                        cat.push({ categoryId: v.id });
                });
                searchUpdate();
            };

            $scope.itemDetails = function (item) {
                $state.go($rootScope.currentRootState + '.catalog.item', { id: item.itemNumber });
            };

            $scope.showMore = function () {
                $scope.startIndex = $scope.items.length + 1;
                $scope.searchItems();
                $scope.loading = false;
            };

            $scope.gotoCategory = function (categoryAlias) {
                $state.go('anonymous.shop.category', { c: categoryAlias });
            };
            $scope.gotoSubCategory = function (categoryAlias, subCategoryAlias) {
                $state.go('anonymous.shop.category.sub', { c: categoryAlias, sc: subCategoryAlias });
            };
            $scope.gotoCustomField = function (cf) {
                $state.go('anonymous.shop.filter', { f: cf.cfAlias, v: cf.optAlias });
            };
            $scope.gotoStockStatus = function (ss) {
                $state.go('anonymous.shop.status', { s: ss.alias });
            };
            $scope.gotoItemBrand = function (ss) {
                $state.go('anonymous.shop.brand', { b: ss.alias });
            };

            init();

            // ------------------
            $scope.expandFilter = function (indx) {
                $scope.isCollapsedArr[indx] = !$scope.isCollapsedArr[indx];
            };
            if (typeof $rootScope.isCollapsedCategoryArr === 'undefined')
                $rootScope.isCollapsedCategoryArr = [];
            $scope.expandCategoryFilter = function (indx) {
                $rootScope.isCollapsedCategoryArr[indx] = !$rootScope.isCollapsedCategoryArr[indx];
            };
            $scope.checkCategoryCollapsed = function (indx) {
                if (typeof $rootScope.isCollapsedCategoryArr[indx] === 'undefined')
                    $rootScope.isCollapsedCategoryArr[indx] = true;
            }

            // CUSTOM for QODO clients
            $scope.gridView = true;
            $scope.changeGridView = function (v) {
                $scope.gridView = v;
            };

            $scope.currentCategory = null;
            $scope.openCategory = function (cat) {
                if ($scope.currentCategory != cat) {
                    $scope.currentCategory = cat;
                } else {
                    $scope.currentCategory = null;
                }
            };
        }
    ]);
angular.module('appCatalogue').controller('SearchCategoryCtrl',
    ['$scope', '$state', '$rootScope', '$stateParams', 'categories', 'customFields', 'stockStatuses', 'baseFactory',
        function ($scope, $state, $rootScope, $stateParams, categories, customFields, stockStatuses, baseFactory) {

            $scope.search = {};
            $scope.search.advancedSearch = "";
            $scope.isLoading = true;
            $scope.startIndex = 1;
            $scope.pageSize = 20;
            $scope.url = "/api/item/SearchItems";
            $scope.dataToSend = {};
            $scope.items = [];
            $scope.tempItems = [];
            $scope.searchUpdate = searchUpdate;
            $scope.searchItems = searchItems;
            $scope.totalRows = 0;
            $scope.category = null;
            $scope.parentCategory = null;
            $scope.pageCategory = null;
            $scope.subPageCategory = null;
            var arrItems = [];
            var temporaryCategoryIds = [];

            // console.log(customFields);

            function setAndCheckCategories() {
                temporaryCategoryIds = [];
                $scope.search.searchCategories = [];
                angular.forEach(categories, function (v) {
                    v.selected = typeof $stateParams.c !== 'undefined' ? $stateParams.c == v.alias : false;
                    v.partial = null;
                    angular.forEach(v.subCategories, function (vv) {
                        vv.selected = false;
                        if (typeof $stateParams.sc !== 'undefined') {
                            vv.selected = $stateParams.sc == vv.alias;
                            if (vv.selected) {
                                $scope.pageCategory = vv.name;
                                $scope.subPageCategory = vv.description;
                                $scope.category = vv;
                                temporaryCategoryIds.push(vv.id);
                                v.partial = true;
                            }
                        } else if (v.selected) {
                            temporaryCategoryIds.push(vv.id);
                        }
                    });
                    if (v.selected) {
                        if (!v.partial) {
                            $scope.pageCategory = v.name;
                            $scope.subPageCategory = v.description;
                        }
                        $scope.parentCategory = v;
                        temporaryCategoryIds.push(v.id);
                    }

                    $scope.search.searchCategories.push(v);
                });
            }

            function init() {
                $scope.isLoading = true;

                // SearchText
                $scope.search.advancedSearch = typeof $stateParams.q === "undefined" ? '' : $stateParams.q;

                // Categories
                setAndCheckCategories();

                // Stock Status
                var statusIdArr = typeof $stateParams.s === "undefined" ? [] : $stateParams.s.split(',');
                $scope.search.stockStatuses = [];
                angular.forEach(stockStatuses, function (v) {
                    v.selected = statusIdArr.indexOf(v.id.toString()) >= 0;
                    $scope.search.stockStatuses.push(v);
                });

                // CustomFields
                var customFieldArr = typeof $stateParams.f === "undefined" ? [] : $stateParams.f.split('_');
                $scope.search.searchCustomFields = [];

                angular.forEach(customFields, function (cf) {
                    if (cf.options != null && cf.options.length > 0) {
                        // console.log(cf.options);
                        var cfValues = [];
                        for (var x = 0; x < customFieldArr.length; x++) {
                            var cfStrArr = customFieldArr[x].replace(';', '').split(':');
                            if (cfStrArr[0] == cf.id) {
                                cfValues = cfStrArr[1].split(',');
                                break;
                            }
                        }
                        var options = angular.copy(angular.fromJson(cf.options));
                        var ncf = angular.copy(cf);
                        ncf.options = [];
                        angular.forEach(options, function (v, indx) {
                            var tempOption = {
                                id: indx,
                                name: v,
                                value: {},
                                selected: cfValues.indexOf(v) >= 0
                            };
                            ncf.options.push(tempOption);
                        });

                        $scope.search.searchCustomFields.push(ncf);
                    }
                });

                searchItems();
            };

            function searchUpdate() {
                $scope.currentCategory = null;
                $scope.isLoading = true;
                $scope.items = [];
                $scope.startIndex = 1;
                var categoryIdArr = [];
                var statusIdArr = [];
                var customFieldArr = [];

                // Categories
                angular.forEach($scope.search.searchCategories, function (value, index) {
                    if (value.subCategories.length > 0) {
                        var ctrSelected = 0;
                        var subCatIdArr = [];
                        angular.forEach(value.subCategories, function (v) {
                            if (v.selected)
                                ctrSelected++;

                            if (v.selected && categoryIdArr.indexOf(v.alias) < 0) {
                                subCatIdArr.push(v.alias);
                            }
                        });
                        if (ctrSelected != value.subCategories.length) {
                            for (var i = 0; i < subCatIdArr.length; i++) {
                                categoryIdArr.push(subCatIdArr[i]);
                            }
                        }
                    }
                    if (value.selected && categoryIdArr.indexOf(value.alias) < 0) {
                        categoryIdArr.push(value.alias);
                    }
                });

                // Statuses
                angular.forEach($scope.search.stockStatuses, function (value, index) {
                    if (value.selected) {
                        statusIdArr.push(value.id);
                    }
                });

                // CustomFields
                angular.forEach($scope.search.searchCustomFields, function (cf) {
                    var cfStr = cf.id.toString();
                    var cfArr = [];
                    angular.forEach(cf.options, function (v) {
                        if (v.selected) {
                            cfArr.push(v.name);
                        }
                    });

                    if (cfArr.length > 0)
                        customFieldArr.push(cfStr + ':' + cfArr.join(',') + ';');
                });

                var dataToSend = {
                    q: null,
                    f: customFieldArr.join('_'),
                    s: statusIdArr.join(','),
                    c: categoryIdArr.join(',')
                };
                if ($scope.search.advancedSearch)
                    dataToSend.q = $scope.search.advancedSearch;
                // console.log(dataToSend)
                // $state.go($rootScope.currentRootState + '.catalog', dataToSend);
                $state.go('anonymous.shop', dataToSend);
            }

            function searchItems() {
                // Categories
                setAndCheckCategories();

                var dataToSend = {
                    filter: $stateParams.f,
                    searchText: $stateParams.q,
                    statuses: $stateParams.s,
                    retrieveSize: 20,
                    categoryIds: temporaryCategoryIds.length > 0 ? jQuery.unique(temporaryCategoryIds).join() : $stateParams.c
                };
                temporaryCategoryIds = [];
                dataToSend.startIndex = $scope.startIndex;
                dataToSend.includeMinimumQuantity = true;
                dataToSend.sort = 'name';
                baseFactory.fetch($scope.url, dataToSend).then(function (rrdata) {
                    angular.forEach(rrdata.object, function (value, index) {
                        $scope.totalRows = value.totalRows;
                        if (arrItems.indexOf(value.itemNumber) < 0) {
                            arrItems.push(value.itemNumber);
                            $scope.items.push(value);
                        }
                    });
                    $scope.isLoading = false;
                });
            };

            function clearSearch() {
                $scope.search.advancedSearch = null;
                searchUpdate();
            };
            $scope.clearSearch = clearSearch;

            $scope.updateCategories = function (nvid) {
                var cat = [];

                angular.forEach($scope.search.searchCategories, function (v) {
                    // select one
                    v.selected = v.id == nvid;

                    if (v.subCategories.length > 0) {
                        for (var i = 0; i < v.subCategories.length; i++) {
                            v.subCategories[i].selected = v.subCategories[i].id == nvid;
                            if (v.subCategories[i].selected)
                                v.selected = true;
                        }
                    }

                    //if (v.subCategories.length > 0) {
                    //    var ctr = 0;
                    //    angular.forEach(v.subCategories, function (vv) {
                    //        if (v.id == nvid)
                    //            vv.selected = v.selected;

                    //        if (vv.selected) {
                    //            cat.push({ categoryId: vv.id });
                    //            ctr++;
                    //        }
                    //    });

                    //    if (ctr > 0) {
                    //        if (v.subCategories.length == ctr) {
                    //            v.partial = false;
                    //            v.selected = true;
                    //        } else {
                    //            v.partial = true;
                    //        }
                    //    } else {
                    //        v.partial = false;
                    //        v.selected = false;
                    //    }
                    //}

                    //if (v.selected)
                    //    cat.push({ categoryId: v.id });
                });
                searchUpdate();
            };

            $scope.itemDetails = function (item) {
                $state.go($rootScope.currentRootState + '.catalog.item', { id: item.itemNumber });
            };

            $scope.showMore = function () {
                $scope.startIndex = $scope.items.length + 1;
                $scope.searchItems();
                $scope.loading = false;
            };

            $scope.gotoCategory = function (categoryAlias) {
                $state.go('anonymous.shop.category', { c: categoryAlias });
            };
            $scope.gotoSubCategory = function (categoryAlias, subCategoryAlias) {
                $state.go('anonymous.shop.category.sub', { c: categoryAlias, sc: subCategoryAlias });
            };

            init();

            // ------------------
            $scope.expandFilter = function (indx) {
                $scope.isCollapsedArr[indx] = !$scope.isCollapsedArr[indx];
            };
            if (typeof $rootScope.isCollapsedCategoryArr === 'undefined')
                $rootScope.isCollapsedCategoryArr = [];
            $scope.expandCategoryFilter = function (indx) {
                $rootScope.isCollapsedCategoryArr[indx] = !$rootScope.isCollapsedCategoryArr[indx];
            };
            $scope.checkCategoryCollapsed = function (indx) {
                if (typeof $rootScope.isCollapsedCategoryArr[indx] === 'undefined')
                    $rootScope.isCollapsedCategoryArr[indx] = true;
            };

            // CUSTOM for QODO clients
            $scope.gridView = true;
            $scope.changeGridView = function (v) {
                $scope.gridView = v;
            };

            $scope.currentCategory = null;
            $scope.openCategory = function (cat) {
                if ($scope.currentCategory != cat) {
                    $scope.currentCategory = cat;
                } else {
                    $scope.currentCategory = null;
                }
            };
        }
    ]);
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.downloads', {
                url: "/downloads",
                noLoginRequired: true,
                meta: {
                    title: "Downloads",
                    description: "Download page"
                },
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/downloads/views/index.html",
                        controller: 'DownloadCtrl',
                        resolve: {
                            downloadItems: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/documents/GetAllDocuments?isAll=true&retrieveSize=40&startIndex=1').then(function (rdata) {
                                    return rdata.object || [];
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Downloads'
                }
            });
    }
]);
(function () {
    'use strict';

    homeModule.controller('DownloadCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'downloadItems'];
    function ctrl($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, downloadItems) {

        $scope.downloadItems = downloadItems;

        // DOCUMENTS
        $scope.refreshData = function() {
            baseFactory.fetch('/api/documents/GetAllDocuments?isAll=true&retrieveSize=40&startIndex=1').then(function (rdata) {
                $scope.downloadItems = rdata.object || [];
            });
        };
        $scope.setdocIcon = function (ext) {
            switch (ext) {
                case 'doc':
                case 'docx':
                    return '/app/css/img/docicons/icon-doc-20.png';
                case 'xls':
                case 'xlsx':
                    return '/app/css/img/docicons/icon-xls-20.png';
                case 'ppt':
                case 'pptx':
                    return '/app/css/img/docicons/icon-ppt-20.png';
                case 'jpg':
                case 'jpeg':
                case 'png':
                case 'gif':
                    return '/app/css/img/docicons/icon-image-20.png';
                case 'pdf':
                    return '/app/css/img/docicons/icon-pdf-20.png';
                default:
                    return '/app/css/img/docicons/icon-txt-20.png';
            }
        };
        $scope.openUploadDocumentModal = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/uploads/uploadDocumentModal.html',
                controller: 'UploadDocumentModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    doc: function () {
                        return d == null ? {
                            id: 0,
                            isHomePage: false,
                            showHomePage: false,
                            showIsYoutubeVideo: false,
                            permissions: [],
                            categoryId: null
                        } : d;
                    },
                    title: function () {
                        return "Document";
                    },
                    docTypes: [function () {
                        if ($rootScope.lookup.docTypes.length > 0)
                            return $rootScope.lookup.docTypes;

                        return baseFactory.fetch('/api/documents/GetAllDocumentTypes').then(function (rrdata) {
                            $rootScope.lookup.docTypes = rrdata.object == null ? [] : rrdata.object;
                            return $rootScope.lookup.docTypes;
                        });
                    }],
                    categories: ['$route', 'baseFactory', function ($route, baseFactory) {
                        return baseFactory.fetch('/api/category/GetAll').then(function (rrdata) {
                            return rrdata.object;
                        });
                    }]
                }
            });
            modalInstance.result.then(function () {
                $scope.refreshData();
            });
        };
        
        $scope.deleteItemDocument = function(item) {
            promptFactory.confirm("Are you sure you want to delete this item?", function (result) {
                if (result) {
                    baseFactory.remove('/api/documents/delete/' + item.id).then(function (rrdata) {
                        $scope.refreshData();
                    });
                }
            });
        };

        //$scope.deleteItemDocument = function (entity) {
        //    modalFactory.deleteEntityFromGrid(
        //        entity.fileName,
        //        entity.id,
        //        'Documents',
        //        null,
        //        '/api/documents/delete/',
        //        $scope.gridOptions.gridName
        //    );
        //};
    }
})();
(function () {
    'use strict';

    gridsModule.controller('appGridController', appGrid);
    appGrid.$inject = ['$scope', '$rootScope', '$timeout', '$window', 'baseFactory', 'GRID_CONSTANTS'];
    function appGrid($scope, $rootScope, $timeout, $window, baseFactory, GRID_CONSTANTS) {
        $scope.loading = true;
        $scope.isRefreshed = false;
        $scope.dg = {};
        $scope.tempJson = {};

        var clearItems = function () {
            if ($scope.gridOptions.selectAll)
                $scope.gridOptions.selectAll(false);
        };

        //gets the sort string from the sorted column. If the column has a 'customSortField' property, it will use that property,
        //otherwise it will use the field name
        var getSortString = function () {
            var customSortField;
            angular.forEach($scope.gridOptions.columnDefs, function (col) {
                if (col.field == $scope.gridOptions.sortInfo.fields[0] && col.customSortField)
                    customSortField = col.customSortField;
            });
            if (typeof customSortField !== 'undefined')
                return customSortField + ' ' + $scope.gridOptions.sortInfo.directions[0];

            return $scope.gridOptions.sortInfo.fields[0] + ' ' + $scope.gridOptions.sortInfo.directions[0];
        };

        var generateRefreshOptions = function (startIndex, retrieveSize) {
            // console.log($scope.dg.fetchOptions)
            var refreshOptions = {};

            if ($scope.dg.fetchOptions.extraParams) {
                var extraparams = angular.copy($scope.dg.fetchOptions.extraParams);

                if (typeof extraparams.dateRange !== 'undefined') {
                    $scope.dg.fetchOptions.dateRange = angular.copy(extraparams.dateRange);
                    delete extraparams.dateRange;
                }
                refreshOptions = extraparams;
            }

            //if ($scope.dg.fetchOptions.extraData)
            //    refreshOptions = $scope.dg.fetchOptions.extraData;

            if ($scope.dg.fetchOptions.enableSorting === true)
                refreshOptions.sort = $scope.sortString;

            if ($scope.dg.fetchOptions.enableSearching === true)
                refreshOptions.searchText = $scope.dg.searchTerms;

            if ($scope.dg.fetchOptions.id)
                refreshOptions.id = $scope.dg.fetchOptions.id;

            if ($scope.dg.fetchOptions.startDate)
                refreshOptions.startDate = moment($scope.dg.fetchOptions.startDate).format('YYYY-M-DD');

            if ($scope.dg.fetchOptions.endDate)
                refreshOptions.endDate = moment($scope.dg.fetchOptions.endDate).format('YYYY-M-DD');

            if ($scope.dg.fetchOptions.dateRange) {
                refreshOptions.startDate = moment($scope.dg.fetchOptions.dateRange.startDate).format('YYYY-M-DD');
                refreshOptions.endDate = moment($scope.dg.fetchOptions.dateRange.endDate).format('YYYY-M-DD');
            }

            refreshOptions.flag = $scope.gridOptions.fetchFlag;
            if (typeof $scope.dg.fetchOptions.flag === 'undefined' || $scope.dg.fetchOptions.flag == null)
                //use this if a boolean flag needs to be sent back to the server
                refreshOptions.flag = $scope.dg.fetchOptions.flag;

            refreshOptions.startIndex = startIndex;
            refreshOptions.retrieveSize = retrieveSize;

            return refreshOptions;
        };

        $scope.getItems = function (startIndex, retrieveSize, initialRetrieve) {
            if ($scope.dg.fetchOptions.pageSize) {
                retrieveSize = $scope.dg.fetchOptions.pageSize;
            }
            setTimeout(function () {
                var dataToSend = generateRefreshOptions(startIndex, retrieveSize);
                baseFactory.fetch(
                    $scope.dg.fetchOptions.url,
                    dataToSend
                ).then(function (data) { //success
                    if (!data.isErrored) {
                        if (startIndex === 1) {
                            $scope.items = data.object;
                            clearItems();
                        } else {
                            angular.forEach(data.object, function (item) {
                                $scope.items.push(item);
                            });
                        }
                        $scope.totalItemCount = data.totalItems;
                        if ($scope.items)
                            $scope.shownItems = $scope.items.length;
                        else {
                            $scope.shownItems = [];
                        }
                    }
                    $scope.loading = false;
                    $scope.isRefreshed = false;
                    if (initialRetrieve)
                        $scope.focusSearch = true;
                    //we need to rebuild the grid every time we load items!
                    $scope.$emit(GRID_CONSTANTS.REBUILD_GRID, $scope.dg.fetchOptions, dataToSend);
                }, function () {
                    $timeout(function () {
                        $scope.loading = false;
                        $scope.isRefreshed = false;
                    }, 500);
                });
            }, 100);
        };

        //this does the EXACT same call as get all items but returns all the objects.
        //We then get all the ids and emit them with the 'GRID_CONSTANTS.ALL_SEARCHED_IDS_PREFIX + $scope.gridName' message
        $scope.getAllIds = function () {
            baseFactory.fetch(
                $scope.dg.fetchOptions.url,
                generateRefreshOptions(1, 999999999)
            ).then(function (data) {
                if (!data.isErrored) {
                    var itemIds = [];
                    angular.forEach(data.object, function (item) {
                        //if alot of results are returned then the paged list breaks each object into a sub array.
                        //this allows for this
                        if (item instanceof Array) {
                            angular.forEach(item, function (subItem) {
                                itemIds.push(subItem.id);
                            });
                        } else {
                            if (item.id) {
                                itemIds.push(item.id);
                            }
                        }
                    });
                    $rootScope.$emit(GRID_CONSTANTS.ALL_SEARCHED_IDS_PREFIX + $scope.gridName, itemIds);
                }
            });
        };

        //exports All returned items to a spreadsheet.
        $scope.export = function () {
            if (!$scope.gridOptions.enableExport)
                return;
            var url = $scope.dg.fetchOptions.exportUrl + '?' + encodeQueryData(generateRefreshOptions(1, 999999999));

            window.open(url);
        };
        $scope.exportProductionSchedule = function () {
            var url = $scope.dg.fetchOptions.exportUrl + '?' + encodeQueryData(generateRefreshOptions(1, 999999999));
            window.open(url);
        };
        $scope.exportOrderData = function () {
            var url = $scope.dg.fetchOptions.exportUrl + '?isOrderData=true&' + encodeQueryData(generateRefreshOptions(1, 999999999));
            window.open(url);
        };

        $scope.exportAll = function () {
            if (!$scope.gridOptions.enableExport || !$scope.dg.fetchOptions.exportReportsUrl)
                return;
            var url = $scope.dg.fetchOptions.exportReportsUrl + '?' + encodeQueryData(generateRefreshOptions(1, 999999999));

            window.open(url);
        };
        $scope.importData = function () {
            $rootScope.$emit(GRID_CONSTANTS.IMPORT_DATA + $scope.gridName);
        };

        function encodeQueryData(data) {
            var ret = [];
            for (var d in data) {
                if (data[d] && typeof data[d] !== 'undefined')
                    ret.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d]));
            }
            return ret.join("&");
        }

        //looks at the showOn property on colDefs and evaluates the string to determine if the column should be shown
        var showHideColumns = function () {
            //bit of a hack to get visibility working with grids.
            //need to check our column defs to see if the showOn property has been set.
            //we then need to access the ngGrid columns through the gridScope and set its visibility manually.
            //note that settings the visibility on our column definitions only has an affect on initialise.
            //to change the visibility dynamically, set the value against the $gridScope columns
            angular.forEach($scope.gridOptions.columnDefs, function (column, idx) {
                if (column.showOn && $scope.gridOptions.$gridScope)
                    $scope.gridOptions.$gridScope.columns[idx].visible = $scope.$eval(column.showOn);
            });
        };

        var loadOptions = function (options) {
            $scope.gridName = options.gridName;
            $scope.itemType = options.itemType;
            $scope.filterOptions = {
                filterText: "",
                useExternalFilter: true
            };

            $scope.gridOptions.enableInputGroup = false;

            if (options.showSelectionCheckbox)
                $scope.gridOptions.showSelectionCheckbox = true;
            $scope.gridOptions.columnDefs = angular.copy(options.columnDefs);

            if (options.customFilterTemplate)
                $scope.gridOptions.customFilterTemplate = options.customFilterTemplate;

            if (options.groups)
                $scope.gridOptions.groups = options.groups;

            if (typeof options.groupsCollapsedByDefault !== "undefined")
                $scope.gridOptions.groupsCollapsedByDefault = options.groupsCollapsedByDefault;

            if (options.showGroupPanel)
                $scope.gridOptions.showGroupPanel = options.showGroupPanel;

            if (typeof options.enableSearching !== 'undefined')
                $scope.gridOptions.enableSearching = options.enableSearching;

            if (typeof options.hideSearchText !== 'undefined')
                $scope.gridOptions.hideSearchText = options.hideSearchText;

            if (options.fetchLabel)
                $scope.gridOptions.fetchLabel = options.fetchLabel;

            if (options.getSelectedLabel)
                $scope.gridOptions.getSelectedLabel = options.getSelectedLabel;

            if (options.getAllIdsLabel)
                $scope.gridOptions.getAllIdsLabel = options.getAllIdsLabel;

            if (options.controlColumnWidth)
                $scope.gridOptions.controlColumnWidth = options.controlColumnWidth;

            if (options.headerRowHeight)
                $scope.gridOptions.headerRowHeight = options.headerRowHeight;

            if (options.rowHeight)
                $scope.gridOptions.rowHeight = options.rowHeight;

            if (options.gridName)
                $scope.gridOptions.gridName = options.gridName;

            if (typeof options.fetchFlag !== 'undefined')
                $scope.gridOptions.fetchFlag = options.fetchFlag;

            var dateRange = null;
            if (options.dateRange)
                dateRange = angular.copy(options.dateRange);

            if (options.controlCellTemplateHtml) {
                //append the controls column
                $scope.gridOptions.columnDefs.push({
                    field: 'id',
                    displayName: '',
                    cellTemplate: options.controlCellTemplateHtml,
                    width: $scope.gridOptions.controlColumnWidth,
                    sortable: false
                });
            }

            $scope.shownItems = 0;
            $scope.totalItemCount = 0;

            //set the fetch url and fetch id and fetch flag
            $scope.dg.fetchOptions = {
                url: options.fetchUrl,
                exportUrl: options.exportUrl,
                exportReportsUrl: options.exportReportsUrl,
                id: options.fetchId, //an id that needs to be passed back to the server
                flag: options.fetchFlag, //a boolean flag that needs to be passed back to the server
                startDate: options.startDate,
                endDate: options.endDate,
                enableSorting: options.enableSorting,
                enableSearching: options.enableSearching,
                extraParams: options.extraParams,
                extraData: options.extraData,
                pageSize: options.pageSize
            };

            if (options.displayActionMenu) {
                $scope.dg.displayActionMenu = options.displayActionMenu;

                if (options.enableExportReports)
                    $scope.dg.enableExportReports = options.enableExportReports;

                if (options.enableDisplayActionMenuImport)
                    $scope.dg.enableDisplayActionMenuImport = options.enableDisplayActionMenuImport;
            }

            // Input Groups
            if (options.enableDateRange) {
                // console.log(dateRange)
                $scope.dg.fetchOptions.dateRange = dateRange ? dateRange : {
                    startDate: moment().subtract(29, 'days'),
                    endDate: moment()
                };
                $scope.gridOptions.enableInputGroup = true;
            }
            if (options.enableExport && options.exportUrl) {
                $scope.gridOptions.enableExport = true;
                $scope.gridOptions.enableInputGroup = true;
            }

            if (options.enableCustomFields) {
                $scope.gridOptions.customFieldsHtml = options.customFieldsHtml;
                $scope.gridOptions.enableCustomFields = true;
            }

            if (options.enableCustomButtons) {
                $scope.gridOptions.customButtonsHtml = options.customButtonsHtml;
                $scope.gridOptions.enableCustomButtons = true;
                $scope.gridOptions.enableInputGroup = true;
            }

            showHideColumns();
        };

        $scope.init = function (callback) {
            var options = $scope.dg.options;
            $scope.dg = {};
            $scope.gridOptions = {
                showFilter: false,
                showColumnMenu: false,
                headerRowHeight: 34,
                rowHeight: 34,
                data: 'items',
                enablePaging: false,
                enableColumnResize: true,
                enableColumnReordering: true,
                enableExport: false,
                displayActionMenu: false,
                enableSearching: true,
                showFooter: false,
                useExternalSorting: true,
                enableHighlighting: true,
                controlColumnWidth: '80px',
                plugins: [new ngGridFlexibleHeightPlugin(), new ngGridLayoutPlugin()],
                totalServerItems: 'totalItemCount',
                pagingOptions: $scope.pagingOptions,
                filterOptions: $scope.filterOptions,
                gridDebounce: parseInt(GRID_CONSTANTS.GRID_SEARCH_DEBOUNCE),
                init: function (grid, scope) {
                    setTimeout(function () {
                        scope.gridOptions.$gridServices.DomUtilityService.RebuildGrid(
                            scope.gridOptions.$gridScope,
                            scope.gridOptions.ngGrid
                        );
                    }, 10);
                }
            };

            if ($scope.$parent.gridOptions && angular.isFunction($scope.$parent.gridOptions.afterSelectionChange)) {
                $scope.gridOptions.afterSelectionChange = $scope.$parent.gridOptions.afterSelectionChange;
            }

            loadOptions(options);

            if (options.enableSorting) {
                $scope.sortString = options.initSortString;

                var sortParts = options.initSortString.split(' ');

                $scope.gridOptions.sortInfo = {
                    fields: [sortParts[0]],
                    directions: [sortParts[1]]
                };
            }

            //sort direction listener
            $scope.$watch('gridOptions.sortInfo.directions', function (newVal, oldVal) {
                if (newVal && newVal.length > 0 && newVal !== oldVal) {
                    $scope.sortString = getSortString();
                }
            }, true);

            //sort field listener
            $scope.$watch('gridOptions.sortInfo.fields', function (newVal, oldVal) {
                if (newVal && newVal.length > 0 && newVal !== oldVal) {
                    $scope.sortString = getSortString();
                }
            }, true);

            $scope.$watch('sortString', function (newVal, oldVal) {
                if (newVal && newVal.length > 0 && newVal !== oldVal) {
                    $scope.getItems(1, $scope.items && $scope.items.length > 0 ? $scope.items.length : GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
                }
            }, true);

            //$scope.$watch('fetchOptions.dateRange', function (newVal, oldVal) {
            //    if (newVal && newVal !== oldVal && !oldVal) {
            //        $scope.updateSearch();
            //    }
            //}, true);

            $scope.$watch('gridOptions.fetchFlag', function (newVal, oldVal) {
                if (typeof newVal === 'undefined')
                    return;
                //loadOptions($scope.$parent.gridOptions);
                showHideColumns();
                $scope.getItems(1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
            });

            //get the initial list of items
            if (typeof options.loadOnInit === 'undefined' || options.loadOnInit) {
                if (typeof options.items === 'undefined' || options.items === null)
                    $scope.getItems(1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE, true);
                else {
                    $scope.items = options.items.object;
                    $scope.totalItemCount = options.items.totalItems;
                    $scope.shownItems = options.items.object.length;
                    $scope.loading = false;
                    $scope.focusSearch = true;
                }
            } else {
                $scope.items = [];
                $scope.totalItemCount = 0;
                $scope.shownItems = 0;
                $scope.loading = false;
                $scope.focusSearch = true;
            }

            // Responsive columns based on visibleAt attribute
            var w = angular.element($window);
            $scope.getWidth = function () {
                return w.width();
            };

            var checkColumnVisibleAt = function (newValue) {
                try {
                    angular.forEach($scope.gridOptions.columnDefs, function (column, idx) {
                        if (typeof column.visibleAt !== 'undefined') {
                            if (newValue >= column.visibleAt) {
                                $scope.gridOptions.$gridScope.columns[idx].visible = true;
                            } else {
                                $scope.gridOptions.$gridScope.columns[idx].visible = false;
                            }
                        }
                    });
                } catch (er) {
                    $timeout(function () {
                        checkColumnVisibleAt(newValue);
                    }, 500);
                }
            };

            $scope.$watch($scope.getWidth, function (newValue, oldValue) {
                checkColumnVisibleAt(newValue);
            }, false);

            $scope.$onRootScope(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridName, function () {
                $scope.getItems(1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
            });
            $scope.$onRootScope(GRID_CONSTANTS.EXPORT_GRID_PREFIX + $scope.gridName, function () {
                $scope.export();
            });

            //refreshes items if no name is provided
            $scope.$onRootScope(GRID_CONSTANTS.REFRESH_GRID_PREFIX, function () {
                $scope.getItems(1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
            });

            $scope.$onRootScope(GRID_CONSTANTS.REFRESH_GRID_OPTIONS_PREFIX + $scope.gridName, function () {
                loadOptions($scope.dg.options);
            });

            $scope.$onRootScope(GRID_CONSTANTS.REFRESH_GRID_OPTIONS_AND_RELOAD_PREFIX + $scope.gridName, function () {
                loadOptions($scope.dg.options);
                $scope.getItems(1, $scope.items && $scope.items.length > GRID_CONSTANTS.DEFAULT_PAGE_SIZE ? $scope.items.length : GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
            });

            $scope.$onRootScope(GRID_CONSTANTS.GET_SELECTED_ITEMS_GRID_PREFIX + $scope.gridName, function () {
                var selectedItems = [];
                if ($scope.gridOptions.$gridScope) {
                    selectedItems = $scope.gridOptions.$gridScope.selectedItems;
                }

                $scope.$parent.selectedItems = selectedItems;
                $scope.$parent.allItemsInGrid = $scope.items;
            });

            $scope.getSelected = function () {
                $rootScope.$emit(GRID_CONSTANTS.SELECTED_ITEMS_GRID_PREFIX + $scope.gridName, $scope.gridOptions.$gridScope.selectedItems);
            };

            $scope.deleteEntity = function (selectedEntity) {
                $scope.$parent.deleteEntity(selectedEntity);
            };

            callback(options);
        };

        //init(function (options) {
        //    $scope.$emit(GRID_CONSTANTS.REBUILD_GRID, options);
        //});
        $scope.showMore = function () {
            $scope.getItems($scope.items.length + 1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
        };
        $scope.updateSearch = function () {
            $scope.isRefreshed = true;
            $scope.getItems(1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
        };
        $scope.updateSearchOnFieldChanged = function (param) {
            if (typeof param === 'undefined') {
                console.log("param undefined");
                return;
            }

            var json = angular.copy($scope.dg.fetchOptions.extraParams);
            if (json[param] !== $scope.tempJson[param]) {
                $scope.tempJson[param] = json[param];
                if (!$scope.isRefreshed)
                    $scope.getItems(1, GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
            }

            if ($scope.dg.fetchOptions.extraParams[param] !== null)
                $scope.dg.fetchOptions.extraParams[param] = null;
        };
        $scope.displayShowMore = function () {
            // return ($scope.shownItems < $scope.totalItemCount && $scope.shownItems > 0);
            return ($scope.totalItemCount >= GRID_CONSTANTS.DEFAULT_PAGE_SIZE);
        };
        $scope.displayAllResultsShown = function () {
            return ($scope.shownItems >= $scope.totalItemCount && $scope.shownItems > 0);
        };
        $scope.displayNoResultsFound = function () {
            //return ($scope.shownItems == 0);
            return (!$scope.items || $scope.items.length === 0);
        };
    }
})();
(function () {
    'use strict';
    gridsModule.directive('appGridCustomButtons', function ($compile) {
        return {
            restrict: 'A',
            scope: true,
            link: function (scope, ele, attr) {
                var html = attr.template;
                var e = $compile(html)(scope);
                ele.replaceWith(e);
            }
        };
    });
})();
gridsModule.directive('appGridCustomFields', function ($compile) {
    return {
        restrict: 'A',
        scope: true,
        link: function (scope, ele, attr) {
            var html = attr.template;
            var e = $compile(html)(scope);
            ele.replaceWith(e);
        }
    };
});
gridsModule.directive('appGrid', ['GRID_CONSTANTS', function(GRID_CONSTANTS) {
    return {
        restrict: 'AE',
        scope: true,
        templateUrl: function(element, attrs) {
            if (attrs && attrs.templateUrl)
                return attrs.templateUrl;
            return '/app/modules/grids/templates/dataGrid.html';
        },
        controller: 'appGridController',
        link: function (scope, ele, attr) {
            if (attr.gridOptions)
                scope.dg.options = scope[attr.gridOptions];
            else
                scope.dg.options = scope.gridOptions;
            scope.init(function (options) {
                scope.$emit(GRID_CONSTANTS.REBUILD_GRID, options);
            });
        }
    };
}]);
(function () {
    'use strict';
    sharedModule.factory('gridTemplateFactory', gridTemplateFactory);
    gridTemplateFactory.$inject = [];
    function gridTemplateFactory() {

        return {

            getEntityStatusTemplate: function () {
                return '<div class="entity-status {{row.entity.status.class}}">{{row.entity.status.name}}</div>';
            },
            oneBindTemplate: function (func, value) {
                return '<div>{{::row.entity.' + value + '}}</div>';
            },
            getMonitoringRatingTemplate: function () {
                return '<div class="monitoring-rating-{{row.entity.colour}}">{{row.entity.ratingName}}</div>';
            },
            getCellTemplate: function (func, value) {
                return '<div ng-click="' + func + '(row.entity)" class="ngCellText">{{row.entity.' + value + '}}</div>';
            },
            getConfirmationModal: function (func) {
                //console.log(row.entity.status.name);
                return '<div ng-click="' + func + '(row.entity)" class="entity-status {{row.entity.status.class}}">{{row.entity.status.name}}</div>';
            },
            getHyperlink: function (state, value) {
                return '<a bind-once ui-sref="' + state + '" class="dx-link">{{row.entity.' + value + '}}</a>';
            },
            setDocCellTemplate: function () {
                return '<div class="media">' +
                    '<div class="media-left media-middle">' +
                    '<a href="#">' +
                    '<i class=\"fi fi-{{row.entity.fileExtension}}\"></i>' +
                    '</a>' +
                    '</div>' +
                    '<div class="media-body">' +
                    '<a class=\"dx-link text-bold\" href=\"{{row.entity.link}}\" target="_blank" rel="nofollow noreferrer noopener">{{row.entity.name}}</a>' +
                    '<p class="pTop5">' +
                    '<small class="text-muted mright5" filesize="row.entity.fileSize"></small><small class="text-muted mLeft10">|</small>' +
                    '<small class="text-muted mLeft10"><i class=\"fa fa-calendar-check-o mRight5\"></i>{{row.entity.dateCreated | date:\'d MMM yyyy\'}}</small>' +
                    '</p>' +
                    '</div>';
            },
        };
    }
})();
(function () {
    'use strict';
    homeModule.config(
    ['$stateProvider',
        function ($stateProvider) {
            $stateProvider
                .state('base.hangfire', {
                    url: "/systemhangfire",
                    noLoginRequired: false,
                    views: {
                        'content@base': {
                            templateUrl: "/app/modules/hangfire/views/index.html",
                            controller: 'HangfireCtrl',
                            resolve: {
                                HangfireModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                    return $ocLazyLoad.load('OcHangfireCtrl');
                                }],
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Hangfire'
                    }
                });
        }
    ]);

})();
(function () {
    'use strict';
    angular.module('appHomeModule').controller('HangfireCtrl', ctrl);
    ctrl.$inject = ["$scope", "$rootScope", "$state", "$stateParams"];
    function ctrl($scope, $rootScope, $state, $stateParams) {
        $scope.hangfireUrl = "/hangfire";
    }
})();
(function () {
    'use strict';
    homeModule.controller('home',
        ['$scope', '$rootScope', 'baseFactory', 'clientHelperFactory', '$state', '$controller', '$ocLazyLoad',
            function ($scope, $rootScope, baseFactory, clientHelperFactory, $state, $controller, $ocLazyLoad) {

                if (clientHelperFactory.isTwcWorkOrderScanning()) {
                    $state.transitionTo("base.home.scanning", null, { 'reload': true });
                    return;
                }

                if (clientHelperFactory.isTwcClient()) {
                    $scope.render = false;
                    return;
                }

                $scope.render = true;

                baseFactory.fetch('/api/item/GetMostPopularItems?retrieveSize=5').then(function (popularItems) {
                    $scope.popularItems = popularItems.object;
                    $scope.orderItemsByCategory = popularItems.object;
                });

                $scope.orderItemsByCategoryData = [];
                $scope.getOrderItemsByCategoryData = getOrderItemsByCategoryData;
                $scope.lastOrders = [];
                // MainDateRange
                if (typeof $scope.dateRange === "undefined") {
                    $scope.dateRange = {
                        from: $rootScope.clientName.toLowerCase() == 'tft' ? new Date(moment().subtract(4, 'weeks').valueOf()) : null,
                        to: $rootScope.clientName.toLowerCase() == 'tft' ? new Date(moment().valueOf()) : null,
                    };
                }

                $scope.config = {
                    data: {
                        startDate: "",
                        endDate: ""
                    }
                };

                $rootScope.mainDateRange = {
                    startDate: null,
                    endDate: null
                };

                //Load Data
                var loadData = function (c, dateRange) {
                    if (!moment(dateRange.from).isValid() || !moment(dateRange.to).isValid())
                        return;

                    c.data.endDate = moment(dateRange.to).format("YYYY-MM-DD");
                    c.data.startDate = moment(dateRange.from).format("YYYY-MM-DD");

                    /* BEGIN get order items by category data */
                    $scope.getOrderItemsByCategoryData(c.data);

                    var openOrderUrl = "/api/order/SearchOrders?statusId=4&startIndex=1&retrieveSize=10&sort=orderDate+desc";
                    baseFactory.fetch(openOrderUrl, c.data).then(function (rrdata) {
                        if (!rrdata.isErrored)
                            $scope.openOrders = rrdata.object == null ? [] : rrdata.object;
                    });

                    var url = "/api/order/SearchOrders?startIndex=1&retrieveSize=5&sort=orderDate+desc";
                    baseFactory.fetch(url).then(function (lastOrderData) {
                        if (!lastOrderData.isErrored)
                            $scope.lastOrders = lastOrderData.object == null ? [] : lastOrderData.object;
                    });

                    var orderHistory = "/api/order/GetOrderDashboardData";
                    $scope.orderHistroyCategories = [];
                    $scope.orderHistoryData = [];
                    baseFactory.fetch(orderHistory, c.data).then(function (rrdata) {
                        if (!rrdata.isErrored) {
                            angular.forEach(rrdata.object, function (value, index) {
                                var orderDate = moment(value.orderDate).format("YYYY-MM-DD");
                                $scope.orderHistroyCategories.push(orderDate);
                                $scope.orderHistoryData.push(value.sum);
                            });

                            $scope.orderHistoryTemp = {
                                options: {
                                    chart: {

                                    },
                                    tooltip: {
                                        valuePrefix: '$'
                                    }
                                },
                                xAxis: {
                                    categories: $scope.orderHistroyCategories,
                                    type: 'category',
                                    labels: {
                                        rotation: -60,
                                        style: {
                                            fontSize: '10px',
                                            fontFamily: 'Verdana, sans-serif'
                                        }
                                    }
                                },
                                yAxis: {
                                    title: {
                                        text: 'Order Amount ($)'
                                    },
                                    plotLines: [{
                                        value: 0,
                                        width: 1,
                                        color: '#808080'
                                    }]
                                },
                                legend: {
                                    layout: 'vertical',
                                    align: 'right',
                                    verticalAlign: 'middle',
                                    borderWidth: 0
                                },
                                title: {
                                    text: ''
                                },
                                series: [{
                                    name: 'Total Order',
                                    data: $scope.orderHistoryData
                                }],
                                credits: {
                                    enabled: false
                                }
                            };
                        }
                    });
                    if (["TWC", "TFT"].indexOf($rootScope.clientName) < 0) {
                        $scope.notifications = [];
                        var notifications = "/api/message/GetAllLastMessages/?includeDoc=false";
                        baseFactory.fetch(notifications, c.data).then(function (rrdata) {
                            if (!rrdata.isErrored) {
                                angular.forEach(rrdata.object, function (value, index) {
                                    $scope.notifications.push(value);
                                });
                            }
                        });
                    }

                };

                $scope.$watchCollection('dateRange', function (v) {
                    $scope.$broadcast('dateChanged', v);
                });

                $scope.$on('dateChanged', function (ev, dateRange) {
                    loadData($scope.config, dateRange);
                });

                function fillPie() {
                    $scope.ordersbyProduct = {
                        options: {
                            chart: {
                                type: 'pie'
                            },
                            tooltip: {
                                style: {
                                    padding: 10,
                                    fontWeight: 'normal'
                                },
                                formatter: function () {
                                    return '<b>' + this.key + '</b> : ' + Math.round((this.percentage * 100) / 100) + ' %';
                                }
                            },
                            plotOptions: {
                                pie: {
                                    allowPointSelect: true,
                                    cursor: 'pointer',
                                    center: ['50%', '50%'],
                                    dataLabels: {
                                        enabled: false
                                    },
                                    showInLegend: true
                                }
                            }
                        },
                        series: [
                            {
                                type: 'pie',
                                name: 'Orders by Product',
                                data: $scope.orderItemsByCategoryData
                            }
                        ],
                        loading: false,
                        title: {
                            text: ''
                        }
                    };
                }

                function getOrderItemsByCategoryData(date) {
                    $scope.orderItemsByCategoryData = [];
                    var url = "/api/order/GetOrderItemsByCategory";
                    baseFactory.fetch(url, date).then(function (data) {
                        if (!data.isErrored) {
                            var items = data.object == null ? [] : data.object;

                            var total = 0;
                            angular.forEach(items, function (item) {
                                total += item.sum;
                            });

                            angular.forEach(items, function (item) {
                                var itemsByCat = [
                                    item.name,
                                    item.sum / total * 100
                                ];
                                $scope.orderItemsByCategoryData.push(itemsByCat);
                            });
                        }
                    });

                    fillPie();
                }

            }
        ]);

})();
invoiceModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.invoices', {
                url: "/invoices/",
                views: {
                    'content@base': {
                        templateUrl: function () {
                            return "/app/modules/invoice/invoices.html";
                        },
                        controller: 'invoicesCtrl',
                        resolve: {
                            model: ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
                                return baseFactory.fetch('/api/Receipt/GetCreateReceiptModel', {})
                                .then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Invoices'
                }
            });
    }
]);
(function () {
    'use strict';
    invoiceModule.controller('invoiceDetailsCtrl', ctrl);
    ctrl.$inject = ["$scope", "$rootScope", "$locale", "$filter", "$state", "$stateParams",
        "$sce", "$timeout", "sharedFactory", "baseFactory", "GRID_CONSTANTS"];
    function ctrl($scope, $rootScope, $locale, $filter, $state, $stateParams,
        $sce, $timeout, sharedFactory, baseFactory, GRID_CONSTANTS) {
        var invoiceStatuses = [
            {
                id: 0,
                name: "All Statuses"
            }, {
                id: 1,
                name: "Paid"
            }, {
                id: 2,
                name: "Unpaid"
            }
        ];

        $scope.gridOptions = {
            itemType: 'Invoices',
            gridName: 'invoiceDetails',
            fetchUrl: '/api/Invoice/SearchAllDetails',
            exportUrl: '/exportGrid/getInvoices/',
            initSortString: 'invoiceNumber ASC',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: true,
            showGroupPanel: false,
            groupsCollapsedByDefault: false,
            groups: ['invoiceNumber'],
            enableExport: !($rootScope.clientName.toUpperCase() === 'PPI' || $rootScope.clientName.toUpperCase() === 'KINGPIN'),
            columnDefs: [
                { field: 'invoiceNumber', displayName: 'Invoice #', customField: 'invoiceNumber' },
                {
                    field: 'invoiceDate', displayName: 'Invoice Date',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.invoiceDate | date:"dd/MM/yyyy"}}</span></div>'
                },
                {
                    field: 'dueDate', displayName: 'Due Date',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.dueDate | date:"dd/MM/yyyy"}}</span></div>'
                },
                { field: 'invoiceDescription', displayName: 'Description' },
                { field: 'product', displayName: 'Product' },
                { field: 'productDescription', displayName: 'Product Description' },
                { field: 'quantity', displayName: 'Quantity' },
                { field: 'shipped', displayName: 'Shipped' },
                {
                    field: 'unitPrice', displayName: 'Unit Price',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.unitPrice | currency:\'$\':3}}</span></div>'
                },
                {
                    field: 'amount', displayName: 'Amount',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.amount | currency}}</span></div>'
                },
                {
                    enableSort: false, width: 50,
                    cellTemplate: '<a class="btn btn-default" href="/Report/OrderInvoice?invoiceNumber={{row.entity.invoiceNumber}}" target="_blank" rel="nofollow noreferrer noopener" title="Export Invoice"><i class="fa fa-download"></i></a>'
                }
            ],
            enableCustomFields: true,
            customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.statusId" class="form-control" ng-options="invoice.id as invoice.name for invoice in dg.fetchOptions.extraData.invoiceStatuses"></select>',
            extraParams: {
                statusId: typeof $stateParams.customerId === 'undefined' ? 2 : 0,
                //companyId: null,
                //customerId: typeof $stateParams.customerId === 'undefined' ? null : $stateParams.customerId,
                orderNumber: $scope.$parent.order.orderNumber
            },
            extraData: {
                invoiceStatuses: invoiceStatuses
            }
        };
    }
})();


(function () {
    'use strict';
    invoiceModule.controller('invoicesCtrl', ctrl);
    ctrl.$inject = ["$scope", "$rootScope", "$locale", "$filter", "$state", "$stateParams", "$sce", "$timeout", "sharedFactory", "baseFactory", "model", "GRID_CONSTANTS"];
    function ctrl($scope, $rootScope, $locale, $filter, $state, $stateParams, $sce, $timeout, sharedFactory, baseFactory, model, GRID_CONSTANTS) {
        var resetModel = angular.copy(model);
        $scope.save = save;
        $scope.invoices = [];
        $scope.exportInvoice = exportInvoice;
        $scope.getCustomer = getCustomer;
        $scope.afterSelectionChange = afterSelectionChange;
        $scope.onSelect = onSelect;
        $scope.impersonationRequired = false;
        $scope.selectedItems = [];
        $scope.loading = false;

        // PAYMENT DECLARATIONS
        $scope.authoriseUrl = "";
        $scope.isPaymentSuccessful = false;
        $scope.receipt = null;
        $scope.messages = [];
        $scope.errorMessages = [];
        $scope.isSubmit = false;
        $scope.isSave = false;
        $scope.isFingerPrintUpdating = false;
        $scope.maskedCreditCard = "";
        var originalAmount = 0;
        var originalSelectedInvoices = "";

        $scope.isCompanyUser = [1, 2, 4].indexOf($rootScope.user.userType) !== -1;

        $scope.showCreditCardPayment = ($rootScope.clientName && ($rootScope.clientName.toLowerCase() === "ppi" || $rootScope.clientName.toLowerCase() === "kingpin"));

        function eps(nModel) {
            $scope.model = angular.extend({}, $scope.model, nModel);
            $scope.model['epS_AMOUNT'] = nModel['epS_AMOUNT'];
            $scope.model['epS_NEWAMOUNT'] = ($filter('number')(nModel['epS_AMOUNT'], 2)).replace(/,/g, "");
            originalAmount = angular.copy($scope.model['epS_AMOUNT']);

            $scope.authoriseUrl = $sce.trustAsResourceUrl(nModel['epS_MERCHANTURL']);
        }

        function clear(m) {
            // CLEAR
            $scope.authoriseUrl = "";
            $scope.isPaymentSuccessful = false;
            $scope.receipt = null;
            $scope.messages = [];
            $scope.errorMessages = [];
            $scope.isSubmit = false;
            $scope.loading = false;
            $scope.isSave = false;
            $scope.isFingerPrintUpdating = false;
            $scope.maskedCreditCard = "";
            originalAmount = 0;
            originalSelectedInvoices = "";

            $scope.model = angular.copy(m);
            $scope.model.expiryMonth = null;
            $scope.model.expiryYear = null;

            $scope.ccinfo = { type: undefined };
            $scope.internal = {
                customer: null,
                outstandingBalance: 0.00
            };
        }

        function init(m) {
            clear(m);
            $scope.currentYear = new Date().getFullYear();
            $scope.currentMonth = new Date().getMonth() + 1;
            $scope.months = [];
            $scope.years = [];

            angular.forEach($locale.DATETIME_FORMATS.MONTH, function (mm, indx) {
                var v = indx + 1;
                var str = ('0' + v).slice(-2);
                $scope.months.push({
                    id: str,
                    name: str + '-' + mm
                });
            });

            for (var i = $scope.currentYear; i < $scope.currentYear + 20; i++) {
                $scope.years.push({
                    id: i,
                    name: i
                });
            }

            var invoiceStatuses = [
                {
                    id: 0,
                    name: "All Statuses"
                }, {
                    id: 1,
                    name: "Paid"
                }, {
                    id: 2,
                    name: "Unpaid"
                }
            ];

            var isCustomerUI = $state.current.name.indexOf("base.customers.manage") >= 0;
            var isOrderDashboardUI = $state.current.name == "base.orders.view2.invoices";
            var columnDefs = [];
            if (!isCustomerUI && !isOrderDashboardUI)
                columnDefs.push({ enableSort: false, width: 50, cellTemplate: '<div class="ngSelectionCell "><input type="checkbox" class="ngSelectionCheckbox" ng-model="row.entity.payInvoice" ng-if="$parent.model.receiptInvoiceSelectionMethod == \'2\'" ng-disabled="row.entity.amountDue <= 0" ng-change="$parent.afterSelectionChange()" /></div>' });
            columnDefs.push({ field: 'invoiceNumber', displayName: 'Invoice #' });
            if (!isOrderDashboardUI) {
                columnDefs.push({ field: 'orderNumber', displayName: 'Order #' });
                columnDefs.push({ field: 'purchaseOrderNumber', displayName: 'PO #' });
            }
            if (!isCustomerUI && !isOrderDashboardUI)
                columnDefs.push({ field: 'customer', displayName: 'Customer' });
            columnDefs.push({ field: 'invoiceDate', displayName: 'Invoice Date', cellTemplate: '<div class="ngCellText"><span>{{row.entity.invoiceDate | date:"dd/MM/yyyy"}}</span></div>' });
            columnDefs.push({ field: 'dueDate', displayName: 'Due Date', cellTemplate: '<div class="ngCellText"><span>{{row.entity.invoiceDate | date:"dd/MM/yyyy"}}</span></div>' });
            columnDefs.push({ field: 'description', displayName: 'Description' });
            columnDefs.push({ field: 'amount', displayName: 'Amount', cellTemplate: '<div class="ngCellText"><span>{{row.entity.amount | currency}}</span></div>' });
            columnDefs.push({ field: 'amountDue', displayName: 'Amount Due', cellTemplate: '<div class="ngCellText"><span>{{row.entity.amountDue | currency}}</span></div>' });
            columnDefs.push({ enableSort: false, width: 50, cellTemplate: '<a class="btn btn-default" href="/Report/OrderInvoice?invoiceNumber={{row.entity.invoiceNumber}}" target="_blank" rel="nofollow noreferrer noopener" title="Export Invoice"><i class="fa fa-download"></i></a>' });

            $scope.gridOptions = {
                itemType: 'Invoices',
                gridName: 'invoices',
                fetchUrl: '/api/Invoice/SearchAll',
                exportUrl: '/exportGrid/getInvoices/',
                initSortString: 'invoiceNumber ASC',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                enableExport: !($rootScope.clientName.toUpperCase() == 'PPI' || $rootScope.clientName.toUpperCase() == 'KINGPIN'),
                columnDefs: columnDefs,
                //columnDefs: [],
                //controlCellTemplateHtml: controlHtml(),
                //controlColumnWidth: '100%',
                //headerRowHeight: 1,
                enableCustomFields: true,
                customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.statusId" class="form-control" ng-options="invoice.id as invoice.name for invoice in dg.fetchOptions.extraData.invoiceStatuses"></select>',
                extraParams: {
                    statusId: typeof $stateParams.customerId === 'undefined' ? 2 : 0,
                    companyId: null,
                    customerId: typeof $stateParams.customerId === 'undefined' ? null : $stateParams.customerId,
                    orderNumber: isOrderDashboardUI ? $scope.$parent.order.orderNumber : null
                },
                extraData: {
                    invoiceStatuses: invoiceStatuses
                }
            };
            if (typeof $stateParams.customerId !== 'undefined') {
                $scope.gridOptions.pageSize = 999999;
                $scope.gridOptions.dateRange = {
                    startDate: moment().startOf('year'),
                    endDate: moment().endOf('year')
                };
            }

            function controlHtml() {
                var templateUrl = '/app/modules/invoice/invoiceTemplate.html';
                var html = '<div ng-include src="\'' + templateUrl + '\'"></div>';
                return html;
            }
        }

        function exportInvoice(orderNumber) {
            window.open('/report/OrderInvoice?orderNumber=' + orderNumber);
        };

        function getCustomer(val) {
            return sharedFactory.searchCustomer(val, true).then(function (data) {
                return data;
            });
        };

        function onSelect() {
            if ($scope.internal.customer) {
                $scope.gridOptions.extraParams.customerId = $scope.internal.customer.customerId;
                $scope.model.customerId = $scope.internal.customer.customerId;
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            } else {
                $scope.model.customerId = null;
            }
        }

        function afterSelectionChange() {
            $rootScope.$emit(GRID_CONSTANTS.GET_SELECTED_ITEMS_GRID_PREFIX + $scope.gridOptions.gridName);

            $scope.updateFingerPrint($scope.model);
        }

        function save(realPaymentForm, paymentForm, m) {
            // validate credit card
            $scope.isSave = true;

            if ($scope.isFingerPrintUpdating)
                return;

            $rootScope.formSubmit(paymentForm);
            if (paymentForm.$valid) {
                console.log('valid')
                $scope.loading = true;
                $scope.isSubmit = true;
                $scope.isSave = false;

                // Mask credit card
                $scope.maskedCreditCard = "";
                var ccn = angular.copy(m.creditCardNumber);
                var arrStr = ccn.split('');
                var maskedArr = [];
                for (var i = 0; i < arrStr.length; i++) {
                    if (i > 3) {
                        maskedArr.push('x');
                    } else {
                        maskedArr.push(arrStr[i]);
                    }
                }
                $scope.maskedCreditCard = maskedArr.join('');

                m['epS_NEWAMOUNT'] = ($filter('number')(m['epS_AMOUNT'], 2)).replace(/,/g, "");
                realPaymentForm.commit();
            }

        }

        $scope.$on(GRID_CONSTANTS.REBUILD_GRID, function () {
            afterSelectionChange();
        });
        $scope.$watch("model.receiptInvoiceSelectionMethod", function (v) {
            $scope.updateFingerPrint($scope.model);
        });


        // INIT
        init(model);

        // PAYMENT
        window.nabdirectPostDone = function () {

            if ($scope.isSubmit) {
                var ctr = 0;
                $scope.errorMessages = [];

                var pingServer = function (guid) {
                    $rootScope.showBlanket = true;
                    $scope.loading = true;
                    baseFactory.simplecall("GET", "/api/receipt/getnabreceipt/" + guid).then(function (rdata) {
                        $rootScope.showBlanket = true;

                        $scope.receipt = rdata.object || null;
                        if ($scope.receipt == null) {
                            if (ctr < 5) {
                                $timeout(function () {
                                    ctr++;
                                    pingServer(guid);
                                }, 1000);
                            } else {
                                $scope.isPaymentSuccessful = false;
                                $scope.loading = false;
                                $scope.isSubmit = false;
                                $scope.errorMessages.push("There is an issue with submitting your payment. Please try again");
                                $rootScope.showBlanket = false;
                            }
                        } else {
                            if (rdata.object.summarycode > 1) {
                                $scope.isPaymentSuccessful = false;
                                $scope.loading = false;
                                $scope.isSubmit = false;
                            } else {
                                $scope.isPaymentSuccessful = true;
                                $scope.isSubmit = false;
                                $scope.loading = false;

                                //// RESET
                                //$timeout(function () {
                                //    // CLEAR
                                //    clear(model);

                                //    // Overwrite
                                //    $scope.$$childHead.dg.fetchOptions.extraParams.customerId = null;
                                //    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                                //}, 3000);
                            }
                            $rootScope.showBlanket = false;
                        }
                    });
                };

                pingServer($scope.model['epS_REFERENCEID']);
            }
        };
        $scope.updateFingerPrint = function (m, realPaymentForm, paymentForm) {
            var mm = angular.copy(m);

            if (!mm.epS_AMOUNT || parseFloat(mm.epS_AMOUNT) < 1)
                return;

            // Select All Invoices
            var tempInvoiceArr = [];
            $scope.model.selectedInvoices = [];
            angular.forEach($scope.allItemsInGrid, function (value) {
                if (m.receiptInvoiceSelectionMethod == 1) {
                    $scope.model.selectedInvoices.push(value);
                    tempInvoiceArr.push(value.invoiceId);
                } else if (m.receiptInvoiceSelectionMethod == 2 && value.payInvoice == true) {
                    $scope.model.selectedInvoices.push(value);
                    tempInvoiceArr.push(value.invoiceId);
                }
            });

            if (originalAmount != mm.epS_AMOUNT || originalSelectedInvoices != tempInvoiceArr.join(',')) {
                // $scope.isSubmit = true;
                $scope.isFingerPrintUpdating = true;

                originalSelectedInvoices = tempInvoiceArr.join(',');

                baseFactory.fetch('/api/PpiOrder/GetInvoicePaymentData/', { n: tempInvoiceArr.join(','), amount: mm.epS_AMOUNT })
                    .then(function (data) {
                        // Reinit
                        //var newReceiptModel = angular.copy(receiptModel);
                        //newReceiptModel.cardHolderName = mm.cardHolderName;
                        //newReceiptModel.creditCardNumber = mm.creditCardNumber;
                        //newReceiptModel.expiryMonth = mm.expiryMonth;
                        //newReceiptModel.expiryYear = mm.expiryYear;
                        //newReceiptModel.securityCode = mm.securityCode;

                        eps(data.object);

                        // $scope.isSubmit = false;
                        $scope.isFingerPrintUpdating = false;
                        //
                        if ($scope.isSave && !realPaymentForm && !paymentForm)
                            $timeout(function () {
                                save(realPaymentForm, paymentForm, m);
                            }, 500);
                    });
            }
        };
    }
})();


jobModule.controller('JobTftCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', '$stateParams',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, $stateParams) {
            console.log(job);
        }
    ]);
jobModule.controller('JobTftCreateEditCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'permissionFactory', 'modalFactory', 'sharedFactory', '$state', '$stateParams', '$filter', '$timeout', 'STATES', 'TIMES', 'TITLES', 'job', 'order',
        function ($scope, $rootScope, $modal, baseFactory, permissionFactory, modalFactory, sharedFactory, $state, $stateParams, $filter, $timeout, STATES, TIMES, TITLES, job, order) {
            //
            // console.log($state, job);
            $scope.m = job;
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            var isNew = $state.current.name == "base.jobs.create";
            $scope.isNew = isNew;
            $scope.mode = $scope.isNew ? 'Create' : 'Edit';
            $scope.titles = TITLES;
            $scope.times = TIMES;
            $scope.currentStep = 1;
            $scope.steps = [
                {
                    step: 1,
                    title: 'Booking Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Client Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 3,
                    title: 'Prepack Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 4,
                    title: 'Job Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 5,
                    title: 'Summary',
                    isDone: false,
                    isEditing: false
                },
            ];
            $scope.states = STATES;
            $scope.isCompany = permissionFactory.isCompany() || $rootScope.user.isSysAdmin;
            //
            $scope.m1 = {
                customer: $rootScope.user.customerId == null || $rootScope.user.customerId == '' ? null : {
                    customerId: $rootScope.user.customerId,
                    name: $rootScope.user.customerName
                },
                customerId: $rootScope.user.customerId,
                customerName: $rootScope.user.customerName,
                clientCompany: null,
                clientFirstName: null,
                clientJobTitle: null,
                clientLastName: null,
                clientPartnerName: null,
                clientPurchaseOrder: null,
                clientTitle: null,
                clientMobile1: null,
                clientMobile2: null,
                clientEmail: null,
                userEmail: $rootScope.user.email,
                userFirstName: $rootScope.user.firstName,
                userIsUpdateDetails: false,
                userJobTitle: null,
                userLastName: $rootScope.user.surname,
                userMobile: null,
                userPhone: null
            };
            $scope.m2 = {
                upliftDateOpened: false,
                prepackNumberDays: null,
                prepackDays: [],
                calculatedPrice: {
                    totalPrice: 0,
                    totalHours: 0,
                    pricePerHour: 50, // Fixed
                    additionalCost: 0.10, // Fixed
                    includedGstTotalPrice: 0
                },
                location: {
                    name: null,
                    address: null,
                    latitude: -25.363882,
                    longitude: 131.044922,
                    state: null,
                    stateId: null,
                    postcode: null
                }
            };
            //
            var calculateStaffHours = function (pp) {
                pp.msg = null;
                var hps = pp.numberOfHours / pp.numberOfStaffs;
                pp.hoursPerStaff = 0;
                if (hps < 4) {
                    pp.msg = "Hours per staff member cannot be less than 4 hours. Please re-enter a valid combination";
                } else if (hps > 8) {
                    pp.msg = "Hours per staff member cannot be more than 8 hours. Please re-enter a valid combination";
                } else {
                    pp.hoursPerStaff = hps;

                    $scope.m2.calculatedPrice.totalHours = 0;

                    for (var i = 0; i < $scope.m2.prepackDays.length; i++) {
                        $scope.m2.calculatedPrice.totalHours += $scope.m2.prepackDays[i].numberOfHours;
                    }
                    $scope.m2.calculatedPrice.totalPrice = $filter('number')($scope.m2.calculatedPrice.totalHours * $scope.m2.calculatedPrice.pricePerHour, 2).replace(/,/g, "");
                    var gst = parseFloat($scope.m2.calculatedPrice.totalPrice) * $scope.m2.calculatedPrice.additionalCost;
                    $scope.m2.calculatedPrice.includedGstTotalPrice = $filter('number')(parseFloat($scope.m2.calculatedPrice.totalPrice) + gst, 2).replace(/,/g, "");
                }
            };
            //
            $scope.nextStep = function (indx) {
                $scope.goToStep(indx, false);
            };
            $scope.goToStep = function (indx, isSkip) {
                if (!$scope.disableSubmitButton) {
                    var isMove = false;
                    for (var i = 0; i < $scope.steps.length; i++) {
                        if (!isSkip) {
                            if ($scope.steps[i].step == indx - 1) {
                                $scope.steps[i].isDone = true;
                            }
                            if ($scope.steps[i].step == indx && $scope.steps[i].isDone) {
                                $scope.steps[i].isEditing = true;
                            }
                            isMove = true;
                        } else if (isSkip && $scope.steps[i].step == indx && $scope.steps[i].isDone) {
                            $scope.steps[i].isEditing = true;
                            isMove = true;
                        }
                    }
                    if (isMove)
                        $scope.currentStep = indx;
                }
            };
            //
            $scope.onCompanySelect = function ($item, $model, $label) {
                // console.log($model);
                $scope.m1.customerId = $model.customerId;
                $scope.m1.customerName = $model.name;
                $scope.m1.userFirstName = $model.name;
                $scope.m1.userEmail = $model.email;
            };
            $scope.getCustomer = function (val) {
                return sharedFactory.searchCustomer(val).then(function (data) {
                    return data;
                });
            };
            $scope.upliftDateOpen = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.m2.upliftDateOpened = true;
            };
            $scope.prepackDateOpen = function ($event, indx) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.m2.prepackDays[indx].dateOpened = true;
            };
            $scope.addHours = function (indx, isSubtract) {
                if (isSubtract && $scope.m2.prepackDays[indx].numberOfHours > 4) {
                    $scope.m2.prepackDays[indx].numberOfHours--;
                } else if (!isSubtract && $scope.m2.prepackDays[indx].numberOfHours >= 4) {
                    $scope.m2.prepackDays[indx].numberOfHours++;
                }
                calculateStaffHours($scope.m2.prepackDays[indx]);
            };
            $scope.addStaffs = function (indx, isSubtract) {
                if (isSubtract && $scope.m2.prepackDays[indx].numberOfStaffs > 1) {
                    $scope.m2.prepackDays[indx].numberOfStaffs--;
                } else if (!isSubtract && $scope.m2.prepackDays[indx].numberOfStaffs >= 1) {
                    $scope.m2.prepackDays[indx].numberOfStaffs++;
                }
                calculateStaffHours($scope.m2.prepackDays[indx]);
            };
            $scope.prepackDaysChange = function (n) {
                if ($scope.m2.prepackDays.length < n) {
                    for (var i = $scope.m2.prepackDays.length; i < n; i++) {
                        var now = i == 0 ? moment() : moment($scope.m2.prepackDays[i - 1].date).add(1, 'days');
                        $scope.m2.prepackDays.push({
                            date: now.format('YYYY-MM-DD'),
                            dateOpened: false,
                            numberOfHours: 4,
                            numberOfStaffs: 1,
                            hoursPerStaff: null,
                            time: 1,
                            msg: null
                        });
                        calculateStaffHours($scope.m2.prepackDays[i]);
                    }
                } else {
                    $scope.m2.prepackDays.splice(n);
                    for (var i = 0; i < $scope.m2.prepackDays.length; i++) {
                        calculateStaffHours($scope.m2.prepackDays[i]);
                    }
                }
            };
            //
            $scope.checkStep1 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(2);
                }
            };
            $scope.checkStep2 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(3);
                }
            };
            $scope.checkStep3 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(4);
                }
            };
            $scope.checkStep4 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(5);
                }
            };
            $scope.submit = function (mForm, m1, m2) {
                var mergedObject = angular.extend(m1, m2);
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                //
                var dataToSend = angular.copy(order);
                dataToSend.customFields = [];
                dataToSend.sageItems = [];
                mergedObject.upliftDate = moment(mergedObject.upliftDate).format('YYYY-MM-DD');
                var lastDate = m2.upliftDate;
                for (var i = 0; i < m2.prepackDays.length; i++) {
                    mergedObject.prepackDays[i].date = moment(m2.prepackDays[i].date).format('YYYY-MM-DD');
                    var isafter = moment(lastDate).isAfter(m2.prepackDays[i].date);
                    if (isafter)
                        lastDate = m2.prepackDays[i].date;
                }
                dataToSend.uiData = angular.toJson(mergedObject);
                dataToSend.customerId = mergedObject.customerId;
                dataToSend.customerName = mergedObject.customerName;
                dataToSend.items = [
                    {
                        itemNumber: "12345",
                        itemName: "Test Group",
                        quantity: 1,
                        unitPrice: 0
                    }
                ];
                dataToSend.deliveryDate = lastDate;
                dataToSend.orderDate = moment().format('YYYY-MM-DD');
                dataToSend.purchaseOrderNumber = mergedObject.clientPurchaseOrder;
                dataToSend.total = parseFloat(mergedObject.calculatedPrice.includedGstTotalPrice);
                dataToSend.totalPriceExcGst = parseFloat(mergedObject.calculatedPrice.totalPrice);

                baseFactory.post("/api/tftjobs/saveScheduleJob", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $state.go('base.orders', null, { reload: true });
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            };

            // MAP
            $scope.markers = [];
            $scope.mapId = window.randomString();
            $scope.showMap = false;
            $scope.$on('mapInitialized', function (evt, evtMap) {
                $scope.map = evtMap;
                $timeout(function () {
                    if ($scope.m2.location.latitude != null && $scope.m2.location.longitude != null) {
                        // console.log($scope.m2.location);
                        if ($scope.m2.location.latitude != '' && $scope.m2.location.longitude != '') {
                            $scope.mapLatLng = new google.maps.LatLng($scope.m2.location.latitude, $scope.m2.location.longitude);
                            $scope.map.setCenter($scope.mapLatLng);
                            $scope.map.setZoom(4);
                        }
                    }
                }, 500);
            });
            $scope.place = null;
            $scope.$watch('place', function (v) {
                console.log(v);
                if (v != null) {
                    if (typeof v.name !== "undefined")
                        $scope.m2.location.name = v.name;

                    if (typeof v.formatted_phone_number !== "undefined")
                        $scope.m2.location.phone = v.formatted_phone_number;

                    $scope.mapLatLng = new google.maps.LatLng($scope.m2.location.latitude, $scope.m2.location.longitude);
                    $scope.map.setCenter($scope.mapLatLng);
                    $scope.map.setZoom(10);

                    var marker = new google.maps.Marker({
                        map: $scope.map,
                        animation: google.maps.Animation.DROP,
                        draggable: true,
                        position: $scope.mapLatLng,
                        title: $scope.m2.location.name
                    });
                    $scope.markers.push(marker);
                }
            });
            $scope.centerChanged = function (event) {
                $timeout(function () {
                    try {
                        var mapLatLng = new google.maps.LatLng($scope.m2.location.latitude, $scope.m2.location.longitude);
                        $scope.map.panTo(mapLatLng);
                    } catch (er) {
                        $scope.mapLatLng = new google.maps.LatLng(-24.994167, 134.866944);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(3);
                    }
                }, 500);
            };
            $scope.onSelectPlace = function ($geo) {
                if ($scope.markers.length > 0)
                    for (var i = 0; i < $scope.markers.length; i++) {
                        $scope.markers[i].setMap(null);
                    }
                $scope.m2.address = $geo.loc;
                $scope.m2.location.name = $geo.name;
                $scope.m2.location.address = $geo.loc;
                $scope.m2.location.latitude = $geo.lat;
                $scope.m2.location.longitude = $geo.lng;
                $scope.m2.location.city = $geo.city;
                $scope.m2.location.country = $geo.country;
                $scope.m2.location.state = $geo.state;
                $scope.m2.location.postcode = $geo.postcode;
                $scope.m2.location.stateId = 9; // Other

                // Set state
                angular.forEach($scope.states, function (s) {
                    if (s.name.toLowerCase() == $geo.state.toLowerCase()) {
                        $scope.m2.location.stateId = s.id;
                    }
                });
                //
                $scope.mapLatLng = new google.maps.LatLng($scope.m2.location.latitude, $scope.m2.location.longitude);
                $scope.map.setCenter($scope.mapLatLng);
                $scope.map.setZoom(10);

                function geocodePosition(pos) {
                    geocoder = new google.maps.Geocoder();
                    geocoder.geocode({ latLng: pos }, function (results, status) {
                        if (status == google.maps.GeocoderStatus.OK) {
                            console.log(results)
                        }
                        else {
                        }
                    });
                }

                var marker = new google.maps.Marker({
                    position: $scope.mapLatLng,
                    title: $scope.m2.address,
                    map: $scope.map,
                    //animation: google.maps.Animation.DROP,
                    //draggable: true
                });
                google.maps.event.addListener(marker, 'dragend', function (ev) {
                    //var mapLatLng = new google.maps.LatLng(ev.latLng.lat(), ev.latLng.lng());
                    //$scope.map.setCenter(mapLatLng);
                    console.log('marker changed')
                    // geocodePosition(marker.getPosition());
                });
                $scope.markers.push(marker);

                $scope.$apply();
            };
            $scope.onGoogleInit = function (isInit) {
                $timeout(function () {
                    $scope.showMap = isInit;
                }, 500);
            };
        }
    ]);
(function () {
    'use strict';

    loginModule.controller('ForgotPasswordCtrl', ctrl);
    ctrl.$inject = ['$scope', '$location', 'membershipFactory', '$rootScope'];
    function ctrl($scope, $location, membershipFactory, $rootScope) {

        $scope.login = {};

        $scope.phoneNumber = "";
        $scope.signInText = "Signin";
        $scope.signInDisabled = false;

        if (CLIENT_NAME === "TWC") {
            $scope.phoneNumber = "(03) 9748 3411";
        } else if (CLIENT_NAME === "PPI") {
            $scope.phoneNumber = "(03) 9583 5333";
        } else if (CLIENT_NAME === "Fildes") {
            $scope.phoneNumber = "1800 673 644";
        }

        $scope.btnTxt = "Reset Password";
        $scope.btnDisabled = false;

        $scope.credentials = {
            email: ''
        };
        $scope.isError = false;
        $scope.errorMessages = [];

        // PUBLIC
        $scope.resetMyPassword = function (credentials) {
            $scope.isError = false;

            $scope.btnTxt = "Resetting password...";
            $scope.btnDisabled = true;

            if (credentials.username != "") {
                membershipFactory.resetPassword(credentials.username).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.btnTxt = "Redirecting...";
                        window.location = "/login";
                    } else {
                        $scope.isError = true;
                        $scope.isErrorTxt = '';
                        $scope.errorMessages = rdata.errors;

                        $scope.btnTxt = "Reset Password";
                        $scope.btnDisabled = false;
                    }
                });
            } else {
                $scope.isError = true;
                $scope.isErrorTxt = "Username is required";
                $scope.errorMessages = [];

                $scope.btnTxt = "Reset Password";
                $scope.btnDisabled = false;
            }
        };
    }
})();


(function () {
    'use strict';

    loginModule.controller('LoginCtrl', ctrl);
    ctrl.$inject = ['$scope', 'membershipFactory', 'baseFactory'];
    function ctrl($scope, membershipFactory, baseFactory) {

        $scope.login = {};
        $scope.register = {};

        $scope.signInText = "Login";
        $scope.signInDisabled = false;
        $scope.registerText = "Register";
        $scope.registerDisabled = false;

        $scope.loginUser = function () {

            $scope.signInDisabled = true;
            $scope.signInText = "Checking your credentials";

            membershipFactory.login($scope.login.username, $scope.login.password)
                .then(function (user) {
                    if (user) {
                        window.location.href = "/";
                    } else {
                        $scope.signInText = "Login";
                        $scope.signInDisabled = false;
                    }
                });
        };

        $scope.loginUserOnCheckout = function () {

            $scope.signInDisabled = true;
            $scope.signInText = "Checking your credentials";

            membershipFactory.login($scope.login.username, $scope.login.password)
                .then(function (user) {
                    if (user) {
                        window.location.href = "/checkout";
                    } else {
                        $scope.signInText = "Login";
                        $scope.signInDisabled = false;
                    }
                });
        };
        baseFactory.fetch('/api/system/GetOfflineMessage', {}).then(function (rrdata) {
            $scope.offlineMessage = rrdata == null ? null : rrdata.offlineMessage;
        });
    }
})();


(function () {
    'use strict';

    loginModule.directive('inlineLogin', ['baseFactory',
        function (baseFactory) {
            return {
                restrict: 'EA',
                replace: true,
                scope: {
                    close: '&'
                },
                templateUrl: '/app/modules/login/directives/inlineLogin.html',
                controller: ['$scope',
                    function ($scope) {
                        $scope.login = {};

                        $scope.signInText = "Sign In";
                        $scope.signInDisabled = false;

                        $scope.loginUser = function () {
                            $scope.signInDisabled = true;
                            $scope.signInText = "Signing in...";
                            baseFactory.call('/api/security/login', { username: $scope.login.username, password: $scope.login.password }).then(function (data) {
                                if (!data.isErrored && data.object && data.object.authenticatedUser) {
                                    $scope.signInText = "Redirecting...";
                                    window.location.replace("/");
                                } else {
                                    $scope.signInText = "Login";
                                    $scope.signInDisabled = false;
                                }
                            });
                        };
                        $scope.closeLogin = function () {
                            $scope.close();
                        };
                    }]
            };
        }])
})();
(function () {
    'use strict';

    angular.module('appLoginModule').controller('LoginPopUpCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$location', '$state', '$stateParams', '$timeout', 'membershipFactory', '$window', '$modalInstance', 'offlineMessage'];
    function ctrl($scope, $rootScope, $location, $state, $stateParams, $timeout, membershipFactory, $window, $modalInstance, offlineMessage) {
        
        $scope.login = {};

        $scope.signInText = "Login";
        $scope.signInDisabled = false;
        $scope.offlineMessage = offlineMessage;

        $scope.loginUser = function () {

            $scope.signInDisabled = true;
            $scope.signInText = "Checking your credentials";

            membershipFactory.login($scope.login.username, $scope.login.password)
                .then(function (user) {
                    if (typeof user !== "undefined" && user != null) {
                        if ($state.current.name === 'anonymous.catalog' ||
                            $state.current.name === 'anonymous.catalog.item' ||
                            $state.current.name === 'anonymous.catalog.item.singleItem') {

                            var newName = $state.current.name;
                            newName = newName.replace(/anonymous/gi, 'base');
                            $modalInstance.dismiss('cancel');

                            var url = $state.href(newName, $stateParams, { absolute: true });
                            window.location.href = url;
                            location.reload();
                        } else if (user) {
                            $modalInstance.dismiss('cancel');
                            window.location.href = "/";
                        }
                    } else {
                        $scope.signInText = "Login";
                        $scope.signInDisabled = false;
                    }
                });
        };

        $scope.close = function () {
            $modalInstance.dismiss('cancel');
        };

        $scope.forgotPassword = function () {
            $state.transitionTo('forgotPassword', {}, { reload: true });
            $timeout(function () {
                $modalInstance.dismiss('cancel');
            }, 500);
        };

    }



})();


(function () {
    'use strict';

    menuModule.controller('itemCategoriesCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state', 'baseFactory', '$modal', '$window', 'CART_CONSTANTS', 'clientHelperFactory', 'shoppingCartFactory'];
    function ctrl($scope, $rootScope, $state, baseFactory, $modal, $window, CART_CONSTANTS, clientHelperFactory, shoppingCartFactory) {
        $scope.itemDetails = function (item) {
            $state.go('base.catalog.item', { id: item.itemNumber });
        }

        $scope.currentState = $state.current.name;
        // GlobalSearch
        $scope.globalSearch = function (val) {
            if (val.length < 2)
                return [];

            return baseFactory.fetch('/api/item/SearchItems?retrieveSize=10&searchText=' + encodeURIComponent(val) + '&sort=name&startIndex=1')
                .then(function (rrdata) {
                    return rrdata.object == null ? [] : rrdata.object;
                });
        };

        $scope.globalSearchOnSelect = function ($item, $model, $label) {
            $state.go('catalog.item', { id: $model.itemNumber });
        };

        //Go to Search Page
        $scope.search = {};
        $scope.updateSearch = function () {
            $state.go('base.search', { searchTerm: encodeURIComponent($scope.search.globalSearchKeyword) });
        }

        $scope.currentState = $state.current.name;
        $scope.userFullName = $rootScope.user.fullName;

        // State
        $rootScope.stateInclude = function (stateRoute, params) {
            if (typeof params === "undefined")
                return $state.includes(stateRoute);

            var currentParams = angular.toJson($state.params);
            var strParams = angular.toJson(params);

            return $state.includes(stateRoute) && currentParams == strParams;
        };
        $rootScope.menuHidden = true;

        $scope.changePassword = function () {
            $state.go('base.account.changePassword');
        };

        $scope.logout = function () {
            $rootScope.$emit(LOGOUT_USER);
        };

        $('.dropdown-menu').click(function (event) {
            event.stopPropagation();
        });

        $scope.checkOut = function () {
            $state.go('base.checkout');
        }

        if ($rootScope.clientName != "TWC" && $rootScope.clientName != "RETAILBLINDS") {
            shoppingCartFactory.getShoppingCart().then(function (data) {
                var tempShoppingCart = angular.fromJson(data.shoppingCart);
                $scope.shoppingCart = angular.copy(tempShoppingCart);
            });
        }

        $scope.$onRootScope(CART_CONSTANTS.CART_UPDATED, function (event, data) {
            $scope.shoppingCart = angular.copy(data);
        });

        $scope.removeItem = function (item) {
            angular.forEach($scope.shoppingCart, function (value, index) {
                if (item.itemNumber == value.itemNumber) {
                    $scope.shoppingCart.splice(index, 1);
                }
            });
            var convertedItem = JSON.stringify($scope.shoppingCart);
            var cart = {
                userId: $rootScope.user.userId,
                shoppingCart: convertedItem
            };
            baseFactory.post('/api/users/SaveUserShoppingCart', cart).then(function (data) {
                if ($state.current.name == "base.checkout") {
                    $window.location.reload();
                }
            });
        };

        $scope.checkImpersonate = null;

        if ($rootScope.impersonate) {
            $scope.checkImpersonate = $rootScope.impersonate;
        }

        $scope.impersonate = function () {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/menu/impersonate/editImpersonate.html',
                controller: 'editImpersonateCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-md',
                resolve: {
                    customers: function (resolveFactory) {
                        return resolveFactory.getGridEntity('/api/customer/SearchAll/', null, 10);
                    }
                }
            });
            modalInstance.result.then(function () {
                $state.go('base.catalog');
            });
        };
    }
})();
(function () {
    'use strict';

    menuModule.controller('MenuCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state'];
    function ctrl($scope, $rootScope, $state) {
        console.log($state.current.name);

        $scope.currentState = $state.current.name;
        $scope.userFullName = $rootScope.user.fullName;

        // State
        $rootScope.stateInclude = function (stateRoute, params) {
            if (typeof params === "undefined")
                return $state.includes(stateRoute);

            var currentParams = angular.toJson($state.params);
            var strParams = angular.toJson(params);

            return $state.includes(stateRoute) && currentParams == strParams;
        };
        $rootScope.menuHidden = true;

        //$scope.allMenuItems = SessionService.userType === 2 || SessionService.userType === 3;

        $scope.changePassword = function () {
            $state.go('base.account.changePassword');
        };

        $scope.logout = function () {
            $rootScope.$emit(LOGOUT_USER);
        };

        $scope.isCompany = function () {
            var isCompany = false;
            angular.forEach($rootScope.user.roles, function (role) {
                if (role.id == 1 || role.id == 2) {
                    isCompany = true;
                }
            });

            return isCompany;
        };

        $scope.isAdmin = function () {
            angular.forEach($rootScope.user.roles, function (role) {
                if (role.id == 1 || role.id == 3) {
                    return true;
                }
            });
            return false;
        };

        $scope.viewtab = function (name) {
            console.log(name)
            $scope.currentViewTab = name;
        };
    }
})();
menuModule.factory('menuFactory', [
    function () {
        return{
            getDefaultMenu: function() {
                return {
                    templateUrl: "/app/modules/menu/menu.html",
                    controller: 'MenuCtrl'
                };
            }

        }
    }
]);
(function () {
    customFieldModule.controller('editImpersonateCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'customers', '$window', 'baseFactory', 'resolveFactory'];

    function ctrl($scope, $rootScope, $modalInstance, customers, $window, baseFactory, resolveFactory) {
        $scope.cancel = function () {
            $modalInstance.dismiss();
        }

        $scope.gridOptions = {
            itemType: 'customers',
            items: customers,
            gridName: 'customers',
            fetchUrl: '/api/customer/SearchAll/',
            pageSize: 10,
            initSortString: 'name asc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: false,
            columnDefs: [
                { field: 'customerId', displayName: 'Customer Id', width: "40%" },
                { field: 'name', displayName: 'Name', width: "40%" },
                {
                    field: 'edit', width: "20%", displayName: '', cellTemplate: '<div class="controls">' +
                        '<div class="btn-group btn-group-sm pull-right">' +
                        '<a ng-click="impersonate(row.entity)" class="btn btn-default" title="Impersonate"><i class="fa fa-user"></i></a>' +
                        '</div></div>'
                }
            ]
        };

        $scope.checkImpersonate = function () {
            if (!$scope.impersonate) {
                return "color: blue";
            }
        };

        $scope.isImpersonate = $rootScope.impersonate;

        $scope.impersonate = function (customer) {
            baseFactory.fetch('/api/customer/impersonate?impersonateCustomerId=' + customer.customerId + '&impersonateCustomerName=' + customer.name.replace("&", "%26")).then(function (data) {
                if (!data.isErrored) {
                    $rootScope.impersonate = customer;
                    $rootScope.$emit(IS_IMPERSONATING);
                    $modalInstance.close(customer);
                }
            });
        };

        $scope.stopImpersonate = function () {
            baseFactory.fetch('/api/customer/impersonate?impersonateCustomerId=&impersonateCustomerName=').then(function (data) {
                if (!data.isErrored) {
                    $rootScope.impersonate = "";
                    $rootScope.$emit(IS_IMPERSONATING);

                    $state.transitionTo($state.current, $stateParams, {
                        reload: true,
                        inherit: false,
                        notify: true
                    });
                    $modalInstance.close();
                }
            });
        };

    }
})();
(function () {
    'use strict';
    messageModule.controller('ManageChatSelectUsersModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state', '$stateParams', '$modalInstance', 'mentionedUsersId', 'tempMentionedUsersId', 'users'];
    function ctrl($scope, $rootScope, $state, $stateParams, $modalInstance, mentionedUsersId, tempMentionedUsersId, users) {

        $scope.showErrorMessage = false;
        $scope.userss = [];
        var mentioned = mentionedUsersId;
        angular.forEach(users, function (g) {
                $scope.userss.push({
                    mentionId: g.id,
                    name: g.surname + ', ' + g.firstName,
                    fname: g.firstName,
                    mentio: g.displayName.replace(" ", ""),
                    type: 'user',
                    photoThumbnailUrl: g.photoThumbnailUrl,
                    isActive: mentioned.indexOf(g.id) >= 0 || tempMentionedUsersId.indexOf(g.id) >= 0,
                    isHidden: g.id == $rootScope.user.userId
                });
        });
        $scope.ok = function (selForm, usrs) {
            $scope.showErrorMessage = false;
            var result = [];
            angular.forEach(usrs, function (g) {
                if (g.isActive) {
                    result.push(g.mentionId);
                }
            });
            $modalInstance.close(result);
        };

        $scope.checkUsers = function () {
            $scope.returnValue = true;
            angular.forEach($scope.userss, function (value, index) {
                if (!value.isActive)
                {
                    $scope.returnValue = false;
                }
            });
            return $scope.returnValue;
        };

        // INIT
        tempMentionedUsersId = [];
        console.log($scope.userss);
    }
})();
homeModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.messages', {
                url: "/messages/",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/messages/messages.html",
                        controller: 'messageController',
                        resolve: {
                            messageId: ['$stateParams', function ($stateParams) {
                                return $stateParams.id;
                            }],
                            messages: function () {
                                return [];
                            },
                            mentionedUsers: function () {
                                return [];
                            },
                            lastmessages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllLastMessages').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            currentUser: function (baseFactory) {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            users: function ($rootScope, $stateParams, baseFactory) {
                                if ($rootScope.lookup.users.length > 0)
                                    return $rootScope.lookup.users;

                                return baseFactory.fetch('/api/users/getAll', {}).then(function (rrdata) {
                                    $rootScope.lookup.users = rrdata.object == null ? [] : rrdata.object;
                                    return $rootScope.lookup.users;
                                });
                            },
                            isMain: function () {
                                return true;
                            }
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Notifications'
                }
            })
            .state('base.messages.new', {
                url: "new",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/messages/messages.html",
                        controller: 'messageController',
                        resolve: {
                            messageId: ['$stateParams', function ($stateParams) {
                                return $stateParams.id;
                            }],
                            messages: function () {
                                return [];
                            },
                            mentionedUsers: function () {
                                return [];
                            },
                            lastmessages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllLastMessages').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            users: function ($rootScope, $stateParams, baseFactory) {
                                if ($rootScope.lookup.users.length > 0)
                                    return $rootScope.lookup.users;

                                return baseFactory.fetch('/api/users/getAll', { }).then(function (rrdata) {
                                    $rootScope.lookup.users = rrdata.object == null ? [] : rrdata.object;
                                    return $rootScope.lookup.users;
                                });
                            },
                            currentUser: function (baseFactory) {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            isMain: function () {
                                return true;
                            }
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Create Notification'
                }
            })
            .state('base.messages.edit', {
                url: ":id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/messages/messages.html",
                        controller: 'messageController',
                        resolve: {
                            messageId: ['$stateParams', function ($stateParams) {
                                return $stateParams.id;
                            }],
                            messages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllMessages', { messageId: $stateParams.id, page: 1, count: 20 }).then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            mentionedUsers: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetMessageUsers?id=' + $stateParams.id).then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                                //return [];
                            },
                            lastmessages: function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/message/GetAllLastMessages').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            currentUser: function (baseFactory) {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrdata) {
                                    return rrdata.object == null ? [] : rrdata.object;
                                });
                            },
                            users: function ($rootScope, $stateParams, baseFactory) {
                                if ($rootScope.lookup.users.length > 0)
                                    return $rootScope.lookup.users;

                                return baseFactory.fetch('/api/users/getAll', {}).then(function (rrdata) {
                                    $rootScope.lookup.users = rrdata.object == null ? [] : rrdata.object;
                                    return $rootScope.lookup.users;
                                });
                            },
                            isMain: function () {
                                return false;
                            }
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Notification'
                }
            });
    }
]);

messageModule.controller('messageController',
['$scope', 'baseFactory', 'messages', 'lastmessages', '$stateParams', 'promptFactory', '$timeout', '$state', 'currentUser', 'toaster',
    '$location', 'isMain', 'users', '$rootScope', '$modal', 'mentionedUsers',
function ($scope, baseFactory, messages, lastmessages, $stateParams, promptFactory, $timeout, $state, currentUser, toaster, $location,
    isMain, users, $rootScope, $modal, mentionedUsers) {

    $scope.submitTxt = "Send";

    $scope.isOwner = false;
    $scope.users = users;
    $scope.mentionedUsers = mentionedUsers;
    $scope.tempMentionedUsers = [];

    $scope.pageTitle = "Notifications";

    $scope.lastmessages = lastmessages;
    $scope.messages = messages.conversation === undefined ? [] : messages.conversation;

    try {
        $scope.messageId = typeof $stateParams.id === 'undefined' ? 0 : $stateParams.id;
    } catch (er) {
        $scope.messageId = 0;
        $scope.isNew = true;
    }

    // Init
    if (isMain && $state.current.name == 'messages') {
        // console.log($scope.lastmessages);
        if ($scope.lastmessages.length > 0)
            $state.transitionTo('messages.edit', { id: $scope.lastmessages[0].id }, { reload: true });
    }

    $scope.setActive = function (id) {
        if ($stateParams.id == id) {
            return true;
        }
        else {
            return false;
        }
    }

    $scope.deleteConversation = function (cvs) {
        promptFactory.confirm("Are you sure you want to delete this message?", function (result) {
            if (result) {
                baseFactory.fetch("/api/message/delete/" + cvs.id, {}).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $timeout(function () {
                            $state.transitionTo("messages", null, { 'reload': true });
                        }, 100);
                    }
                });
            }
        });
    };

    $scope.messageChange = function (msg) {
        $scope.message = msg;
        if (msg == null || msg == "") {
            $scope.disableButton = true;
        } else {
            $scope.disableButton = false;
        }
    };

    $scope.addUser = function (item) {

        function addItem(itemm) {
            var isExist = false;
            for (var i = 0; i < $scope.mentionedUsers.length; i++) {
                if ($scope.mentionedUsers[i].mentionId == itemm.mentionId) {
                    isExist = true;
                    break;
                }
            }
            if (!isExist) {
                var tmp = {
                    mentionId: itemm.mentionId,
                    mentionName: itemm.fname,
                    mentionType: 'user',
                    sortOrder: $scope.mentionedUsers.length
                };
                $scope.mentionedUsers.push(tmp);
            }
        }
        addItem(item);

        $timeout(function () {
            $scope.tempUser = "";
            $scope.tempUserInput = "";
            //angular.element("[txtuserbox]").val(" ");
        }, 50);
    };

    $scope.addMessage = function (msg, msgId) {

        if ($scope.message == null || $scope.message == "") {
            toaster.pop("error", "", "Please type the topic message", 1000);
            return false;
        }

        var msgLen = $scope.messages.length;

        var params = {
            id: msgId
        }

        var data = {
            messageItem: {
                sortOrder: msgLen,
                fromId: currentUser.id,
                fromName: currentUser.firstName,
                message: '',
                date: moment.utc()
            },
            mentions: [],
            messageId: msgId
        };

        // Replace all line breaks
        msg = msg.replace(/\n/g, "<br/>");

        // Get all mentioned
        data.mentions = angular.copy($scope.mentionedUsers);

        // Get all mentioned users on the message
        var arrWord = msg.split(" ");
        var eUsr = [];

        angular.forEach($scope.mentionedUsers, function (u) {
            eUsr.push(u.mentionId);
        });


        if ($scope.isOwner) {
            angular.forEach(arrWord, function (w, i) {
                if (w.indexOf('@') == 0) {
                    var word = w.replace('@', '');
                    // Mention User
                    angular.forEach($scope.tempMentionedUsers, function (tbm) {
                        if (tbm.mentio == word) {
                            // Add to mentions
                            if (eUsr.indexOf(tbm.mentionId) < 0) {
                                var tmp = {
                                    mentionId: tbm.mentionId,
                                    mentionName: tbm.fname,
                                    mentionType: 'user',
                                    photoThumbnailUrl: tbm.photoThumbnailUrl,
                                    sortOrder: $scope.mentionedUsers.length
                                };
                                $scope.mentionedUsers.push(tmp);
                                eUsr.push(tmp.mentionId);
                            }
                        } else if (tbm.groupName == word) {
                            // Add to mentions
                            if (eUsr.indexOf(tbm.mentionId) < 0) {
                                var tmp2 = {
                                    mentionId: tbm.mentionId,
                                    mentionName: tbm.fname,
                                    mentionType: 'user',
                                    photoThumbnailUrl: tbm.photoThumbnailUrl,
                                    sortOrder: $scope.mentionedUsers.length
                                };
                                $scope.mentionedUsers.push(tmp2);
                                eUsr.push(tmp2.mentionId);
                            }
                        }
                    });
                    // format
                    arrWord[i] = '<span>' + w + '</span>';
                }
            });
        }
        data.messageItem.message = arrWord.join(" ");

        $scope.disableButton = true;
        $scope.sendButton = "Sending...";

        baseFactory.post('/api/message/save', data).then(function (rdata) {
            if (!rdata.isErrored) {
                $scope.messages.push({
                    sortOrder: msgLen,
                    fromId: currentUser.id,
                    fromName: currentUser.firstName,
                    photoThumbnailUrl: '',
                    message: data.messageItem.message,
                    date: moment.utc(),
                });
                $scope.messageId = rdata.object;
                $scope.message = "";
                angular.element("[txtmessagebox]").val("");

                if ($scope.messageId != 0) {
                    $location.path('/messages/' + $scope.messageId);
                }
            }
            $scope.disableButton = true;
            $scope.sendButton = "Send";
            $scope.tempMentionedUsers = [];
        });

    };

  

    // Attach File

    $scope.fileModel = {
        FileName: "",
        FileFolder: ""
    };
    var isDocument = true;
    var isMedia = true;
    $scope.doc = {
        id: 0,
        permissions: []
    };
    var isFileValid = function (filename) {
        var extAr = filename.split('.');
        var ext = extAr[extAr.length - 1];
        ext = ext.toLocaleLowerCase();
        var fType = [];
        var result = false;

        if (isDocument || isMedia) {
            fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "jpeg", "jpg", "png"];
            result = fType.indexOf(ext) >= 0;

            if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 7) {
                $scope.doc.docTypeId = 1;
            } else if (fType.indexOf(ext) >= 8 && fType.indexOf(ext) <= 10) {
                $scope.doc.docTypeId = 2;
            }
        }

        if (!result)
            $scope.errorMessage = "The file " + filename + " is not valid.";

        if (result) {
            if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                $scope.doc.name = filename;
            }
        }

        $timeout(function () {
            $scope.errorMessage = null;
        }, 2500);

        return result;
    };

    $scope.isFileUploading = false;
    $scope.onFileSelect = function ($files) {
        if (isFileValid($files[0].name)) {
            $scope.isFileUploading = true;
            $scope.progress = 0;

            baseFactory
                .upload('/api/upload/media', { oldfolder: '' }, $files)
                .progress(function (evt) {
                })
                .success(function (data, status, headers, config) {

                    if (!data.isErrored) {
                        // temporary folder
                        $scope.fileModel = data.object;
                        $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                        $scope.doc.fileName = $scope.fileModel.fileName;
                        $scope.doc.isUploaded = true;
                        $scope.doc.isNew = true;
                        $scope.doc.messageId = parseInt($scope.messageId);

                        // Save
                        baseFactory.post("/api/documents/save", $scope.doc).then(function (rrdata) {
                            if (!rrdata.isErrored) {
                                var msgLen = $scope.messages.length;
                                var docData = {
                                    messageItem: {
                                        sortOrder: msgLen,
                                        fromId: currentUser.id,
                                        fromName: currentUser.firstName,
                                        message: 'Attached file',
                                        documentId: rrdata.object.id,
                                        documentName: rrdata.object.fileName,
                                        fileLink: rrdata.object.link,
                                        date: moment.utc()
                                    },
                                    mentions: $scope.mentionedUsers,
                                    messageId: $scope.messageId
                                };
                                baseFactory.post('/api/message/save', docData).then(function (rrrdata) {
                                    $scope.isFileUploading = false;
                                    if (!rrrdata.isErrored) {
                                        $scope.messages.push(docData.messageItem);
                                        for (var j = 0; j < $scope.lastmessages.length; j++) {
                                            if ($scope.messageId == $scope.lastmessages[j].id) {
                                                $scope.lastmessages[j].lastMessage = 'Attached file';
                                                $scope.lastmessages[j].messageCtr += 1;
                                                break;
                                            }
                                        }
                                    }
                                });
                            }
                        });
                    }
                });
        }
    };

    $scope.filteredUsers = function (term) {
        var eUsr = [];

        angular.forEach($scope.mentionedUsers, function (u) {
            eUsr.push(u.mentionId);
        });

        if (term.length < 2) {
            $scope.mentions = [];
            return [];
        }
        return baseFactory.fetch('/api/users/SearchUsersForMentio', { q: term }).then(function (rdata) {
            if (!rdata.isErrored) {
                var usrs = [];
                angular.forEach(rdata.object, function (item) {
                    if (item.mentionId != $rootScope.user.userId) {
                        if (eUsr.indexOf(item.mentionId) < 0) {
                            usrs.push(item);
                        }
                    } else {
                        usrs.push(item);
                    }
                });
                return usrs;
            }
            $scope.mentions = [];
            return [];
        });
    };

    $scope.openManageSelectUsers = function () {
        var modalInstance = $modal.open({
            templateUrl: '/app/modules/messages/manageSelectUsersModal.html',
            controller: 'ManageChatSelectUsersModalCtrl',
            size: 'sm',
            backdrop: 'static',
            resolve: {
                mentionedUsersId: function () {
                    var arr = [];
                    // To Array
                    angular.forEach($scope.mentionedUsers, function (g) {
                        arr.push(g.mentionId);
                    });
                    return arr;
                },
                tempMentionedUsersId: function () {
                    return [];
                },
                users: function () {
                    return users;
                }
            }
        });

        modalInstance.result.then(function (rrrdata) {
            $scope.mentionedUsers = [];
            // Set
            angular.forEach(users, function (usr) {
                if (rrrdata.indexOf(usr.id) >= 0) {
                    $scope.mentionedUsers.push({
                        mentionId: usr.id,
                        mentionName: usr.firstName,
                        mentionType: 'user',
                        photoThumbnailUrl: usr.photoThumbnailUrl,
                        sortOrder: rrrdata.indexOf(usr.userId)
                    });
                }
            });
            console.log($scope.mentionedUsers);
        }, function (isReload) {
        });
    };

}
]);
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding', {
                url: "/moulding",
                redirectTo: "base.moulding.jobs",
                resolve: {
                },
                views: {
                    'content@base': {
                        template: '<div ui-view="mouldingMainView"></div>',
                        //controller: 'DeliveryMainCtrl',
                        resolve: {
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingpurchaseorders.view', 'system.mouldingjobsetup.allow',
                        'system.mouldingallocateorders.allow', 'system.mouldingproductionquantities.allow',
                        'system.mouldingcalendar.view', 'system.mouldingadmin.allow']
                },
                ncyBreadcrumb: {
                    label: 'Moulding'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding.adminproductsetup', {
                url: "/admin/productsetup",
                views: {
                    'mouldingMainView': {
                        templateUrl: "/app/modules/moulding/admin/productionsetup/views/index.html",
                        controller: 'MouldingProductionSetupCtrl',
                        resolve: {
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingadmin.allow']
                },
                ncyBreadcrumb: {
                    label: 'Admin Product Setup'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingProductionSetupCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS'];
    function ctrl($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS) {

        $scope.gridOptions = {
            itemType: 'Workstations',
            gridName: 'mouldingWorkstations',
            fetchUrl: '/api/mouldings/searchAllProductSetup',
            exportUrl: '/exportGrid/searchAllProductSetup/',
            initSortString: 'ItemNumber asc',
            enableExport: true,
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            columnDefs: [
                { field: 'itemNumber', displayName: 'Item Number', customSortField: 'itemNumber', width: 150 },
                { field: 'itemName', displayName: 'Item Name', customSortField: 'itemName' },
                { field: 'cavities', displayName: 'Cavities', customSortField: 'cavities', width: 80 },
                { field: 'cycle', displayName: 'Cycle', customSortField: 'cycle', width: 70 },
                { field: 'weight', displayName: 'Weight', customSortField: 'weight', width: 70 },
                { field: 'setupTime', displayName: 'Setup Time', customSortField: 'setupTime', width: 95 },
                { field: 'availability', displayName: 'Availability', customSortField: 'availability', width: 95 }
            ],
            extraParams: { q: '' },
            controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm pull-right">' +
                '<a ng-click="manageProductionSetup(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '<a ng-click="copyProductionSetup(row.entity)" class="btn btn-default" title="Copy"><i class="fa fa-copy"></i></a>' +
                '</div></div>';
        }

        $scope.filterSearch = function () {
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };
        $scope.export = function () {
            $rootScope.$emit(GRID_CONSTANTS.EXPORT_GRID_PREFIX + $scope.gridOptions.gridName);
        };

        $scope.manageProductionSetup = function (po) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/admin/productionsetup/modals/setupModal.html',
                controller: 'MouldingProductionSetupModalCtrl',
                size: 'sm',
                backdrop: 'static',
                //windowClass: 'app-modal-window',
                resolve: {
                    m: function () {
                        var p = angular.copy(po);
                        if (!p.availability)
                            p.availability = 95;
                        return p;
                    }
                }
            });
            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            }, function (isReloadPage) {
            });
        };

        $scope.copyProductionSetup = function (ps) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/admin/productionsetup/modals/setupCopyModal.html',
                controller: 'MouldingProductionSetupCopyModalCtrl',
                backdrop: 'static',
                size: 'md',
                resolve: {
                    item: function () {
                        return ps;
                    },
                    gridName: function () {
                        return $scope.gridOptions.gridName;
                    }
                }
            });
        };

        $scope.importProductionSetup = function () {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/admin/productionsetup/modals/setupImportModal.html',
                controller: 'MouldingProductionSetupImportModalCtrl',
                size: 'md',
                backdrop: 'static'
            });
            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            }, function (isReloadPage) {
            });
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingProductionSetupCopyModalCtrl',
        ['$scope', '$rootScope', '$modal', '$modalInstance', 'sharedFactory', 'baseFactory', 'GRID_CONSTANTS', 'item', 'gridName',
            function ($scope, $rootScope, $modal, $modalInstance, sharedFactory, baseFactory, GRID_CONSTANTS, item, gridName) {
                $scope.submitButton = "Copy";
                $scope.close = close;
                $scope.save = save;
                $scope.disableSubmitButton = false;
                $scope.m = {
                    copyFromItemNumber: item,
                    copyFromItem: item.itemName + " - " + item.itemNumber,
                    copyToItemNumber: null,
                    copyToItem: null,
                    copyToItems: []
                };

                function save(mForm, m) {

                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitButton = "Copying...";
                        $scope.disableSubmitButton = true;
                        //
                        var dataToSend = {
                            copyFromItemNumber: m.copyFromItemNumber,
                            copyToItemNumbers: angular.copy($scope.m.copyToItems)
                        };
                        //
                        baseFactory.post('/api/mouldings/copyProductSetup', dataToSend).then(function (rdata) {
                            if (!rdata.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                                $modalInstance.close();
                            }
                            $scope.submitButton = "Copy";
                            $scope.disableSubmitButton = false;
                        });
                    }
                }
                function close() {
                    $modalInstance.close();
                }

                $scope.loadingItems = false;
                $scope.searchProducts = function (val) {
                    var dataToSend = {
                        q: val
                    };
                    $scope.loadingItems = true;
                    return baseFactory.fetch('/api/mouldings/searchitems', dataToSend).then(function (rdata) {
                        $scope.loadingItems = false;
                        return rdata.object;
                    });
                };
                $scope.containsTokens = function (state, viewValue) {
                    if (!state || typeof state !== "string") {
                        return false;
                    }

                    var matches = [];
                    var tokens = viewValue.split(" ");

                    for (var i = 0; i < tokens.length; i++) {
                        if (state.toLowerCase().trim().indexOf(tokens[i].toLowerCase().trim()) > -1) {
                            matches.push(true);
                        } else {
                            matches.push(false);
                        }
                    }

                    var allMatch = true;

                    for (var j = 0; j < matches.length; j++) {
                        if (!matches[j]) {
                            allMatch = false;
                        }
                    }

                    return allMatch;
                };
                $scope.addItem = function ($item, $model, $label, $event) {
                    var isExist = false;
                    for (var i = 0; i < $scope.m.copyToItems.length; i++) {
                        if ($scope.m.copyToItems[i].itemNumber === $item.description) {
                            isExist = true;
                            break;
                        }
                    }
                    if (!isExist) {
                        $scope.m.copyToItems.push({
                            isPPI: $item.isPPI,
                            itemNumber: $item.description,
                            display: $item.description + ' - ' + $item.name
                        });
                    }
                    $scope.m.copyToItem = null;
                };
                $scope.removeItem = function ($item) {
                    for (var i = 0; i < $scope.m.copyToItems.length; i++) {
                        if ($scope.m.copyToItems[i].itemNumber === $item.itemNumber) {
                            $scope.m.copyToItems.splice(i, 1);
                            break;
                        }
                    }
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.controller('MouldingProductionSetupImportModalCtrl',
        ['$scope', '$rootScope', '$modal', '$timeout', '$modalInstance', 'sharedFactory', 'baseFactory',
            function ($scope, $rootScope, $modal, $timeout, $modalInstance, sharedFactory, baseFactory) {
                $scope.m = {};

                // FILE
                $scope.fileModel = {
                    fileName: "",
                    fileFolder: ""
                };
                var isFileValid = function (filename) {
                    var extAr = filename.split('.');
                    var ext = extAr[extAr.length - 1];
                    ext = ext.toLocaleLowerCase();
                    var fType = ["xls", "xlsx"];
                    var result = fType.indexOf(ext) >= 0;

                    if (!result)
                        $scope.message = "The file " + filename + " is not valid.";

                    $timeout(function () {
                        $scope.message = null;
                    }, 2500);

                    return result;
                };
                $scope.onFileSelect = function ($files) {
                    if (isFileValid($files[0].name)) {
                        $scope.disableSubmitButton = true;
                        $scope.submitTxt = "Uploading...";
                        $scope.progress = 0;
                        $scope.upload = baseFactory
                            .upload('/api/upload/media', { oldfolder: '' }, $files)
                            .progress(function (evt) {
                                $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                            }).success(function (data, status, headers, config) {
                                $scope.resetInputFile();
                                // temporary folder
                                $scope.fileModel = data.object;
                                $scope.m.fileFolder = $scope.fileModel.fileFolder;
                                $scope.m.fileName = $scope.fileModel.fileName;
                                $scope.m.isUploaded = true;
                                $scope.m.isNew = true;
                                $scope.submitTxt = "Save";
                                $scope.disableSubmitButton = false;
                            });
                    } else {
                        $scope.resetInputFile();
                        $scope.changeFile();
                    }
                };
                $scope.changeFile = function () {
                    $scope.m.isUploaded = false;
                    $scope.m.fileFolder = "";
                    $scope.m.fileName = "";
                    $scope.m.photoUrl = "";
                    $scope.m.link = "";
                    $scope.m.isNew = true;
                };
                $scope.resetInputFile = function () {
                    var elems = document.getElementsByTagName('input');
                    for (var i = 0; i < elems.length; i++) {
                        if (elems[i].type == 'file') {
                            elems[i].value = null;
                        }
                    }
                };

                $scope.disableSubmitButton = false;
                $scope.submitTxt = "Save";

                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;
                        baseFactory.post("/api/mouldings/ImportProductSetup", po).then(function (data) {
                            if (!data.isErrored)
                                $modalInstance.close();
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };
                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.controller('MouldingProductionSetupModalCtrl',
        ['$scope', '$rootScope', '$modal', '$modalInstance', 'sharedFactory', 'baseFactory', 'm',
            function ($scope, $rootScope, $modal, $modalInstance, sharedFactory, baseFactory, m) {
                $scope.m = m;
                $scope.disableSubmitButton = false;
                $scope.submitTxt = "Save";

                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;
                        baseFactory.post("/api/mouldings/SaveProductSetup", po).then(function (data) {
                            if (!data.isErrored)
                                $modalInstance.close();
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding.adminworkstations', {
                url: "/admin/workstations",
                views: {
                    'mouldingMainView': {
                        templateUrl: "/app/modules/moulding/admin/workstations/views/index.html",
                        controller: 'MouldingAdminWorkstationsCtrl',
                        resolve: {
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingadmin.allow']
                },
                ncyBreadcrumb: {
                    label: 'Admin Workstations'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingAdminWorkstationsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$timeout', 'baseFactory', 'promptFactory', 'GRID_CONSTANTS'];
    function ctrl($scope, $rootScope, $modal, $timeout, baseFactory, promptFactory, GRID_CONSTANTS) {
        $scope.adminWorkstations = [];
        $scope.filter = {
            q: ""
        };

        var setItemSortOrder = function () {
            var dataToSend = [];
            for (var i = 0; i < $scope.adminWorkstations.length; i++) {
                var item = $scope.adminWorkstations[i];
                item.sortOrder = i + 1;
                dataToSend.push({
                    id: item.id,
                    sortOrder: item.sortOrder
                });
            }
            // Save
            baseFactory.post('/api/mouldings/saveWorkstationSortOrders', dataToSend).then(function (rrdata) { });
        };
        $scope.workstationSortableOptions = {
            handle: '.my-handle',
            placeholder: "placeholder",
            items: '.ws-item',
            tolerance: 'pointer',
            stop: function () {
                setItemSortOrder();
            }
        };

        $scope.filterSearch = function () {
            baseFactory.fetch('/api/mouldings/searchAllWorkstations', { q: $scope.filter.q, startIndex: 1, retrieveSize: 9999, sort: 'SortOrder asc' }).then(function (rrdata) {
                $scope.adminWorkstations = rrdata.object || [];
            });
        };
        $scope.filterSearch();

        $scope.manageWorkstation = function (po) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/admin/workstations/modals/workstationModal.html',
                controller: 'MouldingWorkstationModalCtrl',
                size: 'md',
                backdrop: 'static',
                //windowClass: 'app-modal-window',
                resolve: {
                    m: function () {
                        return po === null ? {
                            id: null,
                            name: null
                        } : angular.copy(po);
                    },
                    isNew: function () {
                        return po === null;
                    }
                }
            });
            modalInstance.result.then(function () {
                $scope.filterSearch();
            }, function (isReloadPage) {
            });
        };

        $scope.deleteWorkstation = function (cvs) {
            promptFactory.confirm("Are you sure you want to delete this workstation (" + cvs.name + ") ?", function (result) {
                if (result) {
                    baseFactory.remove("/api/mouldings/deleteWorkstation/" + cvs.id, {}).then(function (rdata) {
                        if (!rdata.isErrored) {
                            $timeout(function () {
                                $scope.filterSearch();
                            }, 100);
                        }
                    });
                }
            });
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingWorkstationModalCtrl',
        ['$scope', '$rootScope', '$modal', '$modalInstance', 'sharedFactory', 'baseFactory', 'm', 'isNew',
            function ($scope, $rootScope, $modal, $modalInstance, sharedFactory, baseFactory, m, isNew) {
                $scope.m = m;
                $scope.isNew = isNew;
                $scope.mode = isNew ? 'Create' : 'Edit';
                $scope.disableSubmitButton = false;
                $scope.submitTxt = "Save";

                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;
                        baseFactory.post("/api/mouldings/SaveWorkstation", po).then(function (data) {
                            if (!data.isErrored)
                                $modalInstance.close();
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding.jobs', {
                url: "/jobs",
                views: {
                    'mouldingMainView': {
                        templateUrl: "/app/modules/moulding/jobs/views/index.html"
                    }
                },
                resolve: {
                    workstations: function (baseFactory) {
                        return baseFactory.fetch('/api/mouldings/getallworkstations').then(function (rrdata) {
                            return rrdata.object || [];
                        });
                    }
                },
                ncyBreadcrumb: {
                    label: 'Jobs'
                }
            })
            .state('base.moulding.jobs.setup', {
                url: "/setup",
                views: {
                    'jobview': {
                        templateUrl: "/app/modules/moulding/jobs/views/jobSetup.html",
                        controller: 'MouldingJobSetupCtrl',
                        resolve: {
                            jobStatuses: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/mouldings/getalljobstatuses/').then(function (rdata) {
                                    return rdata.object;
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Setup'
                }
            })
            .state('base.moulding.jobs.allocate', {
                url: "/allocate",
                views: {
                    'jobview': {
                        templateUrl: "/app/modules/moulding/jobs/views/jobAllocate.html",
                        controller: 'MouldingAllocateJobsCtrl',
                        resolve: {
                            AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('AngularGanttModule');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Allocate'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingAllocateJobsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$log', '$stateParams', '$modal', '$timeout', '$window', '$filter', 'baseFactory', 'promptFactory', 'workstations'];
    function ctrl($scope, $rootScope, $log, $stateParams, $modal, $timeout, $window, $filter, baseFactory, promptFactory, workstations) {
        if ($stateParams.workstationId) {
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        }

        $scope.calendars = $filter('orderBy')(workstations, 'name');
        $scope.schedules = [];
        $scope.unallocatedSchedules = [];
        $scope.loading = true;
        $scope.schedulesMode = false;

        var setItemSortOrder = function () {
            var dataToSend = [];
            var ctr = 1;
            for (var i = 0; i < $scope.schedules.length; i++) {
                var item = $scope.schedules[i];
                item.sortOrder = ctr;
                dataToSend.push({
                    id: item.id,
                    sortOrder: item.sortOrder,
                    workStationId: $scope.dg.ws
                });
                ctr++;
                if (typeof item.childJob !== 'undefined') {
                    var childItem = item.childJob;
                    dataToSend.push({
                        id: childItem.id,
                        sortOrder: ctr,
                        workStationId: $scope.dg.ws
                    });
                    ctr++;
                }
            }
            for (var j = 0; j < $scope.unallocatedSchedules.length; j++) {
                var item2 = $scope.unallocatedSchedules[j];
                dataToSend.push({ id: item2.id, sortOrder: null, workStationId: $scope.dg.ws });
            }
            // Save
            baseFactory.post('/api/mouldings/saveJobsSortOrder/', dataToSend).then(function (rrdata) {
                for (var i = 0; i < rrdata.object.length; i++) {
                    var jj = rrdata.object[i];
                    for (var j = 0; j < $scope.schedules.length; j++) {
                        if ($scope.schedules[j].sortOrder === jj.sortOrder) {
                            $scope.schedules[j].jobRuntime = jj.jobRuntime;
                            $scope.schedules[j].completionDate = jj.completionDate;
                            break;
                        }
                    }
                }
                var dts = angular.copy($scope.dg);
                baseFactory.fetch('/api/mouldings/getAllJobsReportSchedule', dts).then(function (rrrdata) {
                    $scope.data = rrrdata.object || [];
                });
            });
        };

        $scope.sortableOptions = {
            handle: '.my-handle',
            placeholder: "media-scheduler-container placeholder",
            connectWith: ".scheduler-container",
            items: '.media-scheduler-container',
            tolerance: 'pointer',
            stop: function () {
                setItemSortOrder();
            }
        };
        $scope.allocateSortableOptions = {
            handle: '.my-handle',
            placeholder: "media-scheduler-container placeholder",
            connectWith: ".scheduler-container",
            cancel: ".unsortable",
            items: '.media-scheduler-container-item:not(.unsortable)',
            tolerance: 'pointer',
            // forceHelperSize: true,
            scroll: true,
            scrollSensitivity: 10,
            stop: function () {
                setItemSortOrder();
            },
            over: function (e, ui) {
                jQuery(ui.sender).sortable('instance').scrollParent = jQuery(e.target);
            }
        };

        $scope.allocateMode = function (mode) {
            $scope.schedulesMode = !mode;
        };
        $scope.printScheduleReport = function () {
            $modal.open({
                templateUrl: '/app/modules/calendars/modals/printScheduleReportModal.html',
                controller: 'PrintScheduleReportModalCtrl',
                size: 'sm',
                backdrop: 'static',
                resolve: {
                    calendars: function () {
                        return $scope.calendars;
                    }
                }
            });
        };

        $scope.eventOnClick = function (event) {
            // console.log(event)
            var tempEvent = angular.copy(event);

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/calendars/modals/calendarOrderModal.html',
                controller: 'CalendarOrderModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    order: function () {
                        var ms = $.fullCalendar.moment(tempEvent.start);
                        var me = $.fullCalendar.moment(tempEvent.end);
                        var isAllDay = !(ms.hasTime() && me.hasTime());

                        if (event.end === null) {
                            tempEvent.end = event.end === null ? tempEvent.start : tempEvent.end;
                        }

                        var duration = moment.duration(tempEvent.end.diff(tempEvent.start));
                        var hours = duration.asHours();

                        if (hours === 0) {
                            tempEvent.end = event.end === null ? tempEvent.start : tempEvent.end;
                        } else {
                            tempEvent.end = isAllDay ? tempEvent.end.subtract(1, 'day').toDate() : tempEvent.end;
                        }
                        tempEvent.origStart = tempEvent.start;
                        tempEvent.origEnd = tempEvent.end;

                        return angular.copy(tempEvent);
                    },
                    orderStatuses: function () {
                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                            return rrdata.object;
                        });
                    },
                    isNew: function () {
                        return false;
                    },
                    event: function () {
                        return event;
                    },
                    isAllPrinters: function () {
                        return true;
                    },
                    printers: function () {
                        return $scope.calendars;
                    },
                    orderDetails: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + tempEvent.orderId).then(function (rrdata) {
                            return rrdata.object;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                if (ddata) {
                    event.location = ddata.location;
                }
                $scope.updateSearch();
            }, function () {
            });
        };
        $scope.onSelect = function ($item) {
            var tempEvent = angular.copy($item);
            tempEvent.titleName = $item.title;
            tempEvent.start = $.fullCalendar.moment(tempEvent.start);
            tempEvent.end = $.fullCalendar.moment(tempEvent.end);
            $scope.eventOnClick(tempEvent);
        };
        $scope.openOrderJobBag = function (order) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderJobBagModal/orderJobBagModal.html',
                controller: 'orderJobBagModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    orderData: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + order.id).then(function (data) {
                            return data.object;
                        });
                    }
                }
            });
        };
        $scope.manageJob = function (job) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/purchaseOrders/modals/purchaseOrderItemModal.html',
                controller: 'MouldingPurchaseOrderItemModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    item: function () {
                        return baseFactory.fetch('/api/mouldings/getPurchaseOrderItem/' + job.purchaseOrderItemId).then(function (rdata) {
                            var j = rdata.object || {};
                            j.purchaseOrderId = job.purchaseOrderId;
                            j.isSave = true;
                            return j;
                        });
                    },
                    workstations: function () {
                        return workstations;
                    },
                    isNew: function () {
                        return false;
                    }
                }
            });
            modalInstance.result.then(function (item) {
                job.jobNumber = angular.copy(item.jobNumber);
                job.itemNumber = angular.copy(item.itemNumber);
                job.itemName = angular.copy(item.itemName);
                job.dueDate = angular.copy(item.dueDate);
                job.comments = angular.copy(item.comments);
            }, function (isReloadPage) {
            });
        };
        $scope.isEnableLinkJob = function (previous, current) {
            return typeof previous.childJob === 'undefined' && typeof current.childJob === 'undefined';
        };
        $scope.linkPreviousJob = function (parentJobId, childJobId, child) {
            baseFactory.put('/api/mouldings/linkpreviousjob?parentId=' + parentJobId + '&childId=' + childJobId).then(function (rrdata) {
                if (!rrdata.isErrored) {
                    child.parentJobId = parentJobId;
                    $scope.updateSearch();
                }
            });
        };
        $scope.unlinkPreviousJob = function (childJobId, child) {
            baseFactory.put('/api/mouldings/linkpreviousjob?childId=' + childJobId).then(function (rrdata) {
                if (!rrdata.isErrored) {
                    child.parentJobId = null;
                    $scope.updateSearch();
                }
            });
        };
        $scope.setupItem = function (orderItem) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/jobs/modals/manageWorkstationsModal.html',
                controller: 'MouldingPurchaseOrderItemWorkstationModalCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    data: function () {
                        return baseFactory.fetch('/api/mouldings/getJob/' + orderItem.purchaseOrderItemId).then(function (rdata) {
                            return rdata.object || null;
                        });
                    },
                    workstations: function () {
                        return workstations;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                //orderItem.jobStatusId = ddata.jobStatusId;
                //orderItem.jobStatus = ddata.jobStatus;
                //orderItem.allocated = ddata.quantity - ddata.maxQuantity;
                //orderItem.unallocated = ddata.maxQuantity;
                $scope.updateSearch();
            }, function () {
            });
        };

        $scope.data = [];
        $scope.dg = {
            searchText: "",
            ws: $stateParams.workstationId
        };
        $scope.updateSearch = function () {
            $scope.data = [];
            $scope.schedules = [];
            $scope.unallocatedSchedules = [];
            $scope.loading = true;
            baseFactory.fetch('/api/mouldings/getAllJobs', $scope.dg).then(function (rdata) {
                var schedules = rdata.object || [];
                $scope.loading = false;
                var uasched = [];
                var asched = [];

                angular.forEach(schedules, function (s, i) {
                    if (s.sortOrder === null) {
                        uasched.push(s);
                    } else {
                        if (s.parentJobId !== null) {
                            try {
                                asched[asched.length - 1].childJob = angular.copy(s);
                            } catch (er) {
                                asched.push(s);
                            }
                        } else {
                            asched.push(s);
                        }
                    }
                });
                $scope.unallocatedSchedules = uasched;
                $scope.schedules = asched;
                var dts = angular.copy($scope.dg);
                baseFactory.fetch('/api/mouldings/getAllJobsReportSchedule', dts).then(function (rrrdata) {
                    $scope.data = rrrdata.object || [];
                    //
                    $timeout(function () {
                        jQuery(".gantt-scrollable-top").on('scroll', function () {
                            jQuery(".gantt-scrollable").scrollLeft(jQuery(".gantt-scrollable-top").scrollLeft());
                        });
                        jQuery(".gantt-scrollable").on('scroll', function () {
                            jQuery(".gantt-scrollable-top").scrollLeft(jQuery(".gantt-scrollable").scrollLeft());
                        });
                    }, 100);
                });
            });
        };

        $scope.openStockAvailability = function (orderr) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderStockAvailabilityModal/index.html',
                controller: 'OrderStockAvailabilityModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    order: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + orderr.orderId).then(function (rdata) {
                            return rdata.object || null;
                        });
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                $scope.updateSearch();
            }, function () {
            });
        };
        $scope.openArtWorkApproval = function (orderr) {
            baseFactory.fetch('/api/order/get/' + orderr.orderId).then(function (rrdata) {
                var item = rrdata.object.items[0];

                angular.forEach(rrdata.object.items, function (itm) {
                    if (itm.isPrimary) {
                        item = itm;
                    }
                });

                // console.log(item)
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/artworkApproval/artworkApprovalDetailModal/artworkApprovalDetail.html',
                    controller: 'artworkApprovalDetailCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        messages: function () {
                            return baseFactory.fetch('/api/message/getAllMessagesByOrder', { orderId: orderr.orderId, page: 1, count: 20 }).then(function (rrrdata) {
                                return rrrdata.object || null;
                            });
                        },
                        messageDetail: function () {
                            return null;
                        },
                        currentUser: function () {
                            return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrrdata) {
                                return rrrdata.object === null ? [] : rrrdata.object;
                            });
                        },
                        orderStatuses: function (resolveFactory) {
                            return resolveFactory.getGridEntity('/api/orderstatus/getall');
                        },
                        order: function () {
                            return rrdata.object;
                        }
                    }
                });

                modalInstance.result.then(function (isReloadPage) {
                    if (isReloadPage)
                        $scope.updateSearch();
                }, function (isReloadPage) {
                    if (isReloadPage)
                        $scope.updateSearch();
                });
            });
        };

        $scope.options = {
            mode: 'custom',
            scale: 'day',
            sortMode: undefined,
            sideMode: 'Tree',
            daily: false,
            maxHeight: false,
            width: false,
            zoom: 1,
            columns: ['model.name'],
            treeTableColumns: [],
            columnsHeaders: { 'model.name': 'Name' },
            columnsClasses: { 'model.name': 'gantt-column-name' },
            columnsFormatters: {
                'from': function (from) {
                    return from !== undefined ? from.format('lll') : undefined;
                },
                'to': function (to) {
                    return to !== undefined ? to.format('lll') : undefined;
                }
            },
            treeHeaderContent: '<i class="fa fa-align-justify"></i> {{getHeader()}}',
            columnsHeaderContents: {
                'model.name': '<i class="fa fa-align-justify"></i> {{getHeader()}}',
                'from': '<i class="fa fa-calendar"></i> {{getHeader()}}',
                'to': '<i class="fa fa-calendar"></i> {{getHeader()}}'
            },
            headers: ['day'],
            headerFormats: {
                'year': 'YYYY',
                'quarter': '[Q]Q YYYY',
                month: 'DD, MMMM YYYY',
                week: function (column) {
                    return column.date.format('MMM D [-]') + column.endDate.format('[ ]MMM D');
                },
                //day: 'DD/MM/YYYY',
                day: 'ddd DD/MM',
                hour: 'H',
                minute: 'HH:mm'
            },
            headerScales: {
                //'shifting': 'hour'
            },
            autoExpand: 'none',
            fromDate: moment(null),
            toDate: undefined,
            rowContent: '<i class="fa fa-align-justify"></i> {{row.model.name}}',
            taskContent: '<i class="fa fa-tasks"></i> {{task.model.name}}',
            allowSideResizing: true,
            labelsEnabled: true,
            currentDate: 'line',
            currentDateValue: new Date(),
            draw: false,
            readOnly: false,
            groupDisplayMode: 'group',
            filterTask: '',
            filterRow: '',
            timeFrames: {
                'shift1': {
                    start: moment('00:00', 'HH:mm'),
                    end: moment('08:00', 'HH:mm'),
                    working: true,
                    default: true
                },
                'shift2': {
                    start: moment('08:01', 'HH:mm'),
                    end: moment('16:00', 'HH:mm'),
                    working: true,
                    classes: ['gantt-timeframe-now-working-alt'],
                    default: true
                },
                'shift3': {
                    start: moment('16:01', 'HH:mm'),
                    end: moment('23:59', 'HH:mm'),
                    working: true,
                    default: true
                },
                //'closed': {
                //    color: '#FFB3B3',
                //    magnet: false,
                //    working: false,
                //    classes: ['gantt-closed-timeframe']
                //}
            },
            dateFrames: {
                weekend: {
                    evaluator: function (date) { // A custom function evaluated for each day in the gantt
                        return date.isoWeekday() === 6 || date.isoWeekday() === 7;
                    },
                    targets: ['closed'] // Use timeFrame named closed for saturday and sunday.
                }
            },
            // timeFramesNonWorkingMode: 'visible',
            timeFramesWorkingMode: 'visible',
            columnMagnet: '8 hours',
            timeFramesMagnet: true,
            canDraw: function (event) {
                var isLeftMouseButton = event.button === 0 || event.button === 1;
                return $scope.options.draw && !$scope.options.readOnly && isLeftMouseButton;
            },
            drawTaskFactory: function () {
                return {
                    id: utils.randomUuid(),  // Unique id of the task.
                    name: 'Drawn task', // Name shown on top of each task.
                    color: '#AA8833' // Color of the task in HEX format (Optional).
                };
            }
        };

        $scope.registerApi = function (api) {
            api.directives.on.new($scope, function (dName, dScope, dElement, dAttrs, dController) {
                if (dName === "ganttRowLabel") {
                    if (dScope.row.model.purchaseOrderId !== null)
                        angular.element(dElement).addClass('cursor-pointer');
                    if (dScope.row.model.isOverdue)
                        angular.element(dElement).addClass('text-bold text-danger');
                    dElement.bind('click', function (event) {
                        if (dScope.row.model.purchaseOrderId !== null)
                            $scope.openQuickViewModal(dScope.row.model.purchaseOrderId, dScope.row.model.orderItemId, dScope.row.model.workstationId);
                    });
                }
            });
        };

        //
        $scope.updateToIsRunning = function (row) {
            var isChanged = !row.isRunning;
            row.isRunning = true;
            for (var i = 0; i < $scope.schedules.length; i++) {
                if ($scope.schedules[i].id !== row.id) {
                    $scope.schedules[i].isRunning = false;
                }
            }

            // Save
            baseFactory.put('/api/mouldings/saveRunningJob/' + row.id + '?ws=' + row.workstationId).then(function (rrrdata) {
                if (isChanged)
                    $scope.updateSearch();
            });
        };

        //
        $scope.setJobToComplete = function (row) {
            promptFactory.confirm("Are you sure you want to complete this job?", function (result) {
                if (result) {
                    // Save
                    baseFactory.put('/api/mouldings/setJobToComplete/' + row.id).then(function (rrrdata) {
                        $scope.updateSearch();
                    });
                }
            });
        };

        $scope.openQuickViewModal = function (purchaseOrderId, orderItemId, workstationId) {
            var modalInstance = $modal.open({
                templateUrl: "/app/modules/moulding/purchaseOrders/modals/purchaseOrderViewModal.html",
                controller: 'MouldingPurchaseOrderViewModalCtrl',
                size: 'huge',
                resolve: {
                    purchaseOrder: function () {
                        return baseFactory.fetch('/api/mouldings/getPurchaseOrderJobs/' + purchaseOrderId, { oi: orderItemId, ws: workstationId })
                            .then(function (rdata) {
                                return rdata.object;
                            });
                    }
                }
            });
            modalInstance.result.then(function () {
            }, function (isReloadPage) {
            });
        };
        $scope.updateSearch();
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingJobSetupCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'workstations', 'jobStatuses'];
    function ctrl($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, workstations, jobStatuses) {

        var js = angular.copy(jobStatuses);
        js.unshift({ id: null, name: 'All' });
        $scope.gridOptions = {
            itemType: 'allocated jobs',
            gridName: 'mouldingAllocateJobs12345',
            fetchUrl: '/api/mouldings/searchAllJobs',
            initSortString: 'dateCreated desc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: false,
            columnDefs: [
                { field: 'purchaseOrderNumber', displayName: 'PO No.', customSortField: 'PurchaseOrderNumber', width: 120 },
                { field: 'jobNumber', displayName: 'Job No.', customSortField: 'JobNumber', width: 120 },
                { field: 'itemName', displayName: 'Item Name', customSortField: 'itemName' },
                { field: 'itemNumber', displayName: 'Item Number', customSortField: 'itemNumber' },
                { field: 'jobStatus', displayName: 'Job Status', customSortField: 'jobStatus' },
                { field: 'allocated', displayName: 'Allocated', customSortField: 'allocated', width: 100 },
                { field: 'unallocated', displayName: 'Unallocated', customSortField: 'unallocated', width: 100 }
            ],
            enableCustomFields: true,
            extraParams: { stat: null, q: '' },
            extraData: {
                statuses: js
            },
            controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ng-click="manageWorkstations(row.entity.id)" class="btn btn-default">Allocate</a>' +
                '</div></div>';
        }

        $scope.filterSearch = function () {
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };

        $scope.deletePurchaseOrder = function (value) {
            modalFactory.deleteEntityFromGrid(
                value.orderNumber,
                value.id,
                'Purchase Order',
                null,
                '/api/mouldings/deletePurchaseOrder/',
                $scope.gridOptions.gridName
            );
        };

        //
        $scope.manageWorkstations = function (orderItemId) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/jobs/modals/manageWorkstationsModal.html',
                controller: 'MouldingPurchaseOrderItemWorkstationModalCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    data: function () {
                        return baseFactory.fetch('/api/mouldings/getJob/' + orderItemId).then(function (rdata) {
                            return rdata.object || null;
                        });
                    },
                    workstations: function () {
                        return workstations;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
            }, function () {
            });
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingJobSetupModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', 'sharedFactory', 'baseFactory', 'jobSetup', 'workstations',
            function ($scope, $rootScope, $modalInstance, sharedFactory, baseFactory, jobSetup, workstations) {
                $scope.m = angular.copy(jobSetup);
                $scope.workstations = workstations;
                $scope.mode = 'Edit';
                $scope.disableSubmitButton = false;
                $scope.submitTxt = 'Save';

                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;
                        baseFactory.post("/api/mouldings/saveJobSetup", po).then(function (data) {
                            if (!data.isErrored) {
                                $modalInstance.close(po);
                            }
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.controller('MouldingPurchaseOrderItemWorkstationModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', 'sharedFactory', 'baseFactory', 'data', 'workstations',
            function ($scope, $rootScope, $modalInstance, sharedFactory, baseFactory, data, workstations) {

                // check data
                var j = 0;
                var totalQuantity = 0;
                for (j = 0; j < data.workstations.length; j++) {
                    totalQuantity += (data.workstations[j].productionQuantity > data.workstations[j].quantity ?
                        data.workstations[j].productionQuantity : data.workstations[j].quantity);
                }
                if (totalQuantity > data.quantity) {
                    data.quantity = totalQuantity;
                    data.maxQuantity = totalQuantity - data.quantity;
                }

                $scope.newItem = {
                    isFuture: false,
                    workstationId: workstations[0].id,
                    workstation: workstations[0].name,
                    productionQuantity: 0,
                    quantity: data.maxQuantity,
                    cavities: data.default.cavities || 1,
                    cycle: data.default.cycle,
                    weight: data.default.weight,
                    setupTime: data.default.setupTime,
                    availability: data.default.availability,
                    maxQuantity: data.maxQuantity,
                    setJobStatusId: null
                };


                $scope.data = angular.copy(data);
                $scope.workstations = [];
                $scope.cavities = [1, 2, 3, 4, 5, 6];
                $scope.jobStatuses = [
                    { id: null, name: 'Active' },
                    { id: 4, name: 'Completed' }
                ];
                $scope.disableSubmitButton = false;
                $scope.submitTxt = "Save";
                $scope.getMaxQuantity = function (w, mq) {
                    return w.origQuantity + mq;
                };
                $scope.quantityChanged = function (w) {
                    var total = 0;
                    var isundefined = false;
                    var indx = -1;
                    for (var j = 0; j < $scope.data.workstations.length; j++) {
                        if (typeof $scope.data.workstations[j].quantity !== 'undefined') {
                            total += $scope.data.workstations[j].quantity;
                            $scope.data.workstations[j].origQuantity = angular.copy($scope.data.workstations[j].quantity);
                        } else {
                            indx = j;
                            isundefined = true;
                        }
                    }
                    if (isundefined) {
                        $scope.data.workstations[indx].origQuantity = $scope.data.quantity - total;
                        total += $scope.data.workstations[indx].origQuantity;
                    }
                    $scope.newItem.quantity = $scope.data.quantity - total;
                    $scope.newItem.maxQuantity = angular.copy($scope.newItem.quantity);
                };


                $scope.addItem = function (mForm, item) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        // find name
                        for (var i = 0; i < workstations.length; i++) {
                            if (item.workstationId === workstations[i].id) {
                                item.workstation = workstations[i].name;
                                break;
                            }
                        }

                        $scope.data.workstations.push(angular.copy(item));

                        $scope.newItem = {
                            isFuture: false,
                            workstationId: workstations[0].id,
                            workstation: workstations[0].name,
                            productionQuantity: 0,
                            quantity: item.maxQuantity - item.quantity,
                            origQuantity: item.maxQuantity - item.quantity,
                            cavities: data.default.cavities || 1,
                            cycle: data.default.cycle,
                            weight: data.default.weight,
                            setupTime: data.default.setupTime,
                            availability: data.default.availability,
                            maxQuantity: item.maxQuantity - item.quantity,
                            setJobStatusId: null
                        };
                    }
                };
                $scope.deleteItem = function (indx) {
                    if (indx >= 0) {
                        $scope.data.workstations.splice(indx, 1);
                        var total = 0;
                        for (var j = 0; j < $scope.data.workstations.length; j++) {
                            total += $scope.data.workstations[j].quantity;
                        }
                        data.maxQuantity = $scope.data.quantity - total;
                        $scope.newItem.maxQuantity = data.maxQuantity;
                        $scope.newItem.quantity = data.maxQuantity;
                    }
                };
                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;
                        baseFactory.post("/api/mouldings/savejob", po).then(function (data) {
                            if (!data.isErrored) {
                                $modalInstance.close(data.object);
                            }
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };

                // INIT
                for (var i = 0; i < workstations.length; i++) {
                    var isExist = false;
                    if (!isExist) {
                        $scope.workstations.push(workstations[i]);
                    }
                }
                for (j = 0; j < $scope.data.workstations.length; j++) {
                    $scope.data.workstations[j].maxQuantity = $scope.data.workstations[j].quantity + $scope.newItem.maxQuantity;
                    $scope.data.workstations[j].origQuantity = angular.copy($scope.data.workstations[j].quantity);
                }
            }]);
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding.productions', {
                url: "/productions",
                views: {
                    'mouldingMainView': {
                        templateUrl: "/app/modules/moulding/productionQuantities/views/index.html",
                        controller: 'MouldingProductionQuantityCtrl',
                        resolve: {
                            workstations: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/mouldings/getallworkstations/').then(function (rdata) {
                                    return rdata.object;
                                });
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Production Quantities'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingProductionQuantityCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$log', '$stateParams', '$modal', '$timeout', '$window', '$filter', 'baseFactory', 'promptFactory', 'workstations'];
    function ctrl($scope, $rootScope, $log, $stateParams, $modal, $timeout, $window, $filter, baseFactory, promptFactory, workstations) {
        if ($stateParams.workstationId) {
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        }
        //
        $scope.paramShifts = [
            { id: 1, name: 'Morning' },
            { id: 2, name: 'Afternoon' },
            { id: 3, name: 'Evening' }
        ];
        $scope.shifts = [
            { id: 1, name: 'Morning' },
            { id: 2, name: 'Afternoon' },
            { id: 3, name: 'Evening' }
        ];
        $scope.paramJobStatuses = [
            { id: null, name: 'Active' },
            { id: 5, name: 'Running' },
            { id: 4, name: 'Completed' }
        ];

        $scope.items = [];
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;

        $scope.params = {
            workstationId: $stateParams.workstationId,
            shiftId: 1,
            js: 5,
            date: moment().format('YYYY-MM-DD')
        };
        var requestData = function (n) {
            var m = angular.copy(n);
            m.date = moment(m.date).format('YYYY-MM-DD');
            baseFactory.fetch('/api/mouldings/searchAllProductionQuantities', m).then(function (rdata) {
                $scope.items = rdata.object || [];
                angular.forEach($scope.items, function (item) {
                    item.origQuantity = angular.copy(item.setQuantity);
                });
            });
        };
        $scope.filterSearch = function (mForm, m) {
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                requestData(m);
            }
        };
        $scope.updateSearch = function () {
            requestData($scope.params);
        };
        $scope.dateOpened = false;
        $scope.open = function ($event) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.dateOpened = true;
        };
        $scope.save = function (mForm, items) {
            var errors = [];
            for (var ii = 0; ii < items.length; ii++) {
                var rem = items[ii].remaining > 0 ? items[ii].remaining : 0;
                var set = items[ii].setQuantity;

                if (items[ii].origQuantity > 0) {
                    rem = rem + items[ii].origQuantity;
                    if (items[ii].origQuantity !== items[ii].setQuantity) {
                        set = items[ii].origQuantity - set;
                    }
                }
                if (set > rem) {
                    var total = set + items[ii].current;
                    errors.push('<div><span>#' + (ii + 1) + '</span> Job Quantity is <strong>' + items[ii].quantity + '</strong>. This value brings the total produced to <strong>' + total + '</strong>.</div>');
                }
            }
            var saveit = function () {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                for (var i = 0; i < items.length; i++) {
                    items[i].shiftId = $scope.params.shiftId;
                    items[i].date = $scope.params.date;
                }
                baseFactory.post("/api/mouldings/SaveProductionQuantities", items).then(function (data) {
                    if (!data.isErrored)
                        requestData($scope.params);
                    $scope.submitTxt = "Save";
                    $scope.disableSubmitButton = false;
                });
            };

            $rootScope.formSubmit(mForm);
            if (mForm.$valid && errors.length === 0) {
                saveit();
            } else {
                promptFactory.confirmMd('<div class="mBottom10">Are you sure you want to continue?</div>' + errors.join(''), function (result) {
                    if (result) {
                        saveit();
                    }
                });
            }
        };

        // INIT
        requestData($scope.params);
    }
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding.purchaseOrders', {
                url: "/purchaseorders",
                views: {
                    'mouldingMainView': {
                        templateUrl: "/app/modules/moulding/purchaseOrders/views/index.html",
                        controller: 'MouldingPurchaseOrderCtrl',
                        resolve: {
                            //CatalogModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            //    return $ocLazyLoad.load('OcCatalogCtrl');
                            //}],
                            //orderCustomFields: [
                            //    '$route', 'baseFactory', function ($route, baseFactory) {
                            //        return baseFactory.fetch('/api/customfields/getall?isOrder=True');
                            //    }
                            //]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingpurchaseorders.view']
                },
                ncyBreadcrumb: {
                    label: 'Purchase Orders'
                }
            })
            .state('base.moulding.purchaseOrders.create', {
                url: "/create",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/moulding/purchaseOrders/views/createEdit.html",
                        controller: 'MouldingPurchaseOrderCreateEditCtrl',
                        resolve: {
                            purchaseOrder: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/mouldings/createUpdatePurchaseOrder/0').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            workstations: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/mouldings/getallworkstations/').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            isNew: [function () {
                                return true;
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingpurchaseorders.edit']
                },
                ncyBreadcrumb: {
                    label: 'Create'
                }
            })
            .state('base.moulding.purchaseOrders.edit', {
                url: "/edit/:id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/moulding/purchaseOrders/views/createEdit.html",
                        controller: 'MouldingPurchaseOrderCreateEditCtrl',
                        resolve: {
                            purchaseOrder: ['$stateParams', 'baseFactory', function ($stateParams, baseFactory) {
                                return baseFactory.fetch('/api/mouldings/createUpdatePurchaseOrder/' + $stateParams.id).then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            workstations: ['baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/mouldings/getallworkstations/').then(function (rdata) {
                                    return rdata.object;
                                });
                            }],
                            isNew: [function () {
                                return false;
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingpurchaseorders.edit']
                },
                ncyBreadcrumb: {
                    label: 'Edit'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingPurchaseOrderCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS'];
    function ctrl($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS) {
        $scope.statusIds = [{ id: 1 }, { id: 2 }];
        $scope.gridOptions = {
            itemType: 'Purchase Orders',
            gridName: 'mouldingPurchaseOrder01062020',
            fetchUrl: '/api/mouldings/searchAllPurchaseOrders',
            initSortString: 'orderdate desc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: false,
            columnDefs: [
                { field: 'orderNumber', width: '140', displayName: 'PO Order', customSortField: 'OrderNumber' },
                {
                    field: 'orderDate', width: '100', displayName: 'Date',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>'
                },
                { field: 'orderStatus', width: '120', displayName: 'Status', customSortField: 'OrderStatusId' },
                {
                    field: 'jobCount', width: '85', displayName: 'Job Count', sortable: false,
                    cellTemplate: '<div class="ngCellText text-center"><span>{{row.entity.jobCount}}</span></div>'
                },
                { field: 'quantity', displayName: 'Quantity', customSortField: 'Quantity' },
                { field: 'allocated', displayName: 'Allocated', customSortField: 'Allocated' },
                { field: 'unallocated', displayName: 'Unallocated', customSortField: 'Unallocated' },
                { field: 'productionQuantity', displayName: 'Produced', customSortField: 'ProductionQuantity' },
                { field: 'remaining', displayName: 'Remaining', sortable: false },
                {
                    field: 'percentage', displayName: 'Percentage', sortable: false,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.percentage}}%</span></div>'
                },
                { field: 'comments', displayName: 'Comments', customSortField: 'Comments' }
            ],
            enableCustomFields: true,
            extraParams: { status: '1,2', q: '' },
            extraData: {
                statuses: [
                    { id: 1, name: "Not Started" },
                    { id: 2, name: "Started" },
                    { id: 3, name: "Completed" }
                ]
            },
            controlColumnWidth: '200px',
            controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm pull-right">' +
                '<a permission permissions="system.mouldingpurchaseorders.view" href="/report/mouldingPurchaseOrderReport/{{row.entity.id}}" target="_blank" class="btn btn-default" title="Export PDF">Report</a>' +
                '<a permission permissions="system.mouldingpurchaseorders.view" ng-click="openQuickViewModal(row.entity.id)" class="btn btn-default" title="Quick View"><i class="fa fa-search"></i></a>' +
                '<a permission permissions="system.mouldingpurchaseorders.edit" ui-sref="base.moulding.purchaseOrders.edit({id: row.entity.id})" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                '<a permission permissions="system.mouldingpurchaseorders.edit" ng-click="deletePurchaseOrder(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                '</div></div>';
        }

        $scope.filterSearch = function () {
            console.log($scope.statusIds);
            $scope.gridOptions.extraParams.status = null;
            if ($scope.statusIds.length > 0) {
                var arr = [];
                for (var i = 0; i < $scope.statusIds.length; i++) {
                    arr.push($scope.statusIds[i].id);
                }
                $scope.gridOptions.extraParams.status = arr.join();
            }
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };

        $scope.deletePurchaseOrder = function (value) {
            modalFactory.deleteEntityFromGrid(
                value.orderNumber || value.purchaseOrderNumber,
                value.id,
                'Purchase Order',
                null,
                '/api/mouldings/deletePurchaseOrder/',
                $scope.gridOptions.gridName
            );
        };
        $scope.openQuickViewModal = function (purchaseOrderId) {
            var modalInstance = $modal.open({
                templateUrl: "/app/modules/moulding/purchaseOrders/modals/purchaseOrderViewModal.html",
                controller: 'MouldingPurchaseOrderViewModalCtrl',
                size: 'huge',
                backdrop: 'static',
                resolve: {
                    purchaseOrder: function () {
                        return baseFactory.fetch('/api/mouldings/getPurchaseOrderJobs/' + purchaseOrderId).then(function (rdata) {
                            return rdata.object;
                        });
                    }
                }
            });
            modalInstance.result.then(function () {
            }, function (isReloadPage) {
            });
        };
        //
        $scope.multipleSelectSettings = {
            smartButtonMaxItems: 3,
            displayProp: 'name',
            idProp: 'id',
            smartButtonTextConverter: function (itemText, originalItem) {
                if (itemText.length > 15) {
                    var str = itemText.substring(0, 15);
                    return str + '...';
                }

                return itemText;
            }
        };
        $scope.multipleTextSettings = {
            buttonDefaultText: 'Select All Statuses'
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingPurchaseOrderCreateEditCtrl',
        ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'sharedFactory', 'baseFactory', 'purchaseOrder', 'workstations', 'isNew',
            function ($scope, $rootScope, $modal, $state, $stateParams, sharedFactory, baseFactory, purchaseOrder, workstations, isNew) {
                $scope.m = purchaseOrder;
                $scope.isNew = isNew;
                $scope.mode = isNew ? 'Create' : 'Edit';
                $scope.disableSubmitButton = false;
                $scope.submitTxt = "Save";

                $scope.getOrder = function (val) {
                    return sharedFactory.searchOrder(val).then(function (data) {
                        return data;
                    });
                };
                $scope.onSelect = function ($item, $model, $label) {
                    $scope.m.orderNumber = $item.orderNumber;
                    $scope.m.orderDate = $item.orderDate;
                };

                $scope.openOrderDate = function ($event, cf) {
                    $event.preventDefault();
                    $event.stopPropagation();
                    $scope.opened = true;
                };
                $scope.manageItem = function (m, indx) {
                    var isNew = m === null;
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/moulding/purchaseOrders/modals/purchaseOrderItemModal.html',
                        controller: 'MouldingPurchaseOrderItemModalCtrl',
                        size: 'md',
                        backdrop: 'static',
                        resolve: {
                            item: function () {
                                if (!isNew)
                                    m.purchaseOrderId = $scope.m.id;

                                return isNew ? {
                                    id: 0,
                                    jobNumber: null,
                                    itemNumber: null,
                                    purchaseOrderId: $scope.m.id,
                                    jobStatusId: 1,
                                    jobStatus: "Unallocated",
                                    quantity: 0,
                                    allocated: 0,
                                    unallocated: 0,
                                    dueDate: moment().format('YYYY-MM-DD'),
                                    comments: "",
                                    isCompleted: false
                                } : m;
                            },
                            workstations: function () {
                                return workstations;
                            },
                            isNew: function () {
                                return isNew;
                            }
                        }
                    });
                    modalInstance.result.then(function (item) {
                        if (isNew) {
                            $scope.m.items.push(item);
                        } else {
                            $scope.m.items[indx] = angular.copy(item);
                        }
                    }, function (isReloadPage) {
                    });
                };
                $scope.deleteItem = function (indx) {
                    if (indx >= 0)
                        $scope.m.items.splice(indx, 1);
                };

                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        $scope.submitTxt = "Saving...";
                        $scope.disableSubmitButton = true;
                        baseFactory.post("/api/mouldings/savePurchaseOrder", po).then(function (data) {
                            if (!data.isErrored) {
                                if (isNew)
                                    $state.transitionTo("base.moulding.purchaseOrders", null, { 'reload': false });
                                else
                                    $state.transitionTo("base.moulding.purchaseOrders.edit", { id: $stateParams.id }, { 'reload': true });
                            }
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                        });
                    }
                };

                //
                $scope.setupItem = function (orderItem) {
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/moulding/jobs/modals/manageWorkstationsModal.html',
                        controller: 'MouldingPurchaseOrderItemWorkstationModalCtrl',
                        size: 'lg',
                        backdrop: 'static',
                        resolve: {
                            data: function () {
                                return baseFactory.fetch('/api/mouldings/getJob/' + orderItem.id).then(function (rdata) {
                                    return rdata.object || null;
                                });
                            },
                            workstations: function () {
                                return workstations;
                            }
                        }
                    });

                    modalInstance.result.then(function (ddata) {
                        orderItem.jobStatusId = ddata.jobStatusId;
                        orderItem.jobStatus = ddata.jobStatus;
                        orderItem.allocated = ddata.quantity - ddata.maxQuantity;
                        orderItem.unallocated = ddata.maxQuantity;
                    }, function () {
                    });
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.controller('MouldingPurchaseOrderItemModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', 'sharedFactory', 'baseFactory', 'promptFactory', 'item', 'workstations', 'isNew',
            function ($scope, $rootScope, $modalInstance, sharedFactory, baseFactory, promptFactory, item, workstations, isNew) {
                $scope.m = angular.copy(item);
                $scope.workstations = workstations;
                $scope.isNew = isNew;
                $scope.mode = isNew ? 'Add' : 'Edit';
                $scope.disableSubmitButton = false;
                $scope.submitTxt = isNew ? 'Create' : 'Update';
                if (item.isSave) {
                    $scope.submitTxt = 'Save';
                }
                if (item.setJobStatusId === 5) {
                    item.isSave = true;
                    $scope.m.isSave = true;
                }
                $scope.jobStatuses = [
                    { id: null, name: 'Active' },
                    { id: 4, name: 'Completed' }
                ];
                $scope.getOrder = function (val) {
                    //return sharedFactory.searchOrder(val).then(function (data) {
                    //    return data;
                    //});
                    var dataToSend = {
                        startIndex: 1,
                        retrieveSize: 10,
                        searchText: val
                    };
                    return baseFactory.fetch('/api/order/find', dataToSend).then(function (rdata) {
                        return rdata.object;
                    });
                };
                $scope.dateOptions = {
                    formatYear: 'yyyy',
                    startingDay: 1
                };
                $scope.onSelectOrder = function ($item, $model, $label) {
                    $scope.m.jobNumber = $item.orderNumber;
                };
                $scope.getItems = function (val) {
                    var dataToSend = {
                        q: val
                    };
                    return baseFactory.fetch('/api/mouldings/searchitems', dataToSend).then(function (rdata) {
                        return rdata.object;
                    });
                };
                $scope.onSelectItem = function ($item, $model, $label) {
                    $scope.m.itemName = $item.name;
                };

                $scope.openDueDate = function ($event) {
                    $event.preventDefault();
                    $event.stopPropagation();
                    $scope.opened = true;
                };
                $scope.isCompletedChange = function () {
                    if (!item.isSave) {
                        $scope.m.isSave = $scope.m.setJobStatusId === 4;
                    }
                };
                $scope.setActivateJob = function (b) {
                    $scope.m.isReactivateJob = b;
                };

                $scope.save = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        var dts = angular.copy(po);
                        var save = function () {
                            dts.isSave = item.isSave;
                            $scope.submitTxt = "Saving...";
                            $scope.disableSubmitButton = true;
                            baseFactory.post("/api/mouldings/savePurchaseOrderItem", dts).then(function (data) {
                                if (!data.isErrored) {
                                    dts.dueDate = moment(dts.dueDate).format();
                                    $modalInstance.close(dts);
                                }
                                $scope.submitTxt = "Save";
                                $scope.disableSubmitButton = false;
                            });
                        };
                        if (dts.setJobStatusId === 4) {
                            promptFactory.confirm("Are you sure you want to mark this job as complete?", function (result) {
                                if (result)
                                    save();
                            });
                        } else {
                            save();
                        }
                    }
                };

                $scope.ok = function (mForm, po) {
                    $rootScope.formSubmit(mForm);
                    if (mForm.$valid) {
                        po.dueDate = moment(po.dueDate).format();
                        $modalInstance.close(po);
                    }
                };

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.controller('MouldingPurchaseOrderItemViewModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', '$controller', 'sharedFactory', 'baseFactory', 'promptFactory', 'itemNumber',
            function ($scope, $rootScope, $modalInstance, $controller, sharedFactory, baseFactory, promptFactory, itemNumber) {
                $scope.itemNumber = itemNumber;
                $scope.gridOptions = {
                    itemType: 'Orders',
                    gridName: 'mouldingItemSummaryOrders',
                    fetchUrl: '/api/mouldings/searchAllItemSummary',
                    exportUrl: '/exportGrid/getAllItemSummary/',
                    initSortString: 'DueDate Desc',
                    enableExport: true,
                    enableSorting: true,
                    enableSearching: true,
                    enablePaging: true,
                    enableDateRange: false,
                    columnDefs: [
                        { field: 'orderNumber', displayName: 'PO Number', customSortField: 'orderNumber' },
                        {
                            field: 'orderDate', displayName: 'PO Date', customSortField: 'OrderDate',
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>'
                        },
                        { field: 'jobNumber', displayName: 'Job Number', customSortField: 'JobNumber' },
                        { field: 'itemNumber', displayName: 'Item Number', customSortField: 'ItemNumber' },
                        { field: 'itemName', displayName: 'Item Name', sortable: false },
                        { field: 'jobStatus', displayName: 'Job Status', sortable: false },
                        {
                            field: 'dueDate', displayName: 'Due Date', customSortField: 'DueDate',
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.dueDate | date:"dd/MM/yyyy"}}</span></div>'
                        },
                        { field: 'comments', displayName: 'Comments', sortable: false },
                        { field: 'workstation', displayName: 'Workstation', customSortField: 'Workstation' },
                        //{ field: 'quantity', displayName: 'Qty', customSortField: 'Quantity' },
                        { field: 'allocated', displayName: 'Quantity', customSortField: 'Allocated' },
                        //{ field: 'unallocated', displayName: 'Unallocated', customSortField: 'Unallocated' },
                        { field: 'productionQuantity', displayName: 'Produced', sortable: false },
                        { field: 'remaining', displayName: 'Remaining', sortable: false },
                        {
                            field: 'percentage', displayName: 'Percentage', sortable: false,
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.percentage}}%</span></div>'
                        }
                    ],
                    enableCustomFields: true,
                    extraParams: {
                        itemNumber: itemNumber
                    }
                };
                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.controller('MouldingPurchaseOrderViewModalCtrl',
        ['$scope', '$rootScope', '$modalInstance', '$controller', 'sharedFactory', 'baseFactory', 'promptFactory', 'purchaseOrder',
            function ($scope, $rootScope, $modalInstance, $controller, sharedFactory, baseFactory, promptFactory, purchaseOrder) {

                angular.extend(this, $controller('MouldingPurchaseOrderCreateEditCtrl', {
                    $scope: $scope, purchaseOrder: purchaseOrder, workstations: [], isNew: false
                }));

                $scope.cancel = function () {
                    $modalInstance.dismiss(false);
                };
            }]);
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            //.state('base.moulding.reports', {
            //    url: "/reports",
            //    abstract: true,
            //    resolve: {
            //        workstations: ['baseFactory', function (baseFactory) {
            //            return baseFactory.fetch('/api/mouldings/getallworkstations/').then(function (rdata) {
            //                return rdata.object;
            //            });
            //        }]
            //    },
            //    ncyBreadcrumb: {
            //        label: 'Reports'
            //    }
            //})
            //.state('base.moulding.reports.schedule', {
            //    url: "/schedule",
            //    views: {
            //        'mouldingMainView@base.moulding': {
            //            templateUrl: "/app/modules/moulding/reports/views/schedule.html",
            //            controller: 'MouldingReportScheduleCtrl',
            //            resolve: {
            //                AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
            //                    return $ocLazyLoad.load('AngularGanttModule');
            //                }]
            //            }
            //        }
            //    },
            //    ncyBreadcrumb: {
            //        label: 'Schedule'
            //    }
            //})
            //.state('base.moulding.reports.productionHistory', {
            //    url: "/productionhistory",
            //    views: {
            //        'mouldingMainView@base.moulding': {
            //            templateUrl: "/app/modules/moulding/reports/views/productionHistory.html",
            //            controller: 'MouldingReportProductionHistoryCtrl',
            //            resolve: {
            //                AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
            //                    return $ocLazyLoad.load('AngularGanttModule');
            //                }]
            //            }
            //        }
            //    },
            //    ncyBreadcrumb: {
            //        label: 'Production History'
            //    }
            //})
            //.state('base.moulding.reports.productionStatuses', {
            //    url: "/productionstatuses",
            //    views: {
            //        'mouldingMainView@base.moulding': {
            //            templateUrl: "/app/modules/moulding/reports/views/productionStatus.html",
            //            controller: 'MouldingReportProductionDetailsCtrl'
            //        }
            //    },
            //    ncyBreadcrumb: {
            //        label: 'Production Status'
            //    }
            //})
            .state('base.moulding.reports', {
                url: "/reports",
                ncyBreadcrumb: {
                    label: 'Reports'
                },
                resolve: {
                    workstations: function (baseFactory) {
                        return baseFactory.fetch('/api/mouldings/getallworkstations').then(function (rrdata) {
                            return rrdata.object || [];
                        });
                    }
                },
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/reports/dashboards/views/indexMoulding.html",
                        controller: 'ReportDashboardsCtrl',
                        resolve: {
                            dashboardReports: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/reportApi/getByMoulding').then(function (rrdata) {
                                    return rrdata.object || [];
                                });
                            }]
                        },
                        data: {
                            authorizedRoles: []
                        }
                    }
                }
            })
            .state('base.moulding.reports.view', {
                url: "/v/:id",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/reports/dashboards/views/mouldingview.html",
                        controller: 'ReportDashboardCtrl',
                        data: {
                            authorizedRoles: []
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Dashboard Report'
                }
            })
            .state('base.moulding.reports.schedule', {
                url: "/schedule",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/moulding/reports/views/schedule.html",
                        controller: 'MouldingReportScheduleCtrl',
                        resolve: {
                            AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('AngularGanttModule');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Schedule'
                }
            })
            .state('base.moulding.reports.productionHistory', {
                url: "/productionhistory",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/moulding/reports/views/productionHistory.html",
                        controller: 'MouldingReportProductionHistoryCtrl',
                        resolve: {
                            AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('AngularGanttModule');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Production History'
                }
            })
            .state('base.moulding.reports.productionStatuses', {
                url: "/productionstatuses",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/moulding/reports/views/productionStatus.html",
                        controller: 'MouldingReportProductionStatusCtrl'
                    }
                },
                ncyBreadcrumb: {
                    label: 'Production Status'
                }
            })
            .state('base.moulding.reports.productionDetails', {
                url: "/productiondetails",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/moulding/reports/views/productionDetails.html",
                        controller: 'MouldingReportProductionDetailsCtrl'
                    }
                },
                ncyBreadcrumb: {
                    label: 'Production Details'
                }
            })
            .state('base.moulding.reports.calendar', {
                url: "/calendar",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/moulding/workstations/views/calendar.html",
                        controller: 'MouldingWorkstationCalendarCtrl',
                        resolve: {
                            FullCalendarModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('OcFullCalendarCtrl');
                            }]
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Calendar'
                }
            })
            .state('base.moulding.reports.itemsummary', {
                url: "/itemsummary",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/moulding/reports/views/itemSummary.html",
                        controller: 'MouldingReportItemSummaryCtrl'
                    }
                },
                ncyBreadcrumb: {
                    label: 'Item Summary'
                }
            });
            //.state('base.moulding.reports.manifestreport', {
            //    url: "/manifestreport",
            //    views: {
            //        'dashboardReportView': {
            //            templateUrl: "/app/modules/reports/dashboards/views/grid.html",
            //            controller: 'ReportDashboardManifestReportCtrl',
            //            resolve: {
            //                zones: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
            //                    return baseFactory.fetch('/api/twcdeliveries/getallCarrierZones').then(function (rrdata) {
            //                        return rrdata.object;
            //                    });
            //                }],
            //                statuses: ['$stateParams', 'baseFactory', function ($stateParams, baseFactory) {
            //                    return baseFactory.fetch('/api/twcdeliveries/getallstatuses', { isAllDeliveries: true, isAllReturns: true }).then(function (rrdata) {
            //                        return rrdata.object;
            //                    });
            //                }],
            //                twcZones: ['$stateParams', 'baseFactory', function ($stateParams, baseFactory) {
            //                    var arr = [];
            //                    return baseFactory.fetch('/api/twcdeliveries/getallshipvia').then(function (rrdata) {
            //                        for (var i = 0; i < rrdata.object.length; i++) {
            //                            arr.push({ id: rrdata.object[i], name: rrdata.object[i] });
            //                        }
            //                        return arr;
            //                    });
            //                }],
            //                warehouses: ['$stateParams', 'baseFactory', function ($stateParams, baseFactory) {
            //                    return baseFactory.fetch('/api/twcdeliveries/getallwarehouses').then(function (rrdata) {
            //                        return rrdata.object;
            //                    });
            //                }]
            //            },
            //            data: {
            //                authorizedRoles: []
            //            }
            //        }
            //    },
            //    ncyBreadcrumb: {
            //        label: 'Moulding- Manifest Report'
            //    }
            //});
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', 'modalFactory'];
    function ctrl($scope, $rootScope, baseFactory, modalFactory) {

        $scope.pageContainerCss = {
            lhs: '',
            rhs: 'hidden-xs'
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportItemSummaryCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', '$controller', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'workstations'];
    function ctrl($scope, $rootScope, $stateParams, $controller, $modal, baseFactory, modalFactory, GRID_CONSTANTS, workstations) {

        if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
            $scope.$parent.currentDashboardReportId = -6;
            $scope.$parent.showSidebar = false;
        }

        if ($stateParams.workstationId) {
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        }

        var filterWorkstations = [];
        $scope.data = [];
        $scope.filter = {
            ws: null,
            selectedWorkstations: [],
            q: null,
            dateRange: {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            }
        };

        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }

        $scope.gridOptions = {
            itemType: 'Item Summary',
            gridName: 'mouldingItemSummary',
            fetchUrl: '/api/mouldings/searchAllItemSummary',
            exportUrl: '/exportGrid/getAllItemSummary/',
            initSortString: 'itemName asc',
            enableExport: true,
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: false,
            columnDefs: [
                { field: 'itemNumber', displayName: 'Item Number', customSortField: 'ItemNumber' },
                { field: 'itemName', displayName: 'Item Name' },
                { field: 'quantity', displayName: 'Quantity', customSortField: 'Quantity' }
            ],
            enableCustomFields: true,
            extraParams: {
                dateRange: {
                    startDate: moment().subtract(29, 'days'),
                    endDate: moment()
                },
                ws: $scope.filter.ws,
                q: ''
            },
            extraData: {
                workstations: filterWorkstations
            },
            controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ng-click="openQuickViewModal(row.entity.itemNumber)" class="btn btn-default" title="Quick View"><i class="fa fa-search"></i></a>' +
                '</div></div>';
        }

        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));

        $scope.filterSearch = function () {
            $scope.gridOptions.extraParams.ws = $scope.getWorkstationIds($scope.filter.selectedWorkstations);
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };
        $scope.export = function () {
            $rootScope.$emit(GRID_CONSTANTS.EXPORT_GRID_PREFIX + $scope.gridOptions.gridName);
        };
        
        $scope.openQuickViewModal = function (itemNumber) {
            var modalInstance = $modal.open({
                templateUrl: "/app/modules/moulding/purchaseOrders/modals/purchaseOrderItemViewModal.html",
                controller: 'MouldingPurchaseOrderItemViewModalCtrl',
                size: 'huge',
                resolve: {
                    itemNumber: function () {
                        return itemNumber;
                    }
                }
            });
            modalInstance.result.then(function () {
            }, function (isReloadPage) {
            });
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportProductionDetailsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', '$controller', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'workstations'];
    function ctrl($scope, $rootScope, $stateParams, $controller, baseFactory, modalFactory, GRID_CONSTANTS, workstations) {
        if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
            $scope.$parent.currentDashboardReportId = -4;
            $scope.$parent.showSidebar = false;
        }

        if ($stateParams.workstationId) {
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        }

        var filterWorkstations = [];
        $scope.data = [];
        $scope.filter = {
            ws: null,
            selectedWorkstations: [],
            dateRange: {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            }
        };

        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }

        $scope.gridOptions = {
            itemType: 'Production Details',
            gridName: 'mouldingProductionDetails',
            fetchUrl: '/api/mouldings/searchAllProductionDetails',
            exportUrl: '/exportGrid/getAllProductionDetails/',
            initSortString: 'dateStart asc',
            enableExport: true,
            enableSorting: true,
            enableSearching: false,
            enablePaging: true,
            enableDateRange: true,
            columnDefs: [
                {
                    field: 'dateStart', displayName: 'Date Start', customSortField: 'DateStart', width: 120,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateStart | date:"dd/MM/yyyy"}}</span></div>'
                },
                {
                    field: 'dateStart', displayName: 'Start Time', customSortField: 'DateStart', width: 100,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateStart | date:"hh:mm a"}}</span></div>'
                },
                {
                    field: 'dateEnd', displayName: 'Date Finish', customSortField: 'DateStart', width: 120,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateEnd | date:"dd/MM/yyyy"}}</span></div>'
                },
                {
                    field: 'dateEnd', displayName: 'Finish Time', customSortField: 'DateStart', width: 100,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateEnd | date:"hh:mm a"}}</span></div>'
                },
                { field: 'product', displayName: 'Product', customSortField: 'product' },
                { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber', width: 120 },
                { field: 'jobNumber', displayName: 'Job', customSortField: 'jobNumber', width: 100 },
                { field: 'setupTime', displayName: 'Setup', customSortField: 'setupTime', width: 80 },
                { field: 'productWeight', displayName: 'Weight', customSortField: 'productWeight', width: 80 },
                {
                    field: 'quantity', displayName: 'Quantity', customSortField: 'quantity', width: 80,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.quantity | number}}</span></div>'
                },
                {
                    field: 'runningQuantity', displayName: 'Running', customSortField: 'runningQuantity', width: 80,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.runningQuantity | number}}</span></div>'
                },
                {
                    field: 'remainingQuantity', displayName: 'Remain', sortable: false, width: 80,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.remainingQuantity | number}}</span></div>'
                },
                { field: 'materialUsed', displayName: 'Mat. (kg)', sortable: false, width: 80 },
                { field: 'impliedCycleTime', displayName: 'ICT', sortable: false, width: 80 },
                { field: 'machineCycleTime', displayName: 'MCT', customSortField: 'machineCycleTime', width: 80 },
                { field: 'workstation', displayName: 'Workstation', customSortField: 'workstation', width: 100 },
                { field: 'comments', displayName: 'Comments', customSortField: 'comments' }
            ],
            enableCustomFields: true,
            extraParams: {
                dateRange: {
                    startDate: moment().subtract(29, 'days'),
                    endDate: moment()
                },
                ws: $scope.filter.ws,
                searchText: ''
            },
            extraData: {
                workstations: filterWorkstations
            },
            // controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ng-click="manageWorkstations(row.entity.id)" class="btn btn-default">Allocate</a>' +
                '</div></div>';
        }
        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));

        $scope.filterSearch = function () {
            $scope.gridOptions.extraParams.ws = $scope.getWorkstationIds($scope.filter.selectedWorkstations);
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };
        $scope.export = function () {
            $rootScope.$emit(GRID_CONSTANTS.EXPORT_GRID_PREFIX + $scope.gridOptions.gridName);
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportProductionHistoryCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', '$controller', 'baseFactory', 'modalFactory', 'workstations'];
    function ctrl($scope, $rootScope, $stateParams, $controller, baseFactory, modalFactory, workstations) {

        if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
            $scope.$parent.currentDashboardReportId = -3;
            $scope.$parent.showSidebar = false;
        }

        $scope.isLoading = true;
        $scope.workstations = [];
        $scope.data = [];
        $scope.filter = {
            ws: null,
            selectedWorkstations: [],
            dateRange: {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            }
        };

        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }

        $scope.options = {
            mode: 'custom',
            scale: 'day',
            sortMode: undefined,
            sideMode: 'Tree',
            daily: false,
            maxHeight: false,
            width: false,
            zoom: 1,
            columns: ['model.name'],
            treeTableColumns: [],
            columnsHeaders: { 'model.name': 'Name' },
            columnsClasses: { 'model.name': 'gantt-column-name' },
            columnsFormatters: {
                'from': function (from) {
                    return from !== undefined ? from.format('lll') : undefined;
                },
                'to': function (to) {
                    return to !== undefined ? to.format('lll') : undefined;
                }
            },
            treeHeaderContent: '<i class="fa fa-align-justify"></i> {{getHeader()}}',
            columnsHeaderContents: {
                'model.name': '<i class="fa fa-align-justify"></i> {{getHeader()}}',
                'from': '<i class="fa fa-calendar"></i> {{getHeader()}}',
                'to': '<i class="fa fa-calendar"></i> {{getHeader()}}'
            },
            headers: ['day'],
            headerFormats: {
                'year': 'YYYY',
                'quarter': '[Q]Q YYYY',
                month: 'DD, MMMM YYYY',
                week: function (column) {
                    return column.date.format('MMM D [-]') + column.endDate.format('[ ]MMM D');
                },
                //day: 'DD/MM/YYYY',
                day: 'ddd DD/MM',
                hour: 'H',
                minute: 'HH:mm'
            },
            headerScales: {
                //'shifting': 'hour'
            },
            autoExpand: 'none',
            taskOutOfRange: 'truncate',
            fromDate: moment(null),
            toDate: undefined,
            rowContent: '<i class="fa fa-align-justify"></i> {{row.model.name}}',
            taskContent: '<i class="fa fa-tasks"></i> {{task.model.name}}',
            allowSideResizing: true,
            labelsEnabled: true,
            currentDate: 'line',
            currentDateValue: new Date(),
            draw: false,
            readOnly: false,
            groupDisplayMode: 'group',
            filterTask: '',
            filterRow: '',
            timeFrames: {
                'shift1': {
                    start: moment('00:00', 'HH:mm'),
                    end: moment('08:00', 'HH:mm'),
                    working: true,
                    default: true
                },
                'shift2': {
                    start: moment('08:01', 'HH:mm'),
                    end: moment('16:00', 'HH:mm'),
                    working: false,
                    default: true
                },
                'shift3': {
                    start: moment('16:01', 'HH:mm'),
                    end: moment('23:59', 'HH:mm'),
                    working: true,
                    default: true
                }
            },
            timeFramesNonWorkingMode: 'visible',
            columnMagnet: '8 hours',
            timeFramesMagnet: true,
            canDraw: function (event) {
                var isLeftMouseButton = event.button === 0 || event.button === 1;
                return $scope.options.draw && !$scope.options.readOnly && isLeftMouseButton;
            },
            drawTaskFactory: function () {
                return {
                    id: utils.randomUuid(),  // Unique id of the task.
                    name: 'Drawn task', // Name shown on top of each task.
                    color: '#AA8833' // Color of the task in HEX format (Optional).
                };
            },

            //api: function (api) {
            //    // API Object is used to control methods and events from angular-gantt.
            //    $scope.api = api;

            //    api.core.on.ready($scope, function () {
            //        // Log various events to console
            //        api.scroll.on.scroll($scope, logScrollEvent);
            //        api.core.on.ready($scope, logReadyEvent);

            //        api.data.on.remove($scope, addEventName('data.on.remove', logDataEvent));
            //        api.data.on.load($scope, addEventName('data.on.load', logDataEvent));
            //        api.data.on.clear($scope, addEventName('data.on.clear', logDataEvent));

            //        api.tasks.on.add($scope, addEventName('tasks.on.add', logTaskEvent));
            //        api.tasks.on.change($scope, addEventName('tasks.on.change', logTaskEvent));
            //        api.tasks.on.rowChange($scope, addEventName('tasks.on.rowChange', logTaskEvent));
            //        api.tasks.on.remove($scope, addEventName('tasks.on.remove', logTaskEvent));

            //        if (api.tasks.on.moveBegin) {
            //            api.tasks.on.moveBegin($scope, addEventName('tasks.on.moveBegin', logTaskEvent));
            //            //api.tasks.on.move($scope, addEventName('tasks.on.move', logTaskEvent));
            //            api.tasks.on.moveEnd($scope, addEventName('tasks.on.moveEnd', logTaskEvent));

            //            api.tasks.on.resizeBegin($scope, addEventName('tasks.on.resizeBegin', logTaskEvent));
            //            //api.tasks.on.resize($scope, addEventName('tasks.on.resize', logTaskEvent));
            //            api.tasks.on.resizeEnd($scope, addEventName('tasks.on.resizeEnd', logTaskEvent));
            //        }

            //        api.rows.on.add($scope, addEventName('rows.on.add', logRowEvent));
            //        api.rows.on.change($scope, addEventName('rows.on.change', logRowEvent));
            //        api.rows.on.move($scope, addEventName('rows.on.move', logRowEvent));
            //        api.rows.on.remove($scope, addEventName('rows.on.remove', logRowEvent));

            //        api.side.on.resizeBegin($scope, addEventName('labels.on.resizeBegin', logLabelsEvent));
            //        //api.side.on.resize($scope, addEventName('labels.on.resize', logLabelsEvent));
            //        api.side.on.resizeEnd($scope, addEventName('labels.on.resizeEnd', logLabelsEvent));

            //        api.timespans.on.add($scope, addEventName('timespans.on.add', logTimespanEvent));
            //        api.columns.on.generate($scope, logColumnsGenerateEvent);

            //        api.rows.on.filter($scope, logRowsFilterEvent);
            //        api.tasks.on.filter($scope, logTasksFilterEvent);

            //        api.data.on.change($scope, function (newData) {
            //            if (dataToRemove === undefined) {
            //                dataToRemove = [
            //                    { 'id': newData.data[2].id }, // Remove Kickoff row
            //                    {
            //                        'id': newData.data[0].id, 'tasks': [
            //                            { 'id': newData.data[0].tasks[0].id },
            //                            { 'id': newData.data[0].tasks[3].id }
            //                        ]
            //                    }, // Remove some Milestones
            //                    {
            //                        'id': newData.data[6].id, 'tasks': [
            //                            { 'id': newData.data[6].tasks[0].id }
            //                        ]
            //                    } // Remove order basket from Sprint 2
            //                ];
            //            }
            //        });

            //        // When gantt is ready, load data.
            //        // `data` attribute could have been used too.
            //        $scope.load();

            //        // Add some DOM events
            //        api.directives.on.new($scope, function (directiveName, directiveScope, element) {
            //            if (directiveName === 'ganttTask') {
            //                element.bind('click', function (event) {
            //                    event.stopPropagation();
            //                    logTaskEvent('task-click', directiveScope.task);
            //                });
            //                element.bind('mousedown touchstart', function (event) {
            //                    event.stopPropagation();
            //                    $scope.live.row = directiveScope.task.row.model;
            //                    if (directiveScope.task.originalModel !== undefined) {
            //                        $scope.live.task = directiveScope.task.originalModel;
            //                    } else {
            //                        $scope.live.task = directiveScope.task.model;
            //                    }
            //                    $scope.$digest();
            //                });
            //            } else if (directiveName === 'ganttRow') {
            //                element.bind('click', function (event) {
            //                    event.stopPropagation();
            //                    logRowEvent('row-click', directiveScope.row);
            //                });
            //                element.bind('mousedown touchstart', function (event) {
            //                    event.stopPropagation();
            //                    $scope.live.row = directiveScope.row.model;
            //                    $scope.$digest();
            //                });
            //            } else if (directiveName === 'ganttRowLabel') {
            //                element.bind('click', function () {
            //                    logRowEvent('row-label-click', directiveScope.row);
            //                });
            //                element.bind('mousedown touchstart', function () {
            //                    $scope.live.row = directiveScope.row.model;
            //                    $scope.$digest();
            //                });
            //            }
            //        });

            //        api.tasks.on.rowChange($scope, function (task) {
            //            $scope.live.row = task.row.model;
            //        });

            //        objectModel = new ObjectModel(api);
            //    });
            //}
        };
        $scope.updateSearch = function () {
            $scope.isLoading = true;
            var dts = {
                startDate: moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD'),
                endDate: moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD'),
                ws: $scope.getWorkstationIds($scope.filter.selectedWorkstations)
            };
            baseFactory.fetch('/api/mouldings/getAllJobsProductionHistory', dts).then(function (rrdata) {
                $scope.data = rrdata.object || [];
                $scope.isLoading = false;
            });
        };

        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));
        $scope.updateSearch();
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportProductionLogsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', '$controller', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'workstations'];
    function ctrl($scope, $rootScope, $stateParams, $controller, baseFactory, modalFactory, GRID_CONSTANTS, workstations) {

        if ($stateParams.workstationId) {
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        }

        var filterWorkstations = [];
        $scope.data = [];
        $scope.filter = {
            ws: null,
            selectedWorkstations: []
        };

        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }

        $scope.gridOptions = {
            itemType: 'Production Logs',
            gridName: 'mouldingProductionLogs',
            fetchUrl: '/api/mouldings/searchAllProductionLogs',
            initSortString: 'UpdateDate desc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: false,
            columnDefs: [
                { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber', width: 130 },
                { field: 'jobNumber', displayName: 'Job', customSortField: 'jobNumber', width: 100 },
                {
                    field: 'productionDate', displayName: 'Production Date', customSortField: 'productionDate', width: 125,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.productionDate | date:"dd/MM/yyyy"}}</span></div>'
                },
                { field: 'shift', displayName: 'Shift', customSortField: 'shiftId', width: 80 },
                { field: 'itemName', displayName: 'Product', customSortField: 'itemName', width: 280 },
                { field: 'updatedBy', displayName: 'User', customSortField: 'updatedBy', width: 160 },
                {
                    field: 'updateDate', displayName: 'Update Date', customSortField: 'UpdateDate', width: 160,
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.updateDate | date:"dd/MM/yyyy hh:mm a"}}</span></div>'
                },
                { field: 'details', displayName: 'Details', sortable: false },
                { field: 'comments', displayName: 'Comments', sortable: false },
            ],
            enableCustomFields: true,
            extraParams: {
                ws: $scope.filter.ws,
                searchText: ''
            },
            extraData: {
                workstations: filterWorkstations
            }
        };

        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));

        $scope.filterSearch = function () {
            $scope.gridOptions.extraParams.ws = $scope.getWorkstationIds($scope.filter.selectedWorkstations);
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportProductionStatusCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', '$controller', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'workstations'];
    function ctrl($scope, $rootScope, $stateParams, $controller, baseFactory, modalFactory, GRID_CONSTANTS, workstations) {

        if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
            $scope.$parent.currentDashboardReportId = -5;
            $scope.$parent.showSidebar = false;
        }

        if ($stateParams.workstationId) {
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        }

        var filterWorkstations = [];
        $scope.data = [];
        $scope.filter = {
            ws: null,
            selectedWorkstations: [],
            q: null,
            dateRange: {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            }
        };

        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }

        $scope.gridOptions = {
            itemType: 'Production Status',
            gridName: 'mouldingProductionStatus20200327',
            fetchUrl: '/api/mouldings/searchAllProductionStatuses',
            exportUrl: '/exportGrid/getAllProductionStatuses/',
            initSortString: 'dueDate asc',
            enableExport: true,
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: true,
            columnDefs: [
                { field: 'orderNumber', displayName: 'PO Number', customSortField: 'orderNumber' },
                {
                    field: 'orderDate', displayName: 'PO Date', customSortField: 'OrderDate',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>'
                },
                { field: 'jobNumber', displayName: 'Job Number', customSortField: 'JobNumber' },
                { field: 'itemNumber', displayName: 'Item Number', customSortField: 'ItemNumber' },
                { field: 'itemName', displayName: 'Item Name', sortable: false },
                { field: 'jobStatus', displayName: 'Job Status', sortable: false },
                {
                    field: 'dueDate', displayName: 'Due Date', customSortField: 'DueDate',
                    cellTemplate: '<div class="ngCellText"><span>{{row.entity.dueDate | date:"dd/MM/yyyy"}}</span></div>'
                },
                { field: 'comments', displayName: 'Comments', sortable: false },
                { field: 'workstation', displayName: 'Workstation', customSortField: 'Workstation' },
                { field: 'quantity', displayName: 'Qty', customSortField: 'Quantity' },
                { field: 'allocated', displayName: 'Allocated', customSortField: 'Allocated' },
                { field: 'unallocated', displayName: 'Unallocated', customSortField: 'Unallocated' },
                { field: 'produced', displayName: 'Produced', sortable: false }
            ],
            enableCustomFields: true,
            extraParams: {
                dateRange: {
                    startDate: moment().subtract(29, 'days'),
                    endDate: moment()
                },
                ws: $scope.filter.ws,
                q: ''
            },
            extraData: {
                workstations: filterWorkstations
            },
            // controlCellTemplateHtml: controlHtml()
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ng-click="manageWorkstations(row.entity.id)" class="btn btn-default">Allocate</a>' +
                '</div></div>';
        }

        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));

        $scope.filterSearch = function () {
            $scope.gridOptions.extraParams.ws = $scope.getWorkstationIds($scope.filter.selectedWorkstations);
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };
        $scope.export = function () {
            $rootScope.$emit(GRID_CONSTANTS.EXPORT_GRID_PREFIX + $scope.gridOptions.gridName);
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportScheduleCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$log', '$stateParams', '$controller', '$modal', '$timeout', '$window', '$filter', 'baseFactory', 'workstations'];
    function ctrl($scope, $rootScope, $log, $stateParams, $controller, $modal, $timeout, $window, $filter, baseFactory, workstations) {

        if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
            $scope.$parent.currentDashboardReportId = -1;
            $scope.$parent.showSidebar = false;
        }
        $scope.isLoading = true;
        $scope.workstations = [];
        $scope.data = [];
        $scope.filter = {
            ws: null,
            selectedWorkstations: [],
            dateRange: {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            }
        };

        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }

        $scope.options = {
            mode: 'custom',
            scale: 'day',
            sortMode: undefined,
            sideMode: 'Tree',
            daily: false,
            maxHeight: false,
            width: false,
            zoom: 1,
            columns: ['model.name'],
            treeTableColumns: [],
            columnsHeaders: { 'model.name': 'Name' },
            columnsClasses: { 'model.name': 'gantt-column-name' },
            columnsFormatters: {
                'from': function (from) {
                    return from !== undefined ? from.format('lll') : undefined;
                },
                'to': function (to) {
                    return to !== undefined ? to.format('lll') : undefined;
                }
            },
            treeHeaderContent: '<i class="fa fa-align-justify"></i> {{getHeader()}}',
            columnsHeaderContents: {
                'model.name': '<i class="fa fa-align-justify"></i> {{getHeader()}}',
                'from': '<i class="fa fa-calendar"></i> {{getHeader()}}',
                'to': '<i class="fa fa-calendar"></i> {{getHeader()}}'
            },
            headers: ['day'],
            headerFormats: {
                'year': 'YYYY',
                'quarter': '[Q]Q YYYY',
                month: 'DD, MMMM YYYY',
                week: function (column) {
                    return column.date.format('MMM D [-]') + column.endDate.format('[ ]MMM D');
                },
                //day: 'DD/MM/YYYY',
                day: 'ddd DD/MM',
                hour: 'H',
                minute: 'HH:mm'
            },
            headerScales: {
                //'shifting': 'hour'
            },
            autoExpand: 'none',
            taskOutOfRange: 'truncate',
            fromDate: moment(null),
            toDate: undefined,
            rowContent: '<i class="fa fa-align-justify"></i> {{row.model.name}}',
            taskContent: '<i class="fa fa-tasks"></i> {{task.model.name}}',
            allowSideResizing: true,
            labelsEnabled: true,
            currentDate: 'line',
            currentDateValue: new Date(),
            draw: false,
            readOnly: false,
            groupDisplayMode: 'group',
            filterTask: '',
            filterRow: '',
            timeFrames: {
                'shift1': {
                    start: moment('00:00', 'HH:mm'),
                    end: moment('08:00', 'HH:mm'),
                    working: true,
                    default: true
                },
                'shift2': {
                    start: moment('08:01', 'HH:mm'),
                    end: moment('16:00', 'HH:mm'),
                    working: false,
                    default: true
                },
                'shift3': {
                    start: moment('16:01', 'HH:mm'),
                    end: moment('23:59', 'HH:mm'),
                    working: true,
                    default: true
                }
            },
            timeFramesNonWorkingMode: 'visible',
            columnMagnet: '8 hours',
            timeFramesMagnet: true,
            canDraw: function (event) {
                var isLeftMouseButton = event.button === 0 || event.button === 1;
                return $scope.options.draw && !$scope.options.readOnly && isLeftMouseButton;
            },
            drawTaskFactory: function () {
                return {
                    id: utils.randomUuid(),  // Unique id of the task.
                    name: 'Drawn task', // Name shown on top of each task.
                    color: '#AA8833' // Color of the task in HEX format (Optional).
                };
            },

            //api: function (api) {
            //    // API Object is used to control methods and events from angular-gantt.
            //    $scope.api = api;

            //    api.core.on.ready($scope, function () {
            //        // Log various events to console
            //        api.scroll.on.scroll($scope, logScrollEvent);
            //        api.core.on.ready($scope, logReadyEvent);

            //        api.data.on.remove($scope, addEventName('data.on.remove', logDataEvent));
            //        api.data.on.load($scope, addEventName('data.on.load', logDataEvent));
            //        api.data.on.clear($scope, addEventName('data.on.clear', logDataEvent));

            //        api.tasks.on.add($scope, addEventName('tasks.on.add', logTaskEvent));
            //        api.tasks.on.change($scope, addEventName('tasks.on.change', logTaskEvent));
            //        api.tasks.on.rowChange($scope, addEventName('tasks.on.rowChange', logTaskEvent));
            //        api.tasks.on.remove($scope, addEventName('tasks.on.remove', logTaskEvent));

            //        if (api.tasks.on.moveBegin) {
            //            api.tasks.on.moveBegin($scope, addEventName('tasks.on.moveBegin', logTaskEvent));
            //            //api.tasks.on.move($scope, addEventName('tasks.on.move', logTaskEvent));
            //            api.tasks.on.moveEnd($scope, addEventName('tasks.on.moveEnd', logTaskEvent));

            //            api.tasks.on.resizeBegin($scope, addEventName('tasks.on.resizeBegin', logTaskEvent));
            //            //api.tasks.on.resize($scope, addEventName('tasks.on.resize', logTaskEvent));
            //            api.tasks.on.resizeEnd($scope, addEventName('tasks.on.resizeEnd', logTaskEvent));
            //        }

            //        api.rows.on.add($scope, addEventName('rows.on.add', logRowEvent));
            //        api.rows.on.change($scope, addEventName('rows.on.change', logRowEvent));
            //        api.rows.on.move($scope, addEventName('rows.on.move', logRowEvent));
            //        api.rows.on.remove($scope, addEventName('rows.on.remove', logRowEvent));

            //        api.side.on.resizeBegin($scope, addEventName('labels.on.resizeBegin', logLabelsEvent));
            //        //api.side.on.resize($scope, addEventName('labels.on.resize', logLabelsEvent));
            //        api.side.on.resizeEnd($scope, addEventName('labels.on.resizeEnd', logLabelsEvent));

            //        api.timespans.on.add($scope, addEventName('timespans.on.add', logTimespanEvent));
            //        api.columns.on.generate($scope, logColumnsGenerateEvent);

            //        api.rows.on.filter($scope, logRowsFilterEvent);
            //        api.tasks.on.filter($scope, logTasksFilterEvent);

            //        api.data.on.change($scope, function (newData) {
            //            if (dataToRemove === undefined) {
            //                dataToRemove = [
            //                    { 'id': newData.data[2].id }, // Remove Kickoff row
            //                    {
            //                        'id': newData.data[0].id, 'tasks': [
            //                            { 'id': newData.data[0].tasks[0].id },
            //                            { 'id': newData.data[0].tasks[3].id }
            //                        ]
            //                    }, // Remove some Milestones
            //                    {
            //                        'id': newData.data[6].id, 'tasks': [
            //                            { 'id': newData.data[6].tasks[0].id }
            //                        ]
            //                    } // Remove order basket from Sprint 2
            //                ];
            //            }
            //        });

            //        // When gantt is ready, load data.
            //        // `data` attribute could have been used too.
            //        $scope.load();

            //        // Add some DOM events
            //        api.directives.on.new($scope, function (directiveName, directiveScope, element) {
            //            if (directiveName === 'ganttTask') {
            //                element.bind('click', function (event) {
            //                    event.stopPropagation();
            //                    logTaskEvent('task-click', directiveScope.task);
            //                });
            //                element.bind('mousedown touchstart', function (event) {
            //                    event.stopPropagation();
            //                    $scope.live.row = directiveScope.task.row.model;
            //                    if (directiveScope.task.originalModel !== undefined) {
            //                        $scope.live.task = directiveScope.task.originalModel;
            //                    } else {
            //                        $scope.live.task = directiveScope.task.model;
            //                    }
            //                    $scope.$digest();
            //                });
            //            } else if (directiveName === 'ganttRow') {
            //                element.bind('click', function (event) {
            //                    event.stopPropagation();
            //                    logRowEvent('row-click', directiveScope.row);
            //                });
            //                element.bind('mousedown touchstart', function (event) {
            //                    event.stopPropagation();
            //                    $scope.live.row = directiveScope.row.model;
            //                    $scope.$digest();
            //                });
            //            } else if (directiveName === 'ganttRowLabel') {
            //                element.bind('click', function () {
            //                    logRowEvent('row-label-click', directiveScope.row);
            //                });
            //                element.bind('mousedown touchstart', function () {
            //                    $scope.live.row = directiveScope.row.model;
            //                    $scope.$digest();
            //                });
            //            }
            //        });

            //        api.tasks.on.rowChange($scope, function (task) {
            //            $scope.live.row = task.row.model;
            //        });

            //        objectModel = new ObjectModel(api);
            //    });
            //}
        };

        $scope.registerApi = function (api) {
            api.directives.on.new($scope, function (dName, dScope, dElement, dAttrs, dController) {
                if (dName === "ganttRowLabel") {
                    if (dScope.row.model.purchaseOrderId !== null)
                        angular.element(dElement).addClass('cursor-pointer');
                    if (dScope.row.model.isOverdue)
                        angular.element(dElement).addClass('text-bold text-danger');
                    dElement.bind('click', function (event) {
                        if (dScope.row.model.purchaseOrderId !== null)
                            $scope.openQuickViewModal(dScope.row.model.purchaseOrderId, dScope.row.model.orderItemId, dScope.row.model.workstationId);
                    });
                }
            });
        };

        $scope.updateSearch = function () {
            $scope.isLoading = true;
            var dts = {
                startDate: moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD'),
                endDate: moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD'),
                ws: $scope.getWorkstationIds($scope.filter.selectedWorkstations)
            };
            baseFactory.fetch('/api/mouldings/getAllJobsReportSchedule', dts).then(function (rrdata) {
                $scope.data = rrdata.object || [];
                $scope.isLoading = false;
                //
                jQuery(".gantt-scrollable-top").on('scroll', function () {
                    jQuery(".gantt-scrollable").scrollLeft(jQuery(".gantt-scrollable-top").scrollLeft());
                });
                jQuery(".gantt-scrollable").on('scroll', function () {
                    jQuery(".gantt-scrollable-top").scrollLeft(jQuery(".gantt-scrollable").scrollLeft());
                });
            });
        };

        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));
        $scope.updateSearch();

        $scope.openQuickViewModal = function (purchaseOrderId, orderItemId, workstationId) {
            var modalInstance = $modal.open({
                templateUrl: "/app/modules/moulding/purchaseOrders/modals/purchaseOrderViewModal.html",
                controller: 'MouldingPurchaseOrderViewModalCtrl',
                size: 'huge',
                resolve: {
                    purchaseOrder: function () {
                        return baseFactory.fetch('/api/mouldings/getPurchaseOrderJobs/' + purchaseOrderId, { oi: orderItemId, ws: workstationId })
                            .then(function (rdata) {
                                return rdata.object;
                            });
                    }
                }
            });
            modalInstance.result.then(function () {
            }, function (isReloadPage) {
            });
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingReportWorkstationsCtrl', ctrl);
    ctrl.$inject = ['$scope'];
    function ctrl($scope) {

        //
        $scope.multipleSelectSettingsForWorkstations = {
            smartButtonMaxItems: 10,
            displayProp: 'name',
            idProp: 'id',
            smartButtonTextConverter: function (itemText, originalItem) {
                if (itemText.length > 2) {
                    var str = itemText.substring(0, 2);
                    return str + '...';
                }

                return itemText;
            }
        };
        $scope.multipleTextSettingsForWorkstations = {
            buttonDefaultText: 'Select All Workstations'
        };
        $scope.getWorkstationIds = function (arr) {
            var wsids = [];
            for (var i = 0; i < arr.length; i++) {
                wsids.push(arr[i].id);
            }
            return wsids.length > 0 ? wsids.join() : null;
        };
    }
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];
    function config($stateProvider) {

        $stateProvider
            .state('base.moulding.workstations', {
                url: "/w",
                views: {
                    'mouldingMainView': {
                        templateUrl: "/app/modules/moulding/workstations/views/index.html",
                        controller: 'MouldingWorkstationsCtrl'
                    }
                },
                resolve: {
                    workstations: function (baseFactory) {
                        return baseFactory.fetch('/api/mouldings/getallworkstations').then(function (rrdata) {
                            return rrdata.object || [];
                        });
                    }
                },
                data: {
                    permissions: ['system.mouldingallocateorders.allow', 'system.mouldingproductionquantities.allow',
                        'system.mouldingcalendar.view', 'system.mouldingjobsetup.allow', 'system.mouldingadmin.allow']
                },
                ncyBreadcrumb: {
                    label: 'Workstations'
                }
            })
            .state('base.moulding.workstations.workstation', {
                url: "/:workstationId",
                views: {
                    'workstationview': {
                        templateUrl: "/app/modules/moulding/workstations/views/workstation.html",
                        controller: 'MouldingWorkstationCtrl',
                        resolve: {
                        }
                    }
                },
                resolve: {
                    workstation: ['baseFactory', '$stateParams', function (baseFactory, $stateParams) {
                        return baseFactory.fetch('/api/mouldings/getworkstation/' + $stateParams.workstationId).then(function (rdata) {
                            return rdata.object;
                        });
                    }]
                },
                ncyBreadcrumb: {
                    label: '{{$parent.currentWorkstationName}}'
                }
            })
            .state('base.moulding.workstations.workstation.allocateJobs', {
                url: "/allocatejobs",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/jobs/views/jobAllocate.html",
                        controller: 'MouldingAllocateJobsCtrl',
                        resolve: {
                            AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('AngularGanttModule');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingallocateorders.allow', 'system.mouldingjobsetup.allow']
                },
                ncyBreadcrumb: {
                    label: 'Allocate Jobs'
                }
            })
            .state('base.moulding.workstations.workstation.productionQuantities', {
                url: "/productionquantities",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/productionQuantities/views/index.html",
                        controller: 'MouldingProductionQuantityCtrl',
                        resolve: {
                            AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('AngularGanttModule');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingproductionquantities.allow']
                },
                ncyBreadcrumb: {
                    label: 'Production Quantities'
                }
            })
            .state('base.moulding.workstations.workstation.calendar', {
                url: "/calendar",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/workstations/views/calendar.html",
                        controller: 'MouldingWorkstationCalendarCtrl',
                        resolve: {
                            FullCalendarModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('OcFullCalendarCtrl');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingcalendar.view']
                },
                ncyBreadcrumb: {
                    label: 'Workstation Calendar'
                }
            })
            .state('base.moulding.workstations.workstation.scheduler', {
                url: "/scheduler",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/reports/views/schedule.html",
                        controller: 'MouldingReportScheduleCtrl',
                        resolve: {
                            AngularGranttModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('AngularGanttModule');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingallocateorders.allow', 'system.mouldingcalendar.view', 'system.mouldingjobsetup.allow']
                },
                ncyBreadcrumb: {
                    label: 'Schedule'
                }
            })
            .state('base.moulding.workstations.workstation.productionHistory', {
                url: "/productionhistory",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/reports/views/productionDetails.html",
                        controller: 'MouldingReportProductionDetailsCtrl'
                    }
                },
                data: {
                    permissions: ['system.mouldingallocateorders.allow', 'system.mouldingcalendar.view', 'system.mouldingproductionquantities.allow']
                },
                ncyBreadcrumb: {
                    label: 'Production Details'
                }
            })
            .state('base.moulding.workstations.workstation.productionLogs', {
                url: "/productionlogs",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/reports/views/productionLogs.html",
                        controller: 'MouldingReportProductionLogsCtrl'
                    }
                },
                data: {
                    permissions: ['system.mouldingadmin.allow']
                },
                ncyBreadcrumb: {
                    label: 'Production Logs'
                }
            })
            .state('base.moulding.workstations.workstation.setup', {
                url: "/setup",
                views: {
                    'workstationview@base.moulding.workstations': {
                        templateUrl: "/app/modules/moulding/workstations/views/setup.html",
                        controller: 'MouldingWorkstationSetupCtrl',
                        resolve: {
                            FullCalendarModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('OcFullCalendarCtrl');
                            }]
                        }
                    }
                },
                data: {
                    permissions: ['system.mouldingadmin.allow']
                },
                ncyBreadcrumb: {
                    label: 'Workstation Setup'
                }
            });
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingWorkstationCalendarCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', '$controller', 'baseFactory', 'permissionFactory', 'modalFactory', 'uiCalendarConfig', 'workstations'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, $controller, baseFactory, permissionFactory, modalFactory, uiCalendarConfig, workstations) {

        if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
            $scope.$parent.currentDashboardReportId = -2;
            $scope.$parent.showSidebar = false;
        }

        var setShiftColor = function (v) {
            v.className = v.id > 0 ? 'cursor-pointer' : 'cursor-default';
            v.className += ' workstation-shift-' + v.eventType;
        };
        $scope.eventOnDrop = function (event, revertFunc, jsEvent, ui, view) {
            revertFunc();
        };

        $scope.eventOnResize = function (event, revertFunc, jsEvent, ui, view) {
            revertFunc();
        };

        $scope.selectOnClick = function (start, end, jsEvent, view) {
            return false;
        };

        $scope.eventOnClick = function (event, jsEvent, view) {
            console.log(event);
            if (event.id === 0 || !permissionFactory.hasPermission(['system.mouldingcalendar.edit']))
                return false;

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/purchaseOrders/modals/purchaseOrderItemModal.html',
                controller: 'MouldingPurchaseOrderItemModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    item: function () {
                        return baseFactory.fetch('/api/mouldings/getPurchaseOrderItem/' + event.id).then(function (rdata) {
                            var j = rdata.object || {};
                            j.isSave = true;
                            return j;
                        });
                    },
                    workstations: function () {
                        return workstations;
                    },
                    isNew: function () {
                        return false;
                    }
                }
            });
            modalInstance.result.then(function (item) {
                $scope.myWorkstationCalendar.fullCalendar('refetchEvents');
            }, function (isReloadPage) {
            });
        };
        $scope.setupItem = function (orderItem) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/moulding/jobs/modals/manageWorkstationsModal.html',
                controller: 'MouldingPurchaseOrderItemWorkstationModalCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    data: function () {
                        return baseFactory.fetch('/api/mouldings/getJob/' + orderItem.purchaseOrderItemId).then(function (rdata) {
                            return rdata.object || null;
                        });
                    },
                    workstations: function () {
                        return workstations;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                $scope.myWorkstationCalendar.fullCalendar('refetchEvents');
            }, function () {
            });
        };

        $scope.filter = {
            ws: null,
            selectedWorkstations: []
        };
        if ($stateParams.workstationId) {
            $scope.workstations = [];
            $scope.filter.ws = $stateParams.workstationId;
            $scope.filter.selectedWorkstations = [{ id: parseInt($stateParams.workstationId) }];
            $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));
        } else {
            $scope.workstations = angular.copy(workstations);
        }
        angular.extend(this, $controller('MouldingReportWorkstationsCtrl', { $scope: $scope }));
        $scope.events = [];
        $scope.eventsF = function (start, end, timezone, callback) {
            var s = moment(start).format('YYYY-MM-DD');
            var e = moment(end).format('YYYY-MM-DD');
            $scope.currentStartDate = s;
            $scope.currentEndDate = e;

            baseFactory.fetch('/api/mouldings/getAllJobsCalendar', { start: s, end: e, ws: $scope.getWorkstationIds($scope.filter.selectedWorkstations) }).then(function (rrdata) {
                var obj = rrdata.object;
                angular.forEach(obj, function (v) {
                    v.titleName = angular.copy(v.title);
                    v.tooltip = v.calendarName + ' - ' + v.title;
                    // v.isAllDay = true;
                    setShiftColor(v);
                });
                callback(angular.copy(obj));
            });
        };
        $scope.updateWorkstationCalendar = function () {
            $scope.myWorkstationCalendar.fullCalendar('refetchEvents');
        };

        $scope.eventSources = [$scope.eventsF];

        $scope.uiConfig = {
            calendar: {
                firstDay: 1,
                height: 700,
                editable: true,
                header: {
                    left: '',
                    center: 'title',
                    right: 'today prev,next'
                },
                selectable: false,
                select: $scope.selectOnClick,
                eventClick: $scope.eventOnClick,
                eventDrop: $scope.eventOnDrop,
                eventResize: $scope.eventOnResize,
                eventRender: function (event, element) {
                    //console.log(element)
                    jQuery(element).draggable();
                    //$(element).addTouch();
                }
            }
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingWorkstationCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'baseFactory', 'modalFactory', 'permissionFactory', 'workstations'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, baseFactory, modalFactory, permissionFactory, workstations) {
        for (var i = 0; i < workstations.length; i++) {
            if (parseInt($stateParams.workstationId) === workstations[i].id) {
                $scope.$parent.currentWorkstationName = workstations[i].name;
                $scope.$parent.currentWorkstationId = workstations[i].id;
                break;
            }
        }
        if (permissionFactory.hasPermission(['system.mouldingallocateorders.allow', 'system.mouldingjobsetup.allow'])) {
            $state.go('base.moulding.workstations.workstation.allocateJobs', { workstationId: $stateParams.workstationId });
        } else if (permissionFactory.hasPermission(['system.mouldingproductionquantities.allow'])) {
            $state.go('base.moulding.workstations.workstation.productionQuantities', { workstationId: $stateParams.workstationId });
        } else if (permissionFactory.hasPermission(['system.mouldingcalendar.view'])) {
            $state.go('base.moulding.workstations.workstation.calendar', { workstationId: $stateParams.workstationId });
        } else if (permissionFactory.hasPermission(['system.mouldingadmin.allow'])) {
            $state.go('base.moulding.workstations.workstation.productionLogs', { workstationId: $stateParams.workstationId });
            // $state.go('base.moulding.workstations.workstation.setup', { workstationId: $stateParams.workstationId });
        }
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingWorkstationsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'baseFactory', 'modalFactory', 'workstations'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, baseFactory, modalFactory, workstations) {
        $scope.currentWorkstationId = null;
        $scope.currentWorkstationName = null;
        $scope.workstations = angular.copy(workstations);

        $scope.loadHref = function (id) {
            var currentState = $state.current.name.indexOf('base.moulding.workstations.workstation') === 0 ? $state.current.name : 'base.moulding.workstations.workstation';
            $state.go(currentState, { workstationId: id });
        };

        $scope.setWorkstation = function (wid) {
            for (var i = 0; i < workstations.length; i++) {
                if (workstations[i].id === wid) {
                    $scope.currentWorkstationId = workstations[i].id;
                    $scope.currentWorkstationName = workstations[i].name;
                    break;
                }
            }
        };

        if ($state.current.name === 'base.moulding.workstations') {
            $scope.loadHref(workstations[0].id);
        }
    }
})();
(function () {
    'use strict';
    homeModule.controller('MouldingWorkstationSetupCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'baseFactory', 'modalFactory', 'uiCalendarConfig', 'workstation'];
    function ctrl($scope, $rootScope, $modal, $state, $stateParams, baseFactory, modalFactory, uiCalendarConfig, workstation) {
        $scope.$parent.setWorkstation(parseInt($stateParams.workstationId));

        var availableShiftIds = [];
        for (var i = 0; i < workstation.shifts.length; i++) {
            if (workstation.shifts[i].isActive)
            availableShiftIds.push(workstation.shifts[i].id);
        }
        var setShiftColor = function (v) {
            if (v.eventType === 5) {
                v.className = 'event-type' + v.eventType;
            } else {
                v.className = 'workstation-shift-unavailable';
                var day = moment(v.start, 'YYYY-MM-DD').day();
                if (day === 6 || day === 0 || v.eventType === 6) {
                    v.className = 'workstation-shift-available';
                } else if (availableShiftIds.indexOf(parseInt(v.color))) {
                    v.className = 'workstation-shift-available';
                }
            }
        };
        var isReload = function (event) {
            var isHoliday = false;
            for (var i = 0; i < $scope.events.length; i++) {
                if ($scope.events[i].isPublicHoliday)
                if (event.start.format("YYYY/MM/DD") === moment($scope.events[i].start).format("YYYY/MM/DD") && $scope.events[i].isPublicHoliday) {
                    isHoliday = true;
                    break;
                }
            }
            return isHoliday || event.eventType === 6;
        }
        $scope.eventOnDrop = function (event, revertFunc, jsEvent, ui, view) {
            if (event.isReadOnly) {
                revertFunc();
            } else {
                var dataToSend = angular.copy(event);
                dataToSend.title = dataToSend.titleName;
                dataToSend.eventType = 1;
                baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                    if (rrdata.isErrored) {
                        revertFunc();
                    } else {
                        setShiftColor(event);
                        if (isReload(event))
                            $scope.myOwrkstationSetupCalendar.fullCalendar('refetchEvents');
                    }
                });
            }
        };

        $scope.eventOnResize = function (event, revertFunc, jsEvent, ui, view) {
            if (event.isReadOnly) {
                revertFunc();
            } else {
                var dataToSend = angular.copy(event);
                dataToSend.title = dataToSend.titleName;
                dataToSend.eventType = 1;
                baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                    if (rrdata.isErrored) {
                        revertFunc();
                    } else {
                        setShiftColor(event);
                        if (isReload(event))
                            $scope.myOwrkstationSetupCalendar.fullCalendar('refetchEvents');
                    }
                });
            }
        };

        $scope.selectOnClick = function (start, end, jsEvent, view) {
            var ms = $.fullCalendar.moment(start);
            var dte = moment(ms).format('DD/MM/YYYY');
            // Check if date is already available
            var unavailableShifts = [];
            var unavailableShiftIds = [];
            for (var i = 0; i < $scope.events.length; i++) {
                if ($scope.events[i].date === dte) {
                    unavailableShifts.push($scope.events[i].title);
                    unavailableShiftIds.push($scope.events[i].id);
                }
            }

            console.log("Select on Click");
            var modalInstance = $modal.open({
                templateUrl: "/app/modules/moulding/workstations/modals/mouldingWorkstationSetupModal.html",
                controller: 'MouldingWorkstationSetupModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    ws: function () {
                        var ms = $.fullCalendar.moment(start);
                        var me = $.fullCalendar.moment(end);
                        var isAllDay = !(ms.hasTime() && me.hasTime());

                        return {
                            id: 0,
                            title: '', // 'Default Title',
                            start: start,
                            end: isAllDay ? end.subtract(1, 'day') : end,
                            origStart: start,
                            origEnd: end,
                            allDay: !(ms.hasTime() && me.hasTime()),
                            view: view.name,
                            users: [],
                            reminders: [],
                            isPrivate: false,
                            color: 1,
                            className: '',
                            location: '',
                            comments: '',
                            calendarId: null,
                            workstationId: $stateParams.workstationId
                        };
                    },
                    workstation: function () {
                        var ws = angular.copy(workstation);
                        for (var x = 0; x < ws.shifts.length; x++) {
                            var indx = unavailableShifts.indexOf(ws.shifts[x].name);
                            ws.shifts[x].isSelected = indx >= 0;
                            ws.shifts[x].eventId = ws.shifts[x].isSelected ? unavailableShiftIds[indx] : 0;
                        }
                        return ws;
                    },
                    isNew: function () {
                        return true;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                $scope.myOwrkstationSetupCalendar.fullCalendar('refetchEvents');
            }, function () {

            });

        };

        $scope.eventOnClick = function (event, jsEvent, view) {
            if (event.eventType === 5)
                return;

            var tempEvent = angular.copy(event);

            var modalInstance = $modal.open({
                templateUrl: "/app/modules/moulding/workstations/modals/mouldingWorkstationSetupModal.html",
                controller: 'MouldingWorkstationSetupModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    ws: function () {
                        var ms = $.fullCalendar.moment(tempEvent.start);
                        var me = $.fullCalendar.moment(tempEvent.end);
                        var isAllDay = !(ms.hasTime() && me.hasTime());

                        if (event.end === null) {
                            tempEvent.end = event.end === null ? tempEvent.start : tempEvent.end;
                        }

                        var duration = moment.duration(tempEvent.end.diff(tempEvent.start));
                        var hours = duration.asHours();

                        if (hours === 0) {
                            tempEvent.end = event.end === null ? tempEvent.start : tempEvent.end;
                        } else {
                            tempEvent.end = isAllDay ? tempEvent.end.subtract(1, 'day').toDate() : tempEvent.end;
                        }
                        tempEvent.origStart = tempEvent.start;
                        tempEvent.origEnd = tempEvent.end;
                        tempEvent.eventType = 1;

                        return angular.copy(tempEvent);
                    },
                    workstation: function () {
                        return workstation;
                    },
                    isNew: function () {
                        return false;
                    }
                }
            });

            modalInstance.result.then(function (ddata) {
                if (ddata) {
                    event.location = ddata.location;
                }
                if (ddata.isRemove) {
                    $scope.myOwrkstationSetupCalendar.fullCalendar('removeEvents', ddata.id);
                    for (var i = 0; i < $scope.events.length; i++) {
                        if ($scope.events[i].id === ddata.id) {
                            $scope.events.splice(i, 1);
                            break;
                        }
                    }
                } else {
                    $scope.myOwrkstationSetupCalendar.fullCalendar('refetchEvents');
                }
            }, function () {
            });
        };

        $scope.events = [];
        $scope.eventsF = function (start, end, timezone, callback) {
            var s = moment(start).format('DD/MM/YYYY');
            var e = moment(end).format('DD/MM/YYYY');
            $scope.currentStartDate = s;
            $scope.currentEndDate = e;

            baseFactory.fetch('/api/calendar/getAllEvents', { start: s, end: e, ws: $stateParams.workstationId }).then(function (rrdata) {
                var obj = rrdata.object;
                angular.forEach(obj, function (v) {
                    v.titleName = angular.copy(v.title);
                    v.isAllDay = true;
                    setShiftColor(v);
                });
                $scope.events = angular.copy(obj);
                callback(angular.copy(obj));
            });
        };

        $scope.eventSources = [$scope.eventsF];

        $scope.uiConfig = {
            calendar: {
                firstDay: 1,
                height: 700,
                editable: true,
                header: {
                    left: '',
                    center: 'title',
                    right: 'today prev,next'
                },
                selectable: true,
                select: $scope.selectOnClick,
                eventClick: $scope.eventOnClick,
                eventDrop: $scope.eventOnDrop,
                eventResize: $scope.eventOnResize,
                eventRender: function (event, element) {
                    //console.log(element)
                    jQuery(element).draggable();
                    //$(element).addTouch();
                }
            }
        };
    }
})();
(function () {
    'use strict';

    homeModule.controller('MouldingWorkstationSetupModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$document', '$timeout', '$modalInstance', 'baseFactory', 'isNew', 'ws', 'workstation'];
    function ctrl($scope, $rootScope, $document, $timeout, $modalInstance, baseFactory, isNew, ws, workstation) {

        var day = moment(ws.start).format('ddd');
        $scope.isWeekends = day === 'Sat' || day === 'Sun';
        $scope.m = angular.copy(ws);
        $scope.m.color = parseInt($scope.m.color);
        $scope.isNew = isNew;
        $scope.m.shifts = angular.copy(workstation.shifts);
        $scope.showError = false;

        if (typeof $scope.m.date === 'undefined') {
            $scope.m.date = moment(ws.start).format('DD/MM/YYYY');
        }

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        $scope.btnCancel = "Cancel";
        $scope.btnDelete = "Delete";
        $scope.btnSubmit = "Save";

        $scope.ok = function (form, evnt) {
            $rootScope.formSubmit(form);
            $scope.showError = false;
            if (form.$valid) {
                var arr = [];
                var validCount = 0;
                for (var i = 0; i < evnt.shifts.length; i++) {
                    var dataToSend = angular.copy(evnt);
                    if (evnt.shifts[i].isSelected) {
                        dataToSend.start = moment(dataToSend.start).set('hour', evnt.shifts[i].from).set('minute', 0);
                        dataToSend.end = moment(dataToSend.end).set('hour', evnt.shifts[i].to).set('minute', 0);
                        dataToSend.title = evnt.shifts[i].name;
                        dataToSend.color = evnt.shifts[i].id;
                        dataToSend.id = evnt.shifts[i].eventId;
                        dataToSend.allDay = false;
                        if (evnt.shifts[i].eventId === 0)
                            arr.push(angular.copy(dataToSend));
                        validCount++;
                    } else if (!evnt.shifts[i].isSelected && evnt.shifts[i].eventId > 0) {
                        dataToSend.id = evnt.shifts[i].eventId;
                        dataToSend.isDelete = true;
                        arr.push(angular.copy(dataToSend));
                        validCount++;
                    }
                }
                var url = isNew ? '/api/calendar/saveEvents' : '/api/calendar/saveEvent';
                var dts = isNew ? arr : angular.copy(evnt);
                if (isNew) {
                    if (validCount === 0) {
                        $scope.showError = true;
                        return;
                    }
                }
                // Save Event
                if (dts.length === 0) {
                    $modalInstance.close({ isRemove: false });
                } else {
                    $scope.btnDisabled = true;
                    $scope.btnSubmit = 'Saving...';
                    baseFactory.post(url, dts).then(function (rrdata) {
                        if (!rrdata.isErrored) {
                            $modalInstance.close({ isRemove: false });
                        }
                        $scope.btnDisabled = false;
                        $scope.btnSubmit = 'Save';
                    });
                }
            }
        };

        $scope.delete = function (evnt) {
            var evt = angular.copy(evnt);

            $scope.btnDisabled = true;
            $scope.btnDelete = "Deleting...";

            // Delete Event
            baseFactory.post('/api/calendar/deleteWorkstationUnavailability/' + evt.id).then(function (rrdata) {
                if (!rrdata.isErrored) {
                    evt.isRemove = true;
                    $modalInstance.close(evt);
                } else {
                    $scope.btnDisabled = false;
                    $scope.btnDelete = "Delete";
                }
            });
        };

        // DATE
        $scope.formatEventDateToStr = function (str) {
            if (moment(str.start).format('DD/MM/YYYY') === moment(str.end).format('DD/MM/YYYY')) {
                return moment(str.start).format('DD/MM/YYYY hh:mmA') + ' - ' + moment(str.end).format('hh:mmA');
            } else {
                return moment(str.start).format('DD/MM/YYYY hh:mmA') + ' - ' + moment(str.end).format('DD/MM/YYYY hh:mmA');
            }
        };
        $scope.openDateRange = false;
        $scope.openCustomDateRange = true;
        $scope.openDateRangeDropdown = false;
        var isDrdCliked = false;
        $document.bind('click', function () {
            if (!isDrdCliked) {
                $timeout(function () {
                    if ($scope.openDateRangeDropdown)
                        $scope.openDateRangeDropdown = false;
                }, 50);
            }
        });
        $scope.clickDateRangeDropdown = function () {
            isDrdCliked = true;
            $scope.openDateRange = false;
            $scope.openDateRangeDropdown = !$scope.openDateRangeDropdown;
            $timeout(function () {
                isDrdCliked = false;
            }, 100);
        };
        $scope.done = function () {
            $scope.openCustomDateRange = false;
            $scope.openDateRange = false;
        };

    }
})();
(function () {
    'use strict';
    angular.module('navModule').controller('header', header);
    header.$inject = ['$scope', '$rootScope', '$state', '$stateParams', 'baseFactory', 'permissionFactory', '$modal', '$window', '$timeout', 'shoppingCartFactory', 'CART_CONSTANTS'];
    function header($scope, $rootScope, $state, $stateParams, baseFactory, permissionFactory, $modal, $window, $timeout, shoppingCartFactory, CART_CONSTANTS) {
        $scope.checkImpersonate = null;
        $scope.isCompany = permissionFactory.isCompany() || ($rootScope.user && $rootScope.user.isSysAdmin);

        $scope.itemDetails = function (item) {
            $state.go('anonymous.shop.item', { id: item.itemAlias });
        };

        $scope.ALLOW_ANONYMOUS = ALLOW_ANONYMOUS;

        $rootScope.isUserAthenticated();

        function init() {
            //Go to Search Page
            $scope.search = {};
            $scope.currentState = $state.current.name;
            $scope.userFullName = $rootScope.user.fullName;
            $scope.username = $rootScope.user.username;
            $rootScope.menuHidden = true;

            if (typeof $rootScope.user == 'undefined' || $rootScope.user == null)
                console.log('No user');

            shoppingCartFactory.getShoppingCart().then(function (shoppingCart) {
                $scope.shoppingCart = shoppingCart;
            });

            $scope.checkImpersonate = null;
            if ($rootScope.impersonate) {
                $scope.checkImpersonate = $rootScope.impersonate;
            }
        }

        //console.log('isAuthenticated', $rootScope.isAthenticated);
        if ($rootScope.isAthenticated) {
            init();
        }

        $scope.$onRootScope(IS_IMPERSONATING, function () {
            if (!$rootScope.impersonate || $rootScope.impersonate === "") {
                $scope.checkImpersonate = null;
            } else if ($rootScope.impersonate) {
                $scope.checkImpersonate = $rootScope.impersonate;
            }
        });

        $scope.updateSearch = function () {
            $state.go('base.search', { searchTerm: encodeURIComponent($scope.search.globalSearchKeyword) });
        };

        // State
        $rootScope.stateInclude = function (stateRoute, params) {
            if (typeof params === "undefined")
                return $state.includes(stateRoute);

            var currentParams = angular.toJson($state.params);
            var strParams = angular.toJson(params);

            return $state.includes(stateRoute) && currentParams == strParams;
        };

        $scope.changePassword = function () {
            $state.go('base.account.changePassword');
        };

        $scope.logout = function () {
            $scope.checkImpersonate = null;
            $rootScope.$emit(LOGOUT_USER);
        };

        $('.dropdown-menu').click(function (event) {
            event.stopPropagation();
        });

        $scope.checkOut = function () {
            $state.go('base.checkout');
        };

        $scope.login = function () {
            $modal.open({
                animation: $scope.animationsEnabled,
                templateUrl: '/app/modules/loginPopUp/loginPopUp.html',
                controller: 'LoginPopUpCtrl',
                size: 'md',
                resolve: {
                    LoginModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcLoginPopupCtrl');
                    }],
                    offlineMessage: ["baseFactory", function (baseFactory) {
                        return baseFactory.fetch('/api/system/GetOfflineMessage', {})
                            .then(function (rrdata) {
                                return rrdata == null ? null : rrdata.offlineMessage;
                            });
                    }]
                }
            });
        };

        $scope.$onRootScope(CART_CONSTANTS.CART_UPDATED, function (event, shoppingCart) {
            $scope.shoppingCart = angular.copy(shoppingCart);
        });

        $scope.removeItem = function (item) {
            shoppingCartFactory.removeItemFromCart(item, $scope.shoppingCart);
        };
        $scope.impersonate = function () {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/menu/impersonate/editImpersonate.html',
                controller: 'editImpersonateCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-md',
                resolve: {
                    customers: function (resolveFactory) {
                        return resolveFactory.getGridEntity('/api/customer/SearchAll/', null, 10);
                    }
                }
            });
            modalInstance.result.then(function () {
                $state.reload();
            });
        };
        $scope.$onRootScope(USER_ON_ROOT, function (scope, data) {
            if (($rootScope.user.customerId == null || $rootScope.user.customerId == '') && data.visibleCustomerIds.length > 1) {
                $scope.selectCustomer();
            }
        });
        $scope.visibleCustomers = [];
        $scope.visibleCustomerLoading = false;
        $scope.toggledSetCustomers = function (open) {
            if (open && $scope.visibleCustomers.length == 0) {
                $scope.visibleCustomerLoading = true;
                baseFactory.fetch('/api/customer/SearchAll/', { retrieveSize: 9999 }).then(function (data) {
                    if (!data.isErrored) {
                        $scope.visibleCustomers = data.object;
                        $scope.visibleCustomerLoading = false;
                    }
                });
            }
        };
        $scope.selectCustomer = function (customer) {
            baseFactory.fetch('/api/customer/setCustomer?cid=' + customer.customerId + '&cn=' + customer.name.replace("&", "%26")).then(function (data) {
                if (!data.isErrored) {
                    $rootScope.user.customerId = customer.customerId;
                    $rootScope.user.customerName = customer.name;
                    $timeout(function () {
                        angular.element("[txt-query]").val("");
                        $rootScope.user.query = null;
                    }, 100);
                    $state.reload();
                }
            });
        };

        $scope.stopImpersonate = function () {
            baseFactory.fetch('/api/customer/impersonate?impersonateCustomerId=&impersonateCustomerName=').then(function (data) {
                if (!data.isErrored) {
                    $rootScope.impersonate = null;
                    $scope.checkImpersonate = null;
                    $rootScope.$emit(IS_IMPERSONATING);
                    $state.reload();
                    return data;
                }
            });
        };

        $scope.isOpenSearch = false;
        $scope.openSearch = function () {
            $scope.isOpenSearch = true;
        };
        $scope.closeSearch = function () {
            $scope.isOpenSearch = false;
        };

        // Bookmarks
        $scope.addNote = function () {
            //console.log('Fire')
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/dashboard/modals/manageCreateNoteModal.html',
                controller: 'ManageNoteModalCtrl',
                size: 'md',
                backdrop: 'static',
                resolve: {
                    NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcNoteModalCtrl');
                    }],
                    isNew: function () {
                        return true;
                    },
                    model: function () {
                        return {
                            id: 0,
                            orderId: null,
                            customerId: null,
                            customerName: null,
                            contactId: null,
                            isVisibleCustomer: true,
                            date: moment().format()
                        };
                    },
                    contacts: function () {
                        return [];
                    },
                    //contacts: function () {
                    //    return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: customer.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                    //        return rrdata.object;
                    //    });
                    //},
                    noteTypes: function () {
                        return baseFactory.fetch('/api/notes/getNoteTypes').then(function (rrdata) {
                            return rrdata.object;
                        });
                    }
                }
            }).result.then(function () {
                //if ($state.current.name == "base.orders.view2.notes") {
                //    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + 'orderNotes');
                //} else {
                //    $state.go('base.orders.view2.notes', { id: $stateParams.id });
                //}
            }, function () { });
        };
    }
})();
(function() {
    'use strict';
    angular.module('navModule').controller('layout', layout);
    layout.$inject = ['$scope', '$rootScope', '$timeout'];
    function layout($scope, $rootScope, $timeout) {

        // ------------------- //
        $scope.isCollapsed = true;
        var isExpandButtonClicked = false;

        $scope.hideTopNavMenu = function (isCollapsed) {
            isExpandButtonClicked = true;
            $scope.isCollapsed = isCollapsed;

            $timeout(function () {
                isExpandButtonClicked = false;
            }, 500);
        };
        $scope.topNavMenuClickOutside = function () {
            $scope.hideTopNavMenu(true);
        };
        $rootScope.$watch('showBlanket', function (v) {
            if (v) {
                $scope.isCollapsed = true;
            }
        });
    }
})();
(function() {
    'use strict';
    angular.module('navModule').controller('sideNav', sideNav);
    sideNav.$inject = ['$scope', '$state'];

    function sideNav($scope, $state) {

        $scope.isActive = function (currentState, strict) {
            //item.strict states that the state MUST MATCH EXACTLY
            return ((!strict && $state.current.name.startsWith(currentState)) || $state.current.name == currentState);
        }
    }
})();
(function () {
    'use strict';
    angular.module('navModule').controller('topNav', topNav);
    topNav.$inject = ['$scope', '$rootScope', 'baseFactory', '$state', '$modal', '$timeout', 'GRID_CONSTANTS'];
    function topNav($scope, $rootScope, baseFactory, $state, $modal, $timeout, GRID_CONSTANTS) {

        var dashboards = [];
        $scope.currentState = $state.current.name;
        $scope.dashboards = dashboards;
        // $scope.categories = categories;
        $scope.currentCategory = null;

        $scope.clearCategory = function () {
            $scope.currentCategory = null;
        };
        $scope.loadSubCategories = function (category) {
            $scope.currentCategory = category;
        };

        $scope.isAthenticated = $rootScope.isAthenticated;
        $scope.$onRootScope(USER_ON_ROOT, function (scope, data) {
            $scope.isAthenticated = data != null;
        });
        $scope.$onRootScope(LOGIN_USER, function (scope, data) {
            $scope.isAthenticated = data != null;
            if (dashboards.length < 1) {
                baseFactory.fetch('/api/reportApi/menu', {}).then(function (rrdata) {
                    $scope.dashboards = rrdata.object == null ? [] : rrdata.object;
                });
            }
        });
        $scope.$onRootScope(LOGOUT_USER, function () {
            console.log('fired')
            $scope.isAthenticated = false;
        });

        // GlobalSearch
        $scope.globalSearch = function (val) {
            if (val.length < 2)
                return [];

            return baseFactory.fetch('/api/item/SearchItems?retrieveSize=10&searchText=' + encodeURIComponent(val) + '&sort=name&startIndex=1')
                    .then(function (rrdata) {
                        return rrdata.object == null ? [] : rrdata.object;
                    });
        };

        $scope.globalSearchOnSelect = function ($item, $model, $label) {
            $scope.globalSearchKeyword = '';
            $state.go($rootScope.currentRootState + '.catalog.item', { id: $model.itemNumber });
        };

        $scope.isActive = function (currentState, strict) {
            //item.strict states that the state MUST MATCH EXACTLY
            return ((!strict && $state.current.name.startsWith(currentState)) || $state.current.name == currentState);
        };

        // DOCUMENTS
        $scope.openUploadDocumentModal = function (d) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/uploads/uploadDocumentModal.html',
                controller: 'UploadDocumentModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window-sm',
                resolve: {
                    isNew: function () {
                        return d == null;
                    },
                    doc: function () {
                        return d;
                    },
                    title: function () {
                        return "Document";
                    },
                    docTypes: [function () {
                        if ($rootScope.lookup.docTypes.length > 0)
                            return $rootScope.lookup.docTypes;

                        return baseFactory.fetch('/api/documents/GetAllDocumentTypes').then(function (rrdata) {
                            $rootScope.lookup.docTypes = rrdata.object == null ? [] : rrdata.object;
                            return $rootScope.lookup.docTypes;
                        });
                    }]
                }
            });
            modalInstance.result.then(function () {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + 'AllDownloadDocuments');
            });
        };

        baseFactory.fetch('/api/category/GetAll').then(function (rrdata) {
            $scope.categories = rrdata.object == null ? [] : rrdata.object;
        });

        // ------------------- //
        $scope.isCollapsed = true;
        var isExpandButtonClicked = false;

        $scope.hideTopNavMenu = function (isCollapsed) {
            isExpandButtonClicked = true;
            $scope.isCollapsed = isCollapsed;

            $timeout(function () {
                isExpandButtonClicked = false;
            }, 500);
        };
        $scope.topNavMenuClickOutside = function () {
            $scope.hideTopNavMenu(true);
        };
    }
})();
(function () {
    'use strict';
    homeModule.controller('NewsArticleCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'baseFactory', 'article',
        function ($scope, $rootScope, $modal, $state, $stateParams, baseFactory, article) {

            $scope.newsYear = $stateParams.articleYear;
            $scope.newsCategory = article.categoryName;

            $scope.m = article;
            $scope.title = article.heading;
        }
    ]);
})();
(function () {
    'use strict';
    homeModule.controller('NewsCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$stateParams', 'baseFactory', 'articleCategories', 'articleYears',
        function ($scope, $rootScope, $modal, $state, $stateParams, baseFactory, articleCategories, articleYears) {

            $scope.newsYear = null;
            $scope.newsCategoryId = null;
            $scope.categories = articleCategories;
            $scope.years = articleYears;

            if (typeof $stateParams.articleCategoryAlias !== 'undefined')
                for (var j = 0; j < articleCategories.length; j++) {
                    if (articleCategories[j].alias == $stateParams.articleCategoryAlias) {
                        $scope.newsCategoryId = articleCategories[j].id;
                        $scope.newsCategory = articleCategories[j].name;
                        break;
                    }
                }

            $scope.articles = [];
            $scope.startIndex = 1;
            $scope.pageSize = 9;
            $scope.totalRows = 0;
            $scope.url = "/api/articles/searchAll";
            $scope.dataToSend = {};
            $scope.isLoading = false;

            function searchArticles() {
                var dataToSend = {
                    startIndex: $scope.startIndex,
                    retrieveSize: 9,
                    sort: 'date desc'
                };
                //
                if ($scope.newsYear != null)
                    dataToSend.yr = $scope.newsYear;
                if ($scope.newsCategoryId != null)
                    dataToSend.cid = $scope.newsCategoryId;
                //
                $scope.isLoading = true;
                baseFactory.fetch($scope.url, dataToSend).then(function (rrdata) {
                    for (var i = 0; i < rrdata.object.length; i++) {
                        $scope.articles.push(rrdata.object[i]);
                    }
                    $scope.totalRows = rrdata.totalItems;
                    $scope.isLoading = false;
                });
            };

            $scope.showMore = function () {
                $scope.startIndex = $scope.articles.length + 1;
                searchArticles();
            };

            function init() {
                searchArticles();
            };

            if (typeof $stateParams.articleYear !== 'undefined') {
                $scope.newsYear = $stateParams.articleYear;
                init();
            } else if (articleYears.length > 0) {
                $state.go('anonymous.news.year', { articleYear: articleYears[0] });
            }
        }
    ]);
})();
(function () {
    'use strict';
    sharedModule.controller('NewsSimpleCtrl',
        ['$scope', '$rootScope', '$modal', '$timeout', 'baseFactory',
        function ($scope, $rootScope, $modal, $timeout, baseFactory) {

            var pageSize = 20;
            //$scope.newsYear = null;
            //$scope.newsCategoryId = null;
            //$scope.totalRows = 0;

            $scope.articles = [];
            $scope.startIndex = $scope.totalRows + 1;
            $scope.url = "/api/articles/searchAll";
            $scope.dataToSend = {};
            $scope.isLoading = false;
            $scope.isShowMore = false;

            $timeout(function () {
                $scope.isShowMore = $scope.totalRows === pageSize;
            });

            function searchArticles() {
                var dataToSend = {
                    startIndex: $scope.startIndex,
                    retrieveSize: pageSize,
                    sort: 'Date desc',
                    b: true,
                    cb: true
                };
                //
                if ($scope.newsYear !== null)
                    dataToSend.yr = $scope.newsYear;
                if ($scope.newsCategoryId !== null)
                    dataToSend.cid = $scope.newsCategoryId;
                //
                $scope.isLoading = true;
                baseFactory.fetch($scope.url, dataToSend).then(function (rrdata) {
                    $scope.isShowMore = rrdata.object.length === pageSize;
                    for (var i = 0; i < rrdata.object.length; i++) {
                        $scope.articles.push(rrdata.object[i]);
                    }
                    $scope.totalRows += $scope.articles.length;
                    $scope.isLoading = false;
                });
            };

            $scope.showMore = function () {
                $scope.startIndex = $scope.totalRows + 1;
                searchArticles();
            };

            function init() {
                searchArticles();
            };

            //if (typeof $stateParams.articleYear !== 'undefined') {
            //    $scope.newsYear = $stateParams.articleYear;
            //    init();
            //} else if (articleYears.length > 0) {
            //    $state.go('anonymous.news.year', { articleYear: articleYears[0] });
            //}
        }
    ]);
})();
(function () {
    'use strict';
    orderModule.controller('createOrder', createOrder);
    createOrder.$inject = ['$scope', '$state', '$stateParams', '$document', 'baseFactory', 'sharedFactory', 'order', '$rootScope', '$sce', '$timeout',
        'modalFactory', 'permissionFactory', '$modal', 'FILTER_CONSTANTS', 'detailsMode', 'promptFactory', 'membershipFactory'];

    function createOrder($scope, $state, $stateParams, $document, baseFactory, sharedFactory, order, $rootScope, $sce, $timeout,
        modalFactory, permissionFactory, $modal, FILTER_CONSTANTS, detailsMode, promptFactory, membershipFactory) {
        var noMaterialName = "<No Material>";

        $scope.detailsMode = detailsMode;
        $scope.addBlindType = addBlindType;
        $scope.cloneLineItem = cloneLineItem;
        $scope.open = open;
        $scope.open2 = open2;
        $scope.dateOpened = false;
        $scope.dateOpened2 = false;
        $scope.getCustomer = getCustomer;
        $scope.searchOrders = searchOrders;
        $scope.createNewOrder = createNewOrder;
        $scope.convertQuoteToOrder = convertQuoteToOrder;
        $scope.addItem = addItem;
        $scope.selectTab = selectTab;
        $scope.removeItem = removeItem;
        $scope.itemStatus = { name: "" };
        $scope.isCustomer = isCustomer;
        $scope.materialChanged = materialChanged;
        $scope.colourChanged = colourChanged;
        $scope.pricingFieldChanged = pricingFieldChanged;
        $scope.partPricingFieldChanged = partPricingFieldChanged;
        $scope.displayPriceBreakdown = displayPriceBreakdown;
        $scope.tallyOrderTotal = tallyOrderTotal;
        $scope.squareMetreTotal = squareMetreTotal;
        $scope.disabledOptions = disabledOptions;
        $scope.generateOrderToSave = generateOrderToSave;
        $scope.isValid = isValid;
        $scope.onSelect = onSelect;
        $scope.materials = [];
        $scope.companyDisabled = false;
        $scope.errors = [];
        $scope.displayQuantityColumn = displayQuantityColumn;
        $scope.displaySquareMetreColumn = displaySquareMetreColumn;
        $scope.displayWidthColumn = displayWidthColumn;
        $scope.displayDropColumn = displayDropColumn;
        $scope.displaySlatQuantityColumn = displaySlatQuantityColumn;
        $scope.openItemModal = openItemModal;
        $scope.currentDate = new Date().toJSON().slice(0, 10);
        $scope.order = angular.copy(order);
        $scope.isNew = order.id > 0 ? false : true;
        $scope.onPartSelect = onPartSelect;
        $scope.purchaseOrderNumberChanged = purchaseOrderNumberChanged;
        $scope.openShipToLocation = openShipToLocation;
        $scope.toggleDeliveryDateFixed = toggleDeliveryDateFixed;
        $scope.maxOrderDate = moment().startOf("day");
        $scope.selectedItemNumber = "";
        $scope.isPartIncluded = false;

        $scope.datePickerPopups = {
            dateOpened: false,
            shipOpened: false
        };

        $scope.sortableOptions = {
            handle: '> .my-handle',
            stop: function () {
                setItemSortOrder();
            }
        };

        init();

        // Prevent the backspace button accidentally taking the user away from this page
        $document.on('keydown', function (e) {
            if (e.which === 8 && (e.target.nodeName === "BODY" || e.target.nodeName === "SELECT")) {
                e.preventDefault();
            }
        });

        //Upload Document
        $scope.onFileSelect = onFileSelect;
        $scope.changeFile = changeFile;
        $scope.resetInputFile = resetInputFile;
        var isDocument = true;
        var isMedia = true;
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        function onFileSelect($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        function changeFile() {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };

        function resetInputFile() {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file') {
                    elems[i].value = null;
                }
            }
        };
        //End of Upload Document

        function materialChanged(item, tab, isInit) {
            if (typeof isInit === 'undefined') {
                item.colour = "";
                item.colours = [];
                if (tab.itemDetails.itemConfiguration) {
                    angular.forEach(tab.itemDetails.itemConfiguration.itemMaterials, function (value) {
                        if (value.material === item.material) {
                            item.colours = value.colours;
                        }
                    });
                }
            }

            // for curtains set bottom finish to 70mm hem for selected materials
            setOptionsFromMaterial('1550', "Bottom Finish", ["CLARENCE", "GALAXY", "AMANDA", "CMB-320", "BELMORE", "GUARDIAN ULTIMATE", "GUARDIAN ULTIMATE 318CM", "KADINA", "LA PALMA", "LA ALMA", "LAVISH", "ALLUSION"], ['N/A', '100mm hem', '10mm hem', '70mm hem'], item, tab);
        }

        function init() {
            if (typeof $scope.status === 'undefined') {
                $scope.status = {};
            }
            $scope.status.open = false;
            $scope.itemConfigs = order.id > 0 ? order.configuration !== null ? JSON.parse(order.configuration.value) : [] : [];
            $scope.blindTypes = order.sageItems;

            if ($rootScope.clientName === "TWC" && (permissionFactory.isCompany() || $rootScope.user.isSysAdmin)) {
                $scope.blindTypes.push({
                    description: 'Swatches',
                    categoryName: 'Swatches',
                    categoryNumber: 'SW01',
                    partName: 'Swatches',
                    isParts: true
                });
            }

            // Perf fix
            $scope.itemStatuses = $scope.order.itemStatuses;
            $scope.order.itemStatuses = [];

            //$scope.order = order;
            $scope.order.sageOrder = $scope.order.orderNumber === null ? "" : $scope.order.orderNumber;
            $scope.order.uiData = angular.fromJson($scope.order.uiData);
            $scope.order.shipVia = angular.copy($scope.order.uiData.shipVia);
            $scope.order.orderData = $scope.order.orderData === null || $scope.order.orderData === "" ? {} : angular.fromJson($scope.order.orderData);

            if (!$scope.order.orderItemGroups) {
                $scope.order.orderItemGroups = [];
            } else {
                for (var i = 0; i < $scope.order.orderItemGroups.length; i++) {
                    if (!$scope.isPartIncluded && $scope.order.orderItemGroups[i].isParts) {
                        $scope.isPartIncluded = true;
                    }
                }
            }

            if ($scope.order.id && $scope.order.id > 0) {
                convertServerModel();
                $scope.order.customer = { name: $scope.order.customerName, customerId: $scope.order.customerId };
                checkForPartExist();
            }
            else {
                if (isCustomer()) {
                    $scope.order.customer = { customerId: $rootScope.user.customerId, name: $rootScope.user.customerName };
                }
            }

            if ($state.current.name.indexOf('base.workOrders.scanning.view') < 0)
                getShipToLocations();

            if ($scope.order.artwork) {
                $scope.doc = {
                    id: $scope.order.artwork.id,
                    permissions: [],
                    fileName: $scope.order.artwork.fileName,
                    link: $scope.order.artwork.link,
                    isUploaded: true,
                    isDownload: true,
                    downloadLink: $scope.order.artwork.link
                };
            } else {
                $scope.doc = {
                    id: 0,
                    permissions: []
                };
            }
            for (var i = 0; i < $scope.order.orderItemGroups.length; i++) {
                for (var j = 0; j < $scope.order.orderItemGroups[i].items.length; j++) {
                    materialChanged($scope.order.orderItemGroups[i].items[j], $scope.order.orderItemGroups[i], true);
                }
            }
        }

        function convertServerModel() {
            // console.log('convert server model');
            $scope.companyDisabled = true;
            $scope.order.customer = {
                customerId: order.customerId,
                name: order.customerName
            };
            $scope.order.sageOrder = {
                orderNumber: order.orderNumber
            };

            if ($scope.order.orderItemGroups) {
                angular.forEach($scope.order.orderItemGroups, function (itemGroup) {
                    itemGroup.items = itemGroup.items || [];
                    angular.forEach($scope.itemConfigs, function (itemConfig) {
                        if (itemConfig.itemNumber === itemGroup.itemNumber) {
                            var questions = angular.copy(itemConfig.questions);
                            itemGroup.questions = [];
                            angular.forEach(questions, function (question) {
                                var customField = null;

                                angular.forEach($scope.order.customFields, function (cf) {
                                    if (cf.name === question.name) {
                                        customField = cf;

                                        //if (question.name == "Finish")
                                        //    console.log(customField);
                                    }
                                });

                                if (customField) {
                                    angular.extend(question, customField);

                                    if (question.options && typeof question.options === "string") {
                                        question.options = JSON.parse(question.options);
                                    }

                                    //if (question.name == "Finish")
                                    //    console.log(customField);
                                    itemGroup.questions.push(question);
                                }
                            });
                        }
                    });
                });
            }

            if ($scope.order.items) {
                angular.forEach($scope.order.items, function (item) {
                    if (item.itemPriceData && item.itemPriceData.isPart) {
                        if (!item.itemPriceData.partUserEnteredUnitPrice) {
                            item.itemPriceData.partUserEnteredUnitPrice = item.itemPriceData.unitPrice;
                        }
                    }

                    if (item.questions) {
                        angular.forEach(item.questions, function (question) {
                            if (question.isNonCustomField) {
                                item[lowerCaseFirstLetter(question.name).replace(' ', '')] = setQuestionValue(question.value);
                            }
                        });
                    }

                    var orderItemGroup = null;

                    if ($scope.order.orderItemGroups) {
                        angular.forEach($scope.order.orderItemGroups, function (itemGroup) {
                            if ((item.itemNumber === itemGroup.itemNumber && item.itemName === itemGroup.itemName) || (item.part && item.part.category === itemGroup.itemNumber)) {
                                orderItemGroup = itemGroup;
                                // console.log(angular.copy(item));
                                itemGroup.items.push(item);
                            }
                        });
                    }

                    if (orderItemGroup && orderItemGroup.itemDetails && orderItemGroup.itemDetails.itemConfiguration && orderItemGroup.itemDetails.itemConfiguration.itemMaterials) {
                        angular.forEach(orderItemGroup.itemDetails.itemConfiguration.itemMaterials, function (itemMaterial) {
                            if (item.material && itemMaterial.material === item.material) {
                                item.colours = itemMaterial.colours;
                            } else if (!item.material) {
                                item.colours = itemMaterial.colours;
                            }
                        });
                    }

                    var questions = angular.copy(item.questions);
                    item.questions = [];
                    angular.forEach(questions, function (question) {
                        if (!question.isNonCustomField) {
                            var questionAlreadyInTable = item.hasOwnProperty(lowerCaseFirstLetter(question.name));
                            if (!questionAlreadyInTable) {
                                var customField = null;

                                angular.forEach(orderItemGroup.questions, function (cf) {
                                    if (cf.name === question.name) {
                                        customField = cf;
                                    }
                                });

                                if (customField) {
                                    angular.extend(question, customField);

                                    if (question.options && typeof question.options === "string") {
                                        question.options = JSON.parse(question.options);
                                    }

                                    if (question.dependantItemOptions) {
                                        angular.forEach(question.dependantItemOptions, function (dependantOption) {
                                            if (dependantOption.itemNumber === item.itemNumber) {
                                                question.options = angular.copy(dependantOption.options);

                                                // check if the options already has a N/A?
                                                var isNA = false;
                                                angular.forEach(question.options, function (opt) {
                                                    if (opt.value === "N/A") {
                                                        isNA = true;
                                                    }
                                                });

                                                if (isNA) {
                                                    question.options.splice(0, 0, 'N/A');
                                                }

                                                //autoselect the first if there is only 1 option
                                                if (question.options.length == 1)
                                                    question.value = question.options[0];
                                            }
                                        });
                                    }

                                    item.questions.push(question);
                                }
                            }
                        }
                    });
                });
            }
        }

        function setQuestionValue(val) {
            if (isNaN(val)) {
                return val;
            }

            return parseFloat(val);
        }

        function lowerCaseFirstLetter(val) {
            if (!val) {
                return val;
            }

            if (val.length === 1) {
                return val.toLowerCase();
            }

            return val.charAt(0).toLowerCase() + val.slice(1);
        }

        function onSelect() {
            $scope.order.customerShipToLocationId = null;
            $scope.companyDisabled = true;

            getShipToLocations();

            if ($scope.order.customer != null && ($scope.order.customer.customerId != 'CASH' && $scope.order.customer.customerId != 'QUOACC')) { // for cash orders, don't recalc the pricing
                if ($scope.order.orderItemGroups) {
                    angular.forEach($scope.order.orderItemGroups, function (tab) {
                        if (tab.items) {
                            angular.forEach(tab.items, function (item) {
                                pricingFieldChanged(item, tab);
                            });
                        }
                    });
                }
            }
            purchaseOrderNumberChanged($scope.order.purchaseOrderNumber);
        }

        function getShipToLocations() {
            if ($scope.order.customer && $scope.order.customer.customerId) {
                return baseFactory.fetch('/api/Customer/CustomerShipToLocations/?customerId=' + encodeURIComponent($scope.order.customer.customerId)).then(function (data) {
                    if (!data.isErrored && data.object != null) {
                        $scope.order.shipToLocations = data.object;
                        if ($scope.order.shipToLocations) {
                            for (var i = 0; i < $scope.order.shipToLocations.length; i++) {
                                var shipToLocation = $scope.order.shipToLocations[i];
                                // if the order has a ship to location then we always use this
                                if ($scope.order.customerShipToLocationId != null) {
                                    if ($scope.order.customerShipToLocationId === shipToLocation.customerShipToLocationId) {
                                        var newShipLoc = {};
                                        var isCustomUpdated = false;
                                        for (var k in shipToLocation) {
                                            newShipLoc[k] = $scope.order[k] != shipToLocation[k] ? shipToLocation[k] : $scope.order[k];
                                            if ($scope.order[k] != shipToLocation[k]) {
                                                isCustomUpdated = true;
                                            }
                                        }

                                        if (!isCustomUpdated)
                                            shipToLocationSelected(newShipLoc);
                                        break;
                                    }
                                } else {
                                    // otherwise we set the customer default ship to location
                                    if (shipToLocation.isDefault) {
                                        shipToLocationSelected(shipToLocation);
                                        break;
                                    }
                                }
                            }
                        }
                    };
                });
            }
        }

        function shipToLocationSelected(shipToLocation) {
            if (!shipToLocation) {
                shipToLocation = {};
            }
            // console.log(shipToLocation);
            $scope.order.customerShipToLocationId = shipToLocation.customerShipToLocationId;
            $scope.order.locationName = shipToLocation.locationName;
            $scope.order.address1 = shipToLocation.address1;
            $scope.order.address2 = shipToLocation.address2;
            $scope.order.city = shipToLocation.city;
            $scope.order.state = shipToLocation.state;
            $scope.order.postcode = shipToLocation.postcode;
            $scope.order.phone = shipToLocation.phone;
            $scope.order.email = shipToLocation.email;
            $scope.order.contactName = shipToLocation.contactName;
            $scope.order.shipVia = shipToLocation.shipVia;
        }

        function openShipToLocation() {
            $modal.open({
                templateUrl: '/app/modules/order/shipToLocationModal/shipToLocationModal.html',
                controller: 'shipToLocationModal',
                size: 'lg',
                resolve: {
                    order: function () {
                        return $scope.order;
                    },
                    isCustomer: function () {
                        return $rootScope.user.customerId || $rootScope.user.customerName;
                    },
                    twcZones: function () {
                        var canEditOrder = permissionFactory.hasPermission(["system.orders.edit"]);
                        if (!canEditOrder)
                            return [];
                        return baseFactory.fetch('/api/twcdeliveries/getallshipvia').then(function (rrdata) {
                            return rrdata.object;
                        });
                    }
                }
            }).result.then(function (shipToLocation) {
                shipToLocationSelected(shipToLocation);
            }, function (shipToLocation) {
            });
        };

        function isCustomer() {
            try {
                return $rootScope.user.customerId || $rootScope.user.customerName;
            } catch (er) {
                return false;
            }
        }

        function setItemStatus(tab, completeCallback) {
            if (tab.isParts) {
                console.log($scope.order.customer);
                tab.itemStatus = { name: "" };
                return baseFactory.fetch('/api/item/getPartDetails/', { 'categoryNumber': tab.categoryNumber, 'customer': typeof $scope.order.customer === 'undefined' ? null : $scope.order.customer.name }).then(function (data) {
                    if (!data.isErrored && data.object != null) {
                        tab.parts = data.object;
                    }

                    if (completeCallback && typeof completeCallback === 'function') {
                        completeCallback();
                    }
                });
            } else {
                tab.itemStatus = { name: "" };
                return baseFactory.fetch('/api/item/GetItemDetails/?itemNumber=' + tab.itemNumber).then(function (data) {
                    if (!data.isErrored && data.object != null) {
                        var formBuilder = angular.copy(data.object.formBuilder);

                        tab.itemDetails = data.object;
                        tab.itemDetails.questions = formBuilder.questions;
                        tab.itemDetails.itemStatusComment = data.object.statusComment;
                        tab.itemDetails.description = $sce.trustAsHtml(data.object.description);
                        var tempDocs = angular.copy(tab.itemDetails.documents);
                        tab.itemDetails.images = [];
                        tab.itemDetails.documents = [];
                        angular.forEach(tempDocs, function (value, index) {
                            if (value.docTypeId == 2) {
                                if (value.isPrimary) {
                                    tab.itemDetails.primaryImage = value.link;
                                } else {
                                    tab.itemDetails.images.push(value);
                                }
                            } else if (value.docTypeId == 1) {
                                tab.itemDetails.documents.push(value);
                            }
                        });
                    }

                    if (completeCallback && typeof completeCallback === 'function') {
                        completeCallback();
                    }
                });
            }
        }

        function setItemConfig(tab) {
            if (tab.isParts) {
                return;
            }

            //
            angular.forEach($scope.itemConfigs, function (item) {
                if (item.itemNumber === tab.itemNumber) {
                    tab.itemDetails.questions = item.questions;
                }
            });

            if (!tab.itemDetails) {
                return;
            }

            var questionsToAdd = [];

            if (tab.itemDetails.itemConfiguration) {
                tab.materials = [];
                angular.forEach(tab.itemDetails.itemConfiguration.itemMaterials, function (value) {
                    tab.materials.push(value.material);
                });

                if (tab.materials.length > 1 || (tab.materials.length === 1 && tab.materials[0])) {
                    tab.displayMaterials = true;
                }

                if (tab.materials.length > 0)
                    tab.displayColours = true;
            }

            tab.hasQuestionInDialog = false;
            //replace all the definitions of questions with their corresponding custom field
            angular.forEach(tab.itemDetails.questions, function (question) {
                angular.forEach($scope.order.customFields, function (field) {
                    if (question.id === field.id) {
                        var fieldToAdd = angular.copy(field);
                        if (fieldToAdd.options) {
                            fieldToAdd.options = JSON.parse(fieldToAdd.options);
                        }
                        fieldToAdd.showInDialog = question.showInDialog;
                        if (question.showInDialog)
                            tab.hasQuestionInDialog = true;
                        fieldToAdd.dependantAnswer = question.dependantAnswer;
                        fieldToAdd.dependantField = question.dependantField;
                        fieldToAdd.dependantFieldOptions = question.dependantFieldOptions;
                        fieldToAdd.dependantItemOptions = question.dependantItemOptions;

                        questionsToAdd.push(fieldToAdd);
                    }
                });
            });
            tab.questions = questionsToAdd;
        }

        function checkForPartExist() {
            var blindType = $scope.order.orderItemGroups[0];
            var category = null;

            // Find Categroy
            for (var i = 0; i < $scope.blindTypes.length; i++) {
                if ($scope.blindTypes[i].itemNumber == blindType.itemNumber) {
                    category = $scope.blindTypes[i].categoryName;
                    break;
                }
            }
            var isThereParts = false;
            for (var i = 0; i < $scope.blindTypes.length; i++) {
                if ($scope.blindTypes[i].categoryName == category && $scope.blindTypes[i].isParts) {
                    isThereParts = true;
                }
            }
            if (!$scope.isPartIncluded)
                $scope.isPartIncluded = !isThereParts;
        }
        function addBlindType() {
            if (!$scope.order.blindType) {
                return;
            }
            $scope.selectedItemNumber = $scope.order.blindType.itemNumber;
            var tabExisted = false;
            var tabToUse;
            angular.forEach($scope.order.orderItemGroups, function (tab) {
                if ($scope.order.blindType.description === tab.itemName) {
                    tabToUse = tab;
                    tabExisted = true;
                }
            });

            if (!tabToUse) {
                angular.forEach($scope.order.orderItemGroups, function (tab) {
                    tab.tabActive = false;
                });

                tabToUse = {
                    itemName: $scope.order.blindType.description,
                    tabActive: true,
                    itemNumber: $scope.order.blindType.itemNumber,
                    loading: true,
                    isParts: $scope.order.blindType.isParts,
                    categoryNumber: $scope.order.blindType.categoryNumber,
                    items: []
                };

                $scope.order.orderItemGroups.push(tabToUse);
            }

            if (!tabExisted) {
                setItemStatus(tabToUse, function () {
                    setItemConfig(tabToUse);
                    addItem(tabToUse);
                    tabToUse.loading = false;
                });
            } else {
                tabToUse.tabActive = true;
                addItem(tabToUse);
                tabToUse.loading = false;
            }
            checkForPartExist();
        }

        function selectTab(tab) {
            // Reset Page
            $scope.currentPage = 0;

            $scope.selectedItemNumber = tab.itemNumber;

            for (var i = 0; i < $scope.order.orderItemGroups.length; i++) {
                $scope.order.orderItemGroups[i].tabActive = $scope.selectedItemNumber == $scope.order.orderItemGroups[i].itemNumber;
            }

            $timeout(function () {
                checkOrderItems();
            }, 10);
        }

        function addItem(tab) {
            $scope.submitted = false;

            //no tab. get the currently selected tab
            if (!tab) {
                angular.forEach($scope.order.orderItemGroups, function (itemGroup) {
                    if (itemGroup.tabActive)
                        tab = itemGroup;
                });
            }

            if (!$scope.order.items) {
                $scope.order.items = [];
            }

            if (tab.isParts) {
                var partItem = { itemPriceData: { categoryNumber: tab.categoryNumber, isPart: true } };
                $scope.order.items.push(partItem);
                tab.items.push(partItem);
            } else {
                var questions = angular.copy(tab.questions);
                var hasQuestionInDialog = false;

                angular.forEach(questions, function (question) {
                    //question is a dependant field and its list of items are dependant on another question.
                    //clear the available options as they will be set when the dependant field is selected
                    if ((question.dependantField && question.dependantFieldOptions) || question.dependantItemOptions)
                        question.options = question.name.indexOf('Fixing') > -1 ? [] : ['N/A'];

                    if (question.dependantItemOptions) {
                        angular.forEach(question.dependantItemOptions, function (dependantOption) {
                            if (dependantOption.itemNumber == tab.itemNumber) {
                                question.options = angular.copy(dependantOption.options);

                                if (question.name.indexOf('Fixing') < 0) {
                                    question.options.splice(0, 0, 'N/A');
                                }

                                //autoselect the first if there is only 1 option
                                if (question.options.length == 1)
                                    question.value = question.options[0];
                            }
                        });
                    }
                    if (question.showInDialog)
                        hasQuestionInDialog = true;
                });

                var item = {
                    itemNumber: tab.itemNumber,
                    itemName: tab.itemName,
                    questions: questions,
                    hasQuestionInDialog: hasQuestionInDialog
                };
                if (displaySquareMetreColumn(tab.itemNumber))
                    item.quantity = 1;

                if (!tab.displayMaterials && tab.displayColours) {
                    item.colours = tab.itemDetails.itemConfiguration.itemMaterials[0].colours;
                }

                $scope.order.items.push(item);
                tab.items.push(item);
            }

            tallyOrderTotal();
            setItemSortOrder();

            // Go to last page
            if ($scope.numberOfPages(tab.items) != $scope.currentPage)
                $scope.currentPage = $scope.numberOfPages(tab.items) - 1;
        }

        function removeItem(item, tab) {
            if (!item || !$scope.order.items)
                return;

            modalFactory.openGenericModal('Are you sure you want to delete this line item?', 'Delete').result.then(function (doDelete) {
                if (doDelete) {
                    var index = $scope.order.items.indexOf(item);
                    $scope.order.items.splice(index, 1);

                    if (tab) {
                        tab.items.splice(tab.items.indexOf(item), 1);

                        var anyItems = false;
                        angular.forEach($scope.order.items, function (i) {
                            if (tab.isParts) {
                                if (!anyItems && i.itemPriceData.categoryNumber === tab.categoryNumber) {
                                    anyItems = true;
                                }
                            } else {
                                if (!anyItems && i.itemNumber === tab.itemNumber) {
                                    anyItems = true;
                                }
                            }
                        });

                        if (!anyItems) {
                            $scope.order.orderItemGroups.splice($scope.order.orderItemGroups.indexOf(tab), 1);
                        }
                    }

                    tallyOrderTotal();
                    setItemSortOrder();
                }
            });
        }

        function openItemModal(item, tab) {
            modalFactory.openItemMoreDetailsModal(item, detailsMode).then(function () {
                pricingFieldChanged(item, tab);
            }, function () { });
        }

        function open($event) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.datePickerPopups.dateOpened = true;
        };

        function open2($event) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.datePickerPopups.shipOpened = true;
        };

        function getCustomer(val) {
            return sharedFactory.searchCustomer(val, false, false).then(function (data) {
                return data;
            });
        };

        function searchOrders(val) {
            return baseFactory.fetch('/api/order/SearchSageOrders?searchText=' + val).then(function (data) {
                // console.log(data.object);
                return data.object;
            });
        };

        function generateOrderToSave(isSplit) {
            var order = angular.copy($scope.order);
            order.artworkFile = $scope.doc;
            order.customerId = $scope.order.customer.customerId;
            order.customerName = $scope.order.customer.name;
            order.itemCount = $scope.order.items.length;
            order.orderDate = moment(order.orderDate).format(FILTER_CONSTANTS.FORMAL_DATE_FORMAT_MOMENT);
            if (order.deliveryDate !== null)
                order.deliveryDate = moment(order.deliveryDate).format(FILTER_CONSTANTS.FORMAL_DATE_FORMAT_MOMENT);
            order.status = null;
            order.orderItemGroups = [];
            var copyUiData = angular.copy($scope.order.uiData);
            copyUiData.shipVia = $scope.order.shipVia;
            order.uiData = angular.toJson(copyUiData);
            order.orderData = angular.toJson($scope.order.orderData);

            //Remove some properties off the object to reduce packet size
            delete order.itemStatuses;
            delete order.customFields;
            delete order.configuration;
            delete order.sageItems;

            if ($scope.order.sageOrder !== null) {
                order.orderNumber = $scope.order.sageOrder.orderNumber;
            }

            var splitItemOrders = [];
            var origItemOrders = [];
            angular.forEach(order.items, function (item) {
                var questionsToAdd = [];
                var index = 0;
                if (item.location) {
                    addQuestion(questionsToAdd, 0, item.location, index, "Location", true, "OE35");
                    index++;
                }
                if (item.width) {
                    addQuestion(questionsToAdd, 0, item.width, index, "Width", true, "OE1");
                    index++;
                }
                if (item.drop) {
                    addQuestion(questionsToAdd, 0, item.drop, index, "Drop", true, "OE2");
                    index++;
                }
                if (item.material) {
                    addQuestion(questionsToAdd, 0, item.material, index, "Material", true, "OE34");
                    index++;
                }
                if (item.colour) {
                    addQuestion(questionsToAdd, 0, item.colour, index, "Colour", true, "OE132");
                    index++;
                }
                if (item.slatQuantity) {
                    addQuestion(questionsToAdd, 0, item.slatQuantity, index, "Slat Quantity", true, "OE32");
                    index++;
                }

                angular.forEach(item.questions, function (question, idx) {
                    addQuestion(questionsToAdd, question.id, question.value, index + idx, question.name, false, question.orderItemOptionalField);
                });

                item.questions = questionsToAdd;
                if (typeof item.isSplit !== 'undefined' && item.isSplit && isSplit) {
                    splitItemOrders.push(angular.copy(item));
                } else {
                    origItemOrders.push(angular.copy(item));
                }
            });
            if (isSplit) {
                var parts = [];
                var orig = angular.copy(order);
                orig.items = [];
                var k = 0;
                var so = 1;
                for (k = 0; k < origItemOrders.length; k++) {
                    if (typeof origItemOrders[k].part === 'undefined' || origItemOrders[k].part === null) {
                        origItemOrders[k].sortOrder = so;
                        orig.items.push(angular.copy(origItemOrders[k]));
                        so++;
                    } else {
                        parts.push(angular.copy(origItemOrders[k]));
                    }
                }
                for (k = 0; k < parts.length; k++) {
                    parts[k].sortOrder = so;
                    orig.items.push(angular.copy(parts[k]));
                    so++;
                }
                //
                var copy = angular.copy(order);
                copy.items = [];
                copy.orderNumber = null;
                copy.orderId = null;
                copy.id = 0;
                so = 1;
                for (k = 0; k < splitItemOrders.length; k++) {
                    splitItemOrders[k].id = 0;
                    splitItemOrders[k].sortOrder = so;
                    copy.items.push(angular.copy(splitItemOrders[k]));
                    so++;
                }
                for (k = 0; k < parts.length; k++) {
                    parts[k].id = 0;
                    parts[k].sortOrder = so;
                    copy.items.push(angular.copy(parts[k]));
                    so++;
                }
                //
                tallyOrderTotalData(orig);
                tallyOrderTotalData(copy);
                //
                return [orig, copy];
            }

            return order;
        }

        function addQuestion(questionArray, id, value, displayOrder, name, isNonCustomField, orderItemOptionalField) {
            questionArray.push({
                id: id,
                value: value,
                displayOrder: displayOrder,
                name: name,
                isNonCustomField: isNonCustomField,
                sageOptionalFieldName: orderItemOptionalField
            });
        }

        function isValid(form) {
            try {
                if (form.$invalid) {
                    return false;
                }

                if (!$scope.order.items || $scope.order.items.length < 1) {
                    return false;
                }

                return true;
            } catch (er) {
                // console.log(er);
                return false;
            }
        }

        function checkOrderItems() {
            if ($scope.submitted) {
                $scope.errorNotParts = "";
                $scope.errorParts = "";
                $scope.noPricing = [];
                $scope.partIndexes = [];
                $scope.notPartIndexes = [];

                // Not Parts
                var len = document.getElementsByClassName("tab-item-not-part tab-item-active").length;
                for (var x = 0; x < len; x++) {
                    var tabItem = document.getElementsByClassName("tab-item-not-part tab-item-active")[x];
                    if (tabItem.className.indexOf('ng-invalid') >= 0) {
                        $scope.notPartIndexes.push(x + 1);
                    }
                }
                if ($scope.notPartIndexes.length > 0)
                    $scope.errorNotParts = $scope.notPartIndexes.length > 1 ? "Lines " + $scope.notPartIndexes.join(', ') + " have errors. Please correct before submitting the order" : "Line " + $scope.notPartIndexes[0] + " has errors. Please correct before submitting the order";

                // Parts
                len = document.getElementsByClassName("tab-item-part tab-item-active").length;
                for (x = 0; x < len; x++) {
                    var tabItemm = document.getElementsByClassName("tab-item-part tab-item-active")[x];
                    if (tabItemm.className.indexOf('ng-invalid') >= 0) {
                        $scope.partIndexes.push(x + 1);
                    }
                }
                if ($scope.partIndexes.length > 0)
                    $scope.errorParts = $scope.partIndexes.length > 1 ? "Lines " + $scope.partIndexes.join(', ') + " have errors. Please correct before submitting the order" : "Line " + $scope.partIndexes[0] + " has errors. Please correct before submitting the order";
            }
        }

        function createNewOrder(form, isQuote, isSplit) {
            membershipFactory.ping3(function () {
                $scope.submitted = true;
                checkOrderItems();

                if (!$scope.order.customer || !$scope.order.customer.customerId) {
                    $scope.order.customer = undefined;
                    return;
                }
                var orderType = isQuote ? "save this quote" : "submit this order";
                // console.log(orderType);

                if (!isValid(form)) {
                    console.log(form);
                    return;
                }

                if (isSplit)
                    return createSplitOrder(orderType);

                var runDialog = function (isValidate, msg) {
                    promptFactory.dialog('Confirm Submit', "<div class='clearfix'>" + msg + "<p>Are you sure you want to " + orderType + "?</p></div>", "md", null, 'Yes', 'No', function (result) {
                        if (result && result.result) {
                            $scope.errors = [];
                            $scope.order.errorExists = false;
                            $scope.loading = true;
                            var orderToSave = generateOrderToSave(false);
                            var uri = isQuote ? '/api/order/addquote' : 'api/order/save';
                            baseFactory.post(
                                uri + (isValidate ? '' : '?val=false'),
                                orderToSave,
                                true,
                                false
                            ).then(function (data) {
                                if (!data.isErrored) {
                                    $state.go('^', null, { reload: true });
                                } else {
                                    if (data.object === null) {
                                        runDialog(false, '<i class="fa-4x pull-left fa fa-exclamation-circle text-danger" style="margin-bottom: 30px"></i><p class="p-top0 padding-10 m-bottom0">' + data.errors[0].errorMessage + '</p>');
                                    } else {
                                        $scope.order.errorExists = data.object.errorExists;
                                        if (data.object.errorExists && data.object.errorMessage && data.object.errorMessage.length > 0) {
                                            $scope.errors.push(data.object.errorMessage);
                                        }

                                        if (data.object.items) {
                                            angular.forEach(data.object.items, function (item) {
                                                if (item.errorExists && item.errorMessage && item.errorMessage.length > 0) {
                                                    $scope.errors.push(item.errorMessage);
                                                }
                                            });
                                        }
                                    }
                                }
                            }).finally(function () {
                                $scope.loading = false;
                            });
                        }
                    });
                };
                runDialog(true, "");
            });
        }

        function createSplitOrder(orderType) {
            var runDialog = function (isValidate, msg, orderTypeTemp) {
                promptFactory.dialog('Confirm Submit', "<div class='clearfix'>" + msg + "<p>Are you sure you want to " + orderTypeTemp + "?</p></div>", "md", null, 'Yes', 'No', function (result) {
                    if (result && result.result) {
                        $scope.errors = [];
                        $scope.order.errorExists = false;
                        $scope.loading = true;
                        var orderToSave = generateOrderToSave(true);
                        console.log(orderToSave);
                        var uri = 'api/order/save';
                        var ctr = 0;
                        var saveOrder = function (indx) {
                            baseFactory.post(
                                uri + (isValidate ? '' : '?val=false'),
                                orderToSave[indx],
                                true,
                                false
                            ).then(function (data) {
                                if (!data.isErrored) {
                                    ctr++;
                                    if (ctr < orderToSave.length)
                                        saveOrder(ctr);
                                    else
                                        $state.go('^', null, { reload: true });
                                } else {
                                    if (data.object === null) {
                                        runDialog(false, '<i class="fa-4x pull-left fa fa-exclamation-circle text-danger" style="margin-bottom: 30px"></i><p class="p-top0 padding-10 m-bottom0">' + data.errors[0].errorMessage + '</p>');
                                    } else {
                                        $scope.order.errorExists = data.object.errorExists;
                                        if (data.object.errorExists && data.object.errorMessage && data.object.errorMessage.length > 0) {
                                            $scope.errors.push(data.object.errorMessage);
                                        }

                                        if (data.object.items) {
                                            angular.forEach(data.object.items, function (item) {
                                                if (item.errorExists && item.errorMessage && item.errorMessage.length > 0) {
                                                    $scope.errors.push(item.errorMessage);
                                                }
                                            });
                                        }
                                    }
                                }
                            }).finally(function () {
                                $scope.loading = false;
                            });
                        }

                        saveOrder(ctr);
                    }
                });
            };
            runDialog(true, "", orderType);
        }

        function convertQuoteToOrder(form) {
            $scope.submitted = true;
            checkOrderItems();

            if (!$scope.order.customer || !$scope.order.customer.customerId) {
                $scope.order.customer = undefined;
                return;
            }

            // console.log("quote to an order");
            if (!isValid(form)) {
                return;
            }

            promptFactory.confirm("Are you sure you want to convert this quote to an order?", function (result) {
                if (result) {
                    $scope.errors = [];
                    $scope.order.errorExists = false;
                    $scope.loading = true;
                    var orderToSave = generateOrderToSave();
                    baseFactory.post(
                        '/api/order/convertquotetoorder',
                        orderToSave
                    ).then(function (data) {
                        if (!data.isErrored) {
                            $state.go('^', null, { reload: true });
                        } else {
                            $scope.order.errorExists = data.object.errorExists;
                            if (data.object.errorExists && data.object.errorMessage && data.object.errorMessage.length > 0) {
                                $scope.errors.push(data.object.errorMessage);
                            }

                            if (data.object.items) {
                                angular.forEach(data.object.items, function (item) {
                                    if (item.errorExists && item.errorMessage && item.errorMessage.length > 0) {
                                        $scope.errors.push(item.errorMessage);
                                    }
                                });
                            }
                        }
                    }).finally(function () {
                        $scope.loading = false;
                    });
                }
            });
        }

        function colourChanged(item, tab) {
            if (!item || !item.colours || !$scope.itemStatuses) {
                return;
            }

            angular.forEach($scope.itemStatuses, function (status) {
                if ((!tab.displayMaterials && (!status.material || status.material.trim().toLowerCase() === noMaterialName.trim().toLowerCase())) || (tab.displayMaterials && status.material.trim().toLowerCase() === item.material.trim().toLowerCase())) {
                    angular.forEach(status.colours, function (statusColour) {
                        if (item.colour.trim().toLowerCase() === statusColour.colour.trim().toLowerCase()) {
                            angular.forEach(statusColour.items, function (statusColourItem) {
                                if (statusColourItem.itemNumber.trim().toLowerCase() === tab.itemNumber.trim().toLowerCase() && statusColourItem.status && statusColourItem.status.trim().length > 0) {
                                    modalFactory.openAlertModal((item.colour + ' Stock Alert').toUpperCase(), statusColourItem.status);
                                }
                            });
                        }
                    });
                }
            });
        }

        function setOptionsFromMaterial(itemNumber, fieldName, materials, options, item, tab) {
            if (item.itemNumber === itemNumber) {
                for (var i = 0; i < tab.questions.length; i++) {
                    try {
                        if (item.questions[i].name === fieldName) {
                            if (materials.indexOf(item.material) >= 0) {
                                item.questions[i].options = angular.copy(options);
                                if (item.questions[i].options.indexOf(item.questions[i].value) < 0)
                                    item.questions[i].value = item.questions[i].options[0];
                            } else {
                                for (var j = 0; j < tab.questions[i].dependantItemOptions.length; j++) {
                                    if (tab.questions[i].dependantItemOptions[j].itemNumber === itemNumber) {
                                        item.questions[i].options = angular.copy(tab.questions[i].dependantItemOptions[j].options);
                                        item.questions[i].options.unshift('N/A');
                                        if (item.questions[i].options.indexOf(item.questions[i].value) < 0)
                                            item.questions[i].value = item.questions[i].options[0];
                                    }
                                }
                            }
                        }
                    } catch (e) { }
                }
            }
        }

        function partPricingFieldChanged(lineItem) {
            //console.log(lineItem)
            if (!lineItem.part || !lineItem.part.partNumber) {
            } else {
                if (!lineItem.itemPriceData.quantity || isNaN(lineItem.itemPriceData.quantity)) {
                    lineItem.itemPriceData.quantity = 0;
                }

                calculatePartPrice(lineItem);

                lineItem.quantity = lineItem.itemPriceData.quantity;

                tallyOrderTotal();
            }
        }

        function squareMetreTotal(orderData) {
            var total = 0;
            angular.forEach(orderData.orderItemGroups, function (g) {
                angular.forEach(g.items, function (item) {
                    if (typeof item.itemPriceData !== 'undefined')
                        if (typeof item.itemPriceData.squareMetre !== 'undefined' && item.itemPriceData.squareMetre != null)
                            total = total + item.itemPriceData.squareMetre;
                });
            });
            return total;
        }

        function calculatePartPrice(lineItem) {
            if (!lineItem.itemPriceData.unitPrice || isNaN(lineItem.itemPriceData.unitPrice)) {
                lineItem.itemPriceData.unitPrice = 0;
            }
            if ((lineItem.part.unit || '').toLowerCase().trim() === 'mt') {
                if (!lineItem.itemPriceData.length) {
                    lineItem.itemPriceData.length = 0;
                }

                lineItem.itemPriceData.unitPrice = (lineItem.itemPriceData.length / 1000) * lineItem.itemPriceData.partUserEnteredUnitPrice;
                lineItem.itemPriceData.totalPrice = lineItem.itemPriceData.unitPrice * lineItem.itemPriceData.quantity;
            } else {
                lineItem.itemPriceData.unitPrice = lineItem.itemPriceData.partUserEnteredUnitPrice;
                lineItem.itemPriceData.totalPrice = lineItem.itemPriceData.unitPrice * lineItem.itemPriceData.quantity;
            }
        }
        $scope.previousBentTrackStat1 = false;
        $scope.previousBentTrackStat2 = false;
        $scope.disableBentTrack = function (lineItem, tab) {
            var controlTypeIsNotHandDrawn = false;
            var trackIsNotResidential = false;
            var trackColourIsNotHandDraw = false;
            angular.forEach(lineItem.questions, function (q) {
                if (q.name.toLowerCase() === "control type" && q.value && q.value.toLowerCase() !== 'hand drawn') {
                    controlTypeIsNotHandDrawn = true;
                }
                if (tab.itemNumber === "1550" && q.name.toLowerCase() === "track" && q.value && q.value.toLowerCase().indexOf('residential') < 0) {
                    trackIsNotResidential = true;
                }
                if (q.name.toLowerCase() === "track colour" && q.value && q.value.toLowerCase().indexOf('hand draw') < 0) {
                    trackColourIsNotHandDraw = true;
                }
                if ((controlTypeIsNotHandDrawn || trackIsNotResidential || trackColourIsNotHandDraw) && (q.typeName.toLowerCase() === 'curvedtracks' || q.typeName.toLowerCase() === 'benttracks')) {
                    q.tempValue = null;
                    q.value = null;
                }
            });
            if ($scope.previousBentTrackStat1 !== controlTypeIsNotHandDrawn) {
                $scope.previousBentTrackStat1 = controlTypeIsNotHandDrawn;
                pricingFieldChanged(lineItem, tab);
            }
            if ($scope.previousBentTrackStat2 !== trackIsNotResidential) {
                $scope.previousBentTrackStat2 = trackIsNotResidential;
                pricingFieldChanged(lineItem, tab);
            }

            return (controlTypeIsNotHandDrawn || trackIsNotResidential || trackColourIsNotHandDraw);
        };
        function pricingFieldChanged(lineItem, tab) {
            if (lineItem.itemNumber === "120") {
                lineItem.quantity = 1;
            }

            if (!lineItem.quantity || isNaN(lineItem.quantity)) {
                lineItem.quantity = 0;
            }

            var okToPrice = lineItem.itemNumber && lineItem.itemNumber.length && lineItem.quantity >= 0 && $scope.order.customer != null;

            if (!okToPrice) {
                return;
            }

            if (tab.displayMaterials && !lineItem.material) {
                return;
            }

            if (!tab.displayMaterials && tab.displayColours && !lineItem.colour) {
                return;
            }

            var customFieldValues = [];
            var hasSlatSize = false;
            var controlTypeIsNotHandDrawn = false;
            var trackIsNotResidential = false;
            var trackColourIsNotHandDraw = false;
            angular.forEach(lineItem.questions, function (q) {
                if (q.value)
                    customFieldValues.push({
                        name: q.name,
                        value: q.value
                    });

                setDisabledDropDownFieldOptions(lineItem, q);
                if (q.name.toLowerCase() === "slat size" && q.value && q.value.toLowerCase() !== 'n/a') {
                    hasSlatSize = true;
                }
                if (q.name.toLowerCase() === "control type" && q.value && q.value.toLowerCase() !== 'hand drawn') {
                    controlTypeIsNotHandDrawn = true;
                }
                if (tab.itemNumber === "1550" && q.name.toLowerCase() === "track" && q.value && q.value.toLowerCase().indexOf('residential') < 0) {
                    trackIsNotResidential = true;
                }
                if (q.name.toLowerCase() === "track colour" && q.value && q.value.toLowerCase().indexOf('hand draw') < 0) {
                    trackColourIsNotHandDraw = true;
                }
                if ((controlTypeIsNotHandDrawn || trackIsNotResidential || trackColourIsNotHandDraw) && (q.typeName.toLowerCase() === 'curvedtracks' || q.typeName.toLowerCase() === 'benttracks')) {
                    q.tempValue = null;
                    q.value = null;
                }
            });

            if (displaySlatQuantityColumn(lineItem.itemNumber)) {
                okToPrice = lineItem.slatQuantity && hasSlatSize;
            }
            else if (!displayDropColumn(lineItem.itemNumber)) {
                okToPrice = lineItem.width;
            } else {
                okToPrice = lineItem.width && lineItem.drop;
            }

            if (!okToPrice) {
                return;
            }

            var pricingData = {
                //customerId: $scope.customer.customerId || $scope.order.customerId,
                customerId: $scope.order.customer.customerId,
                itemNumber: lineItem.itemNumber,
                varianceId: 0,
                width: lineItem.width,
                drop: lineItem.drop,
                quantity: lineItem.quantity,
                material: lineItem.material,
                colour: lineItem.colour,
                slatQuantity: lineItem.slatQuantity,
                customFieldValues: customFieldValues
            };

            var cached = JSON.stringify(pricingData);

            if (angular.equals(lineItem.cached, cached)) {
                return;
            }

            lineItem.cached = cached;

            getPrice(pricingData).then(function (pricingData) {
                lineItem.itemPriceData = pricingData;
                tallyOrderTotal();

                //
                $scope.order.orderData['pricingMessage'] = pricingData.pricingMessage;
                if (pricingData.shipDate != null)
                    $scope.order.deliveryDate = pricingData.shipDate;
            });
        }

        function getPrice(pricingData) {
            return baseFactory.call(
                '/api/Pricing/PriceItem/?orderDate=' + moment($scope.order.orderDate).format(FILTER_CONSTANTS.FORMAL_DATE_FORMAT_MOMENT),
                pricingData
            ).then(function (data) {
                return data.object;
            });
        }

        function tallyOrderTotal() {
            var total = 0;
            $scope.isItemBasePriceNotSet = false;
            angular.forEach($scope.order.items, function (item) {
                if (item.itemPriceData && !isNaN(item.itemPriceData.unitPrice) && !isNaN(item.itemPriceData.quantity)) {
                    if (item.itemPriceData.isPart) {
                        calculatePartPrice(item);
                    } else {
                        item.itemPriceData.totalPrice = item.itemPriceData.unitPrice * item.itemPriceData.quantity;
                    }

                    total += item.itemPriceData.totalPrice;
                    if (item.itemPriceData.baseUnitPrice === 0 && item.itemPriceData.unitPrice > 0 && !item.itemPriceData.isPart)
                        $scope.isItemBasePriceNotSet = true;
                }
            });
            $scope.order.total = total;
        }

        function tallyOrderTotalData(order) {
            var total = 0;
            $scope.isItemBasePriceNotSet = false;
            angular.forEach(order.items, function (item) {
                if (item.itemPriceData && !isNaN(item.itemPriceData.unitPrice) && !isNaN(item.itemPriceData.quantity)) {
                    if (item.itemPriceData.isPart) {
                        calculatePartPrice(item);
                    } else {
                        item.itemPriceData.totalPrice = item.itemPriceData.unitPrice * item.itemPriceData.quantity;
                    }

                    total += item.itemPriceData.totalPrice;
                    if (item.itemPriceData.baseUnitPrice === 0 && item.itemPriceData.unitPrice > 0 && !item.itemPriceData.isPart)
                        $scope.isItemBasePriceNotSet = true;
                }
            });
            order.total = total;
        }

        function displayPriceBreakdown(item) {
            $modal.open({
                templateUrl: '/app/modules/order/priceBreakdownModal/priceBreakdown.html',
                controller: 'priceBreakdown',
                size: 'lg',
                resolve: {
                    item: function () {
                        return item;
                    }
                }
            });
        }

        function disabledOptions(item, field) {
            if (field.disabledOptions) {
                return field.disabledOptions;
            }
            setDisabledDropDownFieldOptions(item, field);
            return field.disabledOptions;
        }

        function setDisabledDropDownFieldOptions(item, field) {
            field.disabledOptions = [];

            var motorSelected = false;

            if (field.name.toLowerCase() === "cont side") {
                angular.forEach(item.questions, function (q) {
                    if (q.name.toLowerCase() === "control type" && (q.value && q.value.toLowerCase() === "wand")) {
                        motorSelected = true;
                    }
                });
            }

            angular.forEach(field.options, function (option) {
                var disabled = false;

                if (motorSelected && (option.toLowerCase() === 'll' || option.toLowerCase() === 'rr')) {
                    disabled = true;
                }

                field.disabledOptions.push({ text: option, disabled: disabled });
            });
        }

        function displayQuantityColumn(itemNumber) {
            if (itemNumber === "120" || itemNumber === "1045") {
                return false;
            }
            return true;
        }

        function displaySquareMetreColumn(itemNumber) {
            if (itemNumber === "1000" || itemNumber === "1010" || itemNumber === "1020" || itemNumber === "1025" || itemNumber === "1030" || itemNumber === "1040" || itemNumber === "1045") {
                return true;
            }
            return false;
        };

        function displayWidthColumn(itemNumber) {
            if (itemNumber === "120") {
                return false;
            }
            return true;
        }

        function displayDropColumn(itemNumber) {
            if (itemNumber === "1500" || itemNumber === "1510" || itemNumber === "1520" || itemNumber === "1530" || itemNumber === "503") {
                return false;
            }
            return true;
        }

        function displaySlatQuantityColumn(itemNumber) {
            if (itemNumber === "120") {
                return true;
            }
            return false;
        }

        function cloneLineItem(item, tab) {
            var clone = angular.copy(item);
            clone.id = 0;
            clone.location = (clone.location || "") + " - Copy";
            $scope.order.items.push(clone);
            tab.items.push(clone);
            tallyOrderTotal();
            setItemSortOrder();
        }

        function onPartSelect($item, $model, $label, item, tab) {
            item.part = angular.copy($item);
            item.itemPriceData = {
                baseUnitPrice: $item.price,
                unitPrice: $item.price,
                partUserEnteredUnitPrice: $item.price,
                itemNumber: $model.partNumber,
                colour: $item.colours.length > 0 ? $item.colours[0] : null,
                quantity: item.itemPriceData && item.itemPriceData.quantity ? item.itemPriceData.quantity : 1,
                isPart: true,
                categoryNumber: tab.categoryNumber
            };

            item.itemNumber = $item.partNumber;
            item.itemname = $item.description;

            partPricingFieldChanged(item);
        }

        function setItemSortOrder() {
            angular.forEach($scope.order.orderItemGroups, function (itemGroup) {
                angular.forEach(itemGroup.items, function (item, $index) {
                    item.sortOrder = $index + 1;
                });
            });
        }

        function purchaseOrderNumberChanged(purchaseOrderNumber) {
            // console.log($scope.order.customer, purchaseOrderNumber);
            if ($scope.order.customer && purchaseOrderNumber) {
                baseFactory.fetch('/api/Order/GetDuplicatePurchaseOrders?purchaseOrderNumber=' + purchaseOrderNumber + '&orderId=' + $scope.order.id + '&customerNumber=' + $scope.order.customer.customerId).then(function (data) {
                    if (!data.isErrored && data.object !== null && data.object.length > 0) {
                        var modalInstance = $modal.open({
                            templateUrl: '/app/modules/order/duplicatePurchaseOrderModal/duplicatePurchaseOrderModal.html',
                            controller: 'duplicatePurchaseOrderModal',
                            size: 'lg',
                            resolve: {
                                duplicates: function () {
                                    return data.object;
                                }
                            }
                        });

                        modalInstance.result.then(
                            function () {
                            }, function (isReload) {
                            });
                    }
                });
            }
        }

        function toggleDeliveryDateFixed() {
            $scope.order.uiData.deliveryDateFixed = !$scope.order.uiData.deliveryDateFixed;
        }

        var dataToSend = {
            orderDate: '',
            customerId: '',
            categoryCode: '',
            itemNumber: ''
        };

        $scope.$watchCollection('order', function (v) {
            if (!$scope.isNew) {
                return;
            }

            var currentData = {
                orderDate: moment(v.orderDate).format('YYYY-MM-DD'),
                customerId: '',
                categoryCode: '',
                itemNumber: ''
            };

            if (typeof v.customer !== "undefined")
                if (typeof v.customer.customerId !== "undefined" && v.customer.customerId != null) {
                    currentData.customerId = v.customer.customerId;
                } else {
                    currentData.customerId = '';
                }

            if (typeof v.items !== "undefined" && v.items != null && v.items.length > 0) {
                currentData.itemNumber = v.items[0].itemNumber;
            } else {
                currentData.itemNumber = '';
            }

            if (typeof v.orderItemGroups !== "undefined" && v.orderItemGroups != null && v.orderItemGroups.length > 0) {
                currentData.categoryCode = v.orderItemGroups[0].categoryNumber;
            } else {
                currentData.categoryCode = '';
            }

            if (dataToSend.orderDate != currentData.orderDate ||
                dataToSend.customerId != currentData.customerId ||
                dataToSend.itemNumber != currentData.itemNumber ||
                dataToSend.categoryCode != currentData.categoryCode) {
                dataToSend = angular.copy(currentData);
                baseFactory.fetch('/api/deliveryTime/calculate', dataToSend).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.order.deliveryDate = rdata.object;
                    }
                });
            }
        });

        // console.log($scope.order);
        // console.log(angular.fromJson($scope.order.configuration.value));

        $scope.openManageStatus = function (or) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderDetailModal/orderDetail.html',
                controller: 'orderDetail',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    order: function () {
                        return or;
                    },
                    orderStatuses: function () {
                        return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                            return rrdata.object;
                        });
                    },
                    gridName: function () {
                        return "";
                    }
                }
            }).result.then(function (obj) {
                $scope.order.status = obj.status;
                $scope.order.statusId = obj.statusId;
                $scope.order.orderStatusHistory = obj.orderStatusHistory;
            }, function (isReloadPage) {
            });
        };
        $scope.checkStatus = function (stat) {
            var status = typeof stat === 'string' ? stat : stat.name;
            if ($scope.isNew) return false;
            var returnValue = (status.toLowerCase().trim() !== "quote" && status.toLowerCase().trim() !== "posted" && status.toLowerCase().trim() !== "completed");
            if ($rootScope.clientName && ($rootScope.clientName === "TWC" || $rootScope.clientName === "RETAILBLINDS"))
                if (status.toLowerCase().trim() === "completed")
                    return false;
            return returnValue;
        };

        $scope.openOrderAlerts = function (order) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderAlertsModal/orderAlerts.html',
                controller: 'OrderAlertsCtrl',
                size: 'lg',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    orderId: function () {
                        return order.id;
                    }
                }
            });
            modalInstance.result.then(function () { },
                function (isReload) { });
        };
        $scope.viewOrderApiData = function (m) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderApiDataModal/orderApiDataModal.html',
                controller: 'OrderApiDataModalCtrl',
                size: 'lg',
                resolve: {
                    order: function () {
                        return m;
                    },
                    apiData: function () {
                        return baseFactory.fetch('/api/order/getOrderApiData/' + m.id).then(function (rdata) {
                            return rdata.object;
                        });
                    }
                }
            });
            modalInstance.result.then(function () { },
                function (isReload) { });
        };
        $scope.addItemParts = function () {
            var blindType = $scope.order.orderItemGroups[0];
            var category = null;

            // Find Categroy
            for (var i = 0; i < $scope.blindTypes.length; i++) {
                if ($scope.blindTypes[i].itemNumber === blindType.itemNumber && !$scope.blindTypes[i].isParts) {
                    category = $scope.blindTypes[i].categoryName;
                    break;
                }
            }

            // Find Parts
            if (category !== null)
                for (i = 0; i < $scope.blindTypes.length; i++) {
                    if ($scope.blindTypes[i].categoryName === category && $scope.blindTypes[i].isParts) {
                        $scope.order.blindType = $scope.blindTypes[i];
                        $scope.addBlindType();
                        $scope.isPartIncluded = true;
                        break;
                    }
                }
        };

        // PAGING
        $scope.currentPage = 0;
        $scope.pageSize = 10;

        $scope.numberOfPages = function (items) {
            return Math.ceil(items.length / $scope.pageSize);
        };
        $scope.previousPage = function () {
            if ($scope.currentPage > 0) {
                $scope.currentPage = $scope.currentPage - 1;
            }
        };
        $scope.nextPage = function () {
            $scope.currentPage = $scope.currentPage + 1;
        };

        // SPLIT
        $scope.isEnableSplitOrders = false;
        $scope.enableSplitOrders = function () {
            $scope.isEnableSplitOrders = true;
        };
        $scope.disableSplitOrders = function () {
            $scope.isEnableSplitOrders = false;
        };
        $scope.clickToSplitOrder = function (orderItem) {
            orderItem.isSplit = typeof orderItem.isSplit === 'undefined' ? true : !orderItem.isSplit;
        };
    }
})();
orderModule.controller('orderCtrl',
    ['$scope', '$controller', 'baseFactory', '$modal', '$rootScope', '$state', '$stateParams', 'GRID_CONSTANTS', 'promptFactory', 'permissionFactory', 'clientHelperFactory',
        'orderStatuses', 'categories', 'printers', 'orderTemplateUrl',
        function ($scope, $controller, baseFactory, $modal, $rootScope, $state, $stateParams, GRID_CONSTANTS, promptFactory, permissionFactory, clientHelperFactory,
            orderStatuses, categories, printers, orderTemplateUrl) {
            // console.log(orderStatuses);
            angular.extend(this, $controller('OrderAdvancedCtrl', {
                $scope: $scope,
                extraParams: {
                    statusId: null,
                    excludeQuotes: true,
                    sort: "orderDate desc",
                    cid: typeof $stateParams.customerId === 'undefined' ? null : $stateParams.customerId,
                    uid: typeof $stateParams.userId === 'undefined' ? null : $stateParams.userId
                },
                orderStatuses: orderStatuses,
                categories: categories,
                printers: printers,
                orderTemplateUrl: orderTemplateUrl
            }));
        }
    ]);
orderModule.controller('OrderAdvancedCtrl',
    ['$scope', 'baseFactory', '$modal', '$rootScope', '$state', '$stateParams', '$controller', 'GRID_CONSTANTS', 'promptFactory', 'permissionFactory', 'clientHelperFactory',
        'extraParams', 'orderStatuses', 'categories', 'printers', 'orderTemplateUrl',
        function ($scope, baseFactory, $modal, $rootScope, $state, $stateParams, $controller, GRID_CONSTANTS, promptFactory, permissionFactory, clientHelperFactory,
            extraParams, orderStatuses, categories, printers, orderTemplateUrl) {

            $scope.currentState = $state.current.name;
            $scope.orders = [];
            $scope.printers = printers;
            $scope.categories = categories;
            $scope.canCreateStandardOrder = ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN") && ($rootScope.user.userType === 1 || $rootScope.user.userType === 4);

            var tempOrderStatuses = angular.copy(orderStatuses.object);
            var isExist = false;
            angular.forEach(tempOrderStatuses, function (tt) {
                if (tt.id === null) {
                    isExist = true;
                }
            });
            if (!isExist) {
                tempOrderStatuses.unshift({
                    id: -1,
                    name: "All Open Orders"
                });
                tempOrderStatuses.unshift({
                    id: null,
                    name: "All Order Statuses"
                });
            }

            $scope.getOrderStatusColor = function (order) {

                var statusIsExist = false;
                angular.forEach(orderStatuses.object, function (value, index) {
                    if (value.name === order) {
                        if (value.colour) {
                            $scope.orderStatusColor = value.colour;
                            statusIsExist = true;
                        }
                    }
                });

                if (statusIsExist) {
                    return { 'background-color': $scope.orderStatusColor };
                } else {
                    return { 'color': 'black' };
                }
            };

            initGrid();

            function initGrid() {
                $scope.gridOptions = {
                    itemType: 'Orders',
                    gridName: 'orders',
                    fetchUrl: '/api/order/SearchOrders',
                    exportUrl: '/exportGrid/getOrders/',
                    initSortString: 'dateUpdated desc',
                    enableSorting: false,
                    enableSearching: true,
                    enablePaging: true,
                    enableDateRange: true,
                    enableExport: false,
                    enableCustomButtons: true,
                    columnDefs: [],
                    controlCellTemplateHtml: controlHtml(),
                    customButtonsHtml: customButtons(),
                    controlColumnWidth: '100%',
                    headerRowHeight: 1,
                    enableCustomFields: true,
                    extraParams: extraParams,
                    extraData: {
                        orderStatuses: [],
                        fields: [
                            { id: "dateUpdated desc", name: "Last Updated" },
                            { id: "orderDate desc", name: "Order Date" },
                            { id: "dateCreated desc", name: "Date Created" },
                            { id: "total desc", name: "Total" },
                            { id: "itemName desc", name: "Item Name" }
                        ]
                    }
                };

                if ($scope.currentState === "base.orders") {
                    $scope.gridOptions.customFieldsHtml = '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                        '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.statusId" class="form-control" ng-options="order.id as order.name for order in dg.fetchOptions.extraData.orderStatuses"></select>';
                    $scope.gridOptions.extraData.orderStatuses = tempOrderStatuses;
                }

                function customButtons() {
                    return '<div class="btn-group" dropdown style="margin-right: -1px;margin-left: -1px;">' +
                        '<button class="btn btn-default" dropdown-toggle title="Sort"><i class="fa fa-sort"></i></button>' +
                        '<ul class="dropdown-menu dropdown-menu-right" dropdown-menu>' +
                        '<li ng-repeat="s in dg.fetchOptions.extraData.fields" ng-class="{\'active\': s.id==dg.fetchOptions.extraParams.sort}"><a class="cursor-pointer" ng-click="dg.fetchOptions.extraParams.sort=s.id;updateSearch()">{{s.name}}</a></li>' +
                        '</ul>' +
                        '</div>' +
                        '<div class="btn-group" dropdown style="margin-right: -1px;margin-left: -1px;">' +
                        '<button class="btn btn-default" dropdown-toggle title="Export">Export <i class="caret"></i></button>' +
                        '<ul class="dropdown-menu dropdown-menu-right" dropdown-menu>' +
                        (($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN") ? '<li><a class="cursor-pointer" ng-click="exportProductionSchedule()">Export Production Schedule</a></li>' : '') +
                        '<li><a class="cursor-pointer" ng-click="exportOrderData()">Export Orders</a></li>' +
                        '</ul>' +
                        '</div>';
                }

                function controlHtml() {
                    var html = '<div ng-include src="\'' + orderTemplateUrl + '\'"></div>';
                    // var html = '<div ng-include src="\'/app/modules/order/orderTemplate.html\'"></div>';
                    return html;
                }
            }

            angular.extend(this, $controller('OrderAdvancedExtensionCtrl', { $scope: $scope }));
            $scope.allocatePrinter = function (order, printerId) {
                var allocateOrder = function () {
                    var dataToSend = {
                        calendarId: printerId,
                        start: moment().format("YYYY-MM-DD"),
                        end: moment().format("YYYY-MM-DD"),
                        title: order.orderNumber,
                        allDay: true,
                        eventType: 1,
                        orderId: order.id,
                        id: 0,
                        isPrivate: false
                    };
                    baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    });
                };
                if (order.statusId !== 8) {
                    baseFactory.fetch('/api/order/updateorderstatus', { orderId: order.id, statusId: 8 }).then(function (rdata) {
                        if (!rdata.isErrored) {
                            allocateOrder();
                        }
                    });
                } else {
                    allocateOrder();
                }
            };

            $scope.openOrderDetail = function (order) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderDetailModal/orderDetail.html',
                    controller: 'orderDetail',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        order: function () {
                            return order;
                        },
                        orderStatuses: function () {
                            return orderStatuses.object;
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });

                modalInstance.result.then(function (isReloadPage) {
                }, function (isReloadPage) {
                });
            };
            $scope.deleteOrder = function (orderId) {
                promptFactory.confirm("Are you sure you want to delete this order?", function (result) {
                    if (result) {
                        return baseFactory.fetch('/api/order/delete/' + orderId).then(function (data) {
                            if (!data.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                            }
                        });
                    }
                });
            };
            $scope.deleteQuote = function (orderId) {
                promptFactory.confirm("Are you sure you want to delete this quote?", function (result) {
                    if (result) {
                        return baseFactory.fetch('/api/order/delete/' + orderId).then(function (data) {
                            if (!data.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                            }
                        });
                    }
                });
            };
            $scope.showEditOrder = function (row) {
                if ($rootScope.clientName && ($rootScope.clientName.toLowerCase() === "ppi" ||
                    $rootScope.clientName.toLowerCase() === "kingpin")) {

                    if (row.status === "Quote") {
                        return false;
                    }

                    return true;
                } else if ($rootScope.clientName && ($rootScope.clientName === "TWC" || $rootScope.clientName === "RETAILBLINDS")) {
                    if (row.status === "Completed" || row.status === "Quote") {
                        return false;
                    }

                    if (row.orderNumber !== null) {
                        return false;
                    }
                } else if ($rootScope.clientName.toLowerCase() === "qodo" ||
                    $rootScope.clientName.toLowerCase() === "fildes" ||
                    $rootScope.clientName.toLowerCase() === "test") {

                    if (row.status === "Waiting Payment") {
                        return true;
                    } else {
                        return false;
                    }
                }

                return true;
            };
            $scope.showViewOrder = function (row) {
                if ($rootScope.clientName && ($rootScope.clientName === "TWC" || $rootScope.clientName === "RETAILBLINDS")) {
                    if (row.status === "Completed") {
                        return true;
                    }
                }

                return false;
            };
            $scope.showEdit = function (row) {
                if (row.status === "Quote") {
                    return true;
                }

                return false;
            };
            $scope.checkStatus = function (status) {
                return (status.toLowerCase().trim() !== "quote" && status.toLowerCase().trim() !== "posted" && status.toLowerCase().trim() !== "completed");
            };
            $scope.openOrderLogs = function (orderId) {
                $modal.open({
                    templateUrl: '/app/modules/order/orderLogsModal/orderLogs.html',
                    controller: 'OrderLogsCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        orderId: function () {
                            return orderId;
                        }
                    }
                });
            };
            $scope.viewEmailLogs = function (orderId) {
                $modal.open({
                    templateUrl: '/app/modules/admin/emailLogs/modals/orderEmailLogs.html',
                    controller: 'OrderEmailLogsCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        orderId: function () {
                            return orderId;
                        }
                    }
                });
            };

            $scope.exportInvoice = function (orderNumber) {
                window.location.href = '/report/OrderInvoice?orderNumber=' + orderNumber;
            };
            $scope.exportOrderConfirmation = function (orderNumber) {
                window.location.href = '/report/OrderConfirmation?orderNumber=' + orderNumber;
            };
            $scope.exportCreditNote = function (orderNumber) {
                window.location.href = '/report/CreditNote?orderNumber=' + orderNumber;
            };
            $scope.convertQuoteToOrder = function (orderId) {
                return baseFactory.fetch('/api/order/OrderQuote/?orderId=' + orderId).then(function (data) {
                    if (!data.isErrored) {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    }
                });
            };
            $scope.convertPpiQuoteToOrder = function (order) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderPurchaseOrder/orderPurchaseOrderModal.html',
                    controller: 'OrderPurchaseOrderModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        order: function () {
                            return angular.copy(order);
                        },
                        receiptModel: [
                            'baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/Receipt/GetCreateReceiptModel').then(function (data) {
                                    return data.object;
                                });
                            }
                        ],
                        orderPaymentDataModel: [
                            'baseFactory', function (baseFactory) {
                                return baseFactory.fetch('/api/PpiOrder/GetOrderPaymentData/' + order.id + '?isForQuote=true').then(function (data) {
                                    return data.object;
                                });
                            }
                        ]
                    }
                });

                modalInstance.result.then(function (ordr) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReloadPage) {
                });
            };

            $scope.openOrderNumber = function (mm) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderNumberModal/orderNumberModal.html',
                    controller: 'orderNumberModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        order: function () {
                            return angular.copy(mm);
                        }
                    }
                });

                modalInstance.result.then(function (orderNumber) {
                    mm.orderNumber = orderNumber;
                }, function () { });
            };
            $scope.exportAll = function () {
                console.log('export all');
            };

            $scope.duplicate = function (orderId, isStandardOrder) {
                promptFactory.confirm("Are you sure you want to duplicate this order?", function (result) {
                    if (result) {
                        return baseFactory.call('/api/PpiOrder/DuplicateOrder/' + orderId, {}).then(function (data) {
                            if (!data.isErrored && data.object) {
                                if (isStandardOrder) {
                                    $state.go("base.orders.editeppistandardorder", { id: data.object });
                                } else {
                                    $state.go("base.orders.catalogedit", { id: data.object });
                                }
                            }
                        });
                    }
                });
            };
            $scope.openExportInvoiceModal = function (orderId) {
                $modal.open({
                    templateUrl: '/app/modules/order/exportPpiInvoiceModal/exportPpiInvoiceModal.html',
                    controller: 'exportPpiInvoiceModal',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        invoices: ['resolveFactory', function (resolveFactory) {
                            return resolveFactory.getGridEntity('/api/order/GetInvoicesForOrder/' + orderId);
                        }]
                    }
                });
            };
            $scope.reprocessInSage = function (orderId) {
                promptFactory.confirm("Are you sure you want to re-process this order in Sage?", function (result) {
                    if (result) {
                        return baseFactory.fetch('/api/order/ReprocessInSage/' + orderId).then(function (data) {
                            if (!data.isErrored) {
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                            }
                        });
                    }
                });
            };

            $scope.sendOrderConfirmation = function (id) {
                baseFactory.put('/api/ppiorder/sendOrderConfirmation/' + id).then(function (rdata) {
                });
            };
            $scope.sendProformaInvoice = function (id) {
                baseFactory.put('/api/ppiorder/sendProformaInvoice/' + id).then(function (rdata) {
                });
            };

            //
            $scope.openSubmenu = function (row) {
                // if(typeof row.isOpenSubmenu === 'undefined'){}
                row.isOpenSubmenu = true;
            };
        }
    ]);
orderModule.controller('OrderAdvancedExtensionCtrl',
    ['$scope', 'baseFactory', '$modal', '$rootScope', '$state', '$stateParams', 'GRID_CONSTANTS', 'promptFactory', 'permissionFactory', 'clientHelperFactory',
        function ($scope, baseFactory, $modal, $rootScope, $state, $stateParams, GRID_CONSTANTS, promptFactory, permissionFactory, clientHelperFactory) {

            $scope.openArtWorkApproval = function (orderr) {
                baseFactory.fetch('/api/order/get/' + orderr.id).then(function (rrdata) {
                    var item = rrdata.object.items[0];

                    angular.forEach(rrdata.object.items, function (itm) {
                        if (itm.isPrimary) {
                            item = itm;
                        }
                    });

                    // console.log(item)
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/artworkApproval/artworkApprovalDetailModal/artworkApprovalDetail.html',
                        controller: 'artworkApprovalDetailCtrl',
                        size: 'md',
                        backdrop: 'static',
                        windowClass: 'app-modal-window',
                        resolve: {
                            messages: function () {
                                return baseFactory.fetch('/api/message/getAllMessagesByOrder', { orderId: orderr.id, page: 1, count: 20 }).then(function (rrrdata) {
                                    return rrrdata.object || null;
                                });
                            },
                            messageDetail: function () {
                                return null;
                            },
                            currentUser: function () {
                                return baseFactory.fetch('/api/Users/GetCurrentUser/').then(function (rrrdata) {
                                    return rrrdata.object == null ? [] : rrrdata.object;
                                });
                            },
                            orderStatuses: function (resolveFactory) {
                                return resolveFactory.getGridEntity('/api/orderstatus/getall');
                            },
                            order: function () {
                                return rrdata.object;
                            }
                        }
                    });

                    modalInstance.result.then(function (isReloadPage) {
                        if (isReloadPage && typeof $scope.gridOptions !== 'undefined')
                            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    }, function (isReloadPage) {
                        if (isReloadPage && typeof $scope.gridOptions !== 'undefined')
                            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                    });
                });
            };
            $scope.openOrderJobBag = function (orderr) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderJobBagModal/orderJobBagModal.html',
                    controller: 'orderJobBagModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        orderData: function () {
                            return baseFactory.fetch('/api/ppiorder/get/' + orderr.id).then(function (data) {
                                return data.object;
                            });
                        }
                    }
                });
                modalInstance.result.then(
                    function (ordr) {
                        if (ordr != null) {
                            orderr.customerName = ordr.customerName;
                            orderr.description = ordr.orderDescription;
                        }
                    },
                    function (ordr) {
                        if (ordr != null) {
                            orderr.customerName = ordr.customerName;
                            orderr.description = ordr.orderDescription;
                        }
                    });
            };
            $scope.openPrintInformation = function (orderr) {
                baseFactory.fetch('/api/calendar/Get/' + orderr.id).then(function (rdata) {
                    if (!rdata.isErrored) {
                        var tempEvent = angular.copy(rdata.object);

                        var modalInstance = $modal.open({
                            templateUrl: '/app/modules/calendars/modals/calendarOrderModal.html',
                            controller: 'CalendarOrderModalCtrl',
                            size: 'md',
                            backdrop: 'static',
                            resolve: {
                                order: function () {

                                    var ms = tempEvent.start = $.fullCalendar.moment(tempEvent.start);
                                    var me = tempEvent.end = $.fullCalendar.moment(tempEvent.end);
                                    var isAllDay = !(ms.hasTime() && me.hasTime());

                                    if (event.end == null) {
                                        tempEvent.end = event.end == null ? tempEvent.start : tempEvent.end;
                                    }

                                    var duration = moment.duration(tempEvent.end.diff(tempEvent.start));
                                    var hours = duration.asHours();

                                    if (hours == 0) {
                                        tempEvent.end = event.end == null ? tempEvent.start : tempEvent.end;
                                    } else {
                                        tempEvent.end = isAllDay ? tempEvent.end.subtract(1, 'day').toDate() : tempEvent.end;
                                    }
                                    tempEvent.origStart = tempEvent.start;
                                    tempEvent.origEnd = tempEvent.end;

                                    return angular.copy(tempEvent);
                                },
                                orderStatuses: function () {
                                    return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                        return rrdata.object || [];
                                    });
                                },
                                isNew: function () {
                                    return false;
                                },
                                event: function () {
                                    return rdata.object;
                                },
                                isAllPrinters: function () {
                                    return true;
                                },
                                printers: function () {
                                    return baseFactory.fetch('/api/calendar/list').then(function (rrdata) {
                                        return rrdata.object || [];
                                    });
                                },
                                orderDetails: function () {
                                    return baseFactory.fetch('/api/ppiorder/get/' + order.id).then(function (rrdata) {
                                        return rrdata.object;
                                    });
                                }
                            }
                        });

                        modalInstance.result.then(function (ddata) {
                            if (typeof $scope.gridOptions !== 'undefined')
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                        }, function () {
                        });
                    }
                });
            };
            $scope.openStockAvailability = function (orderr) {
                $modal.open({
                    templateUrl: '/app/modules/order/orderStockAvailabilityModal/index.html',
                    controller: 'OrderStockAvailabilityModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        order: function () {
                            return baseFactory.fetch('/api/ppiorder/get/' + orderr.id).then(function (rdata) {
                                return rdata.object || null;
                            });
                        }
                    }
                });
            };
            $scope.viewFiles = function (orderr) {
                $modal.open({
                    templateUrl: '/app/modules/artworkApproval/artworkApprovalViewModal/artworkApprovalView.html',
                    controller: 'artworkApprovalViewCtrl',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        order: function () {
                            return baseFactory.fetch('/api/order/get/' + orderr.id).then(function (rdata) {
                                return rdata.object || null;
                            });
                        },
                        documents: function () {
                            return baseFactory.fetch('/api/documents/getAllDocuments', { startIndex: 1, retrieveSize: 9999, isAll: true, orderId: orderr.id }).then(function (rdata) {
                                return rdata.object || [];
                            });
                        }
                    }
                });
            };
        }
    ]);
(function () {
    "use strict";
    orderModule.factory("orderFactory", orderFactory);
    orderFactory.$inject = ["baseFactory", "$q"];

    function orderFactory(baseFactory, $q) {

        function replaceOrderItem(model) {
            return baseFactory.call('/api/PpiOrder/ReplaceOrderItem', model)
                .then(function (data) {
                    if (!data.isErrored)
                        return data.object;
                    return null;
                });
        }

        return {
            replaceOrderItem: replaceOrderItem
        };
    }

})();
orderModule.controller('QuoteCtrl',
    ['$scope', '$controller', 'baseFactory', '$modal', '$rootScope', '$state', '$stateParams', 'GRID_CONSTANTS', 'promptFactory', 'permissionFactory', 'clientHelperFactory',
        'orderStatuses', 'categories', 'printers', 'orderTemplateUrl',
        function ($scope, $controller, baseFactory, $modal, $rootScope, $state, $stateParams, GRID_CONSTANTS, promptFactory, permissionFactory, clientHelperFactory,
            orderStatuses, categories, printers, orderTemplateUrl) {

            angular.extend(this, $controller('OrderAdvancedCtrl', {
                $scope: $scope,
                extraParams: { statusId: 13 },
                orderStatuses: orderStatuses,
                categories: categories,
                printers: [],
                orderTemplateUrl: orderTemplateUrl
            }));
    }
]);
orderModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('form', {
                url: "/form",
                views: {
                    '@': {
                        templateUrl: "/app/modules/menu/menu.html",
                        controller: 'MenuCtrl'
                    },
                    'viewContent@form': {
                        templateUrl: "/app/modules/order/creditCardForm/creditCardForm.html",
                        controller: 'creditCardForm',
                        resolve: {
                           
                        }
                    }
                }
            });

    }
]);
orderModule.controller('creditCardForm',
['$scope', 'baseFactory', '$modal', '$locale',
    function ($scope, baseFactory, $modal, $locale) {

        $scope.currentYear = new Date().getFullYear();
        $scope.currentMonth = new Date().getMonth() + 1;
        $scope.months = $locale.DATETIME_FORMATS.MONTH;
        $scope.ccinfo = { type: undefined }
        $scope.save = function (data) {
            if ($scope.paymentForm.$valid) {
                console.log(data); // valid data saving stuff here
            }
        }
       

    }
]);



orderModule.config(
    ['$stateProvider',
        function ($stateProvider) {
            $stateProvider
                .state('base.orders.view2', {
                    url: "v/:id",
                    views: {
                        'content@base': {
                            templateProvider: ['$stateParams', '$templateRequest', '$rootScope',
                                function ($stateParams, $templateRequest, $rootScope) {
                                    var templateUrl = '/app/modules/order/dashboard/views/index.html';
                                    if ($rootScope.clientName === "TFT") {
                                        templateUrl = '/app/modules/order/dashboard/views/indexTFT.html';
                                    }
                                    return $templateRequest(templateUrl);
                                }],
                            controller: 'DashboardOrderManageCtrl',
                            resolve: {
                                order: ['resolveFactory', 'baseFactory', '$stateParams', '$rootScope',
                                    function (resolveFactory, baseFactory, $stateParams, $rootScope) {
                                        console.log($rootScope);
                                        if ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN") {
                                            return resolveFactory.getEntity('/api/ppiorder/get/' + $stateParams.id);
                                        } else {
                                            return resolveFactory.getEntity('/api/order/GetCreateUpdateOrderModel?id=' + $stateParams.id);
                                        }
                                    }],
                                categories: ['$route', 'resolveFactory', '$rootScope', function ($route, resolveFactory, $rootScope) {
                                    if ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN")
                                        return resolveFactory.getEntity('/api/category/GetAll');
                                    else
                                        return [];
                                }],
                                orderCustomFields: ['$route', 'baseFactory', '$rootScope', function ($route, baseFactory, $rootScope) {
                                    if ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN")
                                        return baseFactory.fetch('/api/customfields/getall?isOrder=True');
                                    else
                                        return { object: [] };
                                }]
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'View'
                    }
                })
                .state('base.orders.view2.details', {
                    url: "/details",
                    views: {
                        'detailsView@base.orders.view2': {
                            templateProvider: ['$stateParams', '$templateRequest', '$rootScope',
                                function ($stateParams, $templateRequest, $rootScope) {
                                    var templateUrl = '';
                                    if ($rootScope.clientName === "FILDES" || $rootScope.clientName === "QODO") {
                                        templateUrl = '/app/modules/order/dashboard/views/orderDetailsQodo.html';
                                    } else if ($rootScope.clientName === "TWC" || $rootScope.clientName === "BLOCKOUT") {
                                        templateUrl = '/app/modules/order/dashboard/views/orderDetailsTWC.html';
                                    } else if ($rootScope.clientName === "RETAILBLINDS") {
                                        templateUrl = '/app/modules/order/dashboard/views/orderDetailsRetailBlinds.html';
                                    } else if ($rootScope.clientName === "TFT") {
                                        templateUrl = '/app/modules/order/dashboard/views/orderDetailsTFT.html';
                                    } else if ($rootScope.clientName === "KINGPIN") {
                                        templateUrl = '/app/modules/order/dashboard/views/orderDetailsKingpin.html';
                                    } else {
                                        templateUrl = '/app/modules/order/dashboard/views/orderDetailsPPI.html';
                                    }
                                    return $templateRequest(templateUrl);
                                }],
                            controller: 'DashboardOrderDetailsCtrl'
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Order Details'
                    }
                })
                .state('base.orders.view2.activityLogs', {
                    url: "/activitylogs",
                    views: {
                        'detailsView@base.orders.view2': {
                            templateUrl: "/app/modules/order/dashboard/views/grid.html",
                            controller: 'DashboardOrderActivityLogsCtrl',
                            resolve: {
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Activity Logs'
                    }
                })
                .state('base.orders.view2.emailLogs', {
                    url: "/emaillogs",
                    views: {
                        'detailsView@base.orders.view2': {
                            templateUrl: "/app/modules/order/dashboard/views/grid.html",
                            controller: 'DashboardOrderEmailLogsCtrl',
                            resolve: {
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Email Logs'
                    }
                })
                .state('base.orders.view2.notes', {
                    url: "/notes",
                    views: {
                        'detailsView@base.orders.view2': {
                            templateUrl: "/app/modules/order/dashboard/views/grid.html",
                            controller: 'DashboardOrderNotesCtrl',
                            resolve: {
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Notes'
                    }
                })
                .state('base.orders.view2.invoices', {
                    url: "/invoices",
                    views: {
                        'detailsView@base.orders.view2': {
                            templateUrl: "/app/modules/order/dashboard/views/grid.html",
                            controller: 'invoiceDetailsCtrl',
                            resolve: {
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Invoices'
                    }
                })
                .state('base.orders.view2.history', {
                    url: "/history",
                    views: {
                        'detailsView@base.orders.view2': {
                            templateUrl: "/app/modules/order/dashboard/views/grid.html",
                            controller: 'DashboardOrderHistoryCtrl',
                            resolve: {
                            }
                        }
                    },
                    ncyBreadcrumb: {
                        label: 'Order History'
                    }
                });
        }
    ]);
orderModule.controller('DashboardOrderActivityLogsCtrl',
    ['$scope', '$rootScope', '$controller', '$modal', 'baseFactory', 'modalFactory',
        'GRID_CONSTANTS', '$state', '$stateParams',
    function ($scope, $rootScope, $controller, $modal, baseFactory, modalFactory,
        GRID_CONSTANTS, $state, $stateParams) {

        $scope.gridOptions = {
            itemType: 'Activities',
            gridName: 'allActivities',
            fetchUrl: '/api/ActivityLog/SearchAllLogs?orderId=' + $stateParams.id,
            exportUrl: '/exportGrid/getActivityLogs/?orderId=' + $stateParams.id,
            initSortString: 'createddate desc',
            enableSorting: true,
            enableSearching: true,
            enableDateRange: true,
            enableExport: true,
            enablePaging: true,
            columnDefs: [
                { field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" },
                { field: 'createdDate', displayName: 'Time', customSortField: 'createdDate', cellFilter: 'date:\'HH:mm\'', width: "70px" },
                { field: 'user', displayName: 'User', customSortField: 'user', width: "100px" },
                { field: 'userFullName', displayName: 'Name', customSortField: 'userFullName', width: "150px", visibleAt: '979' },
                { field: 'details', displayName: 'Details', customSortField: 'details', sortable: false },
                { field: 'ipAddress', displayName: 'IP Address', customSortField: 'ipAddress', visibleAt: '1024', width: "120px" },
                { field: 'os', displayName: 'OS', customSortField: 'os', visibleAt: '1024', width: "100px" },
                { field: 'browser', displayName: 'Browser', customSortField: 'browser', visibleAt: '1024', width: "100px" },
                { field: 'browserVersion', displayName: 'Browser Version', customSortField: 'browserVersion', visibleAt: '1024', width: "100px" }
            ]
        };
    }]);
orderModule.controller('DashboardOrderDetailsCtrl',
    ['$scope', '$rootScope', '$controller', '$modal', 'baseFactory', 'modalFactory', '$timeout',
        'GRID_CONSTANTS', '$state', '$stateParams', 'resolveFactory', 'lazyLoadGoogleApi', 'TIMES',
    function ($scope, $rootScope, $controller, $modal, baseFactory, modalFactory, $timeout,
        GRID_CONSTANTS, $state, $stateParams, resolveFactory, lazyLoadGoogleApi, TIMES) {

        if ($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") {
            angular.extend(this, $controller('CheckoutCtrl', {
                $scope: $scope,
                order: $scope.$parent.origOrder,
                orderCustomFields: [],
                itemCustomField: [],
                printers: [],
                items: [],
                customerContacts: []
            }));
        } else if ($rootScope.clientName == "TFT") {
            $scope.job = angular.fromJson($scope.$parent.order.uiData);
            $scope.times = TIMES;
            // console.log($scope.job);

            $scope.mapId = window.randomString();
            $scope.job.showMap = false;
            $scope.$on('mapInitialized', function (evt, evtMap) {
                $scope.map = evtMap;
                $timeout(function () {
                    $scope.mapLatLng = new google.maps.LatLng($scope.job.location.latitude, $scope.job.location.longitude);
                    $scope.map.setCenter($scope.mapLatLng);
                    $scope.map.setZoom(10);

                    $scope.marker = new google.maps.Marker({
                        position: $scope.mapLatLng,
                        title: $scope.job.address
                    });
                    $scope.marker.setMap($scope.map);
                }, 500);
            });
            $scope.centerChanged = function (event) {
                $timeout(function () {
                    try {
                        $scope.map.panTo($scope.marker.getPosition());
                    } catch (er) {
                        $scope.mapLatLng = new google.maps.LatLng($scope.job.location.latitude, $scope.job.location.longitude);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(10);

                        $scope.marker = new google.maps.Marker({
                            position: $scope.mapLatLng,
                            title: $scope.job.address
                        });
                        $scope.marker.setMap($scope.map);
                    }
                }, 500);
            };
            lazyLoadGoogleApi.then(function () {
                $scope.job.showMap = true;
            });
        } else if ($scope.$parent.isStandard) {
            if ($rootScope.clientName == "KINGPIN") {
                baseFactory.fetch('/api/item/getCategories').then(function (result) {
                    angular.extend(this, $controller('standardOrderKingpinController', {
                        $scope: $scope,
                        order: $scope.$parent.origOrder,
                        isNew: false,
                        customerContacts: [],
                        categories: result.object
                    }));
                });
            } else {
                baseFactory.fetch('/api/item/getCategories').then(function (result) {
                    angular.extend(this, $controller('standardOrderPpiController', {
                        $scope: $scope,
                        order: $scope.$parent.origOrder,
                        categories: result.object,
                        isNew: false,
                        customerContacts: { object: [] }
                    }));
                });
            }
        } else if ($rootScope.clientName == "PPI" || $rootScope.clientName == "KINGPIN") {
            baseFactory.fetch('/api/category/GetAll').then(function (result) {
                angular.extend(this, $controller('editOrder', {
                    $scope: $scope,
                    orderData: { object: $scope.$parent.origOrder },
                    categories: result,
                    orderCustomFields: { object: [] },
                    isNew: false
                }));
            });
        } else {
            angular.extend(this, $controller('createOrder', {
                $scope: $scope,
                order: $scope.$parent.order,
                detailsMode: true
            }));
        }
    }]);
orderModule.controller('DashboardOrderEmailLogsCtrl',
    ['$scope', '$rootScope', '$controller', '$modal', 'baseFactory', 'modalFactory',
        'GRID_CONSTANTS', '$state', '$stateParams',
    function ($scope, $rootScope, $controller, $modal, baseFactory, modalFactory,
        GRID_CONSTANTS, $state, $stateParams) {

        $scope.gridOptions = {
            itemType: 'Email Log',
            gridName: 'allOrderEmailLogs',
            fetchUrl: '/api/emailLog/getAll?orderId=' + $stateParams.id,
            initSortString: 'dateCreated desc',
            enableSorting: true,
            enableSearching: true,
            enableDateRange: false,
            enableExport: false,
            enablePaging: true,
            columnDefs: [
                { field: 'from', displayName: 'From' },
                { field: 'to', displayName: 'To' },
                { field: 'subject', displayName: 'Subject' },
                { field: 'status', displayName: 'Status', sortable: false },
                { field: 'orderNumber', displayName: 'Order No.', sortable: false },
                { field: 'purchaseOrderNumber', displayName: 'Purchase Order No.', sortable: false },
                { field: 'dateCreated', displayName: 'Date', customSortField: 'dateCreated', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px" }
            ],
            controlCellTemplateHtml: controlHtml()
        };

        $scope.viewEmail = function (id) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/emailLogs/modals/manageEmailLogModal.html',
                controller: 'ManageEmailLogModalCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    email: function () {
                        return baseFactory.fetch('/api/emailLog/get/' + id).then(function (rdata) {
                            return rdata.object;
                        });
                    }
                }
            });
        };

        function controlHtml() {
            return '<div class="controls">' +
                '<div class="btn-group btn-group-sm">' +
                '<a ng-click="viewEmail(row.entity.id)" class="btn btn-default" title="View">View</a>' +
                '</div></div>';
        }
    }]);
customerDetailsModule.controller('DashboardOrderHistoryCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            // NOTES
            $scope.gridOptions = {
                itemType: 'Order History',
                gridName: 'orderHistory',
                fetchUrl: '/api/order/searchAllOrderHistory?orderId=' + $stateParams.id,
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: false,
                columnDefs: [
                    {
                        field: 'dateCreated', width: '150', displayName: 'Date',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateCreated | date:"dd/MM/yyyy hh:mm:ss"}}</span></div>'
                    },
                    { field: 'user', displayName: 'User' }
                ],
                controlColumnWidth: '100px',
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a href="/report/twcorderhistory/{{row.entity.id}}" permission clients="twc" target="_blank" class="btn btn-link" title="Export PDF">PDF</a>' +
                    '</div></div>';
            }
        }
    ]);
orderModule.controller('DashboardOrderManageCtrl',
    ['$scope', '$rootScope', '$controller', '$modal', '$filter', 'baseFactory', 'modalFactory',
        'GRID_CONSTANTS', '$state', '$stateParams', 'order', 'categories', 'orderCustomFields',
        function ($scope, $rootScope, $controller, $modal, $filter, baseFactory, modalFactory,
            GRID_CONSTANTS, $state, $stateParams, order, categories, orderCustomFields) {

            $scope.indexTemplateUrl = '';
            $scope.isStandard = false;
            $scope.origOrder = angular.copy(order);
            $scope.categories = angular.copy(categories);
            $scope.printers = [];
            $scope.isGearDropdownOpen = false;
            if ($rootScope.clientName === "FILDES" || $rootScope.clientName === "QODO") {
                $scope.indexTemplateUrl = '/app/modules/order/dashboard/views/indexPanelQodo.html';
                angular.extend(this, $controller('CheckoutCtrl', {
                    $scope: $scope,
                    order: order,
                    orderCustomFields: [],
                    itemCustomField: [],
                    printers: [],
                    items: [],
                    customerContacts: []
                }));
            }
            else //if ($rootScope.clientName == "TWC")
            {
                $scope.indexTemplateUrl = $rootScope.clientName === "TFT" ? '/app/modules/order/dashboard/views/indexPanelTFT.html' :
                    $rootScope.clientName === "RETAILBLINDS" ? '/app/modules/order/dashboard/views/indexPanelRetailBlinds.html' :
                        $rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN" ? '/app/modules/order/dashboard/views/indexPanelPPI.html' :
                            '/app/modules/order/dashboard/views/indexPanelTWC.html';
                $scope.order = order;

                if ($scope.order.artwork !== null)
                    $scope.doc = {
                        id: $scope.order.artwork.id,
                        permissions: [],
                        fileName: $scope.order.artwork.fileName,
                        link: $scope.order.artwork.link,
                        isUploaded: true,
                        isDownload: true,
                        downloadLink: $scope.order.artwork.link
                    };

                if ($rootScope.clientName === "PPI") {
                    $scope.isStandard = angular.fromJson(order.uiData).isStandardOrder;
                    angular.extend(this, $controller('editOrder', {
                        $scope: $scope,
                        orderData: { object: order },
                        categories: categories,
                        orderCustomFields: orderCustomFields
                    }));
                } else if ($rootScope.clientName === "KINGPIN") {
                    $scope.isStandard = angular.fromJson(order.uiData).isStandardOrder;
                }

                if ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN") {
                    baseFactory.fetch('/api/invoice/getTotal/' + order.orderNumber).then(function (rdata) {
                        $scope.invoiceTotals = rdata.object;

                        $scope.invoiceTotalQuantity = 0;
                        $scope.invoiceTotalShipped = 0;
                        $scope.invoiceTotalAmount = 0;

                        for (var i = 0; i < $scope.invoiceTotals.length; i++) {
                            $scope.invoiceTotalQuantity += $scope.invoiceTotals[i].quantity;
                            $scope.invoiceTotalShipped += $scope.invoiceTotals[i].shipped;
                            $scope.invoiceTotalAmount += $scope.invoiceTotals[i].amount;
                        }
                    });
                    baseFactory.fetch('/api/calendar/list').then(function (rrdata) {
                        $scope.printers = $filter('orderBy')(rrdata.object || [], 'name');
                    });
                }

                angular.extend(this, $controller('OrderAdvancedExtensionCtrl', { $scope: $scope }));
            }
            //
            $scope.dynamicPopover = {
                customerId: order.customerId,
                content: 'Hello, World!',
                templateUrl: '/app/modules/shared/template/customerPopover.html',
                title: 'Title'
            };
            $scope.canCreateStandardOrder = ($rootScope.clientName === "PPI" || $rootScope.clientName === "KINGPIN") && ($rootScope.user.userType === 1 || $rootScope.user.userType === 4);

            // NOTES
            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/dashboard/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            if (m == null) {
                                return {
                                    id: 0,
                                    orderId: parseInt($stateParams.id),
                                    isVisibleCustomer: false,
                                    date: moment().format()
                                };
                            }
                            return m;
                        },
                        contacts: function () {
                            if (order.customerId == null)
                                return [];
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: order.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes').then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });
                modalInstance.result.then(function () {
                    if ($state.current.name == "base.orders.view2.notes") {
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + 'orderNotes');
                    } else {
                        $state.go('base.orders.view2.notes', { id: $stateParams.id });
                    }
                }, function () { });
            };
            $scope.openManageSimpleNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/dashboard/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            if (m == null) {
                                return {
                                    id: 0,
                                    orderId: parseInt($stateParams.id),
                                    isVisibleCustomer: false,
                                    date: moment().format()
                                };
                            }
                            return m;
                        },
                        contacts: function () {
                            if (order.customerId == null)
                                return [];
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: order.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes').then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });
                modalInstance.result.then(function () {
                }, function () { });
            };

            $scope.openManageStatus = function (order) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderDetailModal/orderDetail.html',
                    controller: 'orderDetail',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        order: function () {
                            return order;
                        },
                        orderStatuses: function () {
                            return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        gridName: function () {
                            return "";
                        }
                    }
                }).result.then(function (obj) {
                    $scope.order.status = obj.status;
                    $scope.order.statusId = obj.statusId;
                    $scope.order.orderStatusHistory = obj.orderStatusHistory;
                }, function (isReloadPage) {
                });
            };

            // SCHEDULER
            $scope.isScheduleSubmenu = false;
            $scope.openManageSchedule = function (scheduleId, orderId) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/calendars/modals/calendarOrderModal.html',
                    controller: 'CalendarOrderModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        order: function () {
                            return baseFactory.fetch('/api/calendar/getevent/' + scheduleId).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        orderStatuses: function () {
                            return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        isNew: function () {
                            return false;
                        },
                        event: function () {
                            return {
                                id: scheduleId
                            };
                        },
                        isAllPrinters: function () {
                            return true;
                        },
                        printers: function () {
                            return $scope.printers;
                        },
                        orderDetails: function () {
                            return baseFactory.fetch('/api/ppiorder/get/' + orderId).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });
                modalInstance.result.then(function (ddata) {
                    if (ddata.isRemove) {
                        $scope.origOrder.scheduleId = null;
                    }
                }, function () {
                });
            };
            $scope.openScheduleSubmenu = function (order) {
                $scope.isScheduleSubmenu = true;
            }
            $scope.allocatePrinter = function (order, printerId) {
                var allocateOrder = function () {
                    var dataToSend = {
                        calendarId: printerId,
                        start: moment().format("YYYY-MM-DD"),
                        end: moment().format("YYYY-MM-DD"),
                        title: order.orderNumber,
                        allDay: true,
                        eventType: 1,
                        orderId: order.id,
                        id: 0,
                        isPrivate: false
                    };
                    baseFactory.post('/api/calendar/saveEvent/', dataToSend).then(function (rrdata) {
                        $scope.origOrder.scheduleId = rrdata.object.id;
                        $scope.openManageSchedule(order.scheduleId, order.id);
                    });
                };
                if (order.statusId !== 8) {
                    baseFactory.fetch('/api/order/updateorderstatus', { orderId: order.id, statusId: 8 }).then(function (rdata) {
                        if (!rdata.isErrored) {
                            allocateOrder();
                        }
                    });
                } else {
                    allocateOrder();
                }
            };
            //
            $scope.$watch('isGearDropdownOpen', function (v) {
                if (!v)
                    $scope.isScheduleSubmenu = v;
            });

            // INIT
            if ($state.current.name === "base.orders.view2")
                if ($rootScope.clientName === "TFT")
                    $state.go('.bookingdetails');
                else
                    $state.go('.details');
        }]);
customerDetailsModule.controller('DashboardOrderNotesCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', '$stateParams',
        function ($scope, $rootScope, $modal, baseFactory, modalFactory, GRID_CONSTANTS, $stateParams) {

            // NOTES
            $scope.gridOptions = {
                itemType: 'Order Notes',
                gridName: 'orderNotes',
                fetchUrl: '/api/notes/searchall?orderId=' + $stateParams.id,
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [],
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: '100%',
                headerRowHeight: 1
            };

            function controlHtml() {
                var html = '<div ng-include src="\'/app/modules/admin/customers/views/noteTemplate.html\'"></div>';
                return html;
            }

            function notesDetailsTemplate() {
                return '<div class="ngCellText">' +
                        '<div style="white-space: pre-line;">{{row.entity.content}}</div>' +
                    '</div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.noteType,
                    value.id,
                    'Note',
                    null,
                    '/api/notes/deletenote/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/dashboard/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m == null;
                        },
                        model: function () {
                            return m;
                        },
                        contacts: function () {
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: m.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () { });
            };
        }
    ]);
orderModule.controller('ViewNotesModalCtrl',
    ['$scope', '$rootScope', '$modal', '$modalInstance', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS', 'order',
        function ($scope, $rootScope, $modal, $modalInstance, baseFactory, modalFactory, GRID_CONSTANTS, order) {

            // NOTES
            $scope.order = angular.copy(order);
            $scope.gridOptions = {
                itemType: 'Order Notes',
                gridName: 'orderNotes',
                fetchUrl: '/api/notes/searchall?orderId=' + order.id,
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [],
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: '100%',
                headerRowHeight: 1
            };

            function controlHtml() {
                var html = '<div ng-include src="\'/app/modules/admin/customers/views/noteTemplate.html\'"></div>';
                return html;
            }

            function notesDetailsTemplate() {
                return '<div class="ngCellText">' +
                    '<div style="white-space: pre-line;">{{row.entity.content}}</div>' +
                    '</div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.noteType,
                    value.id,
                    'Note',
                    null,
                    '/api/notes/deletenote/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/dashboard/modals/manageNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            return m === null ? {
                                id: 0,
                                orderId: order.id,
                                customerId: order.customerId,
                                customerName: order.customerName,
                                contactId: null,
                                isVisibleCustomer: true,
                                date: moment().format()
                            }: m;
                        },
                        contacts: function () {
                            return baseFactory.fetch('/api/customer/searchallcontacts', { ct: 1, cid: order.customerId, retrieveSize: 9999 }).then(function (rrdata) {
                                return rrdata.object;
                            });
                        },
                        noteTypes: function () {
                            return baseFactory.fetch('/api/notes/getNoteTypes', {}).then(function (rrdata) {
                                return rrdata.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () { });
            };
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }
    ]);
orderModule.controller('duplicatePurchaseOrderModal', ["$scope", "$modalInstance", "duplicates", function ($scope, $modalInstance, duplicates) {

    $scope.duplicates = duplicates;

    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };
}]);
orderModule.controller('editOrder',
    ['$scope', 'baseFactory', '$modal', '$rootScope', 'orderData', '$state', '$stateParams', 'categories', 'membershipFactory',
        'FREIGHT_CONSTANTS', 'CART_CONSTANTS', '$timeout', 'ppiOrderFactory', 'promptFactory', 'orderCustomFields',
        function ($scope, baseFactory, $modal, $rootScope, orderData, $state, $stateParams, categories, membershipFactory,
            FREIGHT_CONSTANTS, CART_CONSTANTS, $timeout, ppiOrderFactory, promptFactory, orderCustomFields) {

            $scope.formValid = formValid;
            $scope.editDeliveryAddress = editDeliveryAddress;
            $scope.onFileSelect = onFileSelect;
            $scope.changeFile = changeFile;
            $scope.resetInputFile = resetInputFile;
            $scope.displaySplitDeliveries = displaySplitDeliveries;
            $scope.getGrandTotal = getGrandTotal;
            $scope.showCustomFieldDate = showCustomFieldDate;
            $scope.openEventDate = openEventDate;
            $scope.openPreProductionDate = openPreProductionDate;
            $scope.openDeliveryDate = openDeliveryDate;
            $scope.openStockDueDate = openStockDueDate;
            $scope.createQuote = saveQuote;
            $scope.submitOrder = submitOrder;
            $scope.isEditMode = true;
            $scope.hideQuoteButton = false;
            $scope.clickDeliveryRequired = clickDeliveryRequired;
            $scope.quoteButtonText = "Save Quote";
            $scope.submitButtonTxt = "Submit Order";
            $scope.disableSubmitButton = false;
            $scope.displayOptionalFields = displayOptionalFields;
            $scope.isCodCustomer = false;

            var isDocument = true;
            var isMedia = true;

            $scope.$watch("deliveryRequired", function (newValue) {
                if (newValue === 'Yes') {
                    $rootScope.$emit(FREIGHT_CONSTANTS.REGENERATE_PRICE);
                }
                $rootScope.$emit(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, newValue === 'Yes');
            });
            $scope.$onRootScope(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, function (ev, res) {
                clickDeliveryRequired(res ? 'Yes' : 'No');
            });

            function clickDeliveryRequired(v) {
                $scope.deliveryRequired = v;
            }

            function init(orderModel) {

                $scope.order = angular.copy(orderModel.object);
                $scope.isCodCustomer = $scope.order.isCodCustomer;
                $scope.hideQuoteButton = !$scope.order.isQuote;

                if (!$scope.order.orderCustomFields) {
                    $scope.order.orderCustomFields = orderCustomFields;
                }

                $scope.doc = $scope.order.artwork;
                $scope.deliveryRequired = 'No';
                $scope.displayJobBagDetails = $rootScope.user.userType === 1;
                $scope.isCompanyUser = [1, 2, 4].indexOf($rootScope.user.userType) !== -1;

                $scope.buttonToggles = {};
                //
                if ($scope.order.isNotifications)
                    $scope.buttonToggles.isSendEmails = 'Yes';

                if ($scope.order.uiData && $scope.order.uiData.length) {
                    var uiData = angular.fromJson($scope.order.uiData);

                    if (uiData) {
                        if (uiData.isStandardOrder && $state.current.name.indexOf("base.orders.view2") < 0) {
                            if ($rootScope.clientName == "PPI" || $rootScope.clientName == "KINGPIN")
                                $state.go('base.orders.editeppistandardorder', { id: $stateParams.id }, { reload: true });
                        }
                        $scope.order.uiData = angular.copy(uiData);
                        $scope.order.uiData.items = null;
                        delete $scope.order.uiData.items;

                        if ($scope.order.uiData.deliveryRequired) {
                            $scope.deliveryRequired = 'Yes';
                        } else {
                            $scope.deliveryRequired = 'No';
                        }
                        if ($scope.order.uiData.isEvent) {
                            $scope.event = 'Yes';
                        }
                        if ($scope.order.uiData.preProduction) {
                            $scope.preProduction = 'Yes';
                            $scope.preProductionDate = $scope.order.uiData.preProduction;
                        }
                        if ($scope.order.uiData.useOurDate) {
                            $scope.buttonToggles.ourDate = 'Yes';
                        }
                    }

                    if (uiData && uiData.items) {
                        // console.log(uiData.items);
                        // console.log(orderModel);
                        $scope.order.items = uiData.items;
                        if ($scope.order.items) {
                            angular.forEach(orderModel.object.items, function (oItem, outerIndex) {
                                angular.forEach($scope.order.items, function (item, innerindex) {
                                    if (oItem.itemNumber == item.itemNumber) {
                                        item.imageUrl = oItem.imageUrl;

                                        if (outerIndex === innerindex) {
                                            item.kitNumber = oItem.kitNumber;
                                            item.kits = oItem.kits;
                                            item.kitting = oItem.kitting;
                                        }
                                    }
                                });
                            });
                            angular.forEach($scope.order.items, function (item) {
                                if (item.serialisedConfig) {
                                    item.config = angular.fromJson(item.serialisedConfig);
                                }
                            });
                        }
                    }
                } else {
                    $scope.order.uiData = { deliverySplits: [] };
                }

                if ($scope.order.location && $scope.order.location.suburb) {

                    $scope.order.delivery = {
                        location: $scope.order.location,
                        address: $scope.order.address1,
                        address2: $scope.order.address2,
                        state: $scope.order.location.state.code.replace(/ /g, '')
                    };

                    $scope.delivery = $scope.order.location.suburb.replace(/ /g, '') + " , " + $scope.order.location.postcode.replace(/ /g, '') + " , " + $scope.order.location.state.code.replace(/ /g, '');
                }

                //if ($scope.order.orderCustomFields) {
                //    angular.forEach($scope.order.orderCustomFields, function (value) {
                //        if (value.customFieldName.toLocaleLowerCase() === "event") {
                //            $scope.eventDate = value.value;
                //            if (value.value) {
                //                $scope.event = "Yes";
                //            }
                //        } else if (value.customFieldName.toLocaleLowerCase() === "pre-production") {
                //            $scope.preProductionDate = value.value;
                //            if (value.value) {
                //                $scope.preProduction = "Yes";
                //            }
                //        }
                //    });
                //}

                $scope.categories = categories;
                $scope.currentState = $state.current.name;

                if ($scope.order.uiData && $scope.order.uiData.deliveryRequired) {
                    $timeout(function () { ppiOrderFactory.updateFreight($scope.order) }, 200);
                }

                if ($scope.order.artwork) {
                    $scope.doc = {
                        id: $scope.order.artwork.id,
                        permissions: [],
                        fileName: $scope.order.artwork.fileName,
                        link: $scope.order.artwork.link,
                        isUploaded: true,
                        isDownload: true,
                        downloadLink: $scope.order.artwork.link
                    };
                } else {
                    $scope.doc = {
                        id: 0,
                        permissions: []
                    };
                }
                $rootScope.$emit(FREIGHT_CONSTANTS.FREIGHT_TOGGLE, $scope.deliveryRequired == 'Yes');
            }

            var isFileValid = function (filename) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = [];
                var result = false;

                if (isDocument || isMedia) {
                    fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg"];
                    result = fType.indexOf(ext) >= 0;

                    if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                        $scope.doc.docTypeId = 2;
                    } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                        $scope.doc.docTypeId = 1;
                    } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                        $scope.doc.docTypeId = 3;
                    } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                        $scope.doc.docTypeId = 5;
                    }
                }

                if (!result)
                    $scope.message = "The file " + filename + " is not valid.";

                if (result) {
                    if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                        $scope.doc.name = filename;
                    }
                }

                $timeout(function () {
                    $scope.message = null;
                }, 2500);

                return result;
            };

            function onFileSelect($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.submitTxt = "Uploading...";
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) {
                            $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                        }).success(function (data, status, headers, config) {

                            if (!data.isErrored) {
                                $scope.resetInputFile();
                                $scope.fileModel = data.object;
                                $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                                $scope.doc.fileName = $scope.fileModel.fileName;
                                $scope.doc.isUploaded = true;
                                $scope.doc.isDownload = false;
                                $scope.doc.isNew = true;
                            }
                            $scope.disableSubmitButton = false;
                            $scope.submitTxt = "Save";
                        });
                } else {
                    $scope.resetInputFile();
                    $scope.changeFile();
                }
            };

            function changeFile() {
                $scope.doc.id = null;
                $scope.doc.isUploaded = false;
                $scope.doc.isDownload = false;
                $scope.doc.fileFolder = "";
                $scope.doc.fileName = "";
                $scope.doc.link = "";
                $scope.doc.isNew = true;
                $scope.doc.downloadLink = null;
            };

            function resetInputFile() {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };

            $scope.changeValue = function (printer, item) {
                item.colours = [];
                for (i = 1; i <= printer.id; i++) {
                    var newColor = {
                        id: i,
                        value: '',
                    }
                    item.colours.push(newColor);
                }
            }

            $scope.setColor = function (value) {
                return { 'background-color': value };
            };

            $scope.showCustomFieldDate = function (cf) {
                var result = false;
                if (cf) {
                    result = true;
                }
                return result;
            };

            angular.forEach(orderData.object.customFields, function (cf, index) {
                if (cf.customFieldName == "Event") {
                    $scope.eventCustomField = cf;
                } else if (cf.customFieldName == "Pre-Production") {
                    $scope.preProductionCustomField = cf;
                }
            });

            $scope.formats = ['dd/MM/yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
            $scope.format = $scope.formats[0];

            $scope.showEvent = false;
            $scope.showPreProd = false;

            function editDeliveryAddress(delivery) {
                ppiOrderFactory.editDeliveryAddress($scope.order, delivery);
            }

            function formValid(validateForQuote) {
                $scope.itemsValid = ppiOrderFactory.validateItems($scope.order);
                return ppiOrderFactory.formValid($scope.order, $scope.form, validateForQuote, $scope.deliveryRequired);
            }

            function displaySplitDeliveries() {
                ppiOrderFactory.displaySplitDeliveries($scope.order, $scope.deliveryRequired);
            }

            function getGrandTotal() {
                var total = 0;
                var discount = 0;
                var additionalItemsTotal = 0;
                angular.forEach($scope.order.items, function (item) {
                    if (typeof item.total !== "undefined" && item.config && item.config.selectedPrintTypeConfig) {
                        var itemTotal = (item.config.selectedPrintTypeConfig.overridePricing ? item.config.selectedPrintTypeConfig.overriddenTotal : item.total);

                        if (item.config.discountPercentage && !item.config.selectedPrintTypeConfig.overridePricing) {
                            item.config.discountAmount = itemTotal * (item.config.discountPercentage / 100);
                            discount += item.config.discountAmount;
                        } else {
                            item.config.discountAmount = 0;
                        }

                        total = total + itemTotal;
                    }
                });
                angular.forEach($scope.order.items, function (item) {
                    if (typeof item.total !== "undefined" && typeof item.config !== "undefined" && typeof item.config.additionalItems !== "undefined") {
                        additionalItemsTotal += item.config.additionalItemsTotalPrice;
                    }
                });

                if ($scope.deliveryRequired === 'Yes' && $scope.order.uiData && !$scope.order.uiData.deliveryInvalid && $scope.order.uiData.deliverySplits) {
                    angular.forEach($scope.order.uiData.deliverySplits, function (deliverySplit) {
                        if (deliverySplit.freightResult && deliverySplit.freightResult.total) {
                            total = total + (deliverySplit.freightResult.totalOverridden ? deliverySplit.freightResult.overriddenTotal : deliverySplit.freightResult.total);
                        }
                    });
                }

                return (total - discount) + additionalItemsTotal;
            }

            function openEventDate($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openEvent = true;
            };

            function openPreProductionDate($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openPreProduction = true;
            };

            function openDeliveryDate($event, cf) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.opened = true;
            };

            function openStockDueDate($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openStockDueDatePicker = true;
            };

            function showCustomFieldDate(cf) {
                var result = false;
                if (cf == "Yes") {
                    result = true;
                }
                return result;
            };

            function saveQuote(form, order) {
                submitOrder(form, order, true);
            };

            function submitOrder(form, order, isQuote) {
                membershipFactory.ping3(function () {
                    if (!isQuote) {
                        if (form.$invalid) {
                            return;
                        }
                    }

                    var customerId, customerName;

                    if ($rootScope.impersonate) {
                        customerId = $rootScope.impersonate.customerId;
                        customerName = $rootScope.impersonate.name;
                    } else {
                        customerId = $rootScope.user.customerId;
                        customerName = $rootScope.user.customerName;
                    }

                    $scope.date = $scope.order.orderDate; // new Date();

                    order.isNotifications = $scope.buttonToggles.isSendEmails === 'Yes';
                    order.uiData.items = order.items;
                    order.uiData.deliveryRequired = $scope.deliveryRequired === 'Yes';
                    order.uiData.isEvent = $scope.event === "Yes";
                    order.uiData.preProduction = $scope.preProduction === "Yes" ? moment($scope.preProductionDate).format('YYYY-MM-DD') : null;
                    order.uiData.useOurDate = $scope.buttonToggles.ourDate === "Yes";
                    order.isNotifications = $scope.buttonToggles.isSendEmails === "Yes";

                    angular.forEach(order.uiData.items, function (item) {
                        item.serialisedConfig = angular.toJson(item.config);
                        item.discountAmount = item.config.discountAmount;
                        item.discountPercentage = item.config.discountPercentage;
                    });

                    var data = {
                        id: $scope.order.id,
                        customerId: customerId,
                        customerName: customerName,
                        orderDescription: order.desc,
                        comments: order.comments,
                        purchaseOrderNumber: order.purchaseOrderNumber,
                        orderDate: $scope.date,
                        total: 0,
                        itemCount: 0,
                        userId: $rootScope.user.userId,
                        address1: order.delivery ? order.delivery.address : '',
                        address2: order.delivery ? order.delivery.address2 : '',
                        locationId: order.delivery && order.delivery.location ? order.delivery.location.id : '',
                        items: angular.copy(order.items),
                        orderData: order.orderData,
                        customFields: order.orderCustomFields,
                        deliveryDate: order.deliveryDate,
                        isQuote: isQuote === true,
                        uiData: JSON.stringify(order.uiData),
                        selectedCustomerContact: null,
                        selectedCustomerContactId: order.selectedCustomerContactId,
                        statusId: order.statusId,
                        notifications: order.notifications,
                        isNotifications: order.isNotifications
                    };

                    order.uiData.items = null;
                    delete order.uiData.items;

                    if (data.selectedCustomerContactId) {
                        angular.forEach(order.customerContacts, function (contact) {
                            if (contact.id === data.selectedCustomerContactId) {
                                data.selectedCustomerContact = contact;
                            }
                        });
                    }

                    if (order.delivery && order.delivery.location) {
                        angular.forEach(data.items, function (item) {
                            item.toLocationId = order.delivery.location.id;
                        });
                    }

                    var newData = {
                        order: '',
                        customFields: [],
                        artworkFile: '',
                        items: order.items,
                        sendQuoteEmail: true
                    };

                    var tempCf = angular.copy(order.orderCustomFields || []);
                    order.orderCustomFields = [];
                    angular.forEach(tempCf, function (value, index) {
                        var event = {
                            id: value.id,
                            name: value.name || value.customFieldName,
                            typeId: value.typeId,
                            value: value.value,
                            customFieldTypeId: value.customFieldTypeId,
                            customFieldId: value.customFieldId,
                            customFieldName: value.name || value.customFieldName
                        };

                        if (event.name.toLocaleLowerCase() == "event") {
                            event.value = $scope.eventDate;
                        } else if (event.name.toLocaleLowerCase() == "pre-production") {
                            event.value = moment($scope.preProductionDate).format('YYYY-MM-DD');
                        }

                        order.orderCustomFields.push(event);
                    });

                    newData.order = data;
                    newData.customFields = angular.copy(order.orderCustomFields);
                    newData.items = angular.copy($scope.order.items);
                    newData.quantity = 0;

                    angular.forEach(newData.items, function (item) {
                        item.overriddenSetupTotal = item.config.selectedPrintTypeConfig.overriddenSetupTotal;
                        item.overriddenTotal = item.config.selectedPrintTypeConfig.overriddenTotal;
                        item.overriddenUnitPrice = item.config.selectedPrintTypeConfig.overriddenUnitPrice;
                        item.overridePricing = item.config.selectedPrintTypeConfig.overridePricing;
                        item.setupTotal = item.config.selectedPrintTypeConfig.setupTotal;
                        item.unitPrice = item.config.selectedPrintTypeConfig.unitPrice;
                        item.additionalItems = item.config.additionalItems;
                        item.additionalItemsTotalPrice = item.config.additionalItemsTotalPrice;
                        var isOverride = typeof item.config.selectedPrintTypeConfig.overridePricing !== "undefined" ? item.config.selectedPrintTypeConfig.overridePricing : false;

                        // Quantity
                        if (isOverride) {
                            if (typeof item.config.selectedPrintTypeConfig.overriddenQuantity !== "undefined") {
                                item.overriddenQuantity = item.config.selectedPrintTypeConfig.overriddenQuantity;
                                item.quantity = item.config.selectedPrintTypeConfig.overriddenQuantity;
                                newData.quantity = newData.quantity + (item.overriddenQuantity !== item.quantity ? item.overriddenQuantity : item.quantity);
                            }
                        }
                    });

                    newData.order.artworkFile = $scope.doc;
                    newData.isOrderDataModified = order.isOrderDataModified;

                    if (isQuote) {
                        $scope.quoteButtonText = "Saving...";
                    } else {
                        $scope.submitButtonTxt = "Submitting...";
                    }
                    $scope.disableSubmitButton = true;

                    baseFactory.post('/api/ppiorder/save', newData).then(function (rdata) {
                        if (!rdata.isErrored) {

                            if (!rdata.object.order.isQuote && $scope.isCodCustomer && rdata.object.requiresPartPayment) {
                                $state.go("base.checkout.payment", { orderId: rdata.object.order.id }, {});
                                return;
                            }

                            var typeName = (rdata.object.order.isQuote ? "quote" : "order");

                            promptFactory.confirm("Your " + typeName + " has been submitted.  Would you like to export the " + typeName + " report?", function (result) {
                                if (result) {
                                    var reportUrl = (rdata.object.order.isQuote ? "/Report/PpiQuote/" : "/Report/PpiOrder/");
                                    $scope.downloadOrderUrl = reportUrl + (rdata.object.orderIdsCreated || rdata.object.order.id);
                                    $timeout(function () {
                                        document.getElementById('adownloadorder').click();
                                        $timeout(function () {
                                            if (isQuote && $state.href('base.quotes'))
                                                $state.transitionTo('base.quotes', {}, { reload: true });
                                            else
                                                $state.transitionTo('base.orders', {}, { reload: true });
                                        }, 500);
                                    }, 100);
                                } else {
                                    if (isQuote && $state.href('base.quotes'))
                                        $state.transitionTo('base.quotes', {}, { reload: true });
                                    else
                                        $state.transitionTo('base.orders', {}, { reload: true });
                                }
                            });
                        }

                        if (isQuote) {
                            $scope.quoteButtonText = "Save Quote";
                        } else {
                            $scope.submitButtonTxt = "Submit Order";
                        }
                        $scope.disableSubmitButton = false;
                    });
                });
            }

            $scope.tempEmailAddress = "";
            $scope.addNotification = function (email) {
                if (window.isValidEmailAddress(email)) {
                    if ($scope.order.notifications.indexOf(email) < 0)
                        $scope.order.notifications.push(angular.copy(email));
                    $scope.tempEmailAddress = "";
                }
            };
            $scope.deleteNotification = function (email) {
                for (var i = 0; i < $scope.order.notifications.length; i++) {
                    if ($scope.order.notifications[i] === email) {
                        $scope.order.notifications.splice(i, 1);
                        break;
                    }
                }
            };

            $rootScope.$on(CART_CONSTANTS.UPDATE_CART, function () {
                //ppiOrderFactory.resetSplitDeliveryItems($scope.order);

                // CLEAR ORIGINAL FREIGHT PRICE
                angular.forEach($scope.order.uiData.deliverySplits, function (split) {
                    split.freightResult = null;
                });

                ppiOrderFactory.updateFreight($scope.order);
            });

            function displayOptionalFields() {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderJobBagModal/orderJobBagModal.html',
                    controller: 'orderJobBagModalCtrl',
                    size: 'md',
                    resolve: {
                        orderData: function () {
                            return baseFactory.fetch('/api/ppiorder/get/' + $scope.order.id).then(function (data) {
                                return data.object;
                            });
                        }
                    }
                });

                modalInstance.result.then(
                    function (updatedOrder) {
                        $scope.order.uiData = angular.copy(angular.fromJson(updatedOrder.uiData));
                        $scope.order.orderData = angular.copy(updatedOrder.orderData);
                        // $scope.order.isOrderDataModified = true;
                    }, function (updatedOrder) {
                    });
            }

            init(orderData);

            // BROADCAST
            $rootScope.$on('$itemColour:updated', function (event) {
                console.log('$itemColour:updated');
                $scope.order.isOrderDataModified = true;
            });
        }
    ]);

(function () {
    'use strict';
    orderModule.controller('standardOrderPpiController', standardOrderPpiController);
    standardOrderPpiController.$inject = ['$scope', '$state', '$sce', 'baseFactory', 'membershipFactory',
        'sharedFactory', 'promptFactory', '$rootScope', '$timeout', 'modalFactory',
        '$modal', 'IMPORT_CONSTANTS', 'order', 'isNew', 'customerContacts', 'categories'];
    function standardOrderPpiController($scope, $state, $sce, baseFactory, membershipFactory,
        sharedFactory, promptFactory, $rootScope, $timeout, modalFactory,
        $modal, IMPORT_CONSTANTS, order, isNew, customerContacts, categories) {
        $scope.createNewOrder = createNewOrder;
        $scope.convertQuoteToOrder = convertQuoteToOrder;
        $scope.addOrderItem = addOrderItem;
        $scope.removeOrderItem = removeOrderItem;
        $scope.isValid = isValid;
        $scope.enableAddItems = false;
        $scope.orderItem = {};
        $scope.updateTotalPrice = updateTotalPrice;
        $scope.displayOptionalFields = displayOptionalFields;
        $scope.openPreProductionDate = openPreProductionDate;
        $scope.openDeliveryDate = openDeliveryDate;
        $scope.trustAsHtml = trustAsHtml;
        $scope.removeArtworkApprovalFile = removeArtworkApprovalFile;
        $scope.itemsValid = false;
        $scope.changeItemImage = changeItemImage;
        $scope.removeItemImage = removeItemImage;
        $scope.onItemFileSelect = onItemFileSelect;
        $scope.categories = categories;

        $scope.totalPrice = 0;

        $scope.$onRootScope(IMPORT_CONSTANTS.FILE_IMPORTED + "StdOrder", function (e, doc) {
            doc.$$hashKey = null;
            $scope.order.artworkFile = doc;
        });

        $scope.containsTokens = function (state, viewValue) {
            if (!state || typeof state !== "string") {
                return false;
            }

            var matches = [];
            var tokens = viewValue.split(" ");

            for (var i = 0; i < tokens.length; i++) {
                if (state.toLowerCase().trim().indexOf(tokens[i].toLowerCase().trim()) > -1) {
                    matches.push(true);
                } else {
                    matches.push(false);
                }
            }

            var allMatch = true;

            for (var j = 0; j < matches.length; j++) {
                if (!matches[j]) {
                    allMatch = false;
                }
            }

            return allMatch;
        };

        //Upload Document
        $scope.onFileSelect = onFileSelect;
        $scope.changeFile = changeFile;
        $scope.resetInputFile = resetInputFile;
        var isDocument = true;
        var isMedia = true;
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg", "jpeg"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        function onFileSelect($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        function changeFile() {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };

        function resetInputFile() {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };
        //End of Upload Document

        function init() {
            $scope.dateOptions = {
                formatYear: 'yy',
                startingDay: 1
            };
            $scope.datePickers = {
                preProductionDateOpened: false,
                deliveryDateOpened: false
            };

            var customerId = $rootScope.user.customerId;
            if (!customerId) {
                customerId = ($rootScope.user.impersonateCustomerId || "").trim();
            }

            $scope.isCompanyUser = [1, 2, 4].indexOf($rootScope.user.userType) !== -1;
            $scope.displayImpersonate = !customerId;

            $scope.enableAddItems = true;

            $scope.status.open = false;
            //$scope.itemConfigs = order.configuration.value ? JSON.parse(order.configuration.value) : [];
            $scope.items = order.sageItems;
            $scope.DisplayOptionalFields = order.DisplayOptionalFields;

            if (typeof order.notifications === 'undefined' || order.notifications == null)
                order.notifications = [];
            // console.log(angular.copy(order));
            $scope.order = order;

            $scope.buttonToggles = {};
            //
            if ($scope.order.isNotifications)
                $scope.buttonToggles.isSendEmails = 'Yes';

            if (customerContacts.length > 0) {
                $scope.order.customerContacts = customerContacts;
            } else if ($scope.order.customerContacts === null) {
                baseFactory.fetch('/api/Customer/GetAllContacts').then(function (rdata) {
                    $scope.order.customerContacts = rdata;
                });
            }

            $scope.order.uiData = ($scope.order.uiData ? JSON.parse($scope.order.uiData) : {}) || {};
            $scope.order.uiData.isStandardOrder = true;

            $scope.uiDataOptions = {
                deliveryRequired: $scope.order.uiData.deliveryRequired ? "Yes" : undefined,
                isEvent: $scope.order.uiData.isEvent ? "Yes" : undefined,
                isPreProduction: $scope.order.uiData.preProduction ? "Yes" : undefined,
                preProductionDate: $scope.order.uiData.preProduction,
                ourDate: $scope.order.uiData.useOurDate ? "Yes" : undefined,
                useArtworkFileAsItemImage: $scope.order.uiData.useArtworkFileAsItemImage ? "Yes" : undefined
            };

            if ($scope.order.items == null) {
                $scope.order.items = [];
            }

            var uiData = $scope.order.uiData;
            if (uiData && uiData.items) {
                // var origItems = angular.copy($scope.order.items);
                // $scope.order.items = uiData.items;

                if ($scope.order.items) {
                    angular.forEach(uiData.items, function (oItem, outerIndex) {
                        angular.forEach($scope.order.items, function (item, innerindex) {
                            if (oItem.itemNumber == item.itemNumber) {
                                if (item.imageUrl == null)
                                    item.imageUrl = '/content/img/placeholder.png';
                                if (oItem.imageUrl != null)
                                    if (oItem.imageUrl.length > item.imageUrl.length)
                                        item.imageUrl = oItem.imageUrl;
                                item['artworkApprovalFiles'] = oItem['artworkApprovalFiles'];
                                if (outerIndex === innerindex) {
                                    item.kitNumber = oItem.kitNumber || item.kitNumber;
                                    item.kits = oItem.kits || item.kits;
                                    item.kitting = oItem.kitting || item.kitting;
                                }
                            }
                        });
                    });
                    angular.forEach($scope.order.items, function (item) {
                        if (item.serialisedConfig) {
                            item.config = angular.fromJson(item.serialisedConfig);
                        }
                    });
                }

                // console.log($scope.order);
            }

            $scope.order.customer = { customerId: $rootScope.user.impersonateCustomerId, name: $rootScope.user.impersonateCustomerName };
            baseFactory.fetch("/api/Order/GetCreateUpdateOrderModel?customerId=" + $scope.order.customer.customerId).then(function (data) {
                $scope.items = data.object.sageItems;
            });

            if (!isNew) {
                updateTotalPrice();

                var itemGroupDetails = function (itemNumber) {
                    for (var i = 0; i < $scope.order.orderItemGroups.length; i++) {
                        var g = $scope.order.orderItemGroups[i];
                        if (g.itemNumber == itemNumber) {
                            return g.itemDetails;
                        }
                    }
                    return null;
                };
                angular.forEach($scope.order.items, function (i) {
                    var details = itemGroupDetails(i.itemNumber);
                    if (details != null) {
                        i.kits = details.kits;
                        i.kitting = details.kitting;
                    }
                });
            }
            else {
                $scope.order.items = [];
                $scope.buttonToggles.isSendEmails = 'Yes';
            }

            $scope.order.sageOrder = $scope.order.orderNumber == null ? "" : $scope.order.orderNumber;

            if ($scope.order.id && $scope.order.id > 0) {
                convertServerModel();
            }

            $scope.importOptions = {
                hideImportButton: true,
                fileLabel: "Artwork File",
                messageIdentifier: "StdOrder",
                existingDoc: angular.copy($scope.order.artwork)
            };

            if ($scope.order.artwork) {
                $scope.doc = {
                    id: $scope.order.artwork.id,
                    permissions: [],
                    fileName: $scope.order.artwork.fileName,
                    link: $scope.order.artwork.link,
                    isUploaded: true,
                    isDownload: true,
                    downloadLink: $scope.order.artwork.link
                };
            } else {
                $scope.doc = {
                    id: 0,
                    permissions: []
                };
            }
            $timeout(function () {
                $scope.$broadcast('INIT_DONE');
            }, 1000);
        }

        function convertServerModel() {
            $scope.companyDisabled = true;
            $scope.enableAddItems = true;
            $scope.order.customer = {
                customerId: order.customerId,
                name: order.customerName
            };
        }

        function openPreProductionDate($event) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.openPreProduction = true;
            $scope.datePickers.preProductionDateOpened = true;
        };

        function openDeliveryDate($event, cf) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.opened = true;
            $scope.datePickers.deliveryDateOpened = true;
        };

        function addOrderItem() {
            if (!$scope.orderItem.currentItem || !$scope.orderItem.currentItem.itemNumber || !$scope.orderItem.currentQty || $scope.orderItem.currentQty == 0) {
                return;
            }
            var item = $scope.orderItem.currentItem;
            var qty = $scope.orderItem.currentQty;
            var itemExist = false;
            angular.forEach($scope.order.items, function (i) {
                if (item.itemNumber === i.itemNumber) {
                    itemExist = true;
                }
            });

            //if (itemExist) {
            //    return;
            //}

            var newItem = {
                itemNumber: item.itemNumber,
                itemName: item.description,
                category: null,
                quantity: qty,
                unitPrice: item.unitPrice,
                totalPrice: item.unitPrice * qty,
                imageUrl: item.imageUrl,
                kitting: item.kitting,
                kits: []
            };

            baseFactory.fetch("/api/order/getItemSetup?itemNumber=" + newItem.itemNumber).then(function (data) {
                if (!data.isErrored) {
                    newItem.kits = data.object.kitNumbers;
                    newItem.category = data.object.category;
                }
            });

            $scope.totalPrice += newItem.totalPrice;
            $scope.order.items.push(newItem);
            $scope.orderItem.currentItem = null;
        }

        function removeOrderItem(item, indx) {
            angular.forEach($scope.order.items, function (i, itemIndex) {
                if (item.itemNumber === i.itemNumber && itemIndex === indx) {
                    $scope.order.items.splice(itemIndex, 1);
                    $scope.totalPrice -= item.totalPrice;
                    return;
                }
            });
        }

        function isValid(form, validateForQuote) {
            var valid = true;

            $scope.itemsValid = $scope.order.items && $scope.order.items.length > 0;

            if (!$scope.order.items || $scope.order.items.length < 1) {
                valid = false;
            }

            for (var i = 0; i < $scope.order.items.length; i++) {
                var item = $scope.order.items[i];
                // PPI-280 Custom orders is accepting no unit price
                if (!item.quantity || item.price === NaN || typeof item.unitPrice === 'undefined') {
                    $scope.itemsValid = false;
                    valid = false;
                }
            }

            if (validateForQuote) {
                return valid;
            }

            if (form.$invalid) {
                valid = false;
            }

            if (!$scope.order.deliveryDate || !$scope.order.purchaseOrderNumber) {
                valid = false;
            }
            if (typeof $scope.info !== 'undefined' && $scope.info != null) {
                $scope.info.locationInvalid = false;
                if (typeof $scope.info.location !== 'object' && $scope.isRequired) {
                    $scope.info.locationInvalid = true;
                    valid = false;
                }
            }

            return valid;
        }

        function createNewOrder(form, isQuote) {
            membershipFactory.ping3(function () {
                $scope.submitted = true;

                if (!isValid(form, isQuote)) {
                    $rootScope.formSubmit(form);
                    console.log('invalid order')
                    return;
                }

                $scope.order.isQuote = isQuote === true;
                if ($scope.info)
                    $scope.order.uiData.shippingDetails = angular.copy($scope.info);
                //
                $scope.order.uiData.deliveryRequired = $scope.uiDataOptions.deliveryRequired === 'Yes';
                $scope.order.uiData.useOurDate = $scope.uiDataOptions.ourDate === "Yes";
                $scope.order.uiData.useArtworkFileAsItemImage = $scope.uiDataOptions.useArtworkFileAsItemImage === "Yes";
                $scope.order.uiData.isEvent = $scope.uiDataOptions.isEvent === "Yes";
                $scope.order.uiData.items = angular.copy($scope.order.items);
                $scope.order.isNotifications = $scope.buttonToggles.isSendEmails === "Yes";
                $scope.order.uiData.freightPrice = $scope.isFreightPriceOverride ? angular.copy($scope.freightPrice) : null;

                if ($scope.uiDataOptions.isPreProduction === "Yes") {
                    $scope.order.uiData.preProduction = moment($scope.uiDataOptions.preProductionDate).format('YYYY-MM-DD');
                } else {
                    $scope.order.uiData.preProduction = null;
                }

                if ($scope.order.deliveryDate) {
                    $scope.order.deliveryDate = moment($scope.order.deliveryDate).format('YYYY-MM-DD');
                }

                var tempCf = angular.copy($scope.order.orderCustomFields);
                $scope.order.orderCustomFields = [];
                angular.forEach(tempCf, function (value, index) {
                    var event = {
                        id: value.id,
                        name: value.name || value.customFieldName,
                        typeId: value.typeId,
                        value: value.value,
                        customFieldTypeId: value.customFieldTypeId,
                        customFieldId: value.customFieldId,
                        customFieldName: value.name || value.customFieldName
                    };

                    if (value.customFieldName.toLocaleLowerCase() == "event") {
                        event.value = $scope.eventDate;
                    } else if (value.customFieldName.toLocaleLowerCase() == "pre-production") {
                        event.value = $scope.uiDataOptions.preProductionDate;
                    }

                    order.orderCustomFields.push(event);
                });

                var ppiOrderModel = {
                    order: $scope.order,
                    customFields: [],
                    artworkFile: $scope.order.artworkFile,
                    items: angular.copy($scope.order.items),
                    sendQuoteEmail: true
                };

                ppiOrderModel.order.uiData = JSON.stringify(ppiOrderModel.order.uiData);
                ppiOrderModel.order.artworkFile = $scope.doc;
                ppiOrderModel.artworkFile = $scope.doc;
                // console.log($scope.order);
                // console.log(ppiOrderModel);
                baseFactory.post('/api/ppiorder/save', ppiOrderModel).then(function (rdata) {
                    if (!rdata.isErrored) {
                        if (rdata.object.order.id > 0) {
                            var typeName = (rdata.object.order.isQuote ? "quote" : "order");
                            promptFactory.confirm("Your " + typeName + " has been submitted.  Would you like to export the " + typeName + " report?", function (result) {
                                if (result) {
                                    var reportUrl = (rdata.object.order.isQuote ? "/Report/PpiQuote/" : "/Report/PpiOrder/");
                                    window.open(reportUrl + (rdata.object.orderIdsCreated || rdata.object.order.id));
                                    if (isQuote && $state.href('base.quotes'))
                                        $state.transitionTo('base.quotes', {}, { reload: true });
                                    else
                                        $state.transitionTo('base.orders', {}, { reload: true });
                                } else {
                                    if (isQuote && $state.href('base.quotes'))
                                        $state.transitionTo('base.quotes', {}, { reload: true });
                                    else
                                        $state.transitionTo('base.orders', {}, { reload: true });
                                }
                            });
                        }
                    }

                    if (isQuote) {
                        $scope.quoteButtonText = "Create Quote";
                    } else {
                        $scope.submitButtonTxt = "Submit Order";
                    }
                    $scope.disableSubmitButton = false;
                });
            });
        }

        function convertQuoteToOrder(orderId) {
            return baseFactory.fetch('/api/order/OrderQuote/?orderId=' + orderId).then(function (data) {
                if (!data.isErrored) {
                    $state.go('^', null, { reload: true });
                }
            });
        }

        function updateTotalPrice(item) {
            if (item)
                item.totalPrice = parseFloat((item.quantity * item.unitPrice).toFixed(2));

            var totalPrice = 0;
            angular.forEach($scope.order.items, function (i) {
                totalPrice += i.totalPrice;
            });
            $scope.totalPrice = totalPrice;
        }

        function displayOptionalFields() {
            $modal.open({
                templateUrl: '/app/modules/order/orderJobBagModal/orderJobBagModal.html',
                controller: 'orderJobBagModalCtrl',
                size: 'md',
                resolve: {
                    orderData: function () {
                        return baseFactory.fetch('/api/ppiorder/get/' + $scope.order.id).then(function (data) {
                            return data.object;
                        });
                    }
                }
            });
        }

        function trustAsHtml(markup) {
            return $sce.trustAsHtml(markup);
        }

        function removeArtworkApprovalFile(file) {
            $scope.order.artworkFile = null;
        }

        function removeItemImage(item, index) {
            item.uploadedDocumentId = -1;
            item.imageUrl = null;
            document.getElementById('fileSelectUpload' + index).value = null;
        }

        function changeItemImage(index) {
            $timeout(function () {
                var ele = document.getElementById('fileSelectUpload' + index);
                if (typeof ele.click == 'function') {
                    ele.click()
                } else if (typeof ele.onclick == 'function') {
                    ele.onclick()
                }
            }, 500);
        }

        function onItemFileSelect($files, item) {
            if ($files.length > 0)
                if (isFileValid($files[0].name)) {
                    $scope.isFileUploading = true;
                    $scope.progress = 0;

                    baseFactory
                        .upload('/api/upload/media', { oldfolder: '' }, $files)
                        .progress(function (evt) {
                        })
                        .success(function (data) {
                            $scope.isFileUploading = false;
                            if (!data.isErrored) {
                                // temporary folder
                                $scope.fileModel = data.object;

                                var doc = {
                                    id: 0,
                                    permissions: []
                                };

                                doc.fileFolder = $scope.fileModel.fileFolder;
                                doc.fileName = $scope.fileModel.fileName;
                                doc.name = $files[0].name;
                                doc.isUploaded = true;
                                doc.isNew = true;
                                doc.docTypeId = 2;
                                doc.orderItemId = item.id;

                                // Save
                                baseFactory.post("/api/documents/save", doc).then(function (rrdata) {
                                    if (!rrdata.isErrored && rrdata.object) {
                                        item.imageUrl = rrdata.object.link;
                                        item.uploadedDocumentId = rrdata.object.id;
                                    }
                                });
                            }
                        });
                }
        }

        $scope.tempEmailAddress = "";
        $scope.addNotification = function (email) {
            if (window.isValidEmailAddress(email)) {
                if ($scope.order.notifications.indexOf(email) < 0)
                    $scope.order.notifications.push(angular.copy(email));
                $scope.tempEmailAddress = "";
            }
        };
        $scope.deleteNotification = function (email) {
            for (var i = 0; i < $scope.order.notifications.length; i++) {
                if ($scope.order.notifications[i] === email) {
                    $scope.order.notifications.splice(i, 1);
                    break;
                }
            }
        };

        $scope.getArrValue = function (arr, key, name, model) {
            for (var i = 0; i < arr.length; i++) {
                if (arr[i][key] == model) {
                    return arr[i][name];
                }
            }
        };

        init();
    }
})();
(function () {
    'use strict';
    orderModule.controller('sageStandardOrderImportItem', checkoutItem);
    checkoutItem.$inject = ['$scope', '$rootScope', 'modalFactory', 'permissionFactory', 'shoppingCartFactory', 'listFactory', 'CART_CONSTANTS', 'IMPORT_CONSTANTS'];

    function checkoutItem($scope, $rootScope, modalFactory, permissionFactory, shoppingCartFactory, listFactory, CART_CONSTANTS, IMPORT_CONSTANTS) {

        $scope.removeArtworkApprovalFile = removeArtworkApprovalFile;

        function init() {
            if (!$scope.item.artworkApprovalFiles)
                $scope.item.artworkApprovalFiles = [];

            $scope.importOptions = {
                hideImportButton: true,
                hideLabel: true,
                messageIdentifier: $scope.item.$$hashKey,
                clearAfterImport: true
                //existingDoc: angular.copy($scope.item.artworkApprovalFile)
            };
        }
        init();

        function removeArtworkApprovalFile(file) {
            if (!file)
                return;
            listFactory.remove($scope.item.artworkApprovalFiles, file);
            $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: false });
        }

        $scope.$onRootScope(IMPORT_CONSTANTS.FILE_IMPORTED + $scope.item.$$hashKey, function (e, doc) {
            var valid = true;
            angular.forEach($scope.item.artworkApprovalFiles, function (approvalFile) {
                if (doc.fileName.toLowerCase() == approvalFile.fileName.toLowerCase())
                    valid = false;
            });
            if (!valid)
                return false;
            //clear hashes so that duplicates dont appear in artworkApprovalFiles
            doc.$$hashKey = null;
            listFactory.add($scope.item.artworkApprovalFiles, doc);
            $rootScope.$emit(CART_CONSTANTS.UPDATE_CART, { overwriteOverriddenPrices: false });
        });
    }
})();
orderModule.directive('sageCustomOrderImportItem',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                item: '='
            },
            templateUrl: '/app/modules/order/editOrderPPI/directives/importItem.html',
            controller: 'sageStandardOrderImportItem',
            link: function postLink(scope, elem, attr) {
            }
        };
    }]);
(function () {
    orderModule.controller('editOrderDeliveryAddress', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'delivery'];

    function ctrl($scope, $rootScope, $modalInstance, delivery) {

        $scope.delivery = delivery;

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };


        $scope.states = [{
            id: 1,
            name: 'ACT'
        }, {
            id: 2,
            name: 'NSW'
        }, {
            id: 3,
            name: 'NT'
        }, {
            id: 4,
            name: 'QLD'
        }, {
            id: 5,
            name: 'SA'
        }, {
            id: 6,
            name: 'TAS'
        }, {
            id: 7,
            name: 'VIC'
        }, {
            id: 8,
            name: 'WA'
        }];

        if ($scope.delivery.state) {
            $scope.delivery.state = $scope.delivery.state.replace(/\s+/g, '');
        }

        //angular.forEach($scope.states, function (value, index) {
        //    if (value.name == $scope.delivery.state) {
        //        alert(value.name);
        //    }
        //})

        $scope.ok = function (delivery) {
            $modalInstance.close($scope.delivery);
        }

    }
})();
orderModule.controller('optionalFieldsModal', ["$scope", "$modalInstance", "optionalFields", function ($scope, $modalInstance, optionalFields) {

    $scope.optionalFields = optionalFields;

    $scope.ok = function () {
        $modalInstance.close($scope.optionalFields);
    };

}]);
orderModule.controller('exportPpiInvoiceModal', function ($scope, $rootScope, $modalInstance, invoices) {

    $scope.invoices = invoices.object;
    console.log($scope.invoices);
    
    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };
});
(function () {
    orderModule.controller('ImportOrderModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', 'baseFactory', 'GRID_CONSTANTS'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, baseFactory, GRID_CONSTANTS) {

        // DECLARATIONS
        $scope.clients = [
            { id: "LOVBLI", name: "Love Light" }
        ];
        $scope.doc = {

        };
        $scope.submitTxt = "Import";

        $scope.disableSubmitButton = false;

        // PRIVATE

        // PUBLIC
        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = ["xls", "xlsx"];
            var result = fType.indexOf(ext) >= 0;

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        $scope.onFileSelect = function ($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {

                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Import";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };
        $scope.changeFile = function () {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };
        $scope.resetInputFile = function () {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type === 'file') {
                    elems[i].value = null;
                }
            }
        };
        $scope.save = function (mForm, m) {
            $scope.resultData = null;
            $scope.downloadResponseUrl = null;
            $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Importing...";
                $scope.disableSubmitButton = true;
                $scope.isUploaded = false;
                baseFactory.post("/api/order/importExcel", m).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $scope.isUploaded = true;
                        $modalInstance.close(rdata.object);
                        //$scope.resultData = rdata.object;

                        //// RESET
                        //$scope.doc = {
                        //    importTypeId: null,
                        //    file: {
                        //        fileFolder: "",
                        //        fileName: ""
                        //    },
                        //    param: {}
                        //};
                    }
                    $scope.submitTxt = "Import";
                    $scope.disableSubmitButton = false;
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss();
        };

        // INIT
        $scope.importFile = {};
    }
})();
orderModule.controller('OrderAlertsCtrl', ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'GRID_CONSTANTS', 'orderId',
    function ($scope, $rootScope, $modalInstance, baseFactory, GRID_CONSTANTS, orderId) {

    $scope.orderId = orderId;

    $scope.gridLogs = {
        itemType: 'Order Alerts',
        gridName: 'orderAlerts',
        fetchUrl: '/api/order/SearchAllAlerts/' + orderId,
        initSortString: 'date desc',
        enableSorting: false,
        enableSearching: false,
        enablePaging: true,
        enableDateRange: false,
        columnDefs: [
            { field: 'date', displayName: 'Date', customSortField: 'date', cellFilter: 'date:\'dd/MM/yyyy\'', width: "100px", sortable: false },
            { field: 'date', displayName: 'Time', customSortField: 'date', cellFilter: 'date:\'HH:mm\'', width: "80px", sortable: false },
            { field: 'reason', displayName: 'Reason', customSortField: 'reason', width: "150px", sortable: false },
            { field: 'comments', displayName: 'Comments', customSortField: 'comments', sortable: false }
        ]
    };


    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };

}]);
orderModule.controller('OrderApiDataModalCtrl', function ($scope, $rootScope, $modalInstance, $timeout, baseFactory, ppiOrderFactory, order, apiData) {

    $scope.order = order;
    $scope.apiData = angular.fromJson(apiData.value);

    $scope.cancel = function () {
        $modalInstance.close();
    };
});
orderModule.controller('orderDetail', function ($scope, $rootScope, $modalInstance, order, baseFactory, orderStatuses, GRID_CONSTANTS, gridName) {

    $scope.order = order;
    var qouteStatus = null;

    $scope.orderStatuses = orderStatuses;

    angular.forEach(orderStatuses, function (v, index) {
        if (v.name == "Quote") {
            qouteStatus = v;
        }
    });

    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };
    $scope.save = function (m, statusComments) {
        if (qouteStatus != null && m.statusId == qouteStatus.id) {
            var changeQuoteStatus = "/api/order/orderquote?orderId=" + m.id;
            baseFactory.fetch(changeQuoteStatus).then(function (data) {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                $modalInstance.close(data.object);
            });
        }
        else {
            var changeOrderStatus = "/api/order/updateorderstatus?orderId=" + m.id + "&statusId=" + m.statusId + "&comment=" + statusComments;
            baseFactory.fetch(changeOrderStatus).then(function (data) {
                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                $modalInstance.close(data.object);
            });
        }
        
    }

});
(function () {
    "use strict";

    angular.module("appOrderModule").directive("firmAnswerRequired", function () {
        // requires an isloated model
        return {
            // restrict to an attribute type.
            restrict: 'A',
            // element must have ng-model attribute.
            require: 'ngModel',
            link: function (scope, ele, attrs, ctrl) {

                scope.$watch("question.options", function() {
                    validateOptions(scope.item.questions[scope.item.questions.indexOf(scope.question)].value);
                });

                //For DOM -> model validation
                ctrl.$parsers.unshift(function (value) {
                    if (!scope.requireAnswer) {
                        return value;
                    }

                    var valid = true;

                    if (!value || value.toString().toLowerCase().trim() === "n/a") {
                        // test and set the validity after update.
                        valid = false;
                        ctrl.$setValidity("firmAnswerError", false);
                    } else {
                        ctrl.$setValidity("firmAnswerError", true);
                    }

                    // if it's valid, return the value to the model,
                    // otherwise return undefined.
                    return valid ? value : undefined;
                });

                //For model -> DOM validation
                ctrl.$formatters.unshift(function (value) {
                    return validateOptions(value);
                    //var valid = true;

                    //if (scope.requireAnswer) {
                    //    if (scope.question.options.length > 1) {
                    //        valid = !(value && value.toString().toLowerCase().trim() === "n/a");
                    //    }
                    //}

                    //var rq = attrs.requireAnswer;

                    //ctrl.$setValidity('firmAnswerError', valid);
                    //return value;
                });

                function validateOptions(value) {
                    var valid = true;

                    if (scope.requireAnswer && scope.question && scope.question.options) {
                        if (scope.question.options.length > 1) {
                            valid = !(value && value.toString().toLowerCase().trim() === "n/a");
                        }
                    }

                    var rq = attrs.requireAnswer;

                    ctrl.$setValidity('firmAnswerError', valid);
                    return value;
                }
            }
        }
    });
})();
(function () {
    'use strict';
    orderModule.controller('orderItemCustomField', orderItemCustomField);
    orderItemCustomField.$inject = ['$scope', '$modal'];
    function orderItemCustomField($scope, $modal) {

        $scope.fieldDisabled = fieldDisabled;
        $scope.pricingDropdownFieldChanged = pricingDropdownFieldChanged;
        $scope.selectRequired = selectRequired;

        function fieldDisabled(field, item) {
            if ($scope.detailsMode)
                return true;

            if (!field || !field.dependantField || !field.dependantAnswer)
                return false;

            //field has dependant answer. this should only be enabled if the dependantField is set
            var disabled = true;
            angular.forEach(item.questions, function (otherField) {
                if (otherField.id !== field.dependantField.id)
                    return;
                //ids match
                var v = otherField.typeName.toLowerCase() === 'curvedtracks' || otherField.typeName.toLowerCase() === 'benttracks' ? otherField.tempValue : otherField.value;
                if (v === field.dependantAnswer)
                    disabled = false;
            });
            if (disabled)
                field.value = '';
            return disabled;
        }

        function pricingDropdownFieldChanged(question, lineItem) {
            angular.forEach(lineItem.questions, function (itemQuestion) {
                if (itemQuestion.dependantField
                    && itemQuestion.dependantField.id == question.id
                    && itemQuestion.dependantFieldOptions) {
                    //another field's options need to be changed as its dependant field has been updated
                    itemQuestion.options = [];
                    angular.forEach(itemQuestion.dependantFieldOptions, function (dependantOption) {
                        var v = question.typeName.toLowerCase() === 'curvedtracks' || question.typeName.toLowerCase() === 'benttracks' ? question.tempValue : question.value;
                        if (dependantOption.itemNumber === v)
                            itemQuestion.options = angular.copy(dependantOption.options);
                    });
                    itemQuestion.options.splice(0, 0, 'N/A');
                    //autoselect the first if there is only 1 option
                    if (itemQuestion.options.length == 1)
                        itemQuestion.value = itemQuestion.options[0];
                }
            });
        }

        function isJson(str) {
            try {
                JSON.parse(str);
            } catch (e) {
                return false;
            }
            return true;
        }

        function selectRequired(requireAnswer, items) {
            if (!requireAnswer || !items) {
                return false;
            }

            if ($scope.question.options.length === 1 && $scope.question.options[0] === 'N/A') {
                return false;
            }

            return true;
        }

        pricingDropdownFieldChanged($scope.$parent.question, $scope.item);

        if ($scope.question.typeName.toLowerCase() === 'curvedtracks' || $scope.question.typeName.toLowerCase() === 'benttracks') {
            if (isJson($scope.question.value))
                $scope.question.tempValue = angular.fromJson($scope.question.value);
        }

        $scope.openMultipleModal = function (question, item, tab, w) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderItemDetails/orderItemCustomFieldBentTracks.html',
                controller: 'orderItemCustomFieldBentTracksModalCtrl',
                size: 'lg',
                backdrop: 'static',
                resolve: {
                    field: function () {
                        return question;
                    },
                    width: function () {
                        return w;
                    }
                }
            });

            modalInstance.result.then(function (v) {
                question.value = v === null ? null : angular.toJson(v);
                question.tempValue = v === null ? null : angular.fromJson(v);
                $scope.pricingDropdownFieldChanged(question, item);
                $scope.$parent.pricingFieldChanged(item, tab);
            }, function () {

            });
        };
    }
})();
(function () {
    'use strict';
    orderModule.controller('orderItemCustomFieldBentTracksModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance', 'field', 'width'];

    function ctrl($scope, $modalInstance, field, width) {
        $scope.field = angular.copy(field);
        $scope.errors = [];
        $scope.field.selectedQuestion = {
            "id": null,
            "question": "N/A",
            "options": []
        };
        $scope.field.selectedQuestionId = null;
        $scope.cancel = cancel;
        $scope.save = save;
        var questions = $scope.questions = [
            {
                "id": null,
                "question": "No",
                "options": []
            },
            {
                "id": 1,
                "question": "Hand Drawn 90° Track",
                "options": [
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/90-1.png",
                        "name": "Option 1",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null }
                        ]
                    },
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/90-2.png",
                        "name": "Option 2",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null },
                            { "isSelected": false, "name": "Measure C", "value": null }
                        ]
                    },
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/90-3.png",
                        "name": "Option 3",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null }
                        ]
                    },
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/90-4.png",
                        "name": "Option 4",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null },
                            { "isSelected": false, "name": "Measure C", "value": null }
                        ]
                    }
                ]
            },
            {
                "id": 2,
                "question": "Hand Drawn 45° Track",
                "options": [
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/45-1.png",
                        "name": "Option 1",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null }
                        ]
                    },
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/45-2.png",
                        "name": "Option 2",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null },
                            { "isSelected": false, "name": "Measure C", "value": null }
                        ]
                    },
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/45-3.png",
                        "name": "Option 3",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null }
                        ]
                    },
                    {
                        "photoUrl": "https://qodo-cdn.azureedge.net/twc/curtaintracks/45-4.png",
                        "name": "Option 4",
                        "isSelected": false,
                        "measurements": [
                            { "isSelected": false, "name": "Measure A", "value": null },
                            { "isSelected": false, "name": "Measure B", "value": null },
                            { "isSelected": false, "name": "Measure C", "value": null }
                        ]
                    }
                ]
            }
        ];

        $scope.questionChange = function (qq) {
            $scope.field.selectedQuestion = angular.copy(qq);
        };
        $scope.selectOption = function (options, indx) {
            for (var i = 0; i < options.length; i++) {
                if (i === indx) {
                    options[i].isSelected = true;
                } else {
                    options[i].isSelected = false;
                }
            }
        }

        function cancel() {
            $modalInstance.dismiss('cancel');
        }

        function save(form, fld) {
            if (fld.selectedQuestion.id === null) {
                return $modalInstance.close(null);
            }
            $scope.submitted = true;
            if (!form.$valid)
                return;

            $scope.errors = [];
            var qs = {
                question: fld.selectedQuestion.question,
                answer: {
                    name: null,
                    measurements: []
                }
            };
            for (var q = 0; q < fld.selectedQuestion.options.length; q++) {
                if (fld.selectedQuestion.options[q].isSelected) {
                    qs.answer.name = fld.selectedQuestion.options[q].name;
                    qs.answer.measurements = fld.selectedQuestion.options[q].measurements;
                    var total = 0;
                    for (var j = 0; j < qs.answer.measurements.length; j++) {
                        if (qs.answer.measurements[j].value !== null) {
                            total += qs.answer.measurements[j].value;
                        }
                    }
                    if (total !== width)
                        $scope.errors.push("Please ensure all measurements must add to the Width (" + width + ")");
                    break;
                }
            }
            if (qs.answer.name !== null && $scope.errors.length === 0)
                $modalInstance.close(qs);
        }

        if (typeof $scope.field.value !== 'undefined' && $scope.field.value !== null && $scope.field.value !== '') {
            var question1 = angular.fromJson($scope.field.value);
            for (var p = 0; p < questions.length; p++) {
                if (question1.question === questions[p].question) {

                    for (var q = 0; q < questions[p].options.length; q++) {
                        if (question1.answer.name === questions[p].options[q].name) {
                            questions[p].options[q].isSelected = true;
                            questions[p].options[q].measurements = question1.answer.measurements;
                            break;
                        }
                    }
                    $scope.field.selectedQuestion = angular.copy(questions[p]);
                    $scope.field.selectedQuestionId = angular.copy(questions[p].id);
                    break;
                }
            }
        }
        //console.log($scope.field)
    }
})();
(function () {
    "use strict";

    angular.module("appOrderModule").directive("orderItemCustomField", orderItemCustomFieldDirective);

    orderItemCustomFieldDirective.$inject = [];

    function orderItemCustomFieldDirective() {
        return {
            restrict: "E",
            templateUrl: "/app/modules/order/orderItemDetails/orderItemCustomField.html",
            controller: 'orderItemCustomField',
            scope: true,
            link: function (scope, element, attrs) {
                scope.requireAnswer = attrs.requireAnswer === true || attrs.requireAnswer === "true";
            }
        };
    }
})();
(function() {
    'use strict';
    orderModule.controller('orderItemDetailsModal', orderItemDetailsModal);
    orderItemDetailsModal.$inject = ['$scope', '$modalInstance', 'item','detailsMode'];

    function orderItemDetailsModal($scope, $modalInstance, item, detailsMode) {
        $scope.detailsMode = detailsMode;
        $scope.cancel = cancel;
        $scope.save = save;
        $scope.pricingFieldChanged = pricingFieldChanged;

        init();
        function init() {
            $scope.item = angular.copy(item);
        }

        function cancel() {
            $modalInstance.dismiss('cancel');
        }

        function save(form) {
            $scope.submitted = true;
            if (!form.$valid)
                return;

            $modalInstance.close($scope.item.questions);
        }

        //this is just a method stub. This logic is being run once the modal is closed
        //this is here to prevent errors
        function pricingFieldChanged() {

        }
    }
})();
orderModule.controller('orderJobBagModalCtrl', function ($scope, $rootScope, $modalInstance, $timeout, baseFactory, ppiOrderFactory, orderData) {

    $scope.order = orderData;
    $scope.optionalFields = angular.fromJson($scope.order.orderData);
    $scope.exportUrl = '/Report/PpiJobBag/' + orderData.id;
    $scope.disableSubmitButton = false;
    $scope.submitButtonTxt = "Save";
    var responseData = null;

    if (orderData.uiData && orderData.uiData.length) {
        var uiData = angular.fromJson(orderData.uiData);
        if (uiData) {
            $scope.order.uiData = angular.copy(uiData);
            $scope.order.uiData.items = null;
            delete $scope.order.uiData.items;
        }

        if (uiData && uiData.items) {
            $scope.order.items = uiData.items;
        }
    } else {
        $scope.order.uiData = { deliverySplits: [] };
    }

    if ($scope.order.uiData && $scope.order.uiData.deliveryRequired) {
        $timeout(function () {
            ppiOrderFactory.updateFreight($scope.order);
        }, 200);
    }

    $scope.save = function (form, orderr) {

        if (form.$invalid) {
            return;
        }

        var order = angular.copy(orderr);
        //console.log(order);
        //var customerId;
        //var customerName;

        if ($rootScope.impersonate) {
            order.customerId = $rootScope.impersonate.customerId;
            order.customerName = $rootScope.impersonate.name;
        }
        else if(order.customerName.length < 1){
            order.customerId = $rootScope.user.customerId;
            order.customerName = $rootScope.user.customerName;
        }

        $scope.date = new Date();

        order.uiData.items = order.items;
        order.uiData.deliveryRequired = $scope.deliveryRequired === 'Yes';

        var data = {
            id: order.id,
            customerId: order.customerId,
            customerName: order.customerName,
            comments: order.comments,
            orderDescription: order.uiData.printLogo,
            purchaseOrderNumber: order.purchaseOrderNumber,
            orderDate: $scope.date,
            total: 0,
            itemCount: 0,
            userId: $rootScope.user.userId,
            address1: order.delivery ? order.delivery.address : '',
            address2: order.delivery ? order.delivery.address2 : '',
            locationId: order.delivery && order.delivery.location ? order.delivery.location.id : '',
            location: order.delivery,
            items: order.items,
            customFields: order.orderCustomFields,
            deliveryDate: order.deliveryDate,
            isQuote: false,
            statusId: order.statusId,
            uiData: angular.toJson(order.uiData),
            selectedCustomerContact: null,
            selectedCustomerContactId: order.selectedCustomerContactId
        };

        order.uiData.items = null;
        delete order.uiData.items;

        if (data.selectedCustomerContactId) {
            angular.forEach(order.customerContacts, function (contact) {
                if (contact.id === data.selectedCustomerContactId) {
                    data.selectedCustomerContact = contact;
                }
            });
        }

        if (order.delivery && order.delivery.location) {
            angular.forEach(data.items, function (item) {
                item.toLocationId = order.delivery.location.id;
            });
        }

        var newData = {
            order: '',
            customFields: [],
            artworkFile: '',
            items: order.items,
            sendQuoteEmail: true,
            eventDate: order.eventDate,
            preProductionDate: order.preProductionDate
        };

        var tempCf = angular.copy(order.orderCustomFields);
        order.orderCustomFields = [];
        angular.forEach(tempCf, function (value) {

            if (value.customFieldName.toLocaleLowerCase() === "event") {
                value.value = $scope.eventRequired === 'No' ? '' : $scope.eventDate;
            } else if (value.customFieldName.toLocaleLowerCase() === "pre-production") {
                value.value = $scope.preProductionDateRequired === 'No' ? '' : $scope.preProductionDate;
            }

            order.orderCustomFields.push(value);
        });

        newData.order = data;
        newData.customFields = angular.copy(order.orderCustomFields);
        newData.items = $scope.order.items;
        newData.order.artworkFile = $scope.doc;
        newData.order.orderData = angular.toJson($scope.optionalFields);;

        //console.log(newData.order);
        $scope.disableSubmitButton = true;
        $scope.submitButtonTxt = "Saving...";
        baseFactory.post('/api/ppiorder/SaveJobBagDetails', newData).then(function (rdata) {
            if (!rdata.isErrored) {
                responseData = newData.order;
                $modalInstance.close(responseData);
            }
            $timeout(function () {
                $scope.disableSubmitButton = false;
                $scope.submitButtonTxt = "Save";
            }, 500);
        });
    };

    $scope.cancel = function () {
        $modalInstance.dismiss(responseData);
    };

    $scope.updateOptionalField = function (jobBagFieldValue, optionalField) {
        console.log(jobBagFieldValue);
        for (var i = 0; i < $scope.optionalFields.length; i++) {
            if ($scope.optionalFields[i].Name.toLowerCase() === optionalField.toLowerCase()) {
                $scope.optionalFields[i].Value = jobBagFieldValue;
                break;
            }
        }
    };
    $scope.updateJobBagField = function (optionalFieldName, optionalFieldValue) {

        switch (optionalFieldName) {
            case "ARTREF":
                $scope.order.uiData.artRef = optionalFieldValue;
                break;
            case "PLATENUMBER":
                $scope.order.uiData.plateNumber = optionalFieldValue;
                break;
            case "PLTDEPTH":
                $scope.order.uiData.plateDepth = optionalFieldValue;
                break;
            case "ARTINST":
                $scope.order.uiData.artInstruction = optionalFieldValue;
                break;
            case "SCNRULING":
                $scope.order.uiData.screenRuling = optionalFieldValue;
                break;
            case "POS":
                $scope.order.uiData.pos = optionalFieldValue;
                break;
            case "PRINTER":
                $scope.order.uiData.printer = optionalFieldValue;
                break;
            case "PREP":
                $scope.order.uiData.prep = optionalFieldValue;
                break;
            case "OVENTEMP":
                $scope.order.uiData.ovenTemp = optionalFieldValue;
                break;
            case "INKTYPE":
                $scope.order.uiData.inkType = optionalFieldValue;
                break;
            case "PRTINSTRUCTI":
                $scope.order.uiData.printInstructions = optionalFieldValue;
                break;
            case "POSTFLAME":
                $scope.order.uiData.postFlame = optionalFieldValue;
                break;
                //$scope.order.uiData.approvedBy = optionalFieldValue;
                //break;
            case "STK":
                $scope.order.uiData.clientStockOurStock = optionalFieldValue;
                break;
            case "COLOURS":
                $scope.order.uiData.colours = optionalFieldValue;
                break;
        }

    };

});
orderModule.controller('OrderLogsCtrl', ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'GRID_CONSTANTS', 'gridName', 'orderId',
    function ($scope, $rootScope, $modalInstance, baseFactory, GRID_CONSTANTS, gridName, orderId) {

    $scope.orderId = orderId;

    $scope.gridLogs = {
        itemType: 'Order Activity Logs',
        gridName: 'orderActivityLogs',
        fetchUrl: '/api/ActivityLog/SearchAllLogs/?startDate=1970-1-01&orderId=' + orderId,
        initSortString: 'user desc',
        enableSorting: false,
        enableSearching: false,
        enablePaging: true,
        enableDateRange: false,
        columnDefs: [
            { field: 'createdDate', displayName: 'Date', customSortField: 'createdDate', cellFilter: 'date:\'dd/MM/yyyy\'', width: "15%", sortable: false },
            { field: 'createdDate', displayName: 'Time', customSortField: 'createdDate', cellFilter: 'date:\'HH:mm\'', width: "15%", sortable: false },
            { field: 'user', displayName: 'User', customSortField: 'user', width: '15%', sortable: false },
            { field: 'details', displayName: 'Details', customSortField: 'details', sortable: false }
        ]
    };


    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };

}]);
orderModule.controller('orderNumberModalCtrl', function ($scope, $rootScope, $modalInstance, $timeout, baseFactory, order) {

    $scope.m = order;
    $scope.disableSubmitButton = false;
    $scope.submitButtonTxt = "Save";

    $scope.save = function (mForm, m) {
        // console.log(m)
        $rootScope.formSubmit(mForm);
        if (mForm.$invalid)
            return;

        $scope.disableSubmitButton = true;
        $scope.submitButtonTxt = "Saving...";
        baseFactory.post('/api/order/saveOrderNumber?orderNumber='+ m.orderNumber + '&orderId='+ m.id ).then(function (rdata) {
            if (!rdata.isErrored) {
                $modalInstance.close(m.orderNumber);
            }
            $timeout(function () {
                $scope.disableSubmitButton = false;
                $scope.submitButtonTxt = "Save";
            }, 500);
        });
};

$scope.cancel = function () {
    $modalInstance.dismiss(false);
};

});
orderModule.controller('OrderPurchaseOrderModalCtrl',
    ["$scope", "$rootScope", "$state", "$modalInstance", "$timeout", "$locale", "baseFactory", "order", "receiptModel", "orderPaymentDataModel",
    function ($scope, $rootScope, $state, $modalInstance, $timeout, $locale, baseFactory, order, receiptModel, orderPaymentDataModel) {

        $scope.savePayment = savePayment;
        $scope.saveOrder = saveOrder;
        $scope.cancel = cancel;
        $scope.disableSubmitButton = false;
        $scope.submitButtonTxt = "Save";
        $scope.openDeliveryDate = openDeliveryDate;
        $scope.creditCardProcessingRequired = false;

        $scope.datePickers = {
            deliveryDateOpened: false
        };

        init();

        function init() {
            $scope.m = order;
            $scope.orderPaymentDataModel = orderPaymentDataModel;

            if ($scope.orderPaymentDataModel) {
                $scope.creditCardProcessingRequired = true;
                $scope.model = receiptModel;
                $scope.model.orderId = $scope.orderPaymentDataModel.orderId;
                $scope.model.customerId = $scope.orderPaymentDataModel.customerId;
                $scope.model.amount = $scope.orderPaymentDataModel.requiredPaymentAmount;
                $scope.currentYear = new Date().getFullYear();
                $scope.currentMonth = new Date().getMonth() + 1;
                $scope.months = $locale.DATETIME_FORMATS.MONTH;
                $scope.years = [];

                for (var i = $scope.currentYear; i < $scope.currentYear + 20; i++) {
                    $scope.years.push(i);
                }

                $scope.ccinfo = { type: undefined };
            }
        }

        function savePayment(paymentForm) {
            if (paymentForm.$invalid) {
                return;
            }

            $scope.loading = true;
            $scope.model.processPaymentAttempted = false;
            $scope.model.validationErrors = [];

            baseFactory.post("/api/Receipt/CreateReceipt", angular.copy($scope.model)).then(function (data) {
                if (data.object) {
                    if (!data.object.isValid) {
                        $scope.model.validationErrors = data.object.validationErrors;
                    }

                    $scope.model.processPaymentAttempted = data.object.processPaymentAttempted;
                    $scope.model.paymentSuccess = data.object.paymentSuccess;
                    $scope.model.paymentReceiptNumber = data.object.paymentReceiptNumber;
                    $scope.model.paymentError = data.object.paymentError;

                    if (data.object.receiptId) {
                        $scope.creditCardProcessingRequired = false;
                    }
                }
            }).finally(function () {
                $scope.loading = false;
            });
        }

        function saveOrder(mForm, m) {
            // console.log(m)
            $rootScope.formSubmit(mForm);
            if (mForm.$invalid)
                return;

            if (m.deliveryDate) {
                m.deliveryDate = moment(m.deliveryDate).format('YYYY-MM-DD');
            }

            $scope.disableSubmitButton = true;
            $scope.submitButtonTxt = "Saving...";
            baseFactory.fetch('/api/ppiorder/OrderQuote/', { orderId: m.id, po: m.purchaseOrderNumber, deliveryDate: m.deliveryDate }).then(function (rdata) {
                // console.log(rdata.object)
                if (!rdata.isErrored) {
                    if (rdata.object.requiresPartPayment) {
                        $state.transitionTo("base.checkout.payment", { orderId: m.id }, { reload: true });
                    } else {
                        $modalInstance.close(m);
                    }
                } else {
                    $timeout(function() {
                        $scope.disableSubmitButton = false;
                        $scope.submitButtonTxt = "Save";
                    }, 500);
                }
            });
        };

        function cancel() {
            $modalInstance.dismiss(false);
        };

        function openDeliveryDate($event, cf) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.datePickers.deliveryDateOpened = true;
        };
    }]);
(function () {
    'use strict';
    orderModule.controller('OrderReviewModalCtrl', createOrder);
    createOrder.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'GRID_CONSTANTS', 'order', 'gridName', 'matchOrders'];
    function createOrder($scope, $rootScope, $modalInstance, baseFactory, GRID_CONSTANTS, order, gridName, matchOrders) {
        $scope.disableSubmitButton = false;
        $scope.order = order;
        $scope.matchOrders = matchOrders;

        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };
        $scope.save = function (orders) {
            var ids = [];
            for (var i = 0; i < orders.length; i++) {
                ids.push(orders[i].id);
            }
            $scope.disableSubmitButton = true;
            baseFactory.put('/api/twcorder/openOrder?id=' + order.id).then(function (data) {
                if (!data.isErrored) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                    $modalInstance.close(data.object);
                }
                $scope.disableSubmitButton = false;
            });
        };
    }
})();
orderModule.controller('OrderStockAvailabilityModalCtrl',
    ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'GRID_CONSTANTS', 'order',
        function ($scope, $rootScope, $modalInstance, baseFactory, GRID_CONSTANTS, order) {

            $scope.order = order;
            //console.log($scope.order);
            $scope.disableSubmitButton = false;
            $scope.submitButtonTxt = "Save";
            $scope.m = {
                stockAvailable: 'Yes',
                stockDueDate: null
            };

            $scope.openStockDueDate = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.openStockDueDatePicker = true;
            };

            $scope.saveOrder = function (mForm, m) {
                //console.log(m);
                $rootScope.formSubmit(mForm);
                if (mForm.$invalid)
                    return;

                var tempCf = angular.copy(order.orderCustomFields || []);
                var orderCustomFields = [];
                angular.forEach(tempCf, function (value, index) {
                    var event = {
                        orderId: order.id,
                        id: value.id,
                        name: value.name || value.customFieldName,
                        typeId: value.typeId,
                        value: value.value,
                        customFieldTypeId: value.customFieldTypeId,
                        customFieldId: value.customFieldId,
                        customFieldName: value.name || value.customFieldName
                    };

                    if (event.name.toLocaleLowerCase() == "stock available") {
                        event.value = $scope.m.stockAvailable;
                    } else if (event.name.toLocaleLowerCase() == "stock due date") {
                        event.value = $scope.m.stockDueDate ? moment($scope.m.stockDueDate).format('YYYY-MM-DD') : null;
                    }

                    orderCustomFields.push(event);
                });

                $scope.submitButtonTxt = "Saving...";
                $scope.disableSubmitButton = true;

                baseFactory.post('/api/ppiorder/saveCustomFields', orderCustomFields).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $modalInstance.close(orderCustomFields);
                    }

                    $scope.submitButtonTxt = "Save";
                    $scope.disableSubmitButton = false;
                });
            };

            $scope.cancel = function () {
                $modalInstance.close();
            };

            // INIT
            angular.forEach(order.orderCustomFields, function (v) {
                if (v.customFieldName.toLocaleLowerCase() === "stock available") {
                    $scope.m.stockAvailable = v.value || 'Yes';
                } else if (v.customFieldName.toLocaleLowerCase() === "stock due date") {
                    $scope.m.stockDueDate = v.value || null;
                }
            });

        }]);
orderModule.controller('orderType', function ($scope, $rootScope, $modalInstance, baseFactory, $modal, $state, sharedFactory) {

    console.log($rootScope.user);

    $scope.selectCustomer = false;

    if ($rootScope.user.customerId.length == 0) {
        $scope.selectCustomer = true;
    }

    $scope.getCustomer = function (val) {
        return sharedFactory.searchCustomer(val).then(function (data) {
            return data;
        });
    };

    $scope.onSelect = function ($item, $model, $label) {
        $rootScope.user.customerId = $item.customerId;
        $rootScope.user.customerName = $item.name;
    };

    $scope.ok = function (val) {
        $state.go('order.create', { blindTypeName: '', customerId: $scope.customerId });
        $modalInstance.dismiss(false);
    };

    $scope.blindTypes = [];
    $scope.blindType = null;
    $scope.showBlindTypes = false;

    baseFactory.fetch('/api/Configuration/GetConfiguration?name=formBuilder').then(function (data) {
        if (!data.isErrored) {
            $scope.showBlindTypes = true;
            $scope.blindTypes = JSON.parse(data.object.value);
            $scope.blindType = $scope.blindTypes[0];
        }
    });

    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };
});
orderModule.controller('priceBreakdown', function ($scope, $modalInstance, item) {

    $scope.item = item;

    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };
});
orderModule.controller('shipToLocationModal',
[
    "$scope", '$rootScope', "$modalInstance", "order", "isCustomer", "twcZones",
    function ($scope, $rootScope, $modalInstance, order, isCustomer, twcZones) {
        // console.log(order)
        var arr = angular.copy(order.shipToLocations);
        $scope.twcZones = twcZones;
        order.shipToLocations = [];
        angular.forEach(arr, function (t) {
            t.name = t.locationName;
            if (t.city.length > 0)
                t.name = t.name + ' - ' + t.city;
            order.shipToLocations.push(t);
        });

        $scope.order = angular.copy(order);
        $scope.model = {
            customerShipToLocationId: order.customerShipToLocationId,
            locationName: order.locationName,
            address1: order.address1,
            address2: order.address2,
            city: order.city,
            state: order.state,
            postcode: order.postcode,
            phone: order.phone,
            email: order.email,
            contactName: order.contactName,
            shipVia: order.shipVia
        };
        $scope.isCustomer = isCustomer;

        $scope.locationChanged = function () {
            if (!$scope.model.customerShipToLocationId) {
                return;
            }

            var selectedShipToLocation = {};

            angular.forEach($scope.order.shipToLocations, function (shipToLocation) {
                if (shipToLocation.customerShipToLocationId === $scope.model.customerShipToLocationId) {
                    selectedShipToLocation = shipToLocation;
                }
            });

            $scope.model.customerShipToLocationId = (selectedShipToLocation.customerShipToLocationId || "").trim();
            $scope.model.locationName = (selectedShipToLocation.locationName || "").trim();
            $scope.model.address1 = (selectedShipToLocation.address1 || "").trim();
            $scope.model.address2 = (selectedShipToLocation.address2 || "").trim();
            $scope.model.city = (selectedShipToLocation.city || "").trim();
            $scope.model.state = (selectedShipToLocation.state || "").trim();
            $scope.model.postcode = (selectedShipToLocation.postcode || "").trim();
            $scope.model.phone = (selectedShipToLocation.phone || "").trim();
            $scope.model.email = (selectedShipToLocation.email || "").trim();
            $scope.model.contactName = (selectedShipToLocation.contactName || "").trim();
            $scope.model.shipVia = (selectedShipToLocation.shipVia || "").trim();
        };

        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };

        $scope.ok = function () {
            $modalInstance.close($scope.model);
        };
    }]);
(function () {
    'use strict';
    orderModule.controller('baseCreateOrderController', baseCreateOrderController);
    baseCreateOrderController.$inject = ['$scope', '$state', 'baseFactory', 'membershipFactory',
        'sharedFactory', 'order', '$rootScope', '$sce', '$timeout', 'modalFactory', '$modal', 'isNew'];
    function baseCreateOrderController($scope, $state, baseFactory, membershipFactory,
        sharedFactory, order, $rootScope, $sce, $timeout, modalFactory, $modal, isNew) {
        $scope.open = open;
        $scope.getCustomer = getCustomer;
        $scope.searchOrders = searchOrders;
        $scope.createNewOrder = createNewOrder;
        $scope.convertQuoteToOrder = convertQuoteToOrder;
        $scope.addOrderItem = addOrderItem;
        $scope.removeOrderItem = removeOrderItem;
        $scope.removeItem = removeItem;
        $scope.fieldDisabled = fieldDisabled;
        $scope.itemStatus = { name: "" };
        $scope.isCompany = isCompany;
        $scope.materialChanged = materialChanged;
        $scope.colourChanged = colourChanged;
        $scope.displayPriceBreakdown = displayPriceBreakdown;
        $scope.tallyOrderTotal = tallyOrderTotal;
        $scope.disabledOptions = disabledOptions;
        $scope.isValid = isValid;
        $scope.onSelect = onSelect;
        $scope.materials = [];
        $scope.enableAddItems = false;
        $scope.errors = [];
        $scope.displayQuantityColumn = displayQuantityColumn;
        $scope.displayWidthColumn = displayWidthColumn;
        $scope.displayDropColumn = displayDropColumn;
        $scope.displaySlatQuantityColumn = displaySlatQuantityColumn;
        $scope.orderItem = {};
        $scope.currentDate = new Date().toJSON().slice(0, 10);
        $scope.updateTotalPrice = updateTotalPrice;

        $scope.totalPrice = 0;
        init();

        //Upload Document
        $scope.onFileSelect = onFileSelect;
        $scope.changeFile = changeFile;
        $scope.resetInputFile = resetInputFile;
        var isDocument = true;
        var isMedia = true;
        $scope.fileModel = {
            FileName: "",
            FileFolder: ""
        };
        $scope.doc = {
            id: 0,
            permissions: []
        };

        var isFileValid = function (filename) {
            var extAr = filename.split('.');
            var ext = extAr[extAr.length - 1];
            ext = ext.toLocaleLowerCase();
            var fType = [];
            var result = false;

            if (isDocument || isMedia) {
                fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg"];
                result = fType.indexOf(ext) >= 0;

                if (fType.indexOf(ext) >= 0 && fType.indexOf(ext) <= 3) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 4 && fType.indexOf(ext) <= 5) {
                    $scope.doc.docTypeId = 2;
                } else if (fType.indexOf(ext) >= 6 && fType.indexOf(ext) <= 8) {
                    $scope.doc.docTypeId = 1;
                } else if (fType.indexOf(ext) >= 9 && fType.indexOf(ext) <= 11) {
                    $scope.doc.docTypeId = 3;
                } else if (fType.indexOf(ext) >= 12 && fType.indexOf(ext) <= 13) {
                    $scope.doc.docTypeId = 5;
                }
            }

            if (!result)
                $scope.message = "The file " + filename + " is not valid.";

            if (result) {
                if ($scope.doc.name == '' || typeof $scope.doc.name === 'undefined') {
                    $scope.doc.name = filename;
                }
            }

            $timeout(function () {
                $scope.message = null;
            }, 2500);

            return result;
        };

        function onFileSelect($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                $scope.progress = 0;
                $scope.upload = baseFactory
                    .upload('/api/upload/media', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data, status, headers, config) {
                        if (!data.isErrored) {
                            $scope.resetInputFile();
                            $scope.fileModel = data.object;
                            $scope.doc.fileFolder = $scope.fileModel.fileFolder;
                            $scope.doc.fileName = $scope.fileModel.fileName;
                            $scope.doc.isUploaded = true;
                            $scope.doc.isNew = true;
                        }
                        $scope.disableSubmitButton = false;
                        $scope.submitTxt = "Save";
                    });
            } else {
                $scope.resetInputFile();
                $scope.changeFile();
            }
        };

        function changeFile() {
            $scope.doc.isUploaded = false;
            $scope.doc.fileFolder = "";
            $scope.doc.fileName = "";
            $scope.doc.link = "";
            $scope.doc.isNew = true;
        };

        function resetInputFile() {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        };
        //End of Upload Document

        function init() {
            $scope.status.open = false;
            $scope.itemConfigs = order.configuration.value ? JSON.parse(order.configuration.value) : [];
            $scope.items = order.sageItems;

            $scope.order = order;

            if ($scope.order.items == null) {
                $scope.order.items = [];
            }

            if (!isNew) {
                $scope.updateTotalPrice();
            }
            else {
                $scope.order.items = [];
            }

            $scope.order.sageOrder = $scope.order.orderNumber == null ? "" : $scope.order.orderNumber;

            if (!$scope.order.orderItemGroups) {
                $scope.order.orderItemGroups = [];
            }

            if ($scope.order.id && $scope.order.id > 0) {
                convertServerModel();
            }

            if ($scope.order.blindType) {
                setItemStatus();
            }

            if (!isCompany()) {
                $scope.order.customer = { customerId: $rootScope.user.customerId, name: $rootScope.user.customerName };
                baseFactory.fetch("/api/order/GetCreateUpdateOrderModel?customerId=" + $scope.order.customer.customerId).then(function (data) {
                    $scope.items = data.object.sageItems;
                });
                $scope.enableAddItems = true;
            }
        }

        function convertServerModel() {
            $scope.companyDisabled = true;
            $scope.enableAddItems = true;
            $scope.order.customer = {
                customerId: order.customerId,
                name: order.customerName
            };
            //$scope.order.sageOrder = {
            //    orderNumber: order.orderNumber
            //};

            //if ($scope.order.orderItemGroups) {
            //    angular.forEach($scope.order.orderItemGroups, function (itemGroup) {
            //        angular.forEach($scope.itemConfigs, function (itemConfig) {
            //            if (itemConfig.itemNumber === itemGroup.itemNumber) {
            //                var questions = angular.copy(itemConfig.questions);
            //                itemGroup.questions = [];
            //                angular.forEach(questions, function(question) {
            //                    var customField = null;

            //                    angular.forEach($scope.order.customFields, function (cf) {
            //                        if (cf.name === question.name) {
            //                            customField = cf;
            //                        }
            //                    });

            //                    if (customField) {
            //                        angular.extend(question, customField);

            //                        if (question.options && typeof question.options === "string") {
            //                            question.options = JSON.parse(question.options);
            //                        }

            //                        itemGroup.questions.push(question);
            //                    }
            //                });
            //            }
            //        });
            //    });
            //}

            //if ($scope.order.items) {
            //    angular.forEach($scope.order.items, function (item, index) {
            //        if (item.questions) {
            //            angular.forEach(item.questions, function (question) {
            //                if (question.isNonCustomField) {
            //                    item[lowerCaseFirstLetter(question.name).replace(' ', '')] = setQuestionValue(question.value);
            //                }
            //            });
            //        }

            //        var orderItemGroup = null;

            //        if ($scope.order.orderItemGroups) {
            //            angular.forEach($scope.order.orderItemGroups, function (itemGroup) {
            //                if (item.itemNumber === itemGroup.itemNumber) {
            //                    orderItemGroup = itemGroup;
            //                }
            //            });
            //        }

            //        if (item.material && orderItemGroup && orderItemGroup.itemDetails && orderItemGroup.itemDetails.itemConfiguration && orderItemGroup.itemDetails.itemConfiguration.itemMaterials) {
            //            angular.forEach(orderItemGroup.itemDetails.itemConfiguration.itemMaterials, function (itemMaterial) {
            //                if (itemMaterial.material === item.material) {
            //                    item.colours = itemMaterial.colours;
            //                }
            //            });
            //        }

            //        var questions = angular.copy(item.questions);
            //        item.questions = [];
            //        angular.forEach(questions, function (question) {
            //            if (!question.isNonCustomField) {
            //                var questionAlreadyInTable = item.hasOwnProperty(lowerCaseFirstLetter(question.name));
            //                if (!questionAlreadyInTable) {
            //                    var customField = null;

            //                    angular.forEach($scope.order.customFields, function (cf) {
            //                        if (cf.name === question.name) {
            //                            customField = cf;
            //                        }
            //                    });

            //                    if (customField) {
            //                        angular.extend(question, customField);

            //                        if (question.options && typeof question.options === "string") {
            //                            question.options = JSON.parse(question.options);
            //                        }

            //                        item.questions.push(question);
            //                    }
            //                }
            //            }
            //        });
            //    });
            //}
        }

        function setQuestionValue(val) {
            if (isNaN(val)) {
                return val;
            }

            return parseFloat(val);
        }

        function lowerCaseFirstLetter(val) {
            if (!val) {
                return val;
            }

            if (val.length === 1) {
                return val.toLowerCase();
            }

            return val.charAt(0).toLowerCase() + val.slice(1);
        }

        function onSelect() {
            $scope.enableAddItems = true;

            baseFactory.fetch("/api/order/GetCreateUpdateOrderModel?customerId=" + $scope.order.customer.customerId).then(function (data) {
                $scope.items = data.object.sageItems;
            });
        }

        function isCompany() {
            return $rootScope.user.customerId === "" || $rootScope.user.customerName === "";
        }

        function setItemStatus(tab, completeCallback) {
            tab.itemStatus = { name: "" };
            return baseFactory.fetch('/api/item/GetItemDetails/?itemNumber=' + tab.itemNumber).then(function (data) {
                if (!data.isErrored && data.object != null) {
                    tab.itemDetails = data.object;
                    tab.itemDetails.itemStatusComment = data.object.statusComment;
                    tab.itemDetails.description = $sce.trustAsHtml(data.object.description);
                    var tempDocs = angular.copy(tab.itemDetails.documents);
                    tab.itemDetails.images = [];
                    tab.itemDetails.documents = [];
                    angular.forEach(tempDocs, function (value, index) {
                        if (value.docTypeId == 2) {
                            if (value.isPrimary) {
                                tab.itemDetails.primaryImage = value.link;
                            } else {
                                tab.itemDetails.images.push(value);
                            }
                        } else if (value.docTypeId == 1) {
                            tab.itemDetails.documents.push(value);
                        }
                    });
                }

                if (completeCallback && typeof completeCallback === 'function') {
                    completeCallback();
                }
            });
        }

        function addOrderItem() {
            if (!$scope.orderItem.currentItem || !$scope.orderItem.currentQty || $scope.orderItem.currentQty == 0) {
                return;
            }
            var item = $scope.orderItem.currentItem;
            var qty = $scope.orderItem.currentQty;
            var itemExist = false;
            angular.forEach($scope.order.items, function (i) {
                if (item.itemNumber === i.itemNumber) {
                    itemExist = true;
                }
            });

            if (itemExist) {
                return;
            } else {
                var newItem = {
                    itemNumber: item.itemNumber,
                    itemName: item.description,
                    quantity: qty,
                    unitPrice: item.unitPrice,
                    totalPrice: item.unitPrice * qty
                };

                $scope.totalPrice += newItem.totalPrice;
                $scope.order.items.push(newItem);
            }
        }

        function removeOrderItem(item, indx) {
            angular.forEach($scope.order.items, function (i, itemIndex) {
                if (item.itemNumber === i.itemNumber && itemIndex === indx) {
                    $scope.order.items.splice(itemIndex, 1);
                    $scope.totalPrice -= item.totalPrice;
                    return;
                }
            });
        }

        function removeItem(item) {
            if (!item || !$scope.order.items)
                return;
            var index = $scope.order.items.indexOf(item);
            $scope.order.items.splice(index, 1);

            tallyOrderTotal();
        }

        function open($event) {
            $event.preventDefault();
            $event.stopPropagation();
            $scope.dateOpened = true;
        };

        function getCustomer(val) {
            return sharedFactory.searchCustomer(val, false, false).then(function (data) {
                return data;
            });
        };

        function searchOrders(val) {
            return baseFactory.fetch('/api/order/SearchSageOrders?searchText=' + val).then(function (data) {
                console.log(data.object);
                return data.object;
            });
        };

        function generateOrderToSave() {
            var order = angular.copy($scope.order);
            order.artworkFile = $scope.doc;
            order.customerId = $scope.order.customer.customerId;
            order.customerName = $scope.order.customer.name;
            order.itemCount = $scope.order.items.length;
            order.status = null;
            order.total = $scope.totalPrice;

            return order;
        }

        function isValid(form) {
            if (form.$invalid) {
                return false;
            }

            if (!$scope.order.items || $scope.order.items.length < 1) {
                return false;
            }

            return true;
        }

        function createNewOrder(form, isQuote) {
            membershipFactory.ping3(function () {
                $scope.submitted = true;
                //todo: add validation
                if (!isValid(form)) {
                    return;
                }
                $scope.errors = [];
                $scope.order.errorExists = false;
                $scope.loading = true;
                var orderToSave = generateOrderToSave();
                var uri = isQuote ? '/api/order/addquote' : 'api/order/save';
                baseFactory.call(uri, orderToSave).then(function (data) {
                    if (!data.isErrored) {
                        $state.go('^', null, { reload: true });
                    } else {
                        $scope.order.errorExists = data.object.errorExists;
                        if (data.object.errorExists && data.object.errorMessage && data.object.errorMessage.length > 0) {
                            $scope.errors.push(data.object.errorMessage);
                        }

                        if (data.object.items) {
                            angular.forEach(data.object.items, function (item) {
                                if (item.errorExists && item.errorMessage && item.errorMessage.length > 0) {
                                    $scope.errors.push(item.errorMessage);
                                }
                            });
                        }
                    }
                }).finally(function () {
                    $scope.loading = false;
                });
            });
        }

        function convertQuoteToOrder(orderId) {
            return baseFactory.fetch('/api/order/OrderQuote/?orderId=' + orderId).then(function (data) {
                if (!data.isErrored) {
                    $state.go('^', null, { reload: true });
                }
            });
        }

        function fieldDisabled(field, item) {
            if (!field || !field.dependantField || !field.dependantAnswer)
                return false;

            //field has dependant answer. this should only be enabled if the dependantField is set
            var disabled = true;
            angular.forEach(item.questions, function (otherField) {
                if (otherField.id != field.dependantField.id)
                    return;
                //ids match
                if (otherField.value == field.dependantAnswer)
                    disabled = false;
            });
            if (disabled)
                field.value = '';
            return disabled;
        }

        function colourChanged(item) {
            if (!item || !item.colours) {
                return;
            }

            angular.forEach(item.colours, function (colour) {
                if (colour.colour === item.colour && colour.status && colour.status.length > 0) {
                    modalFactory.openAlertModal((item.material + " " + item.colour + ' Stock Alert').toUpperCase(), colour.status);
                }
            });
        }

        function materialChanged(item, tab) {
            item.colours = [];
            if (tab.itemDetails.itemConfiguration) {
                angular.forEach(tab.itemDetails.itemConfiguration.itemMaterials, function (value) {
                    if (value.material === item.material) {
                        item.colours = value.colours;
                    }
                });
            }
        }

        function updateTotalPrice(item) {
            if (item)
                item.totalPrice = item.quantity * item.unitPrice;

            $scope.totalPrice = 0;
            angular.forEach($scope.order.items, function (i) {
                $scope.totalPrice += i.totalPrice;
            });
        }

        function getPrice(pricingData) {
            return baseFactory.call(
                '/api/Pricing/PriceItem',
                pricingData
            ).then(function (data) {
                return data.object;
            });
        }

        function tallyOrderTotal() {
            var total = 0;

            angular.forEach($scope.order.items, function (item) {
                if (item.itemPriceData && item.itemPriceData.unitPrice && item.itemPriceData.quantity) {
                    item.itemPriceData.totalPrice = item.itemPriceData.unitPrice * item.itemPriceData.quantity;
                    total += item.itemPriceData.totalPrice;
                }
            });

            $scope.order.total = total;
        }

        function displayPriceBreakdown(item) {
            $modal.open({
                templateUrl: '/app/modules/order/priceBreakdownModal/priceBreakdown.html',
                controller: 'priceBreakdown',
                size: 'lg',
                resolve: {
                    item: function () {
                        return item;
                    }
                }
            });
        }

        function disabledOptions(item, field) {
            if (field.disabledOptions) {
                return field.disabledOptions;
            }
            setDisabledDropDownFieldOptions(item, field);
            return field.disabledOptions;
        }

        function setDisabledDropDownFieldOptions(item, field) {
            field.disabledOptions = [];

            var motorSelected = false;

            if (field.name.toLowerCase() === "cont side") {
                angular.forEach(item.questions, function (q) {
                    if (q.name.toLowerCase() === "control type" && (q.value && q.value.toLowerCase() === "wand")) {
                        motorSelected = true;
                    }
                });
            }

            angular.forEach(field.options, function (option) {
                var disabled = false;

                if (motorSelected && (option.toLowerCase() === 'll' || option.toLowerCase() === 'rr')) {
                    disabled = true;
                }

                field.disabledOptions.push({ text: option, disabled: disabled });
            });
        }

        function displayQuantityColumn(itemNumber) {
            if (itemNumber === "120") {
                return false;
            }
            return true;
        }

        function displayWidthColumn(itemNumber) {
            if (itemNumber === "110" || itemNumber === "120") {
                return false;
            }
            return true;
        }

        function displayDropColumn(itemNumber) {
            if (itemNumber === "110") {
                return false;
            }
            return true;
        }

        function displaySlatQuantityColumn(itemNumber) {
            if (itemNumber === "110" || itemNumber === "120") {
                return true;
            }
            return false;
        }
    }
})();
orderModule.controller('standardOrderController',
['$scope', 'baseFactory', 'orders', '$modal', 'orderStatuses', '$rootScope', '$state', 'GRID_CONSTANTS', 'categories',
    function ($scope, baseFactory, orders, $modal, orderStatuses, $rootScope, $state, GRID_CONSTANTS, categories) {

        $scope.orders = orders;

        $scope.categories = categories;

        var tempOrderStatuses = angular.copy(orderStatuses.object);
        var isExist = false;
        angular.forEach(tempOrderStatuses, function (tt) {
            if (tt.id == null) {
                isExist = true;
            }
        });
        if (!isExist) {
            tempOrderStatuses.unshift({
                id: null,
                name: "All Order Statuses"
            });
        }

        console.log($rootScope.user);

        $scope.getOrderStatusColor = function (order) {

            var statusIsExist = false;
            angular.forEach(orderStatuses.object, function(value, index) {
                if (value.name == order) {
                    if (value.colour) {
                        $scope.orderStatusColor = value.colour;
                        statusIsExist = true;
                    }
                }
            });

            if (statusIsExist) {
                return { 'background-color': $scope.orderStatusColor };
            } else {
                return {'color' : 'black'}
            }
        };
        if ($rootScope.user.customerId.length == 0) {

            $scope.gridOptions = {
                itemType: 'Orders',
                items: $scope.orders,
                gridName: 'orders',
                fetchUrl: '/api/order/SearchOrders',
                initSortString: 'orderDate desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [
                    { field: 'orderDate', visibleAt: '1024', displayName: 'Order Date', customSortField: 'orderDate', cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>'},
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber'},
                    { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber'},
                    { field: 'itemNumber', displayName: 'Item Number', customSortField: 'itemNumber'},
                    { field: 'customerId', visibleAt: '1024', displayName: 'Customer Id', customSortField: 'customerId'},
                    { field: 'customerName', displayName: 'Customer Name', customSortField: 'customerName'},
                    { field: 'status', displayName: 'Status', customSortField: 'onHold', cellTemplate: '<div class="orderStatus text-center" style="padding:5px;" ng-style="getOrderStatusColor(row.entity.status)"> {{row.entity.status}}</div>' },
                    { field: 'description', displayName: 'Description', customSortField: 'description'},
                    { field: 'itemCount', visibleAt: '1024', displayName: 'Items', customSortField: 'itemCount'},
                    { field: 'total', displayName: 'Total', customSortField: 'total', cellTemplate: '<div class="ngCellText"><span>{{row.entity.total | currency}}</span></div>' },
                    {
                        field: 'edit', displayName: '', cellTemplate: 
                        '<div class="list-menu col-lg-12">' +
                            '<ul class="nav navbar-right pull-right" ng-if="row.entity.id">' +
                                '<li class="dropdown" dropdown>' +
                                    '<span href="" class="dropdown-toggle btn btn-default btn-sm" dropdown-toggle>' +
                                        '<span class="hidden-xs"><i class="glyphicon glyphicon-menu-hamburger"></i></span> Manage <span class="caret"></span>' +
                                    '</span>' +
                                    '<ul class="dropdown-menu">' +
                                        '<li permission permissions=\'system.orders.edit\' ng-show="checkStatus(row.entity)"><a class="cursor-pointer" ng-click="openOrderDetail(row.entity)">Change Status</a></li>' +
                                        '<li permission permissions=\'system.orders.edit\' ng-show="!showEdit(row.entity)" ><a class="cursor-pointer" href="#/orders/base/edit/{{row.entity.id}}">Edit Order</a></li>' +
                                        '<li permission permissions=\'system.orders.edit\' ng-show="showEdit(row.entity)" ><a class="cursor-pointer" href="#/orders/base/edit/{{row.entity.id}}">Edit Quote</a></li>' +
                                        '<li ng-show="row.entity.isQuote"><a class="cursor-pointer" ng-click="convertQuoteToOrder(row.entity.id)">Create Order</a></li>' +
                                        '<li ng-show="row.entity.lastInvoiceNumber != null && row.entity.lastInvoiceNumber != \'\'"><a class="cursor-pointer" ng-click="exportInvoice(row.entity.lastInvoiceNumber)">Export Invoice</a></li>' +
                                        '<li ng-show="row.entity.orderNumber != null && row.entity.orderNumber != \'\'"><a class="cursor-pointer" ng-click="exportOrderConfirmation(row.entity.orderNumber)">Export Order Confirmation</a></li>' +
                                        '<li><a class="cursor-pointer" ng-click="openOrderLogs(row.entity.id)">View Logs</a></li>' +
                                    '</ul>' +
                                '</li>' +
                            '</ul>' +
                        '</div>'
                    }
                ],
                controlColumnWidth: 110,
                enableCustomFields: true,
                customFieldsHtml: customFields(),
                extraParams: {
                    statusId: null
                },
                extraData: {
                    orderStatuses: tempOrderStatuses
                }
            };
         

            function customFields() {
                return '<span class="input-group-btn" style="width: 0; border: 0px">' +
                    '</span><select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.statusId" class="form-control" ng-options="order.id as order.name for order in dg.fetchOptions.extraData.orderStatuses"></select>';
            }
        }
        else {

            $scope.gridOptions = {
                itemType: 'Orders',
                items: $scope.orders,
                gridName: 'orders',
                fetchUrl: '/api/order/SearchOrders',
                initSortString: 'orderDate desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [
                    { field: 'orderDate', visibleAt: '1024', displayName: 'Order Date', customSortField: 'orderDate', cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>' },
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber'},
                    { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber'},
                    { field: 'itemNumber', visibleAt: '1024', displayName: 'Item Number', customSortField: 'itemNumber'},
                    { field: 'status', displayName: 'Status', customSortField: 'onHold', cellTemplate: '<div class="orderStatus text-center" style="padding:5px;" ng-style="getOrderStatusColor(row.entity.status)"> <span>{{row.entity.status}}</span>' + '</div>' },
                    { field: 'description', displayName: 'Description', customSortField: 'description'},
                    { field: 'itemCount', visibleAt: '1024', displayName: 'Item Count', customSortField: 'itemCount' },
                    { field: 'total', displayName: 'Total', customSortField: 'total', cellTemplate: '<div class="ngCellText"><span>{{row.entity.total | currency}}</span></div>' },
                    {
                        field: 'edit', displayName: '', cellTemplate:
                       '<div class="list-menu">' +
                           '<ul class="nav navbar-right pull-right" ng-if="row.entity.id">' +
                               '<li class="dropdown" dropdown>' +
                                   '<span href="" class="dropdown-toggle btn btn-default btn-sm" dropdown-toggle>' +
                                       '<span class="hidden-xs"><i class="glyphicon glyphicon-menu-hamburger"></i></span> Manage <span class="caret"></span>' +
                                   '</span>' +
                                   '<ul class="dropdown-menu">' +
                                       '<li permission permissions=\'system.orders.edit\' ng-show="checkStatus(row.entity)"><a class="cursor-pointer" ng-click="openOrderDetail(row.entity)">Change Status</a></li>' +
                                        '<li permission permissions=\'system.orders.edit\' ng-show="!showEdit(row.entity)" ><a class="cursor-pointer" href="#/orders/base/edit/{{row.entity.id}}">Edit Order</a></li>' +
                                        '<li permission permissions=\'system.orders.edit\' ng-show="showEdit(row.entity)" ><a class="cursor-pointer" href="#/orders/base/edit/{{row.entity.id}}">Edit Quote</a></li>' +
                                       '<li ng-show="row.entity.isQuote"><a class="cursor-pointer" ng-click="convertQuoteToOrder(row.entity.id)">Create Order</a></li>' +
                                       '<li ng-show="row.entity.orderNumber != null && row.entity.orderNumber != \'\'"><a class="cursor-pointer" ng-click="exportInvoice(row.entity.orderNumber)">Export Invoice</a></li>' +
                                       '<li ng-show="row.entity.orderNumber != null && row.entity.orderNumber != \'\'"><a class="cursor-pointer" ng-click="exportOrderConfirmation(row.entity.orderNumber)">Export Order Confirmation</a></li>' +
                                       '<li permission permissions=\'system.orders.edit\'><a class="cursor-pointer" ng-click="openOrderLogs(row.entity.id)">View Logs</a></li>' +
                                   '</ul>' +
                               '</li>' +
                           '</ul>' +
                       '</div>'
                    }
                ],
                controlColumnWidth: 110,
                enableCustomFields: true,
                customFieldsHtml: customFields(),
                extraParams: {
                    statusId: null
                },
                extraData: {
                    orderStatuses: tempOrderStatuses
                }
            };

            function customFields() {
                return '<span class="input-group-btn" style="width: 0; border: 0px">' +
                    '</span><select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.statusId" class="form-control" ng-options="order.id as order.name for order in dg.fetchOptions.extraData.orderStatuses"></select>';
            }
        }



        $scope.openOrderDetail = function (order) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderDetailModal/orderDetail.html',
                controller: 'orderDetail',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    order: function () {
                        return order;
                    },
                    orderStatuses: function () {
                        return orderStatuses.object;
                    },
                    gridName: function () {
                        return $scope.gridOptions.gridName;
                    }
                }
            });
        };

        $scope.showEdit = function(row) {
            var returnValue = false;
            if (row.status === "Quote") {
                returnValue = true;
            }
            if (row.orderNumber != null) {
                returnValue = false;
            }
            return returnValue;
        };

        $scope.checkStatus1 = function (status) {
            return (status.toLowerCase().trim() != "quote" && status.toLowerCase().trim() != "posted");
        };

        $scope.openOrderLogs = function (orderId) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/orderLogsModal/orderLogs.html',
                controller: 'OrderLogsCtrl',
                size: 'lg',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    gridName: function () {
                        return $scope.gridOptions.gridName;
                    },
                    orderId : function() {
                        return orderId;
                    }
                }
            });
        };

        $scope.exportInvoice = function (orderNumber) {
            window.location.href = '/report/OrderInvoice?orderNumber=' + orderNumber;
        };
        $scope.exportOrderConfirmation = function (orderNumber) {
            window.location.href = '/report/OrderConfirmation?orderNumber=' + orderNumber;
        };
        $scope.exportCreditNote = function (orderNumber) {
            window.location.href = '/report/CreditNote?orderNumber=' + orderNumber;
        };
        $scope.convertQuoteToOrder = function (orderId) {
            return baseFactory.fetch('/api/order/OrderQuote/?orderId=' + orderId).then(function (data) {
                if (!data.isErrored) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }
            });
        };
        $scope.createOrder = function (order) {

            $state.go('base.standardorders.create');

        };
    }
]);
jobModule.controller('OrderWizardCreateEditCtrl',
    ['$scope', '$rootScope', '$modal', 'baseFactory', 'permissionFactory', 'modalFactory', 'sharedFactory', 'lazyLoadGoogleApi',
        '$state', '$stateParams', '$filter', '$timeout', '$controller', 'STATES', 'TIMES', 'TITLES', 'order', 'detailsMode',
        function ($scope, $rootScope, $modal, baseFactory, permissionFactory, modalFactory, sharedFactory, lazyLoadGoogleApi,
            $state, $stateParams, $filter, $timeout, $controller, STATES, TIMES, TITLES, order, detailsMode) {

            //
            $scope.showMap2 = false;
            $scope.submitTxt = "Save";
            $scope.disableSubmitButton = false;
            var isNew = $state.current.name === "base.orders.create";
            $scope.isNew = isNew;
            $scope.mode = $scope.isNew ? 'Create' : 'Edit';
            $scope.titles = TITLES;
            $scope.times = TIMES;
            $scope.currentStep = 1;
            var isMapInit = false;
            $scope.steps = [
                {
                    step: 1,
                    title: 'Company Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Client Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 3,
                    title: 'Order Details',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 4,
                    title: 'Summary',
                    isDone: false,
                    isEditing: false
                }
            ];
            $scope.states = STATES;
            $scope.isCompany = permissionFactory.isCompany() || $rootScope.user.isSysAdmin;
            //
            order.customer = $rootScope.user.customerId === null || $rootScope.user.customerId === '' ? {} : {
                customerId: $rootScope.user.customerId,
                customerName: $rootScope.user.customerName
            };
            $scope.m1 = {
                customer: $rootScope.user.customerId === null || $rootScope.user.customerId === '' ? null : {
                    customerId: $rootScope.user.customerId,
                    name: $rootScope.user.customerName
                },
                customerId: $rootScope.user.customerId,
                customerName: $rootScope.user.customerName,
                clientCompany: null,
                clientFirstName: null,
                clientJobTitle: null,
                clientLastName: null,
                clientPartnerName: null,
                clientPurchaseOrder: null,
                clientTitle: null,
                clientMobile1: null,
                clientMobile2: null,
                clientEmail: null,
                userEmail: $rootScope.user.email,
                userFirstName: $rootScope.user.firstName,
                userIsUpdateDetails: false,
                userJobTitle: null,
                userLastName: $rootScope.user.surname,
                userMobile: null,
                userPhone: null,
                address: null,
                location: {
                    name: null,
                    address: null,
                    latitude: -25.363882,
                    longitude: 131.044922,
                    state: null,
                    stateId: null,
                    postcode: null
                }
            };
            $scope.m2 = {
                upliftDateOpened: false,
                prepackNumberDays: null,
                prepackDays: [],
                calculatedPrice: {
                    totalPrice: 0,
                    totalHours: 0,
                    pricePerHour: 50, // Fixed
                    additionalCost: 0.10, // Fixed
                    includedGstTotalPrice: 0
                }
            };

            // ORDER
            angular.extend(this, $controller('createOrder', { $scope: $scope, order: order, detailsMode: detailsMode }));
            //
            $scope.nextStep = function (indx) {
                $scope.goToStep(indx, false);
                if (indx === 4) {
                    var centerloc = $scope.m1.location.latitude + ',' + $scope.m1.location.longitude;
                    $scope.mapUrl = "https://maps.googleapis.com/maps/api/staticmap?center=" + centerloc + "&zoom=12&size=300x300&maptype=roadmap&markers=" + centerloc + "&key=AIzaSyBX1vLcFH8298Qst25_mof_a1l7XLKcf8E"
                }
            };
            $scope.goToStep = function (indx, isSkip) {
                if (!$scope.disableSubmitButton) {
                    var isMove = false;
                    for (var i = 0; i < $scope.steps.length; i++) {
                        if (!isSkip) {
                            if ($scope.steps[i].step === indx - 1) {
                                $scope.steps[i].isDone = true;
                            }
                            if ($scope.steps[i].step === indx && $scope.steps[i].isDone) {
                                $scope.steps[i].isEditing = true;
                            }
                            isMove = true;
                        } else if (isSkip && $scope.steps[i].step === indx && $scope.steps[i].isDone) {
                            $scope.steps[i].isEditing = true;
                            isMove = true;
                        }
                    }
                    if (isMove)
                        $scope.currentStep = indx;
                }
            };
            //
            $scope.onCompanySelect = function ($item, $model, $label) {
                // console.log($model);
                $scope.m1.customerId = $model.customerId;
                $scope.m1.customerName = $model.name;
                $scope.m1.userFirstName = $model.name;
                $scope.m1.userEmail = $model.email;

                // update order                
                $scope.order.customer = {
                    customerId: $model.customerId,
                    name: $model.name
                };
                $scope.onSelect();
            };
            $scope.getCustomer = function (val) {
                return sharedFactory.searchCustomer(val).then(function (data) {
                    return data;
                });
            };
            $scope.addCustomer = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/admin/customers/modals/manageCustomerModal.html',
                    controller: 'ManageCustomerModalCtrl',
                    size: 'huge',
                    backdrop: 'static',
                    resolve: {
                        customer: function () {
                            return baseFactory.fetch('/api/customer/get/' + 0)
                                .then(function (rdata) { return rdata.object; });
                        },
                        customFields: function () {
                            return [];
                        },
                        orderStatuses: function () {
                            if ($rootScope.clientName !== "TWC" && $rootScope.clientName !== "RETAILBLINDS" && $rootScope.clientName !== "BLOCKOUT")
                                return [];
                            return baseFactory.fetch('/api/orderstatus/getall').then(function (rrdata) {
                                return rrdata.object || [];
                            });
                        },
                        isNew: function () {
                            return true;
                        }
                    }
                });

                modalInstance.result.then(function (data) {
                    $scope.m1.customer = data.customerId + ' (' + data.customerName + ')';
                    $scope.onCompanySelect(null, data, null);
                }, function (isReloadPage) {
                });
            };
            $scope.updatePurchaseOrderNumber = function () {
                $scope.order.purchaseOrderNumber = $scope.m1.clientPurchaseOrder;
                $scope.purchaseOrderNumberChanged($scope.order.purchaseOrderNumber);
            };
            //
            $scope.checkStep1 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(2);
                }
            };
            $scope.checkStep2 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(3);
                }
            };
            $scope.checkStep3 = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    // $scope.disableSubmitButton = true;
                    $scope.nextStep(4);
                }
            };
            $scope.submitOrderWizard = function (mForm, m1) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                //
                var dataToSend = $scope.generateOrderToSave();
                dataToSend.uiData = angular.toJson(m1);

                baseFactory.post("/api/tftjobs/saveScheduleJob", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $state.go('base.orders', null, { reload: true });
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                        //
                        $scope.order.errorExists = data.object.errorExists;
                        if (data.object.errorExists && data.object.errorMessage && data.object.errorMessage.length > 0) {
                            $scope.errors.push(data.object.errorMessage);
                        }

                        if (data.object.items) {
                            angular.forEach(data.object.items, function (item) {
                                if (item.errorExists && item.errorMessage && item.errorMessage.length > 0) {
                                    $scope.errors.push(item.errorMessage);
                                }
                            });
                        }
                    }
                });
            };

            // MAP
            $scope.markers = [];
            $scope.mapId = window.randomString();
            $scope.showMap = false;
            $scope.$on('mapInitialized', function (evt, evtMap) {
                $scope.map = evtMap;
                $timeout(function () {
                    if ($scope.m1.location.latitude !== null && $scope.m1.location.longitude !== null) {
                        if ($scope.m1.location.latitude !== '' && $scope.m1.location.longitude !== '') {
                            $scope.mapLatLng = new google.maps.LatLng($scope.m1.location.latitude, $scope.m1.location.longitude);
                            $scope.map.setCenter($scope.mapLatLng);
                            $scope.map.setZoom(4);
                        }
                    }
                }, 500);
            });
            $scope.place = null;
            $scope.$watch('place', function (v) {
                // console.log(v);
                if (v !== null) {
                    if (typeof v.name !== "undefined")
                        $scope.m1.location.name = v.name;

                    if (typeof v.formatted_phone_number !== "undefined")
                        $scope.m1.location.phone = v.formatted_phone_number;

                    $scope.mapLatLng = new google.maps.LatLng($scope.m1.location.latitude, $scope.m1.location.longitude);
                    $scope.map.setCenter($scope.mapLatLng);
                    $scope.map.setZoom(10);

                    var marker = new google.maps.Marker({
                        map: $scope.map,
                        animation: google.maps.Animation.DROP,
                        draggable: true,
                        position: $scope.mapLatLng,
                        title: $scope.m1.location.name
                    });
                    $scope.markers.push(marker);
                }
            });
            $scope.centerChanged = function (event) {
                $timeout(function () {
                    try {
                        $scope.mapLatLng = new google.maps.LatLng($scope.m1.location.latitude, $scope.m1.location.longitude);
                        $scope.map.panTo($scope.mapLatLng);
                        $scope.$apply();
                    } catch (er) {
                        $scope.mapLatLng = new google.maps.LatLng(-24.994167, 134.866944);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(3);
                        $scope.$apply();
                    }
                }, 500);
            };
            $scope.onSelectPlace = function ($geo) {
                if ($scope.markers.length > 0)
                    for (var i = 0; i < $scope.markers.length; i++) {
                        $scope.markers[i].setMap(null);
                    }
                if (typeof $geo !== 'undefined') {
                    $scope.m1.address = $geo.loc;
                    $scope.m1.location.name = $geo.name;
                    $scope.m1.location.address = $geo.loc;
                    $scope.m1.location.latitude = $geo.lat;
                    $scope.m1.location.longitude = $geo.lng;
                    $scope.m1.location.city = $geo.city;
                    $scope.m1.location.country = $geo.country;
                    $scope.m1.location.state = $geo.state;
                    $scope.m1.location.postcode = $geo.postcode;
                    $scope.m1.location.stateId = 9; // Other

                    // Set state
                    angular.forEach($scope.states, function (s) {
                        if (s.name.toLowerCase() === $geo.state.toLowerCase()) {
                            $scope.m1.location.stateId = s.id;
                        }
                    });
                }
                //
                $scope.mapLatLng = new google.maps.LatLng($scope.m1.location.latitude, $scope.m1.location.longitude);
                $scope.map.setCenter($scope.mapLatLng);
                $scope.map.setZoom(10);

                function geocodePosition(pos) {
                    geocoder = new google.maps.Geocoder();
                    geocoder.geocode({ latLng: pos }, function (results, status) {
                        if (status === google.maps.GeocoderStatus.OK) {
                            console.log(results)
                        }
                    });
                }

                var marker = new google.maps.Marker({
                    position: $scope.mapLatLng,
                    title: $scope.m1.address,
                    map: $scope.map
                    //animation: google.maps.Animation.DROP,
                    //draggable: true
                });
                $scope.markers.push(marker);
                $scope.$apply();
            };
            $scope.onGoogleInit = function (isInit) {
                $scope.showMap = false;
                $timeout(function () {
                    isMapInit = isInit;
                    $scope.showMap = isInit;
                    if (isInit && $scope.map) {
                        $timeout(function () {
                            $scope.onSelectPlace();
                        }, 100);
                    }
                }, 500);
            };
        }
    ]);
homeModule.controller('ReportCtrl', ["$scope", "$rootScope", "$state", "groups", function ($scope, $rootScope, $state, groups) {
}])
homeModule.controller('ReportDetailsCtrl', ["$scope", "$rootScope", "$state", "$stateParams", "report", function ($scope, $rootScope, $state, $stateParams, report) {
    var reportid = $stateParams.id;
    var size = {
        width: window.innerWidth || document.body.clientWidth,
        height: window.innerHeight || document.body.clientHeight
    };

    $scope.report = report;
    $scope.reportUrl = "/DashboardReport?reportId=" + reportid;
    $scope.resizeIframe = resizeIframe();
    resizeIframe();
    function resizeIframe() {
        $scope.hh = document.body.scrollHeight - 250;

        if ($scope.hh < 500) {
            $scope.hh = 500;
        }
    };
}]);
(function() {
    'use strict';

    homeModule.controller("ReportViewerCtrl", ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$stateParams', 'reportType'];
    function ctrl($scope, $rootScope, $stateParams, reportType) {
        $scope.reportId = $stateParams.reportDocId;
        $scope.reportType = reportType;
    }
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];

    function config($stateProvider) {
        $stateProvider
            .state('base.home.uxreports', {
                url: "uxreports",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/reports/dashboards/views/index.html",
                        controller: 'ReportDashboardsCtrl',
                        resolve: {
                            dashboardReports: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/reportApi/getByGroup').then(function (rrdata) {
                                    return rrdata.object || [];
                                });
                            }]
                        },
                        data: {
                            authorizedRoles: []
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Reports'
                }
            })
            .state('base.home.uxreports.view', {
                url: "/v/:id",
                views: {
                    'dashboardReportView': {
                        templateUrl: "/app/modules/reports/dashboards/views/view.html",
                        controller: 'ReportDashboardCtrl',
                        resolve: {
                            report: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
                                return baseFactory.fetch('/api/reportApi/get', { id: $stateParams.id }).then(function (rrdata) {
                                    return rrdata.object;
                                });
                            }]
                        },
                        data: {
                            authorizedRoles: []
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Dashboard Report'
                }
            });
    }
})();
homeModule.controller('ReportDashboardCtrl', ["$scope", "$rootScope", "$state", "$stateParams", function ($scope, $rootScope, $state, $stateParams) {
    var reportid = $stateParams.id;
    var customerid = $stateParams.customerId || null;
    var size = {
        width: window.innerWidth || document.body.clientWidth,
        height: window.innerHeight || document.body.clientHeight
    };

    $scope.reportUrl = "/DashboardReport?reportId=" + reportid + (customerid !== null ? '&customerId=' + customerid : '');
    $scope.exportReportUrl = "/report/twcDeliveryDashboardReport/" + reportid;
    function resizeIframe() {
        $scope.hh = document.body.scrollHeight - 250;

        //if ($scope.hh < 500) {
        //    $scope.hh = 500;
        //}
    };
    // $scope.resizeIframe = resizeIframe();
    // resizeIframe();

    if (typeof $scope.$parent.currentDashboardReportId !== "undefined") {
        $scope.$parent.currentDashboardReportId = reportid;
        $scope.$parent.showSidebar = false;
    }
}]);

window.deliveryFrameLoad = function () {
    document.getElementById("exportDeliveryButton").style.display = "block";
};
homeModule.controller('ReportDashboardCurtainsCtrl', ["$scope", "$rootScope", "$state", "$stateParams", "GRID_CONSTANTS", function ($scope, $rootScope, $state, $stateParams, GRID_CONSTANTS) {

    $scope.$parent.currentDashboardReportId = -1;
    $scope.$parent.showSidebar = false;
    //var zz = angular.copy(zones);
    //zz.unshift({ id: null, name: "All Carrier Zones" });
    //var ss = angular.copy(statuses);
    //ss.unshift({ id: null, name: "All Statuses" });
    //var tz = angular.copy(twcZones);
    //tz.unshift({ id: null, name: "All Zones" });
    //var ww = angular.copy(warehouses);
    //ww.unshift({ id: null, name: "All Warehouses" });
    $scope.gridOptions = {
        itemType: 'Post-Delivery report',
        gridName: 'PostDeliveryReportGrid',
        fetchUrl: '/api/twcorder/searchAllCurtains',
        exportUrl: '/exportgrid/curtainReports/',
        initSortString: '[OrderDate] DESC',
        enableSorting: true,
        enableSearching: true,
        enablePaging: false,
        enableExport: true,
        displayActionMenu: true,
        hideSearchText: true,
        enableDisplayActionMenuImport: true,
        columnDefs: [
            { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
            {
                field: 'orderDate', displayName: 'Date', customSortField: 'orderDate', width: 150,
                cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>'
            },
            { field: 'customer', displayName: 'Customer', customSortField: 'customer' },
            { field: 'width', displayName: 'Width', customSortField: 'width' },
            { field: 'drop', displayName: 'Drop', sortable: false },
            { field: 'material', displayName: 'Material', sortable: false },
            { field: 'colour', displayName: 'Colour', customSortField: 'colour' },
            { field: 'headingType', displayName: 'Heading Type', customSortField: 'headingType' },
            { field: 'track', displayName: 'Track', customSortField: 'track' },
            { field: 'quantity', displayName: 'Qty', customSortField: 'quantity' },
            {
                field: 'unitPrice', displayName: 'Price', customSortField: 'unitPrice',
                cellTemplate: '<div class="ngCellText text-right"><span>{{row.entity.unitPrice | currency}}</span></div>'
            },
            {
                field: 'totalPrice', displayName: 'Amount', customSortField: 'totalPrice',
                cellTemplate: '<div class="ngCellText text-right"><span>{{row.entity.totalPrice | currency}}</span></div>'
            }
        ],
        customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplateCurtains.html',
        extraParams: {
            dateRange: {
                startDate: moment().subtract(29, 'days'),
                endDate: moment()
            }
        },
        extraData: {
        }
    };
    $scope.zoneId = null;
    $scope.warehouseId = null;
    $scope.shipviaId = null;
    $scope.$on(GRID_CONSTANTS.REBUILD_GRID, function (ev, opts, dts) {
        if (dts) {
            $scope.zoneId = dts.z;
            $scope.warehouseId = dts.w;
            $scope.shipviaId = dts.sv;
        }
    });
}]);
(function () {
    'use strict';

    homeModule.controller('ReportDashboardCustomerLocationCtrl',
        ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', 'STATES', 'zones',
            function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, STATES, zones) {
                $scope.$parent.currentDashboardReportId = -3;
                $scope.$parent.showSidebar = false;
                var states = angular.copy(STATES);
                var zz = angular.copy(zones);
                for (var i = 0; i < zz.length; i++) {
                    zz[i].description = zz[i].name;
                }
                zz.unshift({ description: null, name: "All Carrier Zones" });
                // states.unshift({ id: null, name: "All States" });
                $scope.gridOptions = {
                    itemType: 'customer locations',
                    gridName: 'CustomerLocationsGrid',
                    fetchUrl: '/api/twcdeliveries/searchAllCustomerLocations',
                    // exportUrl: '/report/exportCustomerLocationsReport/',
                    exportUrl: '/exportgrid/searchAllCustomerLocations',
                    initSortString: 'Customer ASC',
                    enableSorting: true,
                    enableSearching: true,
                    enablePaging: true,
                    enableExport: true,
                    displayActionMenu: true,
                    hideSearchText: true,
                    enableDisplayActionMenuImport: true,
                    columnDefs: [
                        { field: 'customerId', displayName: 'Id', customSortField: 'customerId' },
                        { field: 'customer', displayName: 'Customer', customSortField: 'customer' },
                        { field: 'street', displayName: 'Street', customSortField: 'street' },
                        { field: 'city', displayName: 'City', customSortField: 'city' },
                        { field: 'state', displayName: 'State', customSortField: 'state' },
                        { field: 'phone', displayName: 'Phone', customSortField: 'phone' },
                        { field: 'email', displayName: 'Email', customSortField: 'email' },
                        { field: 'shipVia', displayName: 'Ship Via', customSortField: 'shipVia' },
                        { field: 'postcode', displayName: 'Postcode', customSortField: 'postcode' },
                        { field: 'carrierZone', displayName: 'Zone', customSortField: 'carrierZone' },
                        { field: 'notes', displayName: 'Notes', customSortField: 'notes' }
                    ],
                    customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplateCustomerLocation.html',
                    extraParams: {
                        z: null,
                        s: null
                    },
                    extraData: {
                        zones: zz,
                        states: states
                    }
                };
            }]);
})();
(function () {
    'use strict';

homeModule.controller('ReportDashboardDriverRunSheetCtrl',
    ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', 'zones', 'statuses', 'twcZones', 'warehouses',
        function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, zones, statuses, twcZones, warehouses) {

            $scope.$parent.currentDashboardReportId = -2;
            $scope.$parent.showSidebar = false;
            var zz = angular.copy(zones);
            zz.unshift({ id: null, name: "All Carrier Zones" });
            var ss = angular.copy(statuses);
            ss.unshift({ id: null, name: "All Statuses" });
            var tz = angular.copy(twcZones);
            tz.unshift({ id: null, name: "All Zones" });
            var ww = angular.copy(warehouses);
            ww.unshift({ id: null, name: "All Warehouses" });
            //
            $scope.gridOptions = {
                itemType: 'driver run sheet',
                gridName: 'DriverRunSheetGrid',
                fetchUrl: '/api/twcdeliveries/searchAllManifestReports',
                exportUrl: '/report/exportDriverRunSheetReport/',
                initSortString: '[CarrierZoneName] ASC, [SortOrder] ASC',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableExport: true,
                displayActionMenu: true,
                hideSearchText: true,
                enableDisplayActionMenuImport: true,
                columnDefs: [
                    {
                        field: 'date', displayName: 'Date', customSortField: 'date',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
                    { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
                    { field: 'customer', displayName: 'Customer', customSortField: 'customer' },
                    { field: 'address', displayName: 'Address', customSortField: 'address' },
                    { field: 'city', displayName: 'Suburb', customSortField: 'city' },
                    { field: 'postcode', displayName: 'Postcode', customSortField: 'postcode' },
                    { field: 'state', displayName: 'State', customSortField: 'state' },
                    { field: 'itemName', displayName: 'Product', customSortField: 'itemName' },
                    { field: 'deliveryStatus', displayName: 'Status', customSortField: 'deliveryStatus' },
                    { field: 'carrierZone', displayName: 'Zone', customSortField: 'carrierZone' },
                    { field: 'shipVia', displayName: 'Ship Via', customSortField: 'shipVia' },
                    { field: 'deliveryWarehouse', displayName: 'Warehouse', customSortField: 'deliveryWarehouse' }
                ],
                customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplate.html',
                extraParams: {
                    z: null,
                    s: null,
                    sv: null,
                    w: null
                },
                extraData: {
                    zones: zz,
                    statuses: ss,
                    twcZones: tz,
                    warehouses: ww
                }
            };

        }]);
})();
(function () {
    'use strict';

    homeModule.controller('ReportDashboardInTransitReportCtrl',
        ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', 'zones', 'statuses', 'twcZones', 'warehouses',
            function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, zones, statuses, twcZones, warehouses) {

                $scope.$parent.currentDashboardReportId = -5;
                $scope.$parent.showSidebar = false;
                var zz = angular.copy(zones);
                zz.unshift({ id: null, name: "All Carrier Zones" });
                var ss = angular.copy(statuses);
                ss.unshift({ id: null, name: "All Statuses" });
                var tz = angular.copy(twcZones);
                tz.unshift({ id: null, name: "All Zones" });
                var ww = angular.copy(warehouses);
                ww.unshift({ id: null, name: "All Warehouses" });
                $scope.gridOptions = {
                    itemType: 'In-Transit report',
                    gridName: 'inTransitReportGrid',
                    fetchUrl: '/api/twcdeliveries/searchAllInTransitReports',
                    exportUrl: '/report/exportInTransitReport/',
                    initSortString: '[Date] DESC',
                    enableSorting: true,
                    enableSearching: true,
                    enablePaging: false,
                    enableExport: true,
                    displayActionMenu: true,
                    hideSearchText: true,
                    enableDisplayActionMenuImport: true,
                    columnDefs: [
                        {
                            field: 'date', displayName: 'In Transit Date', customSortField: 'date', width: 155,
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy h:mm a"}}</span></div>'
                        },
                        {
                            field: 'notifiedDate', displayName: 'Notified Date', customSortField: 'notifiedDate', width: 155,
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.notifiedDate | date:"dd/MM/yyyy h:mm a"}}</span></div>'
                        },
                        { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
                        { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
                        { field: 'customerName', displayName: 'Customer', customSortField: 'customerName' },
                        { field: 'formattedAddress', displayName: 'Suburb', sortable: false },
                        { field: 'shipVia', displayName: 'Ship Via', customSortField: 'shipVia' },
                        { field: 'carrierZone', displayName: 'Zone', customSortField: 'carrierZone' },
                        { field: 'warehouse', displayName: 'Warehouse', customSortField: 'warehouse' },
                        { field: 'items', displayName: 'Items', customSortField: 'items' },
                        { field: 'parcels', displayName: 'Parcels', customSortField: 'parcels' },
                    ],
                    customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplateInTransit.html',
                    extraParams: {
                        z: null,
                        s: null,
                        sv: null,
                        w: null
                    },
                    extraData: {
                        zones: zz,
                        statuses: ss,
                        twcZones: tz,
                        warehouses: ww
                    }
                };
                $scope.zoneId = null;
                $scope.warehouseId = null;
                $scope.shipviaId = null;
                $scope.$on(GRID_CONSTANTS.REBUILD_GRID, function (ev, opts, dts) {
                    if (dts) {
                        $scope.zoneId = dts.z;
                        $scope.warehouseId = dts.w;
                        $scope.shipviaId = dts.sv;
                    }
                });

                $scope.sendInTransit = function (z, w, sv, t) {
                    if (z != null) {
                        var zone = "";
                        for (var i = 0; i < zz.length; i++) {
                            if (zz[i].id === z)
                                zone = zz[i].id == null ? zz[i].name : "Zone " + zz[i].name;
                        }
                        var html = "<p>Are you sure you want to send the In Transit Report to <b>" + zone + "</b>?</p>";
                        if (t)
                            html += "<p>All emails will be sent to <a>" + $rootScope.user.email + "</a></p>";
                        promptFactory.confirm(html, function (result) {
                            if (result) {
                                var p = {
                                    z: z,
                                    w: w,
                                    sv: sv,
                                    t: t
                                };
                                baseFactory.put('/api/twcdeliveries/sendInTransit?' + $rootScope.objToParam(p)).then(function (rrdata) {
                                    if (!t) {
                                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                                    }
                                });
                            }
                        });
                    }
                };
            }]);
})();
(function () {
    'use strict';

homeModule.controller('ReportDashboardManifestReportCtrl',
    ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', 'zones', 'statuses', 'twcZones', 'warehouses',
        function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, zones, statuses, twcZones, warehouses) {

            $scope.$parent.currentDashboardReportId = -1;
            $scope.$parent.showSidebar = false;
            var zz = angular.copy(zones);
            zz.unshift({ id: null, name: "All Carrier Zones" });
            var ss = angular.copy(statuses);
            ss.unshift({ id: null, name: "All Statuses" });
            var tz = angular.copy(twcZones);
            tz.unshift({ id: null, name: "All Zones" });
            var ww = angular.copy(warehouses);
            ww.unshift({ id: null, name: "All Warehouses" });
            $scope.gridOptions = {
                itemType: 'manifest report',
                gridName: 'manifestReportGrid',
                fetchUrl: '/api/twcdeliveries/searchAllManifestReports',
                exportUrl: '/report/exportManifestReport/',
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableExport: true,
                displayActionMenu: true,
                hideSearchText: true,
                enableDisplayActionMenuImport: true,
                columnDefs: [
                    {
                        field: 'date', displayName: 'Date', customSortField: 'date',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
                    { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
                    { field: 'customer', displayName: 'Customer', customSortField: 'customer' },
                    { field: 'address', displayName: 'Address', customSortField: 'address' },
                    { field: 'itemName', displayName: 'Product', customSortField: 'itemName' },
                    { field: 'deliveryStatus', displayName: 'Status', customSortField: 'deliveryStatus' },
                    { field: 'shipVia', displayName: 'Ship Via', customSortField: 'shipVia' },
                    { field: 'deliveryWarehouse', displayName: 'Warehouse', customSortField: 'deliveryWarehouse' }
                ],
                customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplateManifestReport.html',
                extraParams: {
                    z: null,
                    s: null,
                    sv: null,
                    w: null,
                    dateRange: {
                        startDate: moment().subtract(29, 'days'),
                        endDate: moment()
                    }
                },
                extraData: {
                    zones: zz,
                    statuses: ss,
                    twcZones: tz,
                    warehouses: ww
                }
            };

        }]);
})();
homeModule.controller('ReportDashboardOrderDetailsCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "$controller", "permissionFactory",
        'categories', 'orderStatuses', 'itemStatuses', 'items', 'twcZones',
        function ($scope, $rootScope, $state, $stateParams, $controller, permissionFactory,
            categories, orderStatuses, itemStatuses, items, twcZones) {
            if (permissionFactory.isCompany() || $rootScope.user.isSysAdmin) {
                //
            } else {
                $state.go("anonymous.http404");
            }

            $scope.$parent.currentDashboardReportId = -3;
            $scope.$parent.showSidebar = false;

            angular.extend(this, $controller('BulkOrderUpdateCtrl', {
                $scope: $scope,
                categories: categories,
                orderStatuses: orderStatuses,
                itemStatuses: itemStatuses,
                items: items,
                twcZones: twcZones,
                workOrderStatuses: []
            }));

            $scope.bulkSearchUrl = '/api/twcworkorders/searchallultracut';
            $scope.bulkSearchExportUrl = '/exportGrid/getallorderdetails/';
            $scope.steps = [
                {
                    step: 1,
                    title: 'Find Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Export Orders',
                    isDone: false,
                    isEditing: false
                }
            ];

            var updateExportLink = function () {
                var arrOrderIds = [];
                for (var k = 0; k < $scope.searchResult.result.length; k++) {
                    if ($scope.searchResult.result[k].isSelected)
                        arrOrderIds.push($scope.searchResult.result[k].orderItemId);
                }
                var indx = $scope.searchResult.exportUrl.indexOf('&items=');
                if (indx > 0)
                    $scope.searchResult.exportUrl = $scope.searchResult.exportUrl.slice(0, indx);

                if (arrOrderIds.length > 0) {
                    return $scope.bulkSearchExportUrl + "?isDetailed=true&items=" + arrOrderIds.join();
                } else {
                    return $scope.searchResult.exportUrl + "&isDetailed=true";
                }
            };

            $scope.selectRowOrder2 = function (r) {
                // 1 = All unchecked
                // 2 = All checked
                // 3 = Some checked
                if (!$scope.disableSubmitButton) {
                    r.isSelected = !r.isSelected;
                    if (r.isSelected)
                        $scope.searchResult.selected++;
                    else
                        $scope.searchResult.selected--;
                    //
                    if ($scope.searchResult.selected > 0)
                        $scope.searchResult.selection = $scope.searchResult.selected === $scope.searchResult.result.length ? 2 : 3;
                    else
                        $scope.searchResult.selection = 1;
                    // Reset
                    updateExportLink();
                }
            };
            $scope.selectAllRowOrders2 = function () {
                if (!$scope.disableSubmitButton) {
                    if ($scope.searchResult.selection === 1 || $scope.searchResult.selection === 3) {
                        $scope.searchResult.selection = 2;
                    } else if ($scope.searchResult.selection === 2) {
                        $scope.searchResult.selection = 1;
                    }
                    for (var i = 0; i < $scope.searchResult.result.length; i++) {
                        $scope.searchResult.result[i].isSelected = $scope.searchResult.selection === 2;
                    }
                    $scope.searchResult.selected = $scope.searchResult.selection === 2 ? $scope.searchResult.result.length : 0;
                }
                updateExportLink();
            };
            $scope.exportOrders = function () {
                var url = updateExportLink();
                window.location.href = url;
            };

            // PUBLIC
            $scope.m1.status = null;
            $scope.m1.selectedTemplates = [];
            $scope.m1.orderDate = {
                startDate: moment().subtract(6, 'days'),
                endDate: moment()
            };
            $scope.m1.completionDate = {
                startDate: moment(),
                endDate: moment().add(6, 'days')
            };
        }]);
(function () {
    'use strict';

    homeModule.controller('ReportDashboardPostDeliveryReportCtrl',
        ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', 'zones', 'statuses', 'twcZones', 'warehouses',
            function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, zones, statuses, twcZones, warehouses) {

                $scope.$parent.currentDashboardReportId = -6;
                $scope.$parent.showSidebar = false;
                var zz = angular.copy(zones);
                zz.unshift({ id: null, name: "All Carrier Zones" });
                var ss = angular.copy(statuses);
                ss.unshift({ id: null, name: "All Statuses" });
                var tz = angular.copy(twcZones);
                tz.unshift({ id: null, name: "All Zones" });
                var ww = angular.copy(warehouses);
                ww.unshift({ id: null, name: "All Warehouses" });
                $scope.gridOptions = {
                    itemType: 'Post-Delivery report',
                    gridName: 'PostDeliveryReportGrid',
                    fetchUrl: '/api/twcdeliveries/searchAllPostDeliveryReports',
                    exportUrl: '/report/exportPostDeliveryReport/',
                    initSortString: '[Date] DESC',
                    enableSorting: true,
                    enableSearching: true,
                    enablePaging: false,
                    enableExport: true,
                    displayActionMenu: true,
                    hideSearchText: true,
                    enableDisplayActionMenuImport: true,
                    columnDefs: [
                        {
                            field: 'date', displayName: 'Post-Delivery Date', customSortField: 'date', width: 150,
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy h:mm a"}}</span></div>'
                        },
                        {
                            field: 'notifiedDate', displayName: 'Notified Date', customSortField: 'notifiedDate',
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.notifiedDate | date:"dd/MM/yyyy h:mm a"}}</span></div>'
                        },
                        { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
                        { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
                        { field: 'customerName', displayName: 'Customer', customSortField: 'customerName' },
                        { field: 'deliveryStatus', displayName: 'Status', customSortField: 'deliveryStatus' },
                        { field: 'deliveryComments', displayName: 'Comments', sortable: false },
                        { field: 'formattedAddress', displayName: 'Suburb', sortable: false },
                        { field: 'shipVia', displayName: 'Ship Via', customSortField: 'shipVia' },
                        { field: 'carrierZone', displayName: 'Zone', customSortField: 'carrierZone' },
                        { field: 'warehouse', displayName: 'Warehouse', customSortField: 'warehouse' },
                        { field: 'items', displayName: 'Items', customSortField: 'items' },
                        { field: 'parcels', displayName: 'Parcels', customSortField: 'parcels' }
                    ],
                    customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplatePostDelivery.html',
                    extraParams: {
                        z: null,
                        s: null,
                        sv: null,
                        w: null
                    },
                    extraData: {
                        zones: zz,
                        statuses: ss,
                        twcZones: tz,
                        warehouses: ww
                    }
                };
                $scope.zoneId = null;
                $scope.warehouseId = null;
                $scope.shipviaId = null;
                $scope.$on(GRID_CONSTANTS.REBUILD_GRID, function (ev, opts, dts) {
                    if (dts) {
                        $scope.zoneId = dts.z;
                        $scope.warehouseId = dts.w;
                        $scope.shipviaId = dts.sv;
                    }
                });

                $scope.sendPostDelivery = function (z, w, sv, t) {
                    if (z != null) {
                        var zone = "";
                        for (var i = 0; i < zz.length; i++) {
                            if (zz[i].id === z)
                                zone = zz[i].id == null ? zz[i].name : "Zone " + zz[i].name;
                        }
                        var html = "<p>Are you sure you want to send the Post Delivery Report to <b>" + zone + "</b>?</p>";
                        if (t)
                            html += "<p>All emails will be sent to <a>" + $rootScope.user.email + "</a></p>";
                        promptFactory.confirm(html, function (result) {
                            if (result) {
                                var p = {
                                    z: z,
                                    w: w,
                                    sv: sv,
                                    t: t
                                };
                                baseFactory.put('/api/twcdeliveries/sendPostDelivery?' + $rootScope.objToParam(p)).then(function (rrdata) {
                                    if (!t) {
                                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                                    }
                                });
                            }
                        });
                    }
                };
            }]);
})();
homeModule.controller('ReportDashboardReworkExportCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "$controller", "permissionFactory",
        'categories', 'orderStatuses', 'itemStatuses', 'items', 'twcZones', 'reworkTypes', 'reworkReasons',
        function ($scope, $rootScope, $state, $stateParams, $controller, permissionFactory,
            categories, orderStatuses, itemStatuses, items, twcZones, reworkTypes, reworkReasons) {
            if (permissionFactory.isCompany() || $rootScope.user.isSysAdmin) {
                //
            } else {
                $state.go("anonymous.http404");
            }

            $scope.$parent.currentDashboardReportId = -4;
            $scope.$parent.showSidebar = false;

            angular.extend(this, $controller('BulkOrderUpdateCtrl', {
                $scope: $scope,
                categories: categories,
                orderStatuses: orderStatuses,
                itemStatuses: itemStatuses,
                items: items,
                twcZones: twcZones,
                workOrderStatuses: []
            }));

            $scope.bulkSearchUrl = '/api/order/searchReworkExport';
            $scope.bulkSearchExportUrl = '/exportGrid/getAllReworks/';
            $scope.steps = [
                {
                    step: 1,
                    title: 'Find Reworks',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Export Reworks',
                    isDone: false,
                    isEditing: false
                }
            ];
            $scope.reworkTypes = reworkTypes;
            $scope.reworkReasons = reworkReasons;

            var updateExportLink = function () {
                var arrReworkIds = [];
                for (var k = 0; k < $scope.searchResult.result.length; k++) {
                    if ($scope.searchResult.result[k].isSelected)
                        arrReworkIds.push($scope.searchResult.result[k].orderDetailId);
                }
                var indx = $scope.searchResult.exportUrl.indexOf('&reworks=');
                if (indx > 0)
                    $scope.searchResult.exportUrl = $scope.searchResult.exportUrl.slice(0, indx);

                return $scope.searchResult.exportUrl + "&reworks=" + arrReworkIds.join();
            };

            $scope.getOrderStatusColor = function (order) {
                var statusIsExist = false;
                var colour = 'black';
                angular.forEach(orderStatuses, function (value, index) {
                    if (value.name === order) {
                        if (value.colour) {
                            colour = value.colour;
                            statusIsExist = true;
                        }
                    }
                });

                if (statusIsExist) {
                    return { 'background-color': colour };
                } else {
                    return { 'color': 'black' };
                }
            };

            $scope.selectRowOrder2 = function (r) {
                // 1 = All unchecked
                // 2 = All checked
                // 3 = Some checked
                if (!$scope.disableSubmitButton) {
                    r.isSelected = !r.isSelected;
                    if (r.isSelected)
                        $scope.searchResult.selected++;
                    else
                        $scope.searchResult.selected--;
                    //
                    if ($scope.searchResult.selected > 0)
                        $scope.searchResult.selection = $scope.searchResult.selected === $scope.searchResult.result.length ? 2 : 3;
                    else
                        $scope.searchResult.selection = 1;
                    // Reset
                    updateExportLink();
                }
            };
            $scope.selectAllRowOrders2 = function () {
                if (!$scope.disableSubmitButton) {
                    if ($scope.searchResult.selection === 1 || $scope.searchResult.selection === 3) {
                        $scope.searchResult.selection = 2;
                    } else if ($scope.searchResult.selection === 2) {
                        $scope.searchResult.selection = 1;
                    }
                    for (var i = 0; i < $scope.searchResult.result.length; i++) {
                        $scope.searchResult.result[i].isSelected = $scope.searchResult.selection === 2;
                    }
                    $scope.searchResult.selected = $scope.searchResult.selection === 2 ? $scope.searchResult.result.length : 0;
                }
                updateExportLink();
            };
            $scope.exportOrders = function () {
                var url = updateExportLink(); // console.log(url)
                window.location.href = url;
            };

            // PUBLIC
            $scope.m1.sort = 'datecreated desc';
            $scope.m1.r = null;
            $scope.m1.t = null;
            $scope.m1.status = null;
            $scope.m1.selectedTemplates = [];
            $scope.m1.dateRange = {
                startDate: moment().subtract(30, 'days'),
                endDate: moment()
            };
        }]);
(function () {
    'use strict';

    homeModule.controller('ReportDashboardTransferReportCtrl',
        ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS', 'twcZones', 'warehouses',
            function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS, twcZones, warehouses) {

                $scope.$parent.currentDashboardReportId = -4;
                $scope.$parent.showSidebar = false;
                var tz = angular.copy(twcZones);
                tz.unshift({ id: null, name: "All Zones" });
                var ww = angular.copy(warehouses);
                ww.unshift({ id: null, name: "All Warehouses" });
                $scope.gridOptions = {
                    itemType: 'transfer report',
                    gridName: 'transferReportGrid',
                    fetchUrl: '/api/twcdeliveries/searchAllTransferReports',
                    exportUrl: '/report/exportTransferReport/',
                    initSortString: 'date desc',
                    enableSorting: true,
                    enableSearching: true,
                    enablePaging: true,
                    enableExport: true,
                    displayActionMenu: true,
                    hideSearchText: true,
                    enableDisplayActionMenuImport: true,
                    enableDateRange: true,
                    dateRange: {
                        startDate: moment().startOf('month'),
                        endDate: moment().endOf('month')
                    },
                    columnDefs: [
                        {
                            field: 'date', displayName: 'Date', customSortField: 'date',
                            cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>'
                        },
                        { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
                        { field: 'purchaseOrderNumber', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
                        { field: 'customer', displayName: 'Customer', customSortField: 'customer' },
                        { field: 'address', displayName: 'Address', customSortField: 'address' },
                        { field: 'itemName', displayName: 'Product', customSortField: 'itemName' },
                        { field: 'deliveryStatus', displayName: 'Status', customSortField: 'deliveryStatus' },
                        { field: 'shipVia', displayName: 'Ship Via', customSortField: 'shipVia' },
                        { field: 'deliveryWarehouse', displayName: 'Warehouse', customSortField: 'deliveryWarehouse' },
                        { field: 'items', displayName: 'Items', customSortField: 'items' },
                        { field: 'parcels', displayName: 'Parcels', customSortField: 'parcels' }
                    ],
                    customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplateTransferReport.html',
                    extraParams: {
                        sv: null,
                        w: null
                    },
                    extraData: {
                        twcZones: tz,
                        warehouses: ww
                    }
                };

            }]);
})();
homeModule.controller('ReportDashboardUltraCutCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "GRID_CONSTANTS", "fabrics",
        function ($scope, $rootScope, $state, $stateParams, GRID_CONSTANTS, fabrics) {
            console.log(fabrics);
            var i = 0;
            var items = [{ itemNumber: null, itemName: "All Items" }];
            for (i = 0; i < fabrics.items.length; i++) {
                items.push()
            }
            $scope.$parent.currentDashboardReportId = -2;
            $scope.$parent.showSidebar = false;
            $scope.gridOptions = {
                itemType: 'Ultra Cut report',
                gridName: 'UltraCutReportGrid',
                fetchUrl: '/api/twcorder/searchAllultracut',
                exportUrl: '/exportgrid/ultracutReports/',
                initSortString: '[OrderDate] DESC',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                enableExport: true,
                displayActionMenu: true,
                hideSearchText: true,
                enableDisplayActionMenuImport: true,
                columnDefs: [
                    { field: 'orderNumber', displayName: 'Order Number', customSortField: 'orderNumber' },
                    {
                        field: 'orderDate', displayName: 'Date', customSortField: 'orderDate', width: 150,
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    { field: 'quantity', displayName: 'Qty', customSortField: 'quantity' },
                    { field: 'width', displayName: 'Width', customSortField: 'width' },
                    { field: 'drop', displayName: 'Drop', sortable: false },
                    { field: 'material', displayName: 'Material', customSortField: 'material' },
                    { field: 'colour', displayName: 'Colour', customSortField: 'colour' },
                    { field: 'description', displayName: 'Description', sortable: false },
                    { field: 'template', displayName: 'Template', customSortField: 'template' },
                    { field: 'itemNumber', displayName: 'Item Number', customSortField: 'itemNumber' },
                    { field: 'itemName', displayName: 'Item Name', customSortField: 'itemName' }
                ],
                customFilterTemplate: '/app/modules/reports/dashboards/views/filterTemplateUltraCut.html',
                extraParams: {
                    dateRange: {
                        startDate: moment().subtract(29, 'days'),
                        endDate: moment()
                    },
                    itemNumber: null,
                    material: null,
                    colour: null
                },
                extraData: {
                    items: fabrics.items,
                    materials: fabrics.materials,
                    colours: fabrics.colours
                }
            };
        }]);
(function () {
    'use strict';

    homeModule.controller("ReportDashboardsCtrl", ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$state', '$stateParams', 'baseFactory', '$modal', 'dashboardReports', 'GRID_CONSTANTS'];
    function ctrl($scope, $rootScope, $state, $stateParams, baseFactory, $modal, dashboardReports, GRID_CONSTANTS) {
        // Dashboards
        $scope.isStateStatic = $state.current.name == "base.home.uxreports.stockOnHandReport";
        $scope.currentDashboardReportId = null;
        $scope.dashboardReports = $rootScope.groupList(dashboardReports, "group");

        // Sidebar
        $scope.showSidebar = true;
        $scope.toggleSidebar = function (isShow) {
            $scope.showSidebar = !isShow;
            window.dispatchEvent(new Event('resize'));
        };
    }
})();
homeModule.controller('StockOnHandReportCtrl', ["$scope", "$rootScope", "$state", "$stateParams", "categories", "locations",
    function ($scope, $rootScope, $state, $stateParams, categories, locations) {
        $scope.$parent.showSidebar = false;
        categories.unshift({
            name: null,
            description: "All Categories"
        })
        locations.unshift({
            name: null,
            description: "All Locations"
        })
        $scope.gridOptions = {
            itemType: 'Stock On Hand Report',
            gridName: 'stockOnHandReport',
            fetchUrl: '/api/reportapi/searchStockOnHand',
            exportUrl: '/exportGrid/getStockOnHandReport',
            initSortString: 'itemNumber asc',
            enableSorting: true,
            enableSearching: true,
            enablePaging: true,
            enableExport: true,
            columnDefs: [
                {
                    field: 'itemNumber', displayName: 'Item Number', customSortField: 'itemNumber',
                    cellTemplate: '<div class="ngCellText">{{row.entity.itemNumber}}</div>'
                },
                {
                    field: 'description', displayName: 'Description', customSortField: 'description',
                    cellTemplate: '<div class="ngCellText">{{row.entity.description}}</div>'
                },
                {
                    field: 'category', displayName: 'Category', customSortField: 'category',
                    cellTemplate: '<div class="ngCellText">{{row.entity.category}}</div>'
                },
                {
                    field: 'location', displayName: 'Location', customSortField: 'location',
                    cellTemplate: '<div class="ngCellText">{{row.entity.location}}</div>'
                },
                {
                    field: 'quantityOnHand', displayName: 'On Hand', customSortField: 'quantityOnHand', width: '100',
                    cellTemplate: '<div class="ngCellText">{{row.entity.quantityOnHand}}</div>'
                },
                {
                    field: 'quantityOnOrder', displayName: 'On Order', customSortField: 'quantityOnOrder', width: '100',
                    cellTemplate: '<div class="ngCellText">{{row.entity.quantityOnOrder}}</div>'
                },
                {
                    field: 'quantitySale', displayName: 'Sale', customSortField: 'quantitySale', width: '100',
                    cellTemplate: '<div class="ngCellText">{{row.entity.quantitySale}}</div>'
                },
                {
                    field: 'netStock', displayName: 'Net Stock', customSortField: 'netStock', width: '100',
                    cellTemplate: '<div class="ngCellText">{{row.entity.netStock}}</div>'
                },
            ],
            enableCustomFields: true,
            customFieldsHtml: '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.c" class="form-control" ' +
            'ng-options="i.name as i.description for i in dg.fetchOptions.extraData.categories"></select>' +
            '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
            '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.l" class="form-control" ' +
            'ng-options="i.name as i.description for i in dg.fetchOptions.extraData.locations"></select>',
            extraParams: {
                c: null,
                l: null
            },
            extraData: {
                categories: categories,
                locations: locations
            }
        };
    }]);
(function () {
    homeModule.controller('dashboardReportVisibilityModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', 'baseFactory', '$modalInstance', '$timeout', 'toaster', 'dashboardReport', 'visibilities', 'roles'];
    function ctrl($scope, $rootScope, baseFactory, $modalInstance, $timeout, toaster, dashboardReport, visibilities, roles) {

        $scope.dr = angular.copy(dashboardReport);
        $scope.mRoles = [];

        for (var i = 0; i < roles.length; i++) {
            var isExist = false;
            if (visibilities.length > 0) {
                for (var j = 0; j < visibilities.length; j++) {
                    if (visibilities[j].id == roles[i].id) {
                        isExist = true;
                        break;
                    }
                }
            }
            else {
                isExist = true;
            }

            $scope.mRoles.push({
                id: roles[i].id,
                name: roles[i].name,
                isSelected: roles[i].id == 1 || isExist,
                isShow: roles[i].id != 1
            });
        }

        $scope.btnSubmit = "Save";
        $scope.disableSubmitButton = false;

        $scope.save = function (mRoles) {
            $scope.btnSubmit = "Saving...";
            $scope.disableSubmitButton = true;

            var dataToSend = {
                reportId: $scope.dr.id,
                roles: []
            };

            for (var i = 0; i < mRoles.length; i++) {
                if (mRoles[i].isSelected) {
                    dataToSend.roles.push(mRoles[i]);
                }
            }

            baseFactory.post("/api/reportapi/saveVisibility", dataToSend).then(function (data) {
                if (!data.isErrored) {
                    $modalInstance.close(null);
                } else {
                    $scope.btnSubmit = "Save";
                    $scope.disableSubmitButton = false;
                }
            });
        }
        $scope.cancel = function () {
            $modalInstance.dismiss();
        }

    }
})();
(function () {
    'use strict';
    homeModule.config(config);
    config.$inject = ['$stateProvider'];

    function config($stateProvider) {
        $stateProvider
            // REPORTS
            .state('base.home.uxreporteditor', {
                url: "uxreport/editor?id",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/reports/editor/views/index.html",
                        controller: 'DashboardDesignerCtrl',
                        resolve: {
                            report: ["$rootScope", "$stateParams", "baseFactory", function ($rootScope, $stateParams, baseFactory) {
                                return null;
                            }]
                        },
                        data: {
                            authorizedRoles: []
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Reports'
                }
            });
    }
})();
homeModule.controller('DashboardDesignerCtrl', ["$scope", "$rootScope", "$state", "$stateParams", "report", function ($scope, $rootScope, $state, $stateParams, report) {
    $scope.dashboardDesignerUrl = "/DashboardReport/Designer" + "?id=" + $stateParams.id;
}]);
reworkModule.controller('ReworkCtrl',
    ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'reworkTypes', 'reworkReasons', 'orderStatuses',
        function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, reworkTypes, reworkReasons, orderStatuses) {
            $scope.reworkTypes = reworkTypes;
            $scope.reworkReasons = reworkReasons;

            var statusField = '<div class="ellipsis orderStatus text-center" style="padding:5px;" ng-style="getOrderStatusColor(row.entity.status)" title="{{row.entity.status}}">{{row.entity.status}}</div>';
            $scope.gridOptions = {
                itemType: 'rework',
                gridName: 'rework',
                fetchUrl: '/api/order/searchRework',
                initSortString: 'datecreated desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'datecreated', width: '120', displayName: 'Date', cellTemplate: '<div class="ngCellText"><span>{{row.entity.date | date:"dd/MM/yyyy"}}</span></div>' },
                    { field: 'reworkOrderNumber', displayName: 'Rework Order', customSortField: 'reworkOrder.OrderNumber' },
                    { field: 'status', visibleAt: '768', displayName: 'Status', customSortField: 'reworkOrder.status.name', cellTemplate: statusField },
                    { field: 'completionDate', width: '120', visibleAt: '992', displayName: 'EST Due Date', customSortField: 'reworkOrder.deliveryDate', cellTemplate: '<div class="ngCellText"><span>{{row.entity.completionDate | date:"dd/MM/yyyy"}}</span></div>' },
                    { field: 'originalOrderNumber', visibleAt: '992', displayName: 'Original Order', customSortField: 'originalOrder.OrderNumber' },
                    { field: 'purchaseOrderNumber', visibleAt: '992', displayName: 'PO Number', customSortField: 'reworkOrder.purchaseOrderNumber' },
                    { field: 'customerName', visibleAt: '768', displayName: 'Customer', customSortField: 'reworkOrder.customerName' },
                    { field: 'type', displayName: 'Type', customSortField: 'type' },
                    { field: 'itemName', displayName: 'Product', customSortField: 'OriginalOrder.ItemName' },
                    { field: 'reason', visibleAt: '992', displayName: 'Reason', customSortField: 'reason' }
                ],
                enableCustomFields: true,
                extraParams: { t: null, r: null },
                extraData: {
                    reworkTypes: reworkTypes,
                    reworkReasons: reworkReasons
                },
                controlColumnWidth: 110,
                customFieldsHtml: customFieldsHtml(),
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group" dropdown>' +
                    '<button type="button" class=" btn-sm btn btn-default" dropdown-toggle>Manage <span class="caret"></span></button>' +
                    '<ul class="dropdown-menu">' +
                    '<li><a ui-sref="base.reworks.edit({id:row.entity.id})" ng-show="showEdit()">Edit</a></li>' +
                    '<li><a ng-click="deleteCategory(row.entity)" class="cursor-pointer" ng-show="showEdit()">Delete</a></li>' +
                    '<li permission permissions=\'system.changeOrderStatus.allow\' ng-show="checkStatus(row.entity)" ng-if="showEdit()"><a class="cursor-pointer" ng-click="openOrderDetail(row.entity)">Change Status</a></li>' +
                    '<li role="separator" class="divider" ng-show="showEdit()"></li>' +
                    '<li permission permissions="system.exportOrder.allow" ng-if="row.entity.reworkOrderId"><a class="cursor-pointer" href="/Report/TwcRework/{{row.entity.id}}">Export Rework</a></li>' +
                    '<li permission permissions="system.exportOrder.allow" ng-if="row.entity.reworkOrderId"><a class="cursor-pointer" href="/Report/TwcOrder/{{row.entity.reworkOrderId}}">Export Rework Order</a></li>' +
                    '<li permission permissions="system.exportOrder.allow"><a class="cursor-pointer" href="/Report/TwcOrder/{{row.entity.orderId}}">Export Original Order</a></li>' +
                    '<li permission permissions=\'system.viewOrderLogs.allow\'><a class="cursor-pointer" ng-click="openOrderLogs(row.entity.reworkOrderId)">View Logs</a></li>' +
                    '<li allowed-roles="[\'company admin\',\'company user\']" permission permissions=\'system.viewOrderLogs.allow\'><a class="cursor-pointer" ng-click="viewEmailLogs(row.entity.reworkOrderId)">Email Logs</a></li>' +
                    '</ul>' +
                    '</div>' +
                    '</div>';
            }

            function customFieldsHtml() {
                return '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.t" class="form-control" ng-options="t.id as t.name for t in dg.fetchOptions.extraData.reworkTypes"></select>' +
                    '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                    '<select ng-change="updateSearch()" ng-model="dg.fetchOptions.extraParams.r" class="form-control" ng-options="r.id as r.name for r in dg.fetchOptions.extraData.reworkReasons"></select>';
            }

            $scope.showEdit = function () {
                return $rootScope.isCompanyUser();
            };

            $scope.deleteCategory = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.orderNumber || value.purchaseOrderNumber,
                    value.id,
                    'Rework',
                    null,
                    '/api/order/deleteRework/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.getOrderStatusColor = function (order) {
                var statusIsExist = false;
                angular.forEach(orderStatuses.object, function (value, index) {
                    if (value.name == order) {
                        if (value.colour) {
                            $scope.orderStatusColor = value.colour;
                            statusIsExist = true;
                        }
                    }
                });

                if (statusIsExist) {
                    return { 'background-color': $scope.orderStatusColor };
                } else {
                    return { 'color': 'black' };
                }
            };

            $scope.searchOrderNumber = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/reworks/modals/searchOrderModal.html',
                    controller: 'SearchOrderModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {}
                });

                modalInstance.result.then(function (orderNumber) {
                }, function () { });
            };

            $scope.checkStatus = function (row) {
                var returnValue = true;
                if (!row.reworkOrderId)
                    return false;

                if (row.status === "Quote" || row.status === "Posted")
                    returnValue = false;

                if ($rootScope.clientName && ($rootScope.clientName === "TWC" || $rootScope.clientName === "RETAILBLINDS"))
                    if (row.status === "Completed")
                        return false;

                return returnValue;
            };

            $scope.openOrderDetail = function (order) {
                if (order.reworkOrderId == null)
                    return;

                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/orderDetailModal/orderDetail.html',
                    controller: 'orderDetail',
                    size: 'md',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        order: function () {
                            return baseFactory.fetch('/api/ppiorder/get/' + order.reworkOrderId)
                                .then(function (rdata) { return rdata.object; });
                        },
                        orderStatuses: function ($rootScope, $stateParams, baseFactory) {
                            return baseFactory.fetch('/api/orderstatus/getall')
                                .then(function (rdata) { return rdata.object; });
                        },
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        }
                    }
                });
            };

            $scope.openOrderLogs = function (orderId) {
                $modal.open({
                    templateUrl: '/app/modules/order/orderLogsModal/orderLogs.html',
                    controller: 'OrderLogsCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        orderId: function () {
                            return orderId;
                        }
                    }
                });
            };
            
            $scope.viewEmailLogs = function (orderId) {
                $modal.open({
                    templateUrl: '/app/modules/admin/emailLogs/modals/orderEmailLogs.html',
                    controller: 'OrderEmailLogsCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    windowClass: 'app-modal-window',
                    resolve: {
                        orderId: function () {
                            return orderId;
                        }
                    }
                });
            };
        }]);
reworkModule.controller('ReworkCreateEditCtrl',
    ['$scope', '$rootScope', '$state', '$document', '$timeout', 'baseFactory', 'permissionFactory', 'rework', 'reworkTypes', 'reworkReasons', 'reworkReturnTypes',
        function ($scope, $rootScope, $state, $document, $timeout, baseFactory, permissionFactory, rework, reworkTypes, reworkReasons, reworkReturnTypes) {
            //
            $scope.m = rework;
            $scope.submitTxt = "Submit Rework";
            $scope.disableSubmitButton = false;
            $scope.reworkTypes = reworkTypes;
            $scope.reworkReturnTypes = reworkReturnTypes;
            $scope.reworkReasons = reworkReasons;
            $scope.reworkErrors = angular.copy(rework.reworkErrors);
            $scope.currentTab = $scope.m.groupLines.length > 0 ? $scope.m.groupLines[0].itemNumber : null;


            // Prevent the backspace button accidentally taking the user away from this page
            $document.on('keydown', function (e) {
                if (e.which === 8 && (e.target.nodeName === "BODY" || e.target.nodeName === "SELECT")) {
                    e.preventDefault();
                }
            });

            //Upload Document
            $scope.onFileSelect = onFileSelect;
            $scope.resetInputFile = resetInputFile;
            $scope.deleteFile = deleteFile;
            var isDocument = true;
            var isMedia = true;

            var isFileValid = function (filename, indx) {
                var extAr = filename.split('.');
                var ext = extAr[extAr.length - 1];
                ext = ext.toLocaleLowerCase();
                var fType = [];
                var result = false;

                if (isDocument || isMedia) {
                    fType = ["doc", "docx", "pdf", "txt", "xls", "xlsx", "ppt", "pptx", "key", "mp4", "mov", "zip", "png", "rar", "jpg", "jpeg"];
                    result = fType.indexOf(ext) >= 0;
                }

                return result;
            };

            function onFileSelect($files) {
                $scope.disableSubmitButton = true;
                $scope.submitTxt = "Uploading...";
                var uploadingFiles = $files.length;
                //
                for (var j = 0; j < $files.length; j++) {
                    if (isFileValid($files[j].name)) {
                        $scope.m.files.push({
                            fileName: $files[j].name,
                            progress: 0,
                            isUploaded: false,
                            isNew: true
                        });
                        var len = $scope.m.files.length - 1;
                        $scope.upload = baseFactory
                            .upload('/api/upload/media', { oldfolder: '', indx: len, isDirect: true }, [$files[j]])
                            .progress(function (evt) {
                                $scope.m.files[len].progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                            }).success(function (data, status, headers, config) {
                                if (!data.isErrored) {
                                    var fileModel = data.object;
                                    $scope.m.files[fileModel.fileIndex].fileFolder = fileModel.fileFolder;
                                    $scope.m.files[fileModel.fileIndex].fileName = fileModel.fileName;
                                    $scope.m.files[fileModel.fileIndex].isUploaded = fileModel.isUploaded;
                                    $scope.m.files[fileModel.fileIndex].link = fileModel.link;
                                    $scope.m.files[fileModel.fileIndex].isNew = false;
                                    uploadingFiles--;
                                }
                                if (uploadingFiles == 0) {
                                    $scope.resetInputFile();
                                    $scope.disableSubmitButton = false;
                                    $scope.submitTxt = "Submit Rework";
                                }
                            });
                    } else {
                        uploadingFiles--;
                        $scope.m.files.push({
                            fileName: $files[j].name + ' is invalid',
                            progress: 0,
                            isUploaded: true,
                            isNew: false,
                            isError: true,
                            message: 'File is invalid'
                        });
                        if (uploadingFiles == 0) {
                            $scope.resetInputFile();
                            $scope.disableSubmitButton = false;
                            $scope.submitTxt = "Submit Rework";
                        }
                    }
                }
            };

            function deleteFile($index) {
                $scope.m.files.splice($index, 1);
            }

            function resetInputFile() {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            };

            $scope.setTab = function (itemNumber) {
                $scope.currentTab = itemNumber;
            };

            $scope.typeChanged = function (t) {
                if (t != 'Return') {
                    $scope.m.numberOfParcels = null;
                } else {
                    $scope.m.numberOfParcels = 0;
                }
            };

            $scope.save = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Submitting...";
                    $scope.disableSubmitButton = true;
                    var dataToSend = angular.copy(m);
                    for (var i = 0; i < dataToSend.files.length; i++) {
                        if (dataToSend.files[i].isError) {
                            dataToSend.files.splice(i, 1);
                            dataToSend.files.clean();
                        }
                    }

                    baseFactory.post("/api/order/saverework/", dataToSend).then(function (data) {
                        $scope.submitTxt = "Submit Rework";
                        $scope.disableSubmitButton = false;
                        if (!data.isErrored)
                            if ($scope.isCompany) {
                                $state.go('base.reworks.edit', { id: data.object }, { reload: true });
                            } else {
                                $state.go('base.reworks', null, { reload: true });
                            }
                    });
                }
            };

            $scope.showEdit = function () {
                return $rootScope.isCompanyUser();
            };
            $scope.isCompany = permissionFactory.isCompany() || $rootScope.user.isSysAdmin;

            // INIT
            $scope.shipToLocations = [];
            baseFactory.fetch('/api/customer/customerShipToLocations', { customerId: rework.customerNumber}).then(function (rdata) {
                var arr = rdata.object || [];
                angular.forEach(arr, function (t) {
                    t.name = t.locationName;
                    if (t.city.length > 0)
                        t.name = t.name + ' - ' + t.city;
                    $scope.shipToLocations.push(t);
                });
            });
        }]);
orderModule.controller('SearchOrderModalCtrl', ['$scope', '$rootScope', '$modalInstance', '$timeout', '$state', 'baseFactory', 'clientHelperFactory',
    function ($scope, $rootScope, $modalInstance, $timeout, $state, baseFactory, clientHelperFactory) {
        //
        var isTwcClientVisible = clientHelperFactory.isTwcClient();
        var columnDefs = [
            { field: 'orderDate', width: '120', displayName: 'Order Date', customSortField: 'orderDate', cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:"dd/MM/yyyy"}}</span></div>' },
            { field: 'orderNumber', width: '120', displayName: 'Order Number', customSortField: 'orderNumber' },
            { field: 'purchaseOrderNumber', width: '120', displayName: 'PO Number', customSortField: 'purchaseOrderNumber' },
            { field: 'customerId', width: '120', displayName: 'Customer Id', customSortField: 'customerId' }
        ];
        if (isTwcClientVisible) {
            columnDefs.push({ field: 'itemName', displayName: 'Product', customSortField: 'itemName' });
        } else {
            columnDefs.push({ field: 'customerName', displayName: 'Customer Name', customSortField: 'customerName' });
        }
        $scope.gridOptions = {
            itemType: 'Orders',
            gridName: 'ordersTwc',
            fetchUrl: '/api/order/SearchOrders',
            initSortString: 'dateUpdated desc',
            enableSorting: false,
            enableSearching: true,
            enablePaging: true,
            enableDateRange: true,
            enableExport: false,
            enableCustomButtons: true,
            pageSize: 10,
            dateRange: {
                startDate: moment('1970-01-01', 'YYYY-MM-DD'),
                endDate: moment()
            },
            columnDefs: columnDefs,
            controlCellTemplateHtml: controlHtml(),
            controlColumnWidth: 80,
            extraParams: {
                exnoor: true
            },
            extraData: {}
        };

        function controlHtml() {
            return '<div class="text-right padding-5"><a class="btn btn-primary btn-xs cursor-pointer" ng-click="createRework(row.entity)">Select</a></div>';
        }

        $scope.createRework = function (order) {
            $state.go('base.reworks.create', { orderId: order.id });
            $modalInstance.close();
        };
        $scope.cancel = function () {
            $modalInstance.dismiss(false);
        };

    }]);
invoiceModule.config(
['$stateProvider',
    function ($stateProvider) {
        $stateProvider
            .state('base.sageOrders', {
                url: "/sageorders",
                views: {
                    'content@base': {
                        templateUrl: "/app/modules/sageOrders/index.html",
                        controller: 'SageOrdersCtrl',
                        resolve: {
                        }
                    }
                },
                ncyBreadcrumb: {
                    label: 'Sage Orders'
                }
            });
    }
]);
(function () {
    'use strict';
    invoiceModule.controller('SageOrdersCtrl', ctrl);
    ctrl.$inject = ["$scope", "$rootScope", "$stateParams", "permissionFactory", "resolveFactory", "sharedFactory", "$modal", "GRID_CONSTANTS"];
    function ctrl($scope, $rootScope, $stateParams, permissionFactory, resolveFactory, sharedFactory, $modal, GRID_CONSTANTS) {

        $scope.isCompany = permissionFactory.isCompany() || $rootScope.user.isSysAdmin;

        if (!$scope.isCompany) {
            $state.go("anonymous.http404");
        }

        var columnDefs = [];
        columnDefs.push({ field: 'orderNumber', displayName: 'Order #' });
        if (!$stateParams.customerId) {
            columnDefs.push({ field: 'customer', displayName: 'Customer' });
            columnDefs.push({ field: 'customerId', displayName: 'CustomerId' });
        }
        columnDefs.push({ field: 'orderDate', displayName: 'Order Date', cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderDate | date:\'dd/MM/yyyy\'}}</span></div>' });
        columnDefs.push({ field: 'purchaseOrderNumber', displayName: 'PO Number' });
        columnDefs.push({ field: 'description', displayName: 'Description' });
        columnDefs.push({ field: 'printOn', displayName: 'Print On' });
        columnDefs.push({ field: 'isComplete', displayName: 'Complete', cellTemplate: '<div class="ngCellText"><span>{{row.entity.isComplete ? \'Yes\' : \'No\'}}</span></div>' });
        columnDefs.push({ field: 'orderId', displayName: 'Web Order', cellTemplate: '<div class="ngCellText"><span>{{row.entity.orderId > 0 ? \'Yes\' : \'No\'}}</span></div>' });
        columnDefs.push({
            enableSort: false,
            width: '100',
            displayName: '',
            cellTemplate:
                '<div class="list-menu col-lg-12">' +
                '<ul class="nav navbar-right pull-right">' +
                '<li class="dropdown" dropdown>' +
                '<span href="" class="dropdown-toggle btn btn-default btn-sm" dropdown-toggle>' +
                '<span class="hidden-xs"><i class="glyphicon glyphicon-menu-hamburger"></i></span> Manage <span class="caret"></span>' +
                '</span>' +
                '<ul class="dropdown-menu">' +
                '<li><a class="cursor-pointer" ng-click="openOrderDetailsModal(row.entity.orderNumber)">View Items</a></li>' +
                '<li><a class="cursor-pointer" href="/report/SageOrderExport?orderNumber={{row.entity.orderNumber}}&customerId=' + $stateParams.customerId + '" target="_blank">Export Report</a></li>' +
                '<li><a class="cursor-pointer" ng-click="openExportInvoiceModal(row.entity.orderNumber)">Export Invoices</a></li>' +
                '<li ng-if="row.entity.orderId > 0" class="divider"></li>' +
                '<li ng-if="row.entity.orderId > 0"><a class="cursor-pointer" ui-sref="base.orders.view2({id:row.entity.orderId})">View Order</a></li>' +
                '</ul>' +
                '</li>' +
                '</ul>' +
                '</div>'
        });

        $scope.customer = null;
        $scope.gridOptions = {
            itemType: 'Sage Orders',
            gridName: 'sageOrders' + (!$stateParams.customerId ? '' : '_Customers'),
            fetchUrl: '/api/SageOrders/SearchAll',
            initSortString: 'OrderDate DESC',
            loadOnInit: typeof $stateParams.customerId !== 'undefined',
            enableSorting: true,
            enableSearching: typeof $stateParams.customerId !== 'undefined',
            enablePaging: true,
            enableDateRange: false,
            enableExport: false,
            columnDefs: columnDefs,
            enableCustomFields: true,
            customFieldsHtml: '',
            extraParams: {
                customerId: !$stateParams.customerId ? null : $stateParams.customerId,
                orderNumber: null,
                purchaseOrderNumber: null,
                searchText: null
            },
            extraData: {
            }
        };

        $scope.filterSearch = function () {
            if ($scope.customer === null || $scope.customer === '')
                $scope.gridOptions.extraParams.customerId = null;
            $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
        };
        $scope.getCustomer = function (val) {
            return sharedFactory.searchCustomer(val).then(function (data) {
                return data;
            });
        };
        $scope.onCompanySelect = function ($item, $model, $label) {
            // console.log($model);
            $scope.gridOptions.extraParams.customerId = $model.customerId;
        };

        $scope.openOrderDetailsModal = function (orderNumber) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/sageOrders/modals/sageOrderDetailsModal.html',
                controller: 'SageOrderDetailsModalCtrl',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    orderNumber: function () {
                        return orderNumber;
                    },
                    items: ['resolveFactory', function (resolveFactory) {
                        return resolveFactory.getEntity('/api/sageorders/GetAllOrderItems', { orderNumber: orderNumber, customerId: $stateParams.customerId });
                    }]
                }
            });
            modalInstance.result.then(function () {
            }, function (isReloadPage) {
            });
        };

        $scope.openExportInvoiceModal = function (orderNumber) {
            var modalInstance = $modal.open({
                templateUrl: '/app/modules/order/exportPpiInvoiceModal/exportPpiInvoiceModal.html',
                controller: 'exportPpiInvoiceModal',
                size: 'md',
                backdrop: 'static',
                windowClass: 'app-modal-window',
                resolve: {
                    invoices: ['resolveFactory', function (resolveFactory) {
                        return resolveFactory.getGridEntity('/api/order/GetInvoicesForOrder/?orderNumber=' + orderNumber);
                    }]
                }
            });
            modalInstance.result.then(function () {
            }, function (isReloadPage) {
            });
        };
    }
})();


orderModule.controller('SageOrderDetailsModalCtrl', ['$scope', '$rootScope', '$modalInstance', 'orderNumber', 'items', function ($scope, $rootScope, $modalInstance, orderNumber, items) {
    $scope.orderNumber = orderNumber;
    $scope.sageOrderItems = items;

    $scope.cancel = function () {
        $modalInstance.dismiss(false);
    };
}]);
homeModule.controller('ScheduleCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "$modal", "$timeout", "baseFactory", "blindTypes", "twcZones",
        function ($scope, $rootScope, $state, $stateParams, $modal, $timeout, baseFactory, blindTypes, twcZones) {
            var size = {
                width: window.innerWidth || document.body.clientWidth,
                height: window.innerHeight || document.body.clientHeight
            };

            $scope.reportUrl = "/DashboardReport/schedule";
            function resizeIframe() {
                $scope.hh = document.body.scrollHeight - 250;
            }
            // $scope.resizeIframe = resizeIframe();
            // resizeIframe();

            $scope.manageCapacity = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/schedules/modals/manageCapacityModal.html',
                    controller: 'ManageCapacityModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        categories: function () {
                            return baseFactory.fetch('/api/category/GetAll').then(function (rdata) {
                                return rdata.object || [];
                            });
                        },
                        scheduledCategories: function () {
                            return baseFactory.fetch('/api/category/GetAllScheduledCategories').then(function (rdata) {
                                return rdata.object || [];
                            });
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                    document.getElementById('reportDashboardFrame').contentDocument.location.reload(true);
                }, function () {
                });
            };

            $scope.exportSchedule = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/schedules/modals/exportScheduleModal.html',
                    controller: 'ScheduleExportModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        blindTypes: function () {
                            return blindTypes;
                        },
                        twcZones: function () {
                            return twcZones;
                        },
                        dateRange: function () {
                            return $scope.filter.dateRange;
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                }, function () {
                });
            };

            // NEW UI
            $scope.filter = {
                searchText: null,
                ft: null,
                sv: null,
                p: "All",
                h: 2,
                dateRange: {
                    startDate: moment.utc('20130101', 'YYYYMMDD'),
                    endDate: moment().add(1, 'year')
                }
            };
            $scope.arrHolds = [
                { id: null, name: "All" },
                { id: 1, name: "On Hold" },
                { id: 2, name: "Open" },
                { id: 3, name: "Out of Stock" }
            ];
            $scope.filterTypes = [
                { id: null, name: "All" },
                { id: "orders", name: "Orders" },
                { id: "reworks", name: "Reworks" }
            ];
            $scope.blindTypes = ["All"];
            for (var i = 0; i < blindTypes.length; i++) {
                $scope.blindTypes.push(blindTypes[i]);
            }
            $scope.twcZones = [{ id: null, name: "All Ship Via" }];
            for (var j = 0; j < twcZones.length; j++) {
                $scope.twcZones.push(twcZones[j]);
            }
            $scope.dateRanges = {
                'Today': [moment(), moment()],
                'Next 7 Days': [moment(), moment().add(6, 'days')],
                'Next 30 Days': [moment(), moment().add(29, 'days')],
                'This Month': [moment().startOf('month'), moment().endOf('month')],
                'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
                'This Year': [moment().startOf('year'), moment().endOf('year')],
                'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')],
                'All Time': [moment.utc('20130101', 'YYYYMMDD'), moment()]
            };

            $scope.arr1 = [];
            $scope.arr2 = [];
            $scope.arr3 = [];
            $scope.activeArr1Index = 0;
            $scope.activeArr2Index = 0;
            $scope.activeArr3Index = 0;
            $scope.currentDate = null;
            $scope.isPanel1Show = true;
            $scope.isPanel2Show = true;
            $scope.isPanel3Show = true;
            $scope.isPanel1FullScreen = false;
            $scope.isPanel2FullScreen = false;
            $scope.isPanel3FullScreen = false;
            $scope.panelFullScreen = function (panel) {
                $scope.isPanel1Show = true;
                $scope.isPanel2Show = true;
                $scope.isPanel3Show = true;
                if (panel === 1) {
                    $scope.isPanel1FullScreen = !$scope.isPanel1FullScreen;
                    $scope.isPanel2FullScreen = false;
                    $scope.isPanel3FullScreen = false;
                    if ($scope.isPanel1FullScreen) {
                        $scope.isPanel1Show = true;
                        $scope.isPanel2Show = false;
                        $scope.isPanel3Show = false;
                    }
                } else if (panel === 2) {
                    $scope.isPanel1FullScreen = false;
                    $scope.isPanel2FullScreen = !$scope.isPanel2FullScreen;
                    $scope.isPanel3FullScreen = false;
                    if ($scope.isPanel2FullScreen) {
                        $scope.isPanel1Show = false;
                        $scope.isPanel2Show = true;
                        $scope.isPanel3Show = false;
                    }
                } else if (panel === 3) {
                    $scope.isPanel1FullScreen = false;
                    $scope.isPanel2FullScreen = false;
                    $scope.isPanel3FullScreen = !$scope.isPanel3FullScreen;
                    if ($scope.isPanel3FullScreen) {
                        $scope.isPanel1Show = false;
                        $scope.isPanel2Show = false;
                        $scope.isPanel3Show = true;
                    }
                }
            };
            $scope.loadProductRange = function (indx1) {
                var dts = angular.copy($scope.filter);
                dts.startDate = moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD');
                dts.endDate = moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD');
                delete dts.dateRange;
                baseFactory.fetch('/api/twcSchedules/productRanges', dts).then(function (rdata) {
                    $scope.arr1 = rdata.object || [];
                    $scope.currentDate = null;

                    if ($scope.arr1.length > 0) {
                        var total = 0;
                        for (var i = 0; i < $scope.arr1.length; i++) {
                            total = total + $scope.arr1[i].quantity;
                        }
                        // $scope.arr1.unshift({ category: 'All', quantity: total });
                        $scope.loadOrderRange($scope.arr1[indx1].category, 0);
                    } else {
                        $scope.arr2 = [];
                        $scope.arr3 = [];
                        $scope.activeArr2Index = 0;
                        $scope.activeArr3Index = 0;
                    }
                });
            };
            $scope.loadOrderRange = function (p, indx) {
                $scope.activeArr1Index = indx;
                var dts = angular.copy($scope.filter);
                dts.p = angular.copy(p);
                dts.startDate = moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD');
                dts.endDate = moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD');
                delete dts.dateRange;
                baseFactory.fetch('/api/twcSchedules/orderRanges', dts).then(function (rdata) {
                    $scope.arr2 = rdata.object || [];

                    if ($scope.currentDate !== null) {
                        // find date index
                        var indxx = 0;
                        for (var i = 0; i < $scope.arr2.length; i++) {
                            if ($scope.arr2[i].date === $scope.currentDate) {
                                indxx = i;
                                break;
                            }
                        }
                        $scope.loadOrders($scope.currentDate, $scope.arr1[indx].category, indxx);
                    } else if ($scope.arr2.length > 0) {
                        $scope.loadOrders($scope.arr2[0].date, $scope.arr2[0].category, 0);
                    }
                });
            };
            $scope.loadOrders = function (d, p, indx) {
                $scope.activeArr2Index = indx;
                $scope.currentDate = null;
                var dte = moment(d).format('YYYY-MM-DD');
                var dts = angular.copy($scope.filter);
                dts.p = angular.copy(p);
                dts.d = dte;
                delete dts.dateRange;
                baseFactory.fetch('/api/twcSchedules/orders', dts).then(function (rdata) {
                    $scope.arr3 = rdata.object || [];
                });
            };

            //
            $scope.filterSearh = function () {
                $scope.loadProductRange(0);
                var params = angular.copy($scope.filter);
                params.startDate = moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD');
                params.endDate = moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD');
                delete params.dateRange;
                $scope.exportUrl = "/report/scheduleExport?" + $rootScope.objToParam($scope.filter);
            };
            $scope.filterSearh();
            $scope.$watch("filter.ft", function (v) {
                $timeout(function () {
                    $scope.filterSearh();
                }, 500);
            });
            $scope.viewOrder = function (orderId) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/schedules/modals/viewOrderModal.html',
                    controller: 'ScheduleViewOrderModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        order: ['resolveFactory', function (resolveFactory) {
                            return resolveFactory.getEntity('/api/order/GetCreateUpdateOrderModel?id=' + orderId);
                        }],
                        categories: function () {
                            return [];
                        },
                        orderCustomFields: function () {
                            return { object: [] };
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                    $scope.currentDate = ddata;
                    $scope.loadOrderRange($scope.arr1[$scope.activeArr1Index].category, 0);
                }, function () {
                });
            };
            $scope.editComment = function (orderId, indx) {
                baseFactory.fetch('/api/notes/getbyorder/' + orderId).then(function (rrdata) {
                    var m = rrdata.object;
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/order/dashboard/modals/manageSimpleNoteModal.html',
                        controller: 'ManageNoteModalCtrl',
                        size: 'md',
                        backdrop: 'static',
                        resolve: {
                            NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                return $ocLazyLoad.load('OcNoteModalCtrl');
                            }],
                            isNew: function () {
                                return m.id === 0;
                            },
                            model: function () {
                                return m;
                            },
                            contacts: function () {
                                return [];
                            },
                            noteTypes: function () {
                                return [];
                            }
                        }
                    });
                    modalInstance.result.then(function (obj) {
                        $scope.arr3[indx].comments = angular.copy(obj.content);
                    }, function () {
                    });
                });
            };
        }]);

window.scheduleFrameLoad = function () {
    document.getElementById("exportScheduleButton").style.display = "block";
};
homeModule.controller('ScheduleManageCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "$modal", "$timeout", "$debounce", "baseFactory", 'categories',
        function ($scope, $rootScope, $state, $stateParams, $modal, $timeout, $debounce, baseFactory, categories) {

            //
            var stillLoading = false;
            $scope.categoryOptions = angular.copy(categories);
            $scope.categories = categories;
            $scope.schedCategories = [];
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.currentCategoryId = null;
            $scope.temp = {
                id: 0,
                categoryId: null,
                categoryName: null,
                from: new Date(moment()),
                to: new Date(moment()),
                capacity: 0
            };
            $scope.dateRanges = {
                'Today': [moment(), moment()],
                //'Next 7 Days': [moment(), moment().add(6, 'days')],
                //'Next 30 Days': [moment(), moment().add(29, 'days')],
                //'This Month': [moment().startOf('month'), moment().endOf('month')],
                //'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
                //'This Year': [moment().startOf('year'), moment().endOf('year')],
                //'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')]
            };
            $scope.dateRangeChanged = function (dr) {
                $scope.updateSchedule(dr);
            };
            $scope.updateSchedule = function (temp) {
                var isNew = temp.id == 0;
                //
                var saveSchedule = function () {
                    //
                    var dataToSend = angular.copy(temp);
                    dataToSend.from = moment(dataToSend.from).format('YYYY-MM-DD');
                    dataToSend.to = moment(dataToSend.to).format('YYYY-MM-DD');
                    baseFactory.post("/api/twcSchedules/saveScheduledCapacity", dataToSend).then(function (data) {
                        temp.disableField = false;
                        if (!data.isErrored) {
                            temp.id = data.object;

                            if (isNew) {
                                $scope.schedCategories.push(angular.copy(temp));

                                // RESET
                                $scope.temp = {
                                    id: 0,
                                    categoryId: null,
                                    categoryName: null,
                                    from: new Date(moment()),
                                    to: new Date(moment()),
                                    capacity: 0
                                };
                            }
                        }
                    });
                };
                if (isNew) {
                    temp.categoryId = $scope.currentCategoryId;
                }
                $debounce(saveSchedule, 100);
            };
            $scope.removeSchedule = function (sc, indx) {
                baseFactory.post("/api/twcSchedules/deleteScheduledCapacity/" + sc.id).then(function (data) {
                    if (!data.isErrored) {
                        $scope.schedCategories.splice(indx, 1);
                    }
                });
            };
            $scope.loadCategory = function (cid) {
                stillLoading = true;
                baseFactory.fetch('/api/twcSchedules/GetAllScheduledCapacities', { cid: cid }).then(function (rdata) {
                    $scope.schedCategories = angular.copy(rdata.object || []);
                    $scope.currentCategoryId = cid;
                    $timeout(function () {
                        stillLoading = false;
                    }, 1000);
                });
            };

            $scope.save = function (mForm, cats) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    baseFactory.post("/api/category/saveAll", cats).then(function (data) {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
            $scope.saveCategory = function (cat) {
                $scope.disableSubmitButton = true;
                cat.disableField = true;
                //
                baseFactory.post("/api/twcSchedules/saveScheduleCategory", cat).then(function (data) {
                    $scope.disableSubmitButton = false;
                    cat.disableField = false;
                });
            };
            $scope.saveSched = function (mForm, schedCategories) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    for (var i = 0; i < schedCategories.length; i++) {
                        schedCategories[i].from = moment(schedCategories[i].from).format('YYYY-MM-DD');
                        schedCategories[i].to = moment(schedCategories[i].to).format('YYYY-MM-DD');
                    }
                    var dataToSend = {
                        categoryId: $scope.currentCategoryId,
                        schedules: schedCategories
                    };
                    baseFactory.post("/api/category/SaveAllScheduledCapacities", dataToSend).then(function (data) {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
        }]);
homeModule.controller('ScheduleExportModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', 'baseFactory', 'blindTypes', 'twcZones', 'dateRange',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, baseFactory, blindTypes, twcZones, dateRange) {
            //
            $scope.categories = [{ id: null, name: "All", isSelected: false }];
            $scope.twcZones = [{ id: null, name: "All", isSelected: false }];
            $scope.types = [
                { id: null, name: "All", isSelected: false },
                { id: 'orders', name: "Orders", isSelected: false },
                { id: 'reworks', name: "Reworks", isSelected: false }
            ];
            $scope.statuses = [
                { id: null, name: "All", isSelected: false },
                { id: 1, name: "On Hold", isSelected: false },
                { id: 2, name: "Open", isSelected: true },
                { id: 3, name: "Out of Stock", isSelected: false }
            ];
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.m = {
                startDate: moment().subtract(29, 'days'),
                endDate: moment(),
                bt: null
            };
            $scope.updateExportUrl = function () {
                var cArr = [];
                for (var i = 0; i < $scope.categories.length; i++) {
                    if ($scope.categories[i].id === null && $scope.categories[i].isSelected)
                        break;
                    if ($scope.categories[i].id !== null && $scope.categories[i].isSelected) {
                        cArr.push($scope.categories[i].id);
                    }
                }
                var svArr = [];
                for (i = 0; i < $scope.twcZones.length; i++) {
                    if ($scope.twcZones[i].id === null && $scope.twcZones[i].isSelected)
                        break;
                    if ($scope.twcZones[i].id !== null && $scope.twcZones[i].isSelected) {
                        svArr.push($scope.twcZones[i].id);
                    }
                }
                var tArr = [];
                for (var j = 0; j < $scope.types.length; j++) {
                    if ($scope.types[j].id === null && $scope.types[j].isSelected)
                        break;
                    if ($scope.types[j].id !== null && $scope.types[j].isSelected) {
                        tArr.push($scope.types[j].id);
                    }
                }
                var stArr = [];
                for (var k = 0; k < $scope.statuses.length; k++) {
                    if ($scope.statuses[k].id === null && $scope.statuses[k].isSelected)
                        break;
                    if ($scope.statuses[k].id !== null && $scope.statuses[k].isSelected) {
                        stArr.push($scope.statuses[k].id);
                    }
                }
                var params = {
                    startDate: moment(dateRange.startDate).format('YYYY-MM-DD'),
                    endDate: moment(dateRange.endDate).format('YYYY-MM-DD')
                };
                //
                if (cArr.length > 0)
                    params.c = cArr.join();
                if (tArr.length > 0)
                    params.t = tArr.join();
                if (svArr.length > 0)
                    params.sv = svArr.join();
                if (stArr.length > 0)
                    params.h = stArr.join();
                //
                $scope.exportUrl1 = "/report/scheduleExport?isExcel=false&isSummary=true&" + $rootScope.objToParam(params);
                $scope.exportUrl2 = "/report/scheduleExport?isExcel=true&isSummary=true&" + $rootScope.objToParam(params);
                $scope.exportUrl3 = "/report/scheduleExport?isExcel=false&isSummary=false&" + $rootScope.objToParam(params);
                $scope.exportUrl4 = "/report/scheduleExport?isExcel=true&isSummary=false&" + $rootScope.objToParam(params);
            };
            //
            $scope.selectItem = function (indx, str, isSelected) {
                if (indx > 0) {
                    $scope[str][indx].isSelected = isSelected;
                    var ctr = 0;
                    for (var j = 1; j < $scope[str].length; j++) {
                        if ($scope[str][j].isSelected) ctr++;
                    }
                    $scope[str][0].isSelected = ctr === ($scope[str].length - 1);
                } else {
                    for (var i = 0; i < $scope[str].length; i++) {
                        $scope[str][i].isSelected = isSelected;
                    }
                }
                $scope.updateExportUrl();
            };
            $scope.selectItem2 = function (indx, str, isSelected) {
                $scope[str][indx].isSelected = true;
                for (var j = 0; j < $scope[str].length; j++) {
                    if (j !== indx)
                        $scope[str][j].isSelected = false;
                }
                $scope.updateExportUrl();
            };
            //
            for (var i = 0; i < blindTypes.length; i++) {
                $scope.categories.push({
                    id: blindTypes[i],
                    name: blindTypes[i],
                    isSelected: false
                });
            }
            //
            for (i = 0; i < twcZones.length; i++) {
                $scope.twcZones.push({
                    id: twcZones[i].id,
                    name: twcZones[i].name,
                    isSelected: false
                });
            }
            $scope.updateExportUrl();
            //
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
homeModule.controller('ManageCapacityModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', 'baseFactory', 'categories', 'scheduledCapacities', 'scheduledCategories',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, baseFactory, categories, scheduledCapacities, scheduledCategories) {
            //
            $scope.categoryOptions = angular.copy(categories);
            $scope.categories = categories;
            $scope.schedCategories = scheduledCapacities;
            $scope.scheduledCategories = scheduledCategories;
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.currentTab = 1;
            $scope.temp = {
                id: 0,
                categoryId: null,
                categoryName: null,
                from: new Date(moment()),
                to: new Date(moment()),
                capacity: 0
            };
            $scope.dateRanges = {
                'Today': [moment(), moment()],
                //'Next 7 Days': [moment(), moment().add(6, 'days')],
                //'Next 30 Days': [moment(), moment().add(29, 'days')],
                //'This Month': [moment().startOf('month'), moment().endOf('month')],
                //'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
                //'This Year': [moment().startOf('year'), moment().endOf('year')],
                //'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')]
            };

            //
            $scope.addSchedule = function (temp) {
                for (var i = 0; i < $scope.categoryOptions.length; i++) {
                    if (temp.categoryId == $scope.categoryOptions[i].id) {
                        temp.categoryName = $scope.categoryOptions[i].name;
                        break;
                    }
                }
                $scope.schedCategories.push(angular.copy(temp));

                // RESET
                $scope.temp = {
                    id: 0,
                    categoryId: null,
                    categoryName: null,
                    from: new Date(moment()),
                    to: new Date(moment()),
                    capacity: 0
                };
            };
            $scope.removeSchedule = function (sc, indx) {
                $scope.schedCategories.splice(indx, 1);
            };
            $scope.tabSelected = function (tab) {
                $scope.currentTab = tab;
            };

            $scope.save = function (mForm, cats) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    baseFactory.post("/api/category/saveAll", cats).then(function (data) {
                        if (!data.isErrored)
                            $modalInstance.close();
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };

            $scope.saveSched = function (mForm, schedCategories) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    for (var i = 0; i < schedCategories.length; i++) {
                        schedCategories[i].from = moment(schedCategories[i].from).format('YYYY-MM-DD');
                        schedCategories[i].to = moment(schedCategories[i].to).format('YYYY-MM-DD');
                    }
                    baseFactory.post("/api/category/SaveAllScheduledCapacities", schedCategories).then(function (data) {
                        if (!data.isErrored)
                            $modalInstance.close();
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };

            //
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
homeModule.controller('ScheduleViewOrderModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', '$controller', 'baseFactory', 'order',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, $controller, baseFactory, order) {
            //
            $scope.hideMainTabs = true;
            angular.extend(this, $controller('DashboardOrderManageCtrl', {
                $scope: $scope,
                order: order,
                orderCustomFields: [],
                categories: []
            }));
            $scope.disableDelayOrderButton = false;
            $scope.delayOrder = function () {
                $scope.disableDelayOrderButton = true;
                baseFactory.post('/api/twcSchedules/delayOrder/' + order.id).then(function (rdata) {
                    $scope.disableDelayOrderButton = false;
                    $modalInstance.close(rdata.object);
                });
            };
            //
            $scope.cancel = function () {
                $modalInstance.dismiss(false);
            };
        }]);
homeModule.controller('ScheduleViewOrderDetailsModalCtrl',
    ['$scope', '$rootScope', '$controller', '$modal', 'baseFactory', 'modalFactory', '$timeout',
        'GRID_CONSTANTS', '$state', '$stateParams', 'resolveFactory', 'lazyLoadGoogleApi', 'TIMES',
        function ($scope, $rootScope, $controller, $modal, baseFactory, modalFactory, $timeout,
            GRID_CONSTANTS, $state, $stateParams, resolveFactory, lazyLoadGoogleApi, TIMES) {

            if ($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") {
                angular.extend(this, $controller('CheckoutCtrl', {
                    $scope: $scope,
                    order: $scope.$parent.origOrder,
                    orderCustomFields: [],
                    itemCustomField: [],
                    printers: [],
                    items: [],
                    customerContacts: []
                }));
            } else if ($rootScope.clientName == "TFT") {
                $scope.job = angular.fromJson($scope.$parent.order.uiData);
                $scope.times = TIMES;
                // console.log($scope.job);

                $scope.mapId = window.randomString();
                $scope.job.showMap = false;
                $scope.$on('mapInitialized', function (evt, evtMap) {
                    $scope.map = evtMap;
                    $timeout(function () {
                        $scope.mapLatLng = new google.maps.LatLng($scope.job.location.latitude, $scope.job.location.longitude);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(10);

                        $scope.marker = new google.maps.Marker({
                            position: $scope.mapLatLng,
                            title: $scope.job.address
                        });
                        $scope.marker.setMap($scope.map);
                    }, 500);
                });
                $scope.centerChanged = function (event) {
                    $timeout(function () {
                        try {
                            $scope.map.panTo($scope.marker.getPosition());
                        } catch (er) {
                            $scope.mapLatLng = new google.maps.LatLng($scope.job.location.latitude, $scope.job.location.longitude);
                            $scope.map.setCenter($scope.mapLatLng);
                            $scope.map.setZoom(10);

                            $scope.marker = new google.maps.Marker({
                                position: $scope.mapLatLng,
                                title: $scope.job.address
                            });
                            $scope.marker.setMap($scope.map);
                        }
                    }, 500);
                };
                lazyLoadGoogleApi.then(function () {
                    $scope.job.showMap = true;
                });
            } else if ($scope.$parent.isStandard) {
                if ($rootScope.clientName == "KINGPIN") {
                    baseFactory.fetch('/api/item/getCategories').then(function (result) {
                        angular.extend(this, $controller('standardOrderKingpinController', {
                            $scope: $scope,
                            order: $scope.$parent.origOrder,
                            isNew: false,
                            customerContacts: [],
                            categories: result.object
                        }));
                    });
                } else {
                    baseFactory.fetch('/api/item/getCategories').then(function (result) {
                        angular.extend(this, $controller('standardOrderPpiController', {
                            $scope: $scope,
                            order: $scope.$parent.origOrder,
                            categories: result.object,
                            isNew: false,
                            customerContacts: { object: [] }
                        }));
                    });
                }
            } else if ($rootScope.clientName == "PPI") {
                baseFactory.fetch('/api/category/GetAll').then(function (result) {
                    angular.extend(this, $controller('editOrder', {
                        $scope: $scope,
                        orderData: { object: $scope.$parent.origOrder },
                        categories: result,
                        orderCustomFields: { object: [] },
                        isNew: false
                    }));
                });
            } else {
                angular.extend(this, $controller('createOrder', {
                    $scope: $scope,
                    order: $scope.$parent.order,
                    detailsMode: true
                }));
            }
        }]);
(function () {
    'use strict';
    angular.module('app').controller('BaseCtrl', ['$scope', '$rootScope', '$timeout', '$state', '$filter', '$cookies', '$document', '$location', 'baseFactory',
        'datepickerConfig', 'datepickerPopupConfig', 'membershipFactory',
        function ($scope, $rootScope, $timeout, $state, $filter, $cookies, $document, $location, baseFactory,
            datepickerConfig, datepickerPopupConfig, membershipFactory) {

            datepickerPopupConfig.showButtonBar = false;
            datepickerPopupConfig.datepickerPopup = 'dd/MM/yyyy';
            datepickerConfig.formatYear = 'yyyy';
            datepickerConfig.startingDay = 1;
            datepickerConfig.showWeeks = false;

            var setLogo = function () {
                $rootScope.logostyle = {
                    alternate: {
                        'background-image': 'url(' + $rootScope.cdn + '/' + $rootScope.clientName.toLowerCase() + '/logo-alternate.png)'
                    },
                    logo: {
                        'background-image': 'url(' + $rootScope.cdn + '/' + $rootScope.clientName.toLowerCase() + '/logo.png)'
                    }
                };
            };
            $scope.$watch('clientName', function (v) {
                $rootScope.clientName = angular.copy(v);
                $rootScope.$broadcast('$clientNameSet');
                setLogo();
            });
            $scope.$watch('usr', function (v) {
                $rootScope.isAthenticated = false;
                if (v != null) {
                    $rootScope.enums = angular.copy(v.enums);
                    if (v.userId == 0) {
                        $rootScope.user = null;
                        $rootScope.impersonate = null;
                        $rootScope.isAthenticated = false;
                    } else {
                        $rootScope.user = angular.copy(v);
                        delete $rootScope.user.enums;
                        $rootScope.isAthenticated = $rootScope.user.fullyPassedAuthentication;

                        if (!$rootScope.impersonate && $rootScope.user && $rootScope.user.impersonateCustomerId) {
                            $rootScope.impersonate = { name: $rootScope.user.impersonateCustomerName, customerId: $rootScope.user.impersonateCustomerId };
                            $rootScope.$emit(IS_IMPERSONATING);
                        }
                    }
                }
            });
            $scope.$watch('cdn', function (v) {
                $rootScope.cdn = angular.copy(v);
                setLogo();
            });
            $scope.$watch('pageTitle', function (v) {
                if (v != null && v.length > 0)
                    angular.element('[metatitle]').text(v);
            });
            $scope.$watch('pageDescription', function (v) {
                if (v != null && v.length > 0)
                    angular.element('[metadescription]').attr('content', v);
            });

            // MENU
            var isSubmenuClicked = false;
            $rootScope.expandMenu = [false, false, false, false, false, false, false, false, false, false, false, false, false, false];
            $scope.isCollapsed = function (indx) {
                isSubmenuClicked = true;
                for (var i = 0; i < $rootScope.expandMenu.length; i++) {
                    if (indx == i) {
                        $rootScope.expandMenu[i] = !($rootScope.expandMenu[i]);
                    } else {
                        $rootScope.expandMenu[i] = false;
                    }
                }
                $timeout(function () {
                    isSubmenuClicked = false;
                }, 500);
            };
            $scope.linkClicked = function (indx) {
                if ($rootScope.menuCollapse) {
                    $rootScope.expandMenu[indx] = !$rootScope.expandMenu[indx];
                }
            };
            $document.bind('click', function () {
                if (isSubmenuClicked)
                    return;

                $timeout(function () {
                    isSubmenuClicked = false;
                    if ($rootScope.menuCollapse) {
                        $rootScope.expandMenu = [false, false, false, false, false, false, false, false, false, false, false, false, false, false];
                    }
                }, 50);
            });

            // Lookups
            $rootScope.lookup = {};
            $rootScope.lookup.reminderNotificationTypes = [];
            $rootScope.lookup.availabilityStatuses = [];
            $rootScope.lookup.athletesWithInjuries = [];
            $rootScope.lookup.monitoringVariables = [];
            $rootScope.lookup.notificationTypes = [];
            $rootScope.lookup.performanceGroups = [];
            $rootScope.lookup.performanceTypes = [];
            $rootScope.lookup.monitoringTypes = [];
            $rootScope.lookup.performances = [];
            $rootScope.lookup.sessionTypes = [];
            $rootScope.lookup.customFields = [];
            $rootScope.lookup.customForms = [];
            $rootScope.lookup.eventTypes = [];
            $rootScope.lookup.categories = [];
            $rootScope.lookup.noteGroups = [];
            $rootScope.lookup.calendars = [];
            $rootScope.lookup.noteTypes = [];
            $rootScope.lookup.variables = [];
            $rootScope.lookup.athletes = [];
            $rootScope.lookup.docTypes = [];
            $rootScope.lookup.availableDocTypes = [];
            $rootScope.lookup.ratings = [];
            $rootScope.lookup.honours = [];
            $rootScope.lookup.reasons = [];
            $rootScope.lookup.leagues = [];
            $rootScope.lookup.states = [];
            $rootScope.lookup.groups = [];
            $rootScope.lookup.events = [];
            $rootScope.lookup.venues = [];
            $rootScope.lookup.grades = [];
            $rootScope.lookup.roles = [];
            $rootScope.lookup.teams = [];
            $rootScope.lookup.users = [];
            $rootScope.lookup.games = [];
            $rootScope.lookup.primaryTeam = null;
            $rootScope.lookup.secondaryTeam = null;

            $rootScope.lookup.trainingExerciseCategories = [];
            $rootScope.lookup.trainingProgramTemplates = [];
            $rootScope.lookup.trainingStatuses = [];
            $rootScope.lookup.trainingGroups = [];
            $rootScope.lookup.trainingTypes = [];

            $rootScope.lookup.scoutAttrRatings = [];
            $rootScope.lookup.actionRatings = [];
            $rootScope.lookup.scoutRatings = [];
            $rootScope.lookup.reviewRatings = [];
            $rootScope.lookup.attributes = [];
            $rootScope.lookup.potentials = [];
            $rootScope.lookup.weathers = [];
            $rootScope.lookup.traits = [];
            $rootScope.lookup.spotters = [];

            $rootScope.lookup.dashboardTemplates = [];

            $rootScope.setAthletes = function (rdata) {
                if (rdata == null) {
                    $rootScope.lookup.athletes = [];
                    return [];
                }
                var athletes = angular.copy(rdata.athletes);
                var year = moment().format('YYYY');
                angular.forEach(athletes, function (a, i) {
                    athletes[i].teams = [];
                    if (a.isPrimary) {
                        athletes[i].teams.push({
                            teamId: rdata.primaryTeam.id,
                            teamName: rdata.primaryTeam.name,
                            year: parseInt(year),
                            isPrimary: true,
                            isSecondary: false
                        });
                    } else if (a.isSecondary) {
                        athletes[i].teams.push({
                            teamId: rdata.secondaryTeam.id,
                            teamName: rdata.secondaryTeam.name,
                            year: parseInt(year),
                            isPrimary: false,
                            isSecondary: true
                        });
                    }
                });

                if (rdata.primaryTeam != null)
                    $rootScope.lookup.primaryTeam = {
                        teamId: rdata.primaryTeam.id,
                        teamName: rdata.primaryTeam.name,
                    };

                if (rdata.secondaryTeam != null)
                    $rootScope.lookup.secondaryTeam = {
                        teamId: rdata.secondaryTeam.id,
                        teamName: rdata.secondaryTeam.name,
                    };

                $rootScope.lookup.athletes = angular.copy(athletes);
                return athletes;
            };

            // FORM
            // Check for required fields
            $rootScope.formSubmit = function (mForm) {
                $rootScope.invalidFields = [];
                var ems = angular.element('form[name=' + mForm.$name + ']').find('[error-txt-messages]');
                angular.forEach(ems, function (el) {
                    angular.element(el).remove();
                });
                var hes = angular.element('form[name=' + mForm.$name + ']').find("[class~='has-error']");
                angular.forEach(hes, function (el) {
                    angular.element(el).removeClass('has-error');
                });
                var setValidataionMessage = function (elem, msg) {
                    // check if input-group
                    if (angular.element(elem).parent().hasClass('input-group') || angular.element(elem).parent().hasClass('input-field-group')) {
                        var ems1 = angular.element(elem).parent().parent().find('[error-txt-messages]');
                        angular.forEach(ems1, function (el) {
                            angular.element(el).remove();
                        });
                        angular.element(elem).parent().after('<small error-txt-messages class="error-txt-messages text-danger">' + msg + '</span>');
                    } else {
                        var ems2 = angular.element(elem).parent().find('[error-txt-messages]');
                        angular.forEach(ems2, function (el) {
                            angular.element(el).remove();
                        });
                        angular.element(elem).after('<small error-txt-messages class="error-txt-messages text-danger">' + msg + '</span>');
                    }
                };
                var requiredFields = angular.element('form[name=' + mForm.$name + ']').find(":input[class~='ng-invalid-required'][type!='radio']");
                angular.forEach(requiredFields, function (rfEle) {
                    var tempPar = angular.element(rfEle);
                    for (var i = 0; i < 4; i++) {
                        var hs = angular.element(tempPar).parent().hasClass('form-group');
                        if (hs) {
                            angular.element(tempPar).parent().addClass('has-error');
                            break;
                        } else {
                            tempPar = angular.element(tempPar).parent();
                        }
                    }
                    // check if input-group
                    if (angular.element(rfEle).parent().hasClass('input-group')) {
                        angular.element(rfEle).parent().after('<small error-txt-messages class="text-danger">required</span>');
                    } else {
                        angular.element(rfEle).after('<small error-txt-messages class="text-danger">required</span>');
                    }
                });

                // Radio
                var radioGroup = [];
                var required2Fields = angular.element('form[name=' + mForm.$name + ']').find(":input[class~='ng-invalid-required'][type~='radio']");
                angular.forEach(required2Fields, function (rfEle) {
                    var tempPar = angular.element(rfEle);

                    if (radioGroup.indexOf(tempPar[0].attributes['name'].value) < 0) {
                        radioGroup.push(tempPar[0].attributes['name'].value);
                    }

                    for (var i = 0; i < 4; i++) {
                        var hs = angular.element(tempPar).parent().hasClass('form-group');
                        if (hs) {
                            angular.element(tempPar).parent().addClass('has-error');
                            var errField = angular.element(tempPar).find('[error-txt-messages]');
                            if (errField.length < 1)
                                angular.element(tempPar).append('<div error-txt-messages><small error-txt-messages class="text-danger">required</span></div>');
                            break;
                        } else {
                            tempPar = angular.element(tempPar).parent();
                        }
                    }
                });
                if ((requiredFields.length + radioGroup.length) > 0)
                    $rootScope.invalidFields.push((requiredFields.length + radioGroup.length) + " required field(s).");

                // Email
                var invalidEmailAddressFields = angular.element('form[name=' + mForm.$name + ']').find(":input[class~='ng-invalid-email']");
                angular.forEach(invalidEmailAddressFields, function (rfEle) {
                    var tempPar = angular.element(rfEle);
                    for (var i = 0; i < 4; i++) {
                        var hs = angular.element(tempPar).parent().hasClass('form-group');
                        if (hs) {
                            angular.element(tempPar).parent().addClass('has-error');
                            break;
                        } else {
                            tempPar = angular.element(tempPar).parent();
                        }
                    }
                    setValidataionMessage(rfEle, 'email is not valid');
                });

                // Number ng-valid-number
                var invalidNumberFields = angular.element('form[name=' + mForm.$name + ']').find(":input[type='number']");
                angular.forEach(invalidNumberFields, function (rfEle) {
                    var fieldValue = angular.element(rfEle).val();
                    var tempPar = angular.element(rfEle);
                    if (fieldValue == '') {
                        for (var i = 0; i < 4; i++) {
                            var hs = angular.element(tempPar).parent().hasClass('form-group');
                            if (hs) {
                                angular.element(tempPar).addClass('has-error');
                                break;
                            } else {
                                tempPar = angular.element(tempPar).parent();
                            }
                        }
                    } else if (tempPar.hasClass('ng-invalid-no-decimal')) {
                        setValidataionMessage(rfEle, 'decimal is not allowed');
                    } else if (tempPar.hasClass('ng-invalid-min')) {
                        var minValue = tempPar.attr('min');
                        setValidataionMessage(rfEle, 'value must be at least ' + minValue);
                    } else if (tempPar.hasClass('ng-invalid-max')) {
                        var maxValue = tempPar.attr('max');
                        setValidataionMessage(rfEle, 'value can\'t be more than ' + maxValue);
                    }
                });

                // Date ng-invalid-date
                var invalidDateFields = angular.element('form[name=' + mForm.$name + ']').find(":input[class~='ng-invalid-date']");
                angular.forEach(invalidDateFields, function (rfEle) {
                    var tempPar = angular.element(rfEle);
                    for (var i = 0; i < 4; i++) {
                        var hs = angular.element(tempPar).parent().hasClass('form-group');
                        if (hs) {
                            angular.element(tempPar).parent().addClass('has-error');
                            break;
                        } else {
                            tempPar = angular.element(tempPar).parent();
                        }
                    }
                    var dateFormat = angular.element(rfEle)[0].attributes['datepicker-popup'].value;
                    dateFormat = dateFormat.length > 0 ? "(" + dateFormat + ")" : "";
                    setValidataionMessage(rfEle, 'invalid date format ' + dateFormat.toUpperCase());
                });
            };

            $scope.toggleMenu = function (menuCollapse) {
                var stat = !menuCollapse;
                $rootScope.menuCollapse = stat;
                $cookies.putObject('menuCollapse', stat);
                if ($rootScope.menuCollapse) {
                    // Collapse all menu
                    $rootScope.expandMenu = [false, false, false, false, false, false, false, false, false, false, false, false, false, false];
                }
            };
            $scope.toggleMainMenu = function (menuId) {
                $cookies.putObject('mainMenuId', menuId);
                $rootScope.mainMenuId = menuId;
                $rootScope.expandMenu = [false, false, false, false, false, false, false, false, false, false, false, false, false, false];
            };
            $rootScope.mainMenuId = typeof $cookies.getObject('mainMenuId') === "undefined" ? 1 : $cookies.getObject('mainMenuId');

            $rootScope.timeago = function (dte) {
                if (dte == null)
                    return "";
                return moment(dte).fromNow();
            };
            $rootScope.dayHasElapsed = function (dte) {
                if (dte == null)
                    return false;
                var from = moment();
                var to = moment();
                return to.diff(from, 'days') >= 1;
            };
            $rootScope.strToDate = function (str) {
                if (str == null)
                    return "";
                return new Date(moment(str).valueOf());
            };
            $rootScope.formatDateToStr = function (str, format) {
                format = typeof format === 'undefined' ? 'llll' : format;
                return moment.utc(str).format(format);
            };

            $rootScope.getUserImage = function (id) {
                return '/download/userImage/' + id;
            };

            $rootScope.getUserThumbnail = function (id, height, width) {
                return '/download/userThumbnail/' + id + '?height=' + height + '&width=' + width + '&setMax=true';
            };

            $rootScope.getAthleteImage = function (id) {
                return '/download/athleteImage/' + id;
            };

            $rootScope.getAthleteThumbnail = function (id, height, width) {
                return '/download/athleteThumbnail/' + id + '?height=' + height + '&width=' + width + '&setMax=true';
            };


            $scope.determineDocType = function (ext) {
                if (ext.length > 3) {
                    var extAr = ext.split('.');
                    ext = extAr[extAr.length - 1];
                    ext = ext.toLocaleLowerCase();
                }
                ext = ext.toLocaleLowerCase();
                var cssClass = "";
                switch (ext) {
                    case "doc":
                    case "docx":
                        cssClass = "fa fa-file-word-o";
                        break;
                    case "pdf":
                        cssClass = "fa fa-file-pdf-o";
                        break;
                    case "txt":
                        cssClass = "fa fa-file-text-o";
                        break;
                    case "xls":
                    case "xlsx":
                        cssClass = "fa fa-file-excel-o";
                        break;
                    case "jpg":
                    case "jpeg":
                    case "png":
                        cssClass = "fa fa-file-image-o";
                        break;
                    case "mp3":
                    case "wav":
                    case "ogg":
                        cssClass = "fa fa-file-audio-o";
                        break;
                    case "mp4":
                    case "mov":
                    case "mpg":
                    case "mpeg":
                    case "flv":
                    case "wmv":
                        cssClass = "fa fa-file-movie-o";
                        break;
                    default:
                        cssClass = "fa fa-file-code-o";
                }
                return cssClass;
            };

            $rootScope.gridData = null;

            $rootScope.objToParam = function (obj) {
                var str = "";
                for (var key in obj) {
                    if (obj[key] != null) {
                        if (str != "") {
                            str += "&";
                        }
                        str += key + "=" + encodeURIComponent(obj[key]);
                    }
                }
                return str;
            };
            $rootScope.jsonToQueryString = function (data) {
                var ret = [];
                for (var d in data) {
                    if (data[d] && typeof data[d] !== 'undefined')
                        ret.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d]));
                }
                return ret.join("&");
            };

            $rootScope.groupList = function (list, groupName, sortOrder) {
                var collection;

                if (typeof sortOrder !== 'undefined') {
                    collection = angular.copy($filter('orderBy')(list, sortOrder));
                } else {
                    collection = angular.copy($filter('orderBy')(list, groupName));
                }

                var filteredList = [];

                // Get all Groups
                var arGroup = [];
                angular.forEach(collection, function (item, i) {
                    if (arGroup.indexOf(item[groupName]) < 0) {
                        arGroup.push(item[groupName]);
                    }
                });

                // Get all Group List
                angular.forEach(arGroup, function (g, j) {
                    var groupedList = { group: g, list: [] };
                    angular.forEach(collection, function (item, i) {
                        if (item[groupName] == g) {
                            groupedList.list.push(angular.copy(item));
                        }
                    });
                    filteredList.push(angular.copy(groupedList));
                });

                // console.log(filteredList)

                return filteredList;
            };

            // Permission
            $rootScope.permissionIsViewable = function (permissions) {
                var ret = false;
                if (typeof permissions !== 'undefined') {
                    for (var i = 0; i < permissions.length; i++) {
                        if (permissions[i].isViewable) {
                            ret = true;
                            break;
                        }
                    }
                }
                return ret;
            };
            $rootScope.permissionIsEditable = function (permissions) {
                var ret = false;
                if (typeof permissions !== 'undefined') {
                    for (var i = 0; i < permissions.length; i++) {
                        if (permissions[i].isEditable) {
                            ret = true;
                            break;
                        }
                    }
                }
                return ret;
            };

            // CheckRoles
            //$rootScope.userRole = {
            //    isAdmin: function () {
            //        var cRoles = $rootScope.currentUser.userRoles;
            //        var ret = false;
            //        for (var i = 0; i < cRoles.length; i++) {
            //            if (USER_ROLES.admin == cRoles[i]) {
            //                ret = true;
            //                break;
            //            }
            //        }
            //        return ret;
            //    },
            //    isScout: function () {
            //        var cRoles = $rootScope.currentUser.userRoles;
            //        var ret = false;
            //        for (var i = 0; i < cRoles.length; i++) {
            //            if (USER_ROLES.scout == cRoles[i]) {
            //                ret = true;
            //                break;
            //            }
            //        }
            //        return ret;
            //    },
            //    isDriver: function () {
            //        var cRoles = $rootScope.currentUser.userRoles;
            //        var ret = false;
            //        for (var i = 0; i < cRoles.length; i++) {
            //            if (USER_ROLES.driver == cRoles[i]) {
            //                ret = true;
            //                break;
            //            }
            //        }
            //        return ret;
            //    },
            //    isPlayer: function () {
            //        var cRoles = $rootScope.currentUser.userRoles;
            //        var ret = false;
            //        for (var i = 0; i < cRoles.length; i++) {
            //            if (USER_ROLES.player == cRoles[i]) {
            //                ret = true;
            //                break;
            //            }
            //        }
            //        return ret;
            //    }
            //};



            // Determine DocumentGroupId
            $rootScope.getDocumentGroup = function () {
                // Document Group
                var returnData = { id: 0, name: "" };
                var stname = $state.current.name;
                stname = stname.toLowerCase();
                if (stname.indexOf("football") > 4) {
                    returnData = { id: 1, name: "Football" };
                }
                if (stname.indexOf("medical") > 4) {
                    returnData = { id: 2, name: "Medical" };
                }
                if (stname.indexOf("scouting") > 4) {
                    returnData = { id: 3, name: "Scouting" };
                }
                return returnData;
            };

            // ParseInt
            $rootScope.parseInt = function (str) {
                return parseInt(str);
            };

            // Layout
            $rootScope.formLayouts = [
                { id: 0, name: "Layout 1", ratio: [12] },
                { id: 1, name: "Layout 2", ratio: [6, 6] },
                { id: 2, name: "Layout 3", ratio: [4, 8] },
                { id: 3, name: "Layout 4", ratio: [8, 4] },
                { id: 4, name: "Layout 5", ratio: [4, 4, 4] }
            ];
            $rootScope.formLayout = function (id) {
                for (var i = 0; i < $rootScope.formLayouts.length; i++) {
                    if ($rootScope.formLayouts[i].id == id) {
                        return $rootScope.formLayouts[i];
                    }
                }
                return $rootScope.formLayouts[0];
            };

            // Breadcrumbs
            $scope.breadCrumbs = [];
            var capitaliseFirstLetter = function (str) {
                str = str.charAt(0).toUpperCase() + str.slice(1);
                str = str.replace(/([a-z])([A-Z])/g, '$1 $2');
                return str;
            };

            $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
                $scope.breadCrumbs = [];
                var stateName = $state.current.name;
                var stateArrName = stateName.split('.');
                var stateArrNameLen = stateArrName.length - 1;
                angular.forEach(stateArrName, function (st, i) {
                    var stateArrNameTemp = [];
                    angular.forEach(stateArrName, function (stt, j) {
                        if (j <= i) {
                            stateArrNameTemp.push(stt);
                        }
                    });
                    var tempState = {
                        name: capitaliseFirstLetter(st),
                        url: i < stateArrNameLen ? $state.href(stateArrNameTemp.join('.')) : null,
                        state: stateArrNameTemp.join('.')
                    };

                    $scope.breadCrumbs.push(tempState);
                });
            });

            // Main DateRange
            $rootScope.mainDateRange = {
                from: null,
                to: null
            };

            // Export
            $rootScope.exportCalendar = function (value) {
                return '/download/exportcalendartopdf/' + value;
            };
            $rootScope.sortAlphaArray = function (item) {
                var tt = item;
                if (typeof item.name !== 'undefined')
                    tt = item.name;
                if (tt === 'N/A')
                    return -2;
                if (tt === 'Yes')
                    return -1;
                return tt;
            };


            //DropDown List


            $scope.status = {
                isopen: false
            };

            $scope.toggled = function (open) {
                $log.log('Dropdown is now: ', open);
            };

            $scope.toggleDropdown = function ($event) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.status.isopen = !$scope.status.isopen;
            };

            // Time
            $rootScope.generateTimes = function () {
                var times = [];
                var hCtr = 12;
                var hIndx = 0;

                function gen(hrr, min) {
                    var nhr = hrr > 9 ? hrr : '0' + hrr;
                    return nhr + ":" + min;
                }
                function gen2(hrr, min) {
                    var ampp = hrr >= 12 ? "PM" : "AM";
                    var nhr = hrr <= 12 ? hrr : hrr - 12;
                    nhr = hrr == 0 ? 12 : nhr;
                    return nhr + ":" + min + " " + ampp;
                }

                for (var hr = 0; hr < 24; hr++) {
                    var t1 = {
                        id: hIndx,
                        hour: hr,
                        minute: 0,
                        name: gen2(hr, "00"),
                        value: gen(hr, "00")
                    };
                    hIndx++;
                    var t2 = {
                        id: hIndx,
                        hour: hr,
                        minute: 15,
                        name: gen2(hr, "15"),
                        value: gen(hr, "15")
                    };
                    hIndx++;
                    var t3 = {
                        id: hIndx,
                        hour: hr,
                        minute: 30,
                        name: gen2(hr, "30"),
                        value: gen(hr, "30")
                    };
                    hIndx++;
                    var t4 = {
                        id: hIndx,
                        hour: hr,
                        minute: 45,
                        name: gen2(hr, "45"),
                        value: gen(hr, "45")
                    };
                    hIndx++;
                    hCtr++;
                    times.push(t1);
                    times.push(t2);
                    times.push(t3);
                    times.push(t4);
                }
                return angular.copy(times);
            };

            $scope.sageItemIsAdding = false;
            $rootScope.$on('$sageItemAdding', function (event, model) {
                $scope.sageItemIsAdding = true;
                $scope.sageItemAdded = model;
                $scope.sageItemAdded.msg = "Adding...";
            });
            $rootScope.$on('$sageItemAdded', function (event, model) {
                $scope.sageItemAdded = model;
                $scope.sageItemAdded.msg = "Added item to cart";
                $timeout(function () {
                    $scope.sageItemIsAdding = false;
                }, 3000);
            });
            $rootScope.$on('auth-not-authenticated', function (event, response) {
                // console.log(response);
                try {
                    membershipFactory.ping2(function (result) {
                        // console.log(result);
                        if (!result)
                            window.location.href = "/";
                    });
                } catch (er) {

                }
            });
        }]);
})();
(function () {
    'use strict';

    sharedModule.directive('addTags', dir);
    dir.$inject = [];

    function dir() {
        return {
            template: '<div class="input-group">' +
                '<div class="input-group-btn" dropdown on-toggle="toggled(open)" ng-class="{\'open\':opendd}"> <span class="btn btn-default" dropdown-toggle>' +
                '<span class="caret"></span></span>' +
                '<ul class="dropdown-menu dropdown-menu-left" role="menu">' +
                '<li ng-if="isRemove"><a class="cursor-pointer" ng-click="removeAllTags()">Remove All {{tagName}}</a></li>' +
                '</ul></div>' +

                '<input type="text" placeholder="Add {{tagName}}" ng-model="tempTag" typeahead="a as a.name for a in getTags($viewValue)" typeahead-loading="loadingTags" typeahead-on-select="tempTagSelected(tempTag)" typeahead-editable="false" class="mBottom0 form-control" autocomplete="off">' +
                '<span ng-show="loadingTags" style="position: absolute; top: 6px; right: 6px; z-index: 100"><i class="fa fa-circle-o-notch fa-spin"></i></span>' +
                '</div>',
            restrict: 'AE',
            transclude: true,
            replace: true,
            scope: {
                ngModel: '=',
                source: '=?',
                searchUrl: '=?',
                tagName: '=',
                tagselected: '&onSelected',
                isRemoveAll: '=?',
                tagsremoved: '&onRemoveAll'
            },
            controller: function ($scope, baseFactory) {

                if (typeof $scope.ngModel === "undefined") {
                    console.log("ng-model not defined");
                    return false;
                }

                if (typeof $scope.searchUrl === "undefined" && typeof $scope.source === "undefined") {
                    console.log("both url and source not defined");
                    return false;
                }

                if (typeof $scope.tagName === "undefined") {
                    $scope.tagName = "Tag";
                }

                $scope.loadingTags = false;

                $scope.selectedTags = $scope.ngModel;
                $scope.isRemove = typeof $scope.isRemoveAll === 'undefined' ? false : $scope.isRemoveAll;
                $scope.tempTag = null;

                $scope.opendd = false;
                $scope.toggled = function (open) {
                    $scope.opendd = open;
                };

                // PRIVATE
                var checkIfTagExist = function (inArr, tagId) {
                    for (var i = 0; i < inArr.length; i++) {
                        if (inArr[i].id == tagId) {
                            return true;
                        }
                    }
                    return false;
                };

                $scope.removeAllTags = function () {
                    $scope.tagsremoved();
                };
                $scope.tempTagSelected = function (a) {
                    if (!checkIfTagExist($scope.selectedTags, a.id, true)) {
                        $scope.tagselected({ $tags: [a] });
                    }
                    $scope.tempTag = null;
                };
                $scope.getTags = function (val) {
                    if (val.length < 2)
                        return [];

                    $scope.loadingTags = true;
                    var currTags = [];
                    angular.forEach($scope.selectedTags, function (u) {
                        currTags.push(u.id);
                    });

                    if (typeof $scope.source !== "undefined") {
                        var tt = [];
                        angular.forEach($scope.source, function (t) {
                            if (t.name != null)
                                if (t.name.toLowerCase().indexOf(val.toLowerCase()) >= 0 && tt.length < 10) {
                                    if (currTags.indexOf(t.id) < 0)
                                        tt.push(t);
                                }
                        });
                        return tt;
                    } else {
                        return baseFactory.fetch($scope.searchUrl, { q: val, exclude: currTags.join(","), retrieveSize: 10 }).then(function (rdata) {
                            $scope.loadingTags = false;
                            if (rdata.object == null)
                                return [];
                            return rdata.object;
                        });
                    }
                };

            },
            link: function (scope, ele, attr) {
            }
        };
    }
})();

(function () {
    'use strict';

    sharedModule.directive('addUsers', dir);
    dir.$inject = [];

    function dir() {
        return {
            template: '<div class="input-group">' +
            '<div class="input-group-btn" dropdown on-toggle="toggled(open)" ng-class="{\'open\':opendd}" auto-close="outsideClick"> <span class="btn btn-default" dropdown-toggle>' +
            '<span class="caret"></span></span>' +
            '<ul class="dropdown-menu dropdown-menu-left" role="menu" dropdown-menu>' +
            '<li ng-if="isCustomFilters" ng-class="{\'active\': search.isUser}"><a class="cursor-pointer" ng-click="searchForUsers()">Users</a></li>' +
            '<li ng-if="isCustomFilters" ng-class="{\'active\': search.isRole}"><a class="cursor-pointer" ng-click="searchForRoles()">Roles</a></li>' +
            '<li ng-if="isCustomFilters" ng-class="{\'active\': search.isSalesperson}"><a class="cursor-pointer" ng-click="searchForSalesperson()">Salesperson</a></li>' +
            '<li ng-if="isCustomFilters" ng-class="{\'active\': search.isCompany}"><a class="cursor-pointer" ng-click="searchForCompany()">Companies</a></li>' +
            '<li ng-if="isCustomFilters" ng-class="{\'active\': search.isCustomerType}"><a class="cursor-pointer" ng-click="searchForCustomerType()">Customer Type</a></li>' +
            '<li ng-if="isRemove && isCustomFilters" class="divider"></li>' +
            '<li ng-if="isRemove"><a class="cursor-pointer" ng-click="removeAllUsers()">Remove All {{placeHolder}}s</a></li>' +
            '</ul></div>' +

            '<input type="text" placeholder="Add {{placeHolder}}" ng-model="tempUser" typeahead="a as a.name for a in getUsers($viewValue)" typeahead-loading="loadingUsers" typeahead-on-select="tempUserSelected(tempUser)" typeahead-editable="false" typeahead-wait-ms="500" class="mBottom0 form-control" autocomplete="off">' +
            '<span ng-show="loadingUsers" style="position: absolute; top: 6px; right: 6px; z-index: 100"><i class="fa fa-circle-o-notch fa-spin"></i></span>' +
            '</div>',
            restrict: 'AE',
            transclude: true,
            replace: true,
            scope: {
                destination: '=',
                userselected: '&onSelected',
                isRemoveAll: '=?',
                isCustomFilters: '=?',
                usersremoved: '&onRemoveAll',
                acceptgroups: '=?',
                placeHolder: '@',
                isSubscribedOnly: '=?'
            },
            controller: ["$scope", "baseFactory", function ($scope, baseFactory) {

                $scope.loadingUsers = false;

                $scope.selectedUsers = $scope.destination;
                $scope.isRemove = typeof $scope.isRemoveAll === 'undefined' ? false : $scope.isRemoveAll;
                $scope.isCustomFilters = typeof $scope.isCustomFilters === 'undefined' ? false : $scope.isCustomFilters;
                $scope.placeHolder = typeof $scope.placeHolder === 'undefined' ? 'User' : $scope.placeHolder;
                $scope.isSubscribedOnly = typeof $scope.isSubscribedOnly === 'undefined' ? false : $scope.isSubscribedOnly;
                $scope.tempUser = null;
                $scope.search = {
                    isUser: $scope.isCustomFilters ? true : null,
                    isRole: $scope.isCustomFilters ? false : null,
                    isSalesperson: $scope.isCustomFilters ? false : null,
                    isCompany: $scope.isCustomFilters ? false : null,
                    isCustomerType: $scope.isCustomFilters ? false : null
                }

                $scope.opendd = false;
                $scope.toggled = function (open) {
                    $scope.opendd = open;
                };

                // PRIVATE
                var checkIfUserExist = function (inArr, userId) {
                    for (var i = 0; i < inArr.length; i++) {
                        if (inArr[i].id == userId) {
                            return true;
                        }
                    }
                    return false;
                };

                $scope.searchForUsers = function () {
                    $scope.search.isUser = true;
                    $scope.search.isRole = false;
                    $scope.search.isSalesperson = false;
                    $scope.search.isCompany = false;
                    $scope.search.isCustomerType = false;
                };
                $scope.searchForRoles = function () {
                    $scope.search.isUser = false;
                    $scope.search.isRole = true;
                    $scope.search.isSalesperson = false;
                    $scope.search.isCompany = false;
                    $scope.search.isCustomerType = false;
                };
                $scope.searchForCompany = function () {
                    $scope.search.isUser = false;
                    $scope.search.isRole = false;
                    $scope.search.isSalesperson = false;
                    $scope.search.isCompany = true;
                    $scope.search.isCustomerType = false;
                };
                $scope.searchForSalesperson = function () {
                    $scope.search.isUser = false;
                    $scope.search.isRole = false;
                    $scope.search.isSalesperson = true;
                    $scope.search.isCompany = false;
                    $scope.search.isCustomerType = false;
                };
                $scope.searchForCustomerType = function () {
                    $scope.search.isUser = false;
                    $scope.search.isRole = false;
                    $scope.search.isSalesperson = false;
                    $scope.search.isCompany = false;
                    $scope.search.isCustomerType = true;
                };
                $scope.removeAllUsers = function () {
                    $scope.usersremoved();
                };
                $scope.tempUserSelected = function (a) {
                    if (a.isCustomer) {
                        $scope.loadingUsers = true;
                        baseFactory.fetch("/api/users/getbyCustomer/" + a.id).then(function (rdata) {
                            $scope.loadingUsers = false;

                            if (rdata.object == null)
                                $scope.userselected({ $users: [] });

                            var tempUsers = [];
                            angular.forEach(rdata.object, function (u) {
                                if (!checkIfUserExist($scope.selectedUsers, u.id))
                                    tempUsers.push(u);
                            });

                            $scope.userselected({ $users: tempUsers });
                        });
                    } else if (a.isRole) {
                        $scope.loadingUsers = true;
                        baseFactory.fetch("/api/users/getbyRole/" + a.id).then(function (rdata) {
                            $scope.loadingUsers = false;

                            if (rdata.object == null)
                                $scope.userselected({ $users: [] });

                            var tempUsers = [];
                            angular.forEach(rdata.object, function (u) {
                                if (!checkIfUserExist($scope.selectedUsers, u.id))
                                    tempUsers.push(u);
                            });

                            $scope.userselected({ $users: tempUsers });
                        });
                    } else if (a.isSalesperson) {
                        $scope.loadingUsers = true;
                        baseFactory.fetch("/api/users/getbySalesperson/" + a.id).then(function (rdata) {
                            $scope.loadingUsers = false;

                            if (rdata.object == null)
                                $scope.userselected({ $users: [] });

                            var tempUsers = [];
                            angular.forEach(rdata.object, function (u) {
                                if (!checkIfUserExist($scope.selectedUsers, u.id))
                                    tempUsers.push(u);
                            });

                            $scope.userselected({ $users: tempUsers });
                        });
                    } else if (a.isCustomerType) {
                        $scope.loadingUsers = true;
                        baseFactory.fetch("/api/users/getbyCustomerType/" + a.id).then(function (rdata) {
                            $scope.loadingUsers = false;

                            if (rdata.object == null)
                                $scope.userselected({ $users: [] });

                            var tempUsers = [];
                            angular.forEach(rdata.object, function (u) {
                                if (!checkIfUserExist($scope.selectedUsers, u.id))
                                    tempUsers.push(u);
                            });

                            $scope.userselected({ $users: tempUsers });
                        });
                    } else {
                        if (!checkIfUserExist($scope.selectedUsers, a.id)) {
                            $scope.userselected({ $users: [a] });
                        }
                    }
                    $scope.tempUser = null;
                };
                $scope.getUsers = function (val) {
                    if (val.length < 2 && !$scope.search.isSalesperson)
                        return [];

                    $scope.loadingUsers = true;
                    var currUsers = [];
                    angular.forEach($scope.selectedUsers, function (u) {
                        var uid = u.id || u.userId;
                        currUsers.push(uid);
                    });

                    var dataToSend = { q: val, exclude: currUsers.join(","), retrieveSize: 10 };

                    if ($scope.isSubscribedOnly)
                        dataToSend.subscribedOnly = true;

                    if ($scope.search.isUser != null)
                        dataToSend.isUser = $scope.search.isUser
                    if ($scope.search.isRole != null)
                        dataToSend.isRole = $scope.search.isRole
                    if ($scope.search.isSalesperson != null)
                        dataToSend.isSalesperson = $scope.search.isSalesperson
                    if ($scope.search.isCompany != null)
                        dataToSend.isCompany = $scope.search.isCompany
                    if ($scope.search.isCustomerType != null)
                        dataToSend.isCustomerType = $scope.search.isCustomerType

                    return baseFactory.fetch("/api/users/getAllByKeyword", dataToSend).then(function (rdata) {
                        $scope.loadingUsers = false;
                        if (rdata.object == null)
                            return [];
                        return rdata.object;
                    });
                };

            }],
            link: function (scope, ele, attr) {
            }
        };
    }
})();

(function() {
    'use strict';
    
    sharedModule.directive('affix', ['$window', function ($window) {
        return {
            restrict: 'A',
            $scope: true,
            link: function ($scope, $element, $attrs) {
                var relativeTo = // overide or use default: body (html for IE) element
                    !!$attrs.relativeTo ? angular.element(window.document.getElementById($attrs.relativeTo)) : 
                        !$scope.$root.isIE ? // specify your own isIE check will default to body element
                            angular.element(window.document.getElementsByTagName('body')) : 
                            angular.element(window.document.getElementsByTagName('html')), // required by IE
                    win = !!$attrs.relativeTo ? relativeTo : angular.element($window),
                    // if a relativeTo other than the default is set we will 
                    // offset the affixed position by it's offset
                    relativeToOffset = null, 
                    fixedAt = null;
            
                // boolean
                $scope.affixed = false;
                $scope.offset = 0;

                // Obviously, whenever a scroll occurs, we need to check and possibly 
                // adjust the position of the affixed $element.
                angular.element($window).bind('scroll', checkPosition);

                // on resize recalculate fixedAt position 
                angular.element($window).bind('resize', checkSize);

                $scope.$on('$destroy', function () {
                    angular.element($window).off('scroll', checkPosition);
                    angular.element($window).off('resize', checkSize);
                });

                // calculate if we need to affix element
                function checkPosition() {
                    relativeToOffset = relativeToOffset || (win[0].offsetParent.offsetTop + win[0].offsetTop);
                    fixedAt = win[0].offsetParent.offsetTop;
                
                    $scope.$apply(function () {
                        $scope.affixed = fixedAt <= angular.element($window).scrollTop();
                        $scope.offset = $scope.affixed ? { top: win[0].offsetTop + 'px' } : "";
                    });
                }

                //
                function checkSize() {
                    $scope.$apply(function () {
                        $scope.affixed = false;
                    });
                    relativeToOffset = null;
                    fixedAt = null;
                    checkPosition();
                }
            }
        };
    }]);
})();
sharedModule.directive('bindOnce', [function () {
    return {
        scope: true,
        link: function ($scope, $element, attr) {
            setTimeout(function () {
                $scope.$destroy();
                $element.removeClass('ng-binding ng-scope');
            }, 0);
        }
    };
}]);
(function () {
    'use strict';
    sharedModule.directive('checkUserImage', ['$http', function ($http) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                function setDefault() {
                    attrs.$set('src', 'https://qodo-cdn.azureedge.net/shared/noavatar.png');
                };
                if (typeof attrs.src === 'undefined') {
                    setDefault();
                }
                element.bind('error', function () {
                    setDefault();
                });
            }
        };
    }]).directive('checkImage', ['$http', function ($http) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                function setDefault() {
                    attrs.$set('src', 'https://qodo-cdn.azureedge.net/shared/placeholder.png');
                };
                if (typeof attrs.src === 'undefined') {
                    setDefault();
                }
                element.bind('error', function () {
                    setDefault();
                });
            }
        };
    }]);

})();
sharedModule.directive('compile', ['$compile', function ($compile) {
    return function (scope, element, attrs) {
        scope.$watch(
            function (sscope) {
                // watch the 'compile' expression for changes
                return sscope.$eval(attrs.compile);
            },
            function (value) {
                // when the 'compile' expression changes
                // assign it into the current DOM
                element.html(value);

                // compile the new DOM and link it to the current
                // scope.
                // NOTE: we only compile .childNodes so that
                // we don't get into infinite loop compiling ourselves
                $compile(element.contents())(scope);
            }
        );
    };
}]);
(function () {
    'use strict';

    sharedModule.directive('cardExpiration', function () {
        return {
            require: 'ngModel',
            link: function (scope, elm, attrs, ctrl) {
                var currentYear = parseInt(moment().format('YYYY'));
                var currentMonth = parseInt(moment().format('MM'));
                
                scope.$watch('[model.expiryMonth, model.expiryYear]', function (value) {
                    if (parseInt(value[0]) <= currentMonth && parseInt(value[1]) == currentYear) {
                        ctrl.$setValidity('invalid', false);
                    } else {
                        ctrl.$setValidity('invalid', true);
                    }
                    return value;
                }, true);
            }
        };
    });
})();
(function () {
    'use strict';

    sharedModule.directive('creditCardType', [function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, elm, attrs, ctrl) {
                ctrl.$parsers.unshift(function (value) {
                    scope.ccinfo.type =
                    (/^5[1-5]/.test(value)) ? "mastercard"
                        : (/^4/.test(value)) ? "visa"
                            : (/^3[47]/.test(value)) ? 'amex'
                                : (/^6011|65|64[4-9]|622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))/.test(value)) ? 'discover'
                                    : undefined
                    ctrl.$setValidity('invalid', !!scope.ccinfo.type);
                    return value;
                });
            }
        };
    }]);
})();
(function () {
    'use strict';
    sharedModule.directive('customerCard', dir1);

    dir1.$inject = [];

    function dir1() {
        return {
            templateUrl: '/app/modules/shared/template/customerCard.html',
            restrict: 'AE',
            transclude: true,
            replace: true,
            scope: {
                customerId: '@'
            },
            controller: ["$scope", "$window", "baseFactory", function ($scope, $window, baseFactory) {
                $scope.isLoading = true;
                baseFactory.fetch("/api/customer/getCard/" + $scope.customerId).then(function (rdata) {
                    $scope.isLoading = false;
                    $scope.customerData = rdata.object;
                });
            }]
        };
    }

})();
(function () {
    'use strict';

    sharedModule.directive('customFieldColourPicker', dir);
    dir.$inject = [];
    function dir() {
        return {
            templateUrl: "/app/modules/shared/template/customFieldColourPickerTemplate.html",
            restrict: 'A',
            scope: {
                fieldValue: '=field',
                onSelect: '&'
            },
            controller: ["$scope", function ($scope) {

                var baseColours = [
                    { isFixed: false, name: "white", value: "#FFFFFF" },
                    { isFixed: false, name: "black", value: "#000000" },
                    { isFixed: false, name: "red", value: "#FF0000" },
                    { isFixed: false, name: "coral", value: "#B77374" },
                    { isFixed: false, name: "rose", value: "#E3D4D1" },
                    { isFixed: false, name: "pink", value: "#FFC0CB" },
                    { isFixed: false, name: "orange", value: "#F77000" },
                    { isFixed: false, name: "gold", value: "#FFD700" },
                    { isFixed: false, name: "yellow", value: "#FFFF00" },
                    { isFixed: false, name: "brown", value: "#8B4513" },
                    { isFixed: false, name: "olive", value: "#6D5728" },
                    { isFixed: false, name: "navy", value: "#000066" },
                    { isFixed: false, name: "dark blue", value: "#000066" },
                    { isFixed: false, name: "cobalt", value: "#003163" },
                    { isFixed: false, name: "reflex blue", value: "#002597" },
                    { isFixed: false, name: "blue", value: "#3695D5" },
                    { isFixed: false, name: "teal", value: "#008080" },
                    { isFixed: false, name: "aqua", value: "#7EA499" },
                    { isFixed: false, name: "light blue", value: "#ADD8E6" },
                    { isFixed: false, name: "cyan", value: "#00FFFF" },
                    { isFixed: false, name: "cloud", value: "#BBC9D2" },
                    { isFixed: false, name: "mint", value: "#C0CFC9" },
                    { isFixed: false, name: "green", value: "#008800" },
                    { isFixed: false, name: "purple", value: "#800080" },
                    { isFixed: false, name: "lavender", value: "#D5C9F7" },
                    { isFixed: false, name: "grey", value: "#424242" },
                    { isFixed: true, name: "charcoal", value: "#424242" },
                    { isFixed: true, name: "silver", value: "linear-gradient(90deg, rgba(113,113,113,1) 0%, rgba(203,203,203,1) 50%, rgba(113,113,113,1) 100%)" },
                    { isFixed: true, name: "stainless", value: "linear-gradient(90deg, rgba(113,113,113,1) 0%, rgba(203,203,203,1) 50%, rgba(113,113,113,1) 100%)" },
                    { isFixed: true, name: "clear", value: "repeating-linear-gradient(45deg,#DCDCDC,#DCDCDC 5px,#FFFFFF 5px,#FFFFFF 10px)" },
                ];
                $scope.predefinedColours = baseColours;
                var arr = [];
                var i = 0; 
                for (i = 0; i < $scope.predefinedColours.length; i++) {
                    if (!$scope.predefinedColours[i].isFixed && $scope.predefinedColours[i].name !== 'white') {
                        arr.push({
                            isFixed: true,
                            name: "white / " + $scope.predefinedColours[i].name,
                            value: "repeating-linear-gradient(45deg," + $scope.predefinedColours[i].value + "," + $scope.predefinedColours[i].value + " 20px,#FFFFFF 0px,#FFFFFF)"
                        })
                    }
                }
                for (i = 0; i < $scope.predefinedColours.length; i++) {
                    if (!$scope.predefinedColours[i].isFixed && $scope.predefinedColours[i].name !== 'black' && $scope.predefinedColours[i].name !== 'white') {
                        arr.push({
                            isFixed: true,
                            name: "black / " + $scope.predefinedColours[i].name,
                            value: "repeating-linear-gradient(45deg," + $scope.predefinedColours[i].value + "," + $scope.predefinedColours[i].value + " 20px,#000000 0px,#000000)"
                        })
                    }
                }
                for (var j = 0; j < arr.length; j++) {
                    $scope.predefinedColours.push(arr[j]);
                }

                $scope.onColourPicked = function (col) {
                    $scope.modelColour = {
                        name: col.name,
                        colour: col.value
                    };
                    $scope.onSelect({
                        $name: col.name,
                        $colour: col.value
                    });
                };
                $scope.onColourChanged = function (col) {
                    $scope.onSelect({
                        $name: col.name,
                        $colour: col.colour
                    });
                };
                $scope.validateColour = function (col) {
                    $scope.modelColour.colour = getColour(col.name);
                    $scope.onSelect({
                        $name: $scope.modelColour.name,
                        $colour: $scope.modelColour.colour
                    });
                };
                $scope.modelColour = {
                    name: null,
                    colour: null
                };

                var getColour = function (colour) {
                    if (colour === null || colour === '')
                        return null;
                    var k = 0;
                    if (colour.toLowerCase().indexOf('white') >= 0) {
                        for (k = 0; k < baseColours.length; k++) {
                            if (!baseColours[k].isFixed &&
                                colour.toLowerCase().indexOf(baseColours[k].name) >= 0) {
                                return baseColours[k].value;
                            }
                        }
                    }

                    if (colour.toLowerCase().indexOf('black') >= 0) {
                        for (k = 0; k < baseColours.length; k++) {
                            if (!baseColours[k].isFixed &&
                                colour.toLowerCase().indexOf(baseColours[k].name) >= 0) {
                                return baseColours[k].value;
                            }
                        }
                    }
                    for (k = 0; k < baseColours.length; k++) {
                        if (colour.toLowerCase().indexOf(baseColours[k].name) >= 0) {
                            return baseColours[k].value;
                        }
                    }
                    return null;
                };


                if ($scope.fieldValue.options !== null && $scope.fieldValue.options !== '') {
                    $scope.modelColour = {
                        name: $scope.fieldValue.value,
                        colour: $scope.fieldValue.options
                    };
                } else {

                    $scope.modelColour = {
                        name: $scope.fieldValue.value,
                        colour: getColour($scope.fieldValue.value)
                    };
                }
            }]
        };
    }
})();
(function () {
    'use strict';

    sharedModule.directive('customField', dir);
    dir.$inject = ['$compile'];

    function dir($compile) {
        return {
            restrict: 'A',
            scope: {
                field: '=',
                fieldValue: '=',
                isRequired: '=?',
                customLabel: '@'
            },
            controller: ["$scope", "$rootScope", "baseFactory", function ($scope, $rootScope, baseFactory) {
                $scope.dateOpened = false;
                $scope.open = function ($event) {
                    $event.preventDefault();
                    $event.stopPropagation();
                    $scope.dateOpened = true;
                };
            }],
            link: function (scope, element, attrs) {

                if (typeof scope.isRequired === 'undefined')
                    scope.isRequired = true;

                var attrRequired = scope.isRequired ? 'required' : '';

                var name = window.randomString();

                if (scope.field.typeId == 6)
                    scope.fieldValue = [];

                var fieldHtml = '<label class="col-md-4 control-label">' + (scope.customLabel || scope.field.name) + '</label>';

                if (scope.field.typeId == 1)
                    fieldHtml += '<div class="col-md-8"><input type="text" ng-model="fieldValue" name="' + name + '" ' + attrRequired + ' class="form-control" /></div>';
                else if (scope.field.typeId == 2)
                    fieldHtml += '<div class="col-md-8"><input type="number" ng-model="fieldValue" name="' + name + '" ' + attrRequired + ' class="form-control" /></div>';
                else if (scope.field.typeId == 3)
                    fieldHtml += '<div class="col-md-8"><label class="radio-inline"><input type="radio" ng-model="fieldValue" name="' + name + '" ' + attrRequired + ' value="yes" />Yes</label><label class="radio-inline"><input type="radio" ng-model="fieldValue" name="' + name + '" ' + attrRequired + ' value="no" />No</label></div>';
                else if (scope.field.typeId == 4)
                    fieldHtml += '<div class="col-md-8"><select ng-model="fieldValue" ng-options="v for v in field.optionArray" name="' + name + '" ' + attrRequired + ' class="form-control"></select></div>';
                else if (scope.field.typeId == 5) {
                    var opts = '';
                    angular.forEach(scope.field.options, function (opt) {
                        opts += '<label class="radio-inline"><input type="radio" name="' + name + '" ' + attrRequired + ' ng-model="fieldValue" value="' + opt + '" />' + opt + '</label>';
                    });
                    fieldHtml += '<div class="col-md-8">' + opts + '</div>';
                }
                else if (scope.field.typeId == 6) {
                    fieldHtml += '<div class="col-md-8"><label class="checkbox-inline" ng-repeat="v in field.options"><input type="checkbox" checklist-model="fieldValue" checklist-value="v">{{v}}</label></div>';
                } else if (scope.field.typeId == 7) {
                    fieldHtml += '<div class="col-md-8"><p class="input-group mBottom0"><input ' + attrRequired + ' type="text" class="form-control" name="datepicker" datepicker-popup="dd/MM/yyyy" ng-model="fieldValue" is-open="dateOpened"/><span class="input-group-btn"><button type="button" class="btn btn-default" ng-click="open($event)"><i class="glyphicon glyphicon-calendar"></i></button></span></p></div>';
                }

                // HTML
                var htmlText = '<div class="form-group">' + fieldHtml + '</div>';
                element.html(htmlText).show();
                var e = $compile(element.contents())(scope);
                element.replaceWith(e);
            }
        };
    }
})();
sharedModule
    .directive('dateRangePicker', function ($compile) {
        return {
            oldtemplate: '<div class="input-group custom-date-range" ng-class="{open: openDateRange}"> <div class="input-group-btn">' +
                '<button type="button" title="Show calendar" class="btn btn-default dropdown-toggle" tabindex="-1" ng-click="openDateRange = !openDateRange;openDateRangeDropdown=false"> <i class="glyphicon glyphicon-calendar"></i> </button>' +
                '</div>' +
                '<span class="form-control form-control-static date-range-input" title="{{range.from | date: \'dd/MM/yyyy\'}} - {{range.to | date: \'dd/MM/yyyy\'}}" style="position: relative;">' +
                '<span style="position: absolute; top: 6px; left: 10px; white-space: nowrap">{{range.from | date: \'dd/MM/yyyy\'}} - {{range.to | date: \'dd/MM/yyyy\'}}</span></span>' +
                '<ul class="dropdown-menu" style="width: 548px;{{cssStyle}}" role="menu"> <li> <datepicker ng-model="range.from" max-date="range.to" show-weeks="false" startingDay="1" formatYear="yyyy" class="bootstrap-date-picker-inline"></datepicker><datepicker ng-model="range.to" min-date="range.from" show-weeks="false" startingDay="1" formatYear="yyyy" class="bootstrap-date-picker-inline"></datepicker> </li><li class="text-right mRight10"> <button class="btn btn-primary btn-sm" ng-click="openDateRange = !openDateRange">Done</button> </li> </ul> ' +
                '<div class="input-group-btn open-date-range-dropdown" ng-class="{\'open\':openDateRangeDropdown}" ng-click="clickDateRangeDropdown()"> <button type="button" title="Show defaults" class="btn btn-default dropdown-toggle" tabindex="-1"><i class="glyphicon glyphicon-list"></i> </button> <ul class="dropdown-menu pull-right" role="menu"><li><a class="cursor-pointer" ng-click="option(1)">Last 7 days</a></li><li><a class="cursor-pointer" ng-click="option(2)">Last 4 weeks</a></li><li><a class="cursor-pointer" ng-click="option(3)">This month</a></li><li><a class="cursor-pointer" ng-click="option(4)">Last month</a></li><li><a class="cursor-pointer" ng-click="option(5)">This year</a></li><li><a class="cursor-pointer" ng-click="option(6)">Last year</a></li><li><a class="cursor-pointer" ng-click="option(7)">All Time</a></li></ul> </div> </div>',
            template: '<div class="input-group mBottom0 custom-date-range" ng-class="{\'open\': openDateRange}"> ' +
                '<span class="form-control form-control-static mBottom0 date-range-input" title="{{range.from | date: \'dd/MM/yyyy\'}} - {{range.to | date: \'dd/MM/yyyy\'}}" style="position: relative;">' +
                '<span style="position: absolute; top: 6px; left: 10px; white-space: nowrap">{{range.from | date: \'dd/MM/yyyy\'}} - {{range.to | date: \'dd/MM/yyyy\'}}</span></span>' +
                '<ul class="dropdown-menu" style="{{cssStyle}}" role="menu"> ' +
                '<li style="white-space: nowrap;"> ' +
                '<table class="borders-none"><tr>' +
                '<td style="vertical-align: top" ng-if="openCustomDateRange">' +
                '<datepicker ng-model="range.from" max-date="range.to" show-weeks="false" starting-day="1" format-year="yyyy" format-month="MMMM" max-mode="month" class="bootstrap-date-picker-inline"></datepicker>' +
                '</td>' +
                '<td style="vertical-align: top" ng-if="openCustomDateRange">' +
                '<datepicker ng-model="range.to" min-date="range.from" show-weeks="false" starting-day="1" format-year="yyyy" format-month="MMMM" max-mode="month" class="bootstrap-date-picker-inline"></datepicker>' +
                '<div class="text-right pRight10"><button class="btn btn-primary btn-sm" ng-click="done()">Done</button></div>' +
                '</td>' +
                '<td style="vertical-align: top">' +
                '<ul class="default-cal-range">' +
                '<li ng-repeat="(key, value) in ranges"><a class="cursor-pointer" ng-click="option(value)">{{key}}</a></li>' +
                '<li><a class="cursor-pointer" ng-click="option(null)">Custom Range</a></li>' +
                '</ul>' +
                '</td>' +
                '</tr></table>' +
                '</li>' +
                '</ul> ' +
                '<div class="input-group-btn">' +
                '<button type="button" title="Show calendar" class="btn btn-default dropdown-toggle" tabindex="-1" ng-click="openDateRange = !openDateRange;openDateRangeDropdown=false"> <i class="glyphicon glyphicon-list"></i> </button>' +
                '</div>' +
                '</div>',
            restrict: 'AE',
            replace: true,
            scope: {
                range: "=",
                ranges: "=?",
                onchanged: "&onChanged"
            },
            controller: function ($scope, $document, $timeout) {

                $scope.openDateRange = false;
                $scope.openCustomDateRange = false;
                $scope.openDateRangeDropdown = false;
                var isDrdCliked = false;

                $document.bind('click', function () {
                    if (!isDrdCliked) {
                        $timeout(function () {
                            if ($scope.openDateRangeDropdown)
                                $scope.openDateRangeDropdown = false;
                        }, 50);
                    }
                });

                $scope.clickDateRangeDropdown = function () {
                    isDrdCliked = true;
                    $scope.openDateRange = false;
                    $scope.openDateRangeDropdown = !$scope.openDateRangeDropdown;
                    $timeout(function () {
                        isDrdCliked = false;
                    }, 100);
                };

                if (typeof $scope.ranges === 'undefined') {
                    $scope.ranges = {
                        'Last 7 Days': [moment().subtract(6, 'days'), moment()],
                        'Last 4 weeks': [moment().subtract(29, 'weeks'), moment()],
                        'This Month': [moment().startOf('month'), moment().endOf('month')],
                        'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
                        'This Year': [moment().startOf('year'), moment().endOf('year')],
                        'Last Year': [moment().subtract(1, 'year').startOf('year'), moment().subtract(1, 'year').endOf('year')],
                        'All Time': [moment.utc('19700101', 'YYYYMMDD'), moment()]
                    };
                }

                $scope.option = function (dateRange) {

                    // Custom range
                    if (dateRange == null) {
                        $scope.openCustomDateRange = true;
                    } else {
                        $scope.range.from = new Date(dateRange[0].valueOf());
                        $scope.range.to = new Date(dateRange[1].valueOf());
                        $scope.openCustomDateRange = false;
                        $scope.openDateRange = false;
                        $scope.onchanged({ $daterange: $scope.range });
                    }
                };
                $scope.done = function () {
                    $scope.openCustomDateRange = false;
                    $scope.openDateRange = false;
                    $scope.onchanged({ $daterange: $scope.range });
                };
                if ($scope.range.from == null || $scope.range.to == null) {
                    $timeout(function () {
                        $scope.option($scope.ranges['Last 7 Days']);
                    }, 500);
                } else {
                    $scope.range.from = new Date(moment($scope.range.from).valueOf());
                    $scope.range.to = new Date(moment($scope.range.to).valueOf());
                }
                //$scope.$watchCollection('range', function (v) {
                //    $scope.onchanged({ $daterange: v });
                //});
            },
            link: function (scope, ele, attr) {

                scope.cssStyle = typeof attr.style === "undefined" ? "" : attr.style;

                //var html = ;

                //var e = $compile(html)(scope);
                //ele.replaceWith(e);
            }
        };
    });
(function () {
    'use strict';
    sharedModule.directive('focusElement', [
        '$timeout', '$parse', function ($timeout, $parse) {
            return {
                link: function (scope, element, attrs) {
                    var model = $parse(attrs.focusElement);
                    scope.$watch(model, function (value) {
                        if (value === true) {
                            $timeout(function() {
                                element[0].focus();
                            });
                        }
                    });
                }
            };
        }
    ]);
})();
(function () {
    'use strict';

    sharedModule.directive('formCommit', dir);
    dir.$inject = [];

    function dir() {
        return {
            require: "form",
            link: function ($scope, $el, $attr, $form) {
                $form.commit = function () {
                    $el[0].submit();
                };
            }
        };
    }
})();

(function () {
    'use strict';
    sharedModule
        .directive('geoLocation', function () {
            return {
                restrict: 'E',
                replace: true,
                // transclude:true,
                scope: {
                    location: '=',
                    latitude: '=',
                    longitude: '=',
                    place: '=?'
                },
                template: '<input id="google_places_ac" name="google_places_ac" type="text" data-ng-model="location" class="form-control"/>',
                link: function ($scope, elm, attrs) {
                    var input = document.getElementById('google_places_ac');
                    var autocomplete = new google.maps.places.Autocomplete(input);
                    google.maps.event.addListener(autocomplete, 'place_changed', function () {
                        $scope.place = autocomplete.getPlace();

                        $scope.latitude = $scope.place.geometry.location.lat();
                        $scope.longitude = $scope.place.geometry.location.lng();
                        $scope.location = $scope.place.formatted_address;
                        $scope.$apply();
                    });
                }
            };
        })
        .directive('geoLocationAdvanced', ['lazyLoadGoogleApi', function (lazyLoadGoogleApi) {
            return {
                restrict: 'EA',
                replace: true,
                scope: {
                    name: '=ngName',
                    onselected: '&onSelected',
                    ongoogleinit: '&onGoogleInit'
                },
                template: '<div><input id="google_places_ac" name="google_places_ac" type="text" ng-model="name" class="form-control"/></div>',
                link: function ($scope, elm, attrs) {

                    function initializeMap() {
                        var input = document.getElementById('google_places_ac');
                        var autocomplete = new google.maps.places.Autocomplete(input, { types: ['geocode'], 'country': ['au'] });
                        // Set initial restrict to the greater list of countries.
                        autocomplete.setComponentRestrictions({ 'country': ['au'] });
                        google.maps.event.addListener(autocomplete, 'place_changed', function () {
                            var place = autocomplete.getPlace();
                            var componentForm = {
                                street_number: 'short_name',
                                route: 'long_name',
                                locality: 'long_name',
                                administrative_area_level_1: 'short_name',
                                country: 'long_name',
                                postal_code: 'short_name'
                            };
                            var componentData = {};

                            for (var i = 0; i < place.address_components.length; i++) {
                                var addressType = place.address_components[i].types[0];
                                if (componentForm[addressType]) {
                                    var val = place.address_components[i][componentForm[addressType]];
                                    componentData[addressType] = val;
                                }
                            }

                            // console.log(place)
                            $scope.onselected({
                                $geo: {
                                    lat: place.geometry.location.lat(),
                                    lng: place.geometry.location.lng(),
                                    name: place.name,
                                    loc: place.formatted_address,
                                    city: componentData['locality'],
                                    state: componentData['administrative_area_level_1'],
                                    postcode: componentData['postal_code'],
                                    country: componentData['country']
                                }
                            });
                        });
                        $scope.ongoogleinit({
                            $isInit: true
                        });
                    }

                    lazyLoadGoogleApi.then(initializeMap);
                }
            };
        }])
        .service('lazyLoadGoogleApi', ['$window', '$q', function ($window, $q) {
            function loadScript() {
                console.log('loadScript');
                // use global document since Angular's $document is weak
                var s = document.createElement('script');
                s.setAttributeNode(document.createAttribute("async"));
                s.setAttributeNode(document.createAttribute("defer"));
                s.src = '//maps.google.com/maps/api/js?libraries=geometry,places&language=en-US&language=en&callback=initMap&key=AIzaSyBX1vLcFH8298Qst25_mof_a1l7XLKcf8E';
                document.body.appendChild(s);

                console.log('loadScript 2');
                var ss = document.createElement('script');
                ss.setAttributeNode(document.createAttribute("async"));
                ss.setAttributeNode(document.createAttribute("defer"));
                ss.src = '/app/lib/google-maps/markerclusterer.js'
                document.body.appendChild(ss)
            }
            var deferred = $q.defer()

            $window.initMap = function () {
                deferred.resolve()
            }

            loadScript();
            //if ($window.attachEvent) {
            //    console.log('loadScript')
            //    $window.attachEvent('onload', loadScript)
            //} else {
            //    console.log('loadScript')
            //    $window.addEventListener('load', loadScript, false)
            //}

            return deferred.promise
        }]);
})();
(function () {
    'use strict';

    sharedModule.directive('globalSearch', dir1);
    dir1.$inject = [];

    sharedModule.directive('globalSearchSimple', dir1s);
    dir1s.$inject = [];

    sharedModule.directive('globalSearchKeyNav', dir2);
    dir2.$inject = ['$timeout'];

    var globalSearchCtrl = ["$rootScope", "$scope", "baseFactory", "$state",
                function ($rootScope, $scope, baseFactory, $state) {

                    var filters = [
                        { id: 1, name: "Order", isActive: true },
                        { id: 2, name: "Invoices", isActive: true },
                        { id: 3, name: "Customers", isActive: true }
                    ];
                    $scope.access = typeof $scope.access === 'undefined' ? [] : $scope.access;
                    $scope.filters = [];
                    $scope.isLoading = false;
                    $scope.limitToNum = 3;
                    $scope.gsFilter = [1];
                    $scope.searchFor = "";
                    $scope.globalSearchKeyword = "";
                    $scope.globalSearchCount = 0;
                    $scope.results = [];
                    $scope.isDropOpen = false;

                    // PRIVATE
                    var setCount = function () {
                        $scope.globalSearchCount = $scope.customersGlobalSearch.length + $scope.ordersGlobalSearch.length + $scope.invoicesGlobalSearch.length;
                    };
                    var addCssClass = function (nodes, indx) {
                        var newNodes = [];

                        for (var n = 0, m = nodes.length; n < m; n++) {
                            if ((" " + nodes[n].className + " ").indexOf(' gs-result ') >= 0) {
                                newNodes.push(n);
                            }
                        }

                        if (indx >= newNodes.length) {
                            indx = $scope.focusIndex = newNodes.length - 1;
                        } else if (indx < 0) {
                            indx = $scope.focusIndex = 0;
                        }

                        for (var nn = 0; nn < newNodes.length; nn++) {
                            var nIndx = newNodes[nn];
                            if (nn == indx) {
                                angular.element(nodes[nIndx]).addClass("gs-result-active");
                            } else {
                                angular.element(nodes[nIndx]).removeClass("gs-result-active");
                            }
                        }
                    };
                    var open = function (nodes) {
                        var newNodeIndx = -1;

                        for (var n = 0, m = nodes.length; n < m; n++) {
                            if ((" " + nodes[n].className + " ").indexOf(' gs-result-active ') >= 0) {
                                newNodeIndx = n;
                                break;
                            }
                        }

                        if (newNodeIndx >= 0) {
                            angular.element(nodes[newNodeIndx]).find('a').triggerHandler('click');
                        }
                    };

                    // GlobalSearch
                    $scope.globalSearchChange = function (val) {
                        $scope.focusIndex = -1;
                        if (val.length < 2) {
                            $scope.results = [];
                        } else {
                            var fetches = [
                                {
                                    id: 0, name: "All", isActive: true
                                },
                                {
                                    id: 1, name: $rootScope.clientName == "TFT" ? "Jobs" : "Orders", url: 'base.orders.view2', param: 'id'
                                },
                                {
                                    id: 2, name: "Invoices", url: '/Report/OrderInvoice?invoiceNumber=', param: 'id'
                                },
                                {
                                    id: 3, name: "Customers", url: 'base.customers.manage', param: 'customerId'
                                },
                                {
                                    id: 4, name: "Items", url: 'anonymous.shop.item', param: 'id'
                                },
                                {
                                    id: 5, name: "Contacts", url: 'base.customers.manage', param: 'customerId'
                                }
                            ];

                            $scope.isLoading = true;
                            $scope.results = [];
                            var accessFilter = $scope.access.join(',').toLowerCase();
                            baseFactory.fetch('/api/system/globalsearch', { q: val, access: accessFilter }).then(function (rdata) {
                                var title = null;
                                for (var b = 0; b < rdata.object.length; b++) {
                                    var odata = rdata.object;
                                    var isShow = false;
                                    if (fetches[odata[b]['type']].name != title) {
                                        title = fetches[odata[b]['type']].name;
                                        isShow = true;
                                    }
                                    var state = {
                                        url: fetches[odata[b]['type']].url,
                                        param: {}
                                    };
                                    state.param[fetches[odata[b]['type']].param] = odata[b].id;
                                    $scope.results.push({
                                        filterId: fetches[odata[b]['type']].id,
                                        filterName: fetches[odata[b]['type']].name,
                                        id: odata[b].id,
                                        contactId: odata[b].contactId,
                                        title: isShow ? fetches[odata[b]['type']].name : null,
                                        name: odata[b].name,
                                        photoThumbnailUrl: odata[b].photoThumbnailUrl,
                                        description: odata[b].description,
                                        state: state
                                    });
                                }
                                $scope.isDropOpen = $scope.results.length > 0;
                                $scope.isLoading = false;
                            });
                        }
                    };

                    $scope.isFilterCheck = function (f) {
                        return $scope.gsFilter.indexOf(f) >= 0;
                    };

                    $scope.setFilterStr = function () {
                        for (var i = 0; i < filters.length; i++) {
                            if ($scope.access.length == 0) {
                                $scope.filters.push(filters[i]);
                            } else if ($scope.access.indexOf(filters[i].name) >= 0) {
                                $scope.filters.push(filters[i]);
                            }
                        }
                        //
                        var arrStr = [];
                        angular.forEach($scope.filters, function (f) {
                            if ($scope.gsFilter.indexOf(f.id) >= 0 && f.id > 1) {
                                arrStr.push(f.name.toLowerCase());
                            }
                        });
                        $scope.searchFor = arrStr.join(', ');
                    };

                    $scope.clickGlobalSearchFilter = function (f) {
                        if (f === 1) {
                            $scope.gsFilter = [];
                            $scope.gsFilter.push(1);

                            // SET LIMIT
                            $scope.limitToNum = 3;
                        } else {
                            var indx = $scope.gsFilter.indexOf(f);
                            var isExist = indx >= 0;

                            if ($scope.gsFilter.indexOf(1) >= 0 && f > 1) {
                                $scope.gsFilter = [];
                            }

                            if (isExist) {
                                if ($scope.gsFilter.length > 1)
                                    $scope.gsFilter.splice(indx, 1);
                            } else {
                                $scope.gsFilter.push(f);
                            }

                            // SET LIMIT
                            $scope.limitToNum = Math.round(10 / $scope.gsFilter.length);
                        }

                        $scope.setFilterStr();
                    };

                    // NAVIGATION
                    $scope.focusIndex = -1;

                    $scope.keys = [];
                    $scope.keys.push({
                        code: 13,
                        action: function (parentElem) {
                            open(parentElem);
                        }
                    });
                    $scope.keys.push({
                        code: 38,
                        action: function (parentElem) {
                            $scope.focusIndex--;
                            addCssClass(parentElem, $scope.focusIndex);
                        }
                    });
                    $scope.keys.push({
                        code: 40,
                        action: function (parentElem) {
                            console.log('down');
                            $scope.focusIndex++;
                            addCssClass(parentElem, $scope.focusIndex);
                        }
                    });

                    $scope.$on('globalSearchKeydown', function (msg, obj) {
                        var code = obj.code;
                        $scope.keys.forEach(function (o) {
                            if (o.code !== code) { return; }
                            o.action(obj.parent);
                            obj.event.preventDefault();
                            $scope.$apply();
                        });
                    });
                    $scope.toggleDropdown = function ($event) {
                        $event.preventDefault();
                        $event.stopPropagation();
                        $scope.isDropOpen = true;
                    };
                    $scope.itemSelected = function (item) {
                        $scope.isDropOpen = false;
                        if (!$scope.isField) {
                            $scope.globalSearchKeyword = null;
                        } else {
                            $scope.globalSearchKeyword = item.name;
                        }
                        $scope.onItemSelected({ $item: item });
                    };
                    $scope.itemClicked = function (item) {
                        if (item.filterId == 2) {
                            window.location.href = item.state.url + item.state.param.id;
                        } else {
                            $state.go(item.state.url, item.state.param, { reload: true });
                        }
                    };

                    // INIT
                    $scope.setFilterStr();
                }];
    function dir1() {
        return {
            templateUrl: '/app/modules/shared/template/globalSearchAdvancedTemplate.html',
            restrict: 'AE',
            transclude: true,
            replace: false,
            scope: {
                access: "=?accessFilter",
                onItemSelected: "&onSelected"
            },
            controller: globalSearchCtrl
        };
    }
    function dir1s() {
        return {
            templateUrl: '/app/modules/shared/template/globalSearchSimpleTemplate.html',
            restrict: 'AE',
            transclude: true,
            replace: true,
            scope: {
                access: "=?accessFilter",
                isField: "=?",
                onItemSelected: "&onSelected"
            },
            controller: globalSearchCtrl
        };
    }
    function dir2($timeout) {
        return {
            restrict: 'A',
            require: '?^globalSearch',
            link: function (scope, element, attr) {
                $timeout(function () {
                    element.bind('keydown', function (e) {
                        scope.$broadcast('globalSearchKeydown', { code: event.keyCode, parent: element.find('li'), event: e });
                    });
                }, 0);
            }
        };
    }
})();
(function () {
    'use strict';
    sharedModule.directive('hovercard', dir1);
    sharedModule.directive('popupCardHtml', dir2);

    dir1.$inject = ["$compile", "$timeout"];
    dir2.$inject = ["$compile"];

    function dir1($compile, $timeout) {
        return {
            template: '<div ng-mouseenter="onEnter(customerId)" ng-mouseleave="onLeave()">' +
                '<a target="_blank" ui-sref="home.athletes.dashboard({id:customerId})" class="angular-hovercard-label" ng-class="{\'angular-hovercard-active\': show.card}" ng-style="hoverLabelStyle" ng-transclude></a>' +
                '</div>',
            restrict: 'AE',
            transclude: true,
            replace: true,
            scope: {
                customerId: '@'
            },
            controller: ["$scope", "$window", "baseFactory", function ($scope, $window, baseFactory) {
                $scope.show = {};
                $scope.show.card = false;
                $scope.isTop = true;
                $scope.customerData = { name: "" };

                $scope.onHoverIn = function (id, callback) {
                    $scope.isLoading = true;
                    baseFactory.fetch("/api/customer/getCard/" + id).then(function (rdata) {
                        $scope.isLoading = false;
                        $scope.customerData = rdata.object;
                        callback();
                    });
                };

                angular.element($window).bind('scroll', function () {
                    if (typeof $scope.customerId !== 'undefined') {
                        $scope.onLeave2($scope.customerId);
                        $timeout(function () {
                            try {
                                $scope.$apply();
                            } catch (er) {
                            }
                        });
                    }
                });
            }],
            link: function (scope, element, attrs, ctrl, $transclude) {
                $timeout(function () {
                    scope.customerName = angular.copy(angular.element(element).contents()[0].innerText);
                }, 10);

                // DEBOUNCE
                var stayAtLeast = 500;
                var timer;
                var randomStr = window.randomString();
                var documentHeight = function () {
                    return Math.max(
                        document.documentElement.clientHeight,
                        document.body.scrollHeight,
                        document.documentElement.scrollHeight,
                        document.body.offsetHeight,
                        document.documentElement.offsetHeight
                    );
                };

                // HTML
                scope.onEnter = function (customerId) {
                    timer = $timeout(function () {
                        scope.onHoverIn(customerId, function () {
                            scope.show.card = true;
                            var offset = element.offset();
                            var top = offset.top - window.pageYOffset;
                            var left = offset.left - window.pageXOffset;
                            var bottomDiff = document.documentElement.clientHeight - offset.top;
                            scope.hovercardStyle = {
                                'position': 'fixed',
                                'z-index': '1000',
                                'top': -1000,
                                'left': -1000
                            };

                            var el = angular.element('<div id="popupCard' + randomStr + scope.customerId + '" ng-style="hovercardStyle" class="angular-hovercard open">' +
                                '<div popup-card-html class="angular-hovercard-detail" ng-class="{\'angular-hovercard-active\': show.card}"></div></div>');
                            $compile(el)(scope);
                            angular.element("body").append(el);

                            $timeout(function () {
                                var cardHeight = angular.element('[popup-card-html]')[0].offsetHeight;

                                if (bottomDiff < cardHeight) {
                                    scope.hovercardStyle.top = (top - 10 - cardHeight) + 40;
                                    scope.hovercardStyle.left = (left - 10);
                                    scope.isTop = false;
                                } else {
                                    scope.hovercardStyle.top = (top - 10);
                                    scope.hovercardStyle.left = (left - 10);
                                    scope.isTop = true;
                                }
                            }, 50);
                        });
                    }, stayAtLeast);
                };
                scope.onLeave = function () {
                    $timeout.cancel(timer);
                };
                scope.onLeave2 = function (customerId) {
                    if (angular.element('[id="popupCard' + randomStr + customerId + '"]').hasClass('open')) {
                        scope.show.card = false;
                        $timeout(function () {
                            try {
                                document.getElementById("popupCard" + randomStr + customerId).remove();
                            } catch (er) {
                            }
                        }, 100);
                    } else {
                        $timeout.cancel(timer);
                    }
                };
            }
        };
    }

    function dir2($compile) {
        return {
            templateUrl: "/app/modules/shared/template/hovercardTemplate.html",
            // replace: true,
            restrict: 'A',
            require: '?^hovercard',
            scope: true,
            controller: ["$scope", function ($scope) {
                $scope.coverPhoto = function (ath) {
                    if (typeof ath.coverPhoto === 'undefined' || ath.coverPhoto == '' || ath.coverPhoto == null) {
                        //return null;
                        return {
                            'background-color': '#333'
                        };
                    } else {
                        return {
                            'background-image': 'url(' + ath.coverPhoto + ')'
                        };
                    }
                };
            }],
            link: function (scope, elem, attr, ctrl) {
            }
        };
    }
})();
(function() {
    'use strict';
    
    sharedModule.directive('iframeOnload', [function () {
        return {
            scope: {
                callBack: '&iframeOnload'
            },
            link: function (scope, element, attrs) {
                element.on('load', function() {
                    return scope.callBack();
                });
            }
        };
    }]);
})();
(function () {
    'use strict';

    sharedModule.directive('noDecimal', dir);
    dir.$inject = [];
    function dir() {
        return {
            restrict: 'A',
            require: 'ngModel',
            terminal: true,
            scope: {
                model: '=ngModel',
            },
            link: function (scope, element, attrs, ctrl) {
                if (scope.model && typeof scope.model == 'string') {
                    scope.model = parseFloat(scope.model);
                }

                element.bind("keypress", function (event) {
                    if (event.charCode >= 48 && event.charCode <= 57) {
                    } else {
                        event.preventDefault();
                    }
                });

                ctrl.$parsers.unshift(function (viewValue, $scope) {
                    if (!isNaN(viewValue)) {
                        var isValid = parseFloat(viewValue) % 1 != 0;
                        ctrl.$setValidity('noDecimal', !isValid);
                        return viewValue;
                    }
                    return null;
                });
            }
        };
    }
})();
(function () {
    'use strict';

    function prev(element) {


        if (element.previousElementSibling) {


            return element.previousElementSibling;


        }

        // IE8 doesn't have previousElementSibling


        var elm = element.previousSibling;


        while (elm != null && elm.nodeType !== 1) {


            elm = elm.previousSibling;


        }
        return elm;


    }

    sharedModule.directive('mediumEditor', dir);
    dir.$inject = ['$compile', '$timeout'];
    function dir($compile, $timeout) {
        return {
            scope: {
                ngModel: '=',
                buttons: '=?',
                isEmail: '=?'
            },
            restrict: 'AE',
            require: '?ngModel',
            replace: true,
            transclude: true,
            template: '<div>' +
                '<div ng-hide="isHtml">' +
                '<div class="medium-editor-toolbar-active" style="position: relative"></div>' +
                '<div divmeditor class="medium-editor" ng-bind-html="text"></div>' +
                '</div>' +
                '<div ng-show="isHtml">' +
                '<div class="btn-group"><span class="btn btn-default active" ng-click="unToggleHtml(text)">HTML</span></div>' +
                '<textarea ng-model="text" class="form-control" name="textContent" rows="5"></textarea>' +
                '</div><ng-transclude></ng-transclude>' +
                '</div>',
            controller: ['$scope', function ($scope) {
                $scope.isHtml = false;
            }],
            link: function (scope, elem, attributes, ngModel) {
                scope.text = angular.copy(scope.ngModel);
                var prevElem = angular.element(elem).find('[divmeditor]').prev();

                scope.unToggleHtml = function (html) {
                    ngModel.$setViewValue(html);
                    scope.isHtml = false;
                    $timeout(function () {
                        scope.$apply();
                    }, 100);
                };

                ngModel.editor = new MediumEditor('[divmeditor]', {
                    delay: 500,
                    buttonLabels: 'fontawesome',
                    placeholder: {
                        text: typeof attributes.placeholder !== 'undefined' ? attributes.placeholder : ''
                    },
                    anchorPreview: {
                        showWhenToolbarIsVisible: true
                    },
                    anchor: {
                        /* These are the default options for anchor form,
                           if nothing is passed this is what it used */
                        customClassOption: null,
                        customClassOptionText: 'Button',
                        linkValidation: true,
                        placeholderText: 'Paste or type a link',
                        targetCheckbox: false,
                        targetCheckboxText: 'Open in new window'
                    },
                    imageDragging: false,
                    extensions: {
                        'imageDragging': {},
                        'html': new MediumButton({
                            label: 'HTML',
                            action: function (html, mark) {
                                scope.isHtml = true;
                                scope.text = angular.copy(scope.ngModel);
                            }
                        }),
                        'fontname': new MediumEditor.extensions.fontName(),
                        'fontsize': new MediumEditor.extensions.fontSize(),
                        'paste': {
                            /* This example includes the default options for paste,
                               if nothing is passed this is what it used */
                            forcePlainText: false,
                            cleanPastedHTML: true,
                            cleanReplacements: [],
                            cleanAttrs: ['class', 'style', 'dir'],
                            cleanTags: ['meta']
                        }
                    },
                    toolbar: {
                        /* These are the default options for the toolbar,
                           if nothing is passed this is what is used */
                        allowMultiParagraphSelection: true,
                        buttons: typeof scope.buttons !== 'undefined' ? scope.buttons : ['bold', 'italic', 'underline', 'unorderedlist', 'orderedlist', 'fontname', 'fontsize', 'html'],
                        diffLeft: 0,
                        diffTop: -10,
                        firstButtonClass: 'medium-editor-button-first',
                        lastButtonClass: 'medium-editor-button-last',
                        standardizeSelectionStart: false,
                        static: true,
                        relativeContainer: prevElem[0],

                        /* options which only apply when static is true */
                        align: 'left',
                        sticky: true,
                        updateOnEmptySelection: false
                    }
                });

                ngModel.editor.subscribe('editableInput', function (event, editable) {
                    var inner = angular.copy(editable.innerHTML.trim());
                    inner = removeElementsByClass(inner, 'medium-insert-buttons');

                    if (scope.isEmail) {
                        inner = replaceClassByInlineStyle(inner, 'medium-insert-images');
                        inner = replaceClassByInlineStyle(inner, 'medium-insert-images-left');
                        inner = replaceClassByInlineStyle(inner, 'medium-insert-images-right');
                        inner = replaceClassByInlineStyle(inner, 'medium-insert-images-grid');
                    }

                    function replaceClassByInlineStyle(innerHtml, className) {
                        var temp = document.createElement('div');
                        temp.innerHTML = innerHtml;
                        var elements = temp.getElementsByClassName(className);
                        var cssClassStyle = {
                            'medium-insert-images': {
                                'div': 'text-align: center; margin: 5px 0px;',
                                'figure': 'width: 100%; margin: 0px;',
                                'img': 'max-width: 100%; margin-top: 0px; vertical-align: top;'
                            },
                            'medium-insert-images-left': {
                                'div': 'text-align: center; max-width: 180px;float: left;margin: 0 30px 20px 0;',
                                'figure': 'width: 100%; margin: 0px;',
                                'img': 'width: 100%;'
                            },
                            'medium-insert-images-right': {
                                'div': 'text-align: center; max-width: 180px;float: right;margin: 0 0 20px 30px;',
                                'figure': 'width: 100%; margin: 0px;',
                                'img': 'width: 100%;'
                            },
                            'medium-insert-images-grid': {
                                'div': 'text-align: center; width: 100%; text-align: center; justify-content: center; margin: 5px -5px;',
                                'figure': 'position: relative; width: 33%; display: inline-block; margin: 0px;',
                                'img': 'width: 95%; margin: 5px;'
                            },
                        };
                        if (elements.length > 0) {
                            for (var i = 0; i < elements.length; i++) {
                                elements[i].setAttribute("style", cssClassStyle[className]['div']);

                                var figures = elements[i].getElementsByTagName("figure");
                                for (var j = 0; j < figures.length; j++) {
                                    figures[j].setAttribute("style", cssClassStyle[className]['figure']);
                                    figures[j].getElementsByTagName("img")[0].setAttribute("style", cssClassStyle[className]['img']);
                                }
                            }
                        }
                        return temp.innerHTML.trim();
                    }
                    function removeElementsByClass(innerHtml, className) {
                        var temp = document.createElement('div');
                        temp.innerHTML = innerHtml;
                        var elements = temp.getElementsByClassName(className);
                        while (elements.length > 0) {
                            elements[0].parentNode.removeChild(elements[0]);
                        }
                        return temp.innerHTML.trim();
                    }

                    ngModel.$setViewValue(inner);
                });

                scope.$on('$destroy', function () {
                    ngModel.editor.destroy();
                });
            }
        };
    }
})();
(function () {
    'use strict';

    sharedModule.directive('mediumInsert', mediumInsert);
    function mediumInsert($timeout) {
        var directive = {};
        directive.restrict = 'EA';
        directive.scope = { insertAddons: '=' }
        directive.require = '^ngModel';
        directive.link = linkFunction;
        return directive;

        function linkFunction(scope, elem, attr, ngModel) {

            $timeout(function () {
                var editor = $('medium-editor').length ? $('medium-editor') : $('[divmeditor]');
                editor.mediumInsert({
                    editor: ngModel.editor,
                    enabled: true,
                    addons: scope.insertAddons,
                });
            });
        }
    }
})();
(function () {
    'use strict';
    sharedModule.directive('ngSetFocus', ['$timeout', function ($timeout) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {

                var delay = 300;

                // set focus on broadcast
                scope.$on(attrs.ngSetFocus, function (e) {
                    $timeout(function () {
                        element[0].focus();
                        element[0].setSelectionRange(0, element[0].value.length);
                    }, delay);

                });

                // apply default focus after other events have complete
                $timeout(function () {
                    if (attrs.hasOwnProperty('setFocusDefault')) {
                        element[0].focus();
                    }
                }, delay);

                // fix for default focus on iOS. Does not show keyboard
                element.on('touchstart', function (event) {
                    element[0].blur();
                });
            }
        };
    }]);
})();
app.directive('a', function () {
    return {
        restrict: 'E',
        link: function (scope, elem, attrs) {
            if (attrs.ngClick || attrs.href === '' || attrs.href === '#') {
                elem.on('click', function (e) {
                    e.preventDefault();
                });
            }
        }
    };
});
(function () {
    'use strict';

    sharedModule.directive('numericBinding', dir);
    dir.$inject = [];
    function dir() {
        return {
            restrict: 'A',
            require: 'ngModel',
            priority: 1000,
            scope: {
                model: '=ngModel',
            },
            link: function (scope, element, attrs, ngModelCtrl) {
                if (scope.model && typeof scope.model == 'string') {
                    scope.model = parseFloat(scope.model);
                }
            }
        };
    }
})();
sharedModule
    .directive('optionsDisabled', function ($parse) {
        var disableOptions = function (scope, attr, element, data, fnDisableIfTrue) {
            var realIndex = 0;
            angular.forEach(element.find("option"), function (value, index) {
                var elem = angular.element(value);
                if (elem.val() != "" && data) {
                    var locals = {};
                    locals[attr] = data[realIndex];
                    realIndex++; // this skips data[index] with empty value (IE first <option> with 'Please select from dropdown' item)
                    elem.attr("disabled", fnDisableIfTrue(scope, locals));
                }
            });
        };
        return {
            priority: 0,
            require: 'ngModel',
            link: function (scope, iElement, iAttrs, ctrl) {
                // parse expression and build array of disabled options
                var expElements = iAttrs.optionsDisabled.match(/^\s*(.+)\s+for\s+(.+)\s+in\s+(.+)?\s*/);
                var attrToWatch = expElements[3];
                var fnDisableIfTrue = $parse(expElements[1]);
                scope.$watch(attrToWatch, function (newValue, oldValue) {
                    if (newValue)
                        disableOptions(scope, expElements[2], iElement, newValue, fnDisableIfTrue);
                }, true);
                // handle model updates properly
                scope.$watch(iAttrs.ngModel, function (newValue, oldValue) {
                    var disOptions = $parse(attrToWatch)(scope);
                    if (newValue)
                        disableOptions(scope, expElements[2], iElement, disOptions, fnDisableIfTrue);
                });
            }
        };
    });
(function () {
    'use strict';
    angular.module('appSharedModule').directive('permission', permission);
    permission.$inject = ['$rootScope', 'permissionFactory'];
    function permission($rootScope, permissionFactory) {
        return {
            link: function (scope, elem, attrs) {

                //comma separated list of components. eg. "company,client"
                //these components need to match the componentType enum
                var components = attrs.components ? attrs.components.split(',') : null;
                var invalidComponents = attrs.invalidComponents ? attrs.invalidComponents.split(',') : null;

                //comma separated list of permissions. eg. "company.companycategories.view,client.clientorders.edit"
                //these components need to match the componentType.subcomponentType.PermissionType enum
                var permissions = attrs.permissions ? attrs.permissions.split(',') : null;
                var invalidPermissions = attrs.invalidPermissions ? attrs.invalidPermissions.split(',') : null;

                //comma separated list of clients. eg. "ppi,twc"
                //these components need to match the clientName
                var clients = attrs.clients ? attrs.clients.split(',') : null;
                var invalidClients = attrs.invalidClients ? attrs.invalidClients.split(',') : null;

                //comma separated list of usertypes. eg. "sysadmin,client"
                //these components need to match the userType enum
                var userTypes = attrs.userTypes ? attrs.userTypes.split(',') : null;
                var invalidUserTypes = attrs.invalidUserTypes ? attrs.invalidUserTypes.split(',') : null;

                //comma separated list of roles. eg. "admin,power user"
                //these components need to match the role names
                var roles = attrs.roles ? attrs.roles.split(',') : null;
                var invalidRoles = attrs.invalidRoles ? attrs.invalidRoles.split(',') : null;

                //if the attribute isSysAdmin exists on the node then we need sys admin
                var sysAdmin = typeof (attrs.isSysAdmin) !== 'undefined' ? true : null;
                var sysNotAdmin = typeof (attrs.isSysNotAdmin) !== 'undefined' ? true : null;

                //if the attribute isSysAdmin exists on the node then we need sys admin
                var company = typeof (attrs.isCompany) !== 'undefined' ? true : null;
                var notCompany = typeof (attrs.isNotCompany) !== 'undefined' ? true : null;

                //if the attribute isSysAdmin exists on the node then we need sys admin
                var client = typeof (attrs.isClient) !== 'undefined' ? true : null;

                //permissions were not provided OR the current user has a permission in the provided list
                var hasPermission = !permissions || permissionFactory.hasPermission(permissions);
                //invalidPermissions provided AND the user has one of those permissions
                var hasInvalidPermission = invalidPermissions && permissionFactory.hasPermission(invalidPermissions);

                //components were not provided OR the current user has a component in the provided list
                var hasComponent = !components || permissionFactory.hasAnyPermissionList(components);
                var hasInvalidComponent = invalidComponents && permissionFactory.hasAnyPermissionList(invalidComponents);

                //clients were not provided OR the current client is in the provided list
                var hasClient = !clients || permissionFactory.hasClient(clients);
                var hasInvalidClient = invalidClients && permissionFactory.hasClient(invalidClients);

                //usertypes were not provided OR the current user has a usertype in the provided list
                var hasUserType = !userTypes || permissionFactory.hasUserType(userTypes);
                var hasInvalidUserType = invalidUserTypes && permissionFactory.hasUserType(invalidUserTypes);

                //roles were not provided OR the current role is in the provided list
                var hasRole = !roles || permissionFactory.hasRole(roles);
                var hasInvalidRole = invalidRoles && permissionFactory.hasRole(invalidRoles);

                var hasSysAdmin = !sysAdmin || permissionFactory.isSysAdmin();
                var isCompany = !company || permissionFactory.isCompany();
                var isClient = !client || permissionFactory.isClient();

                if (hasSysAdmin && !sysNotAdmin && !roles) {
                    hasRole = true;
                }
                else if (sysNotAdmin)
                    hasSysAdmin = !permissionFactory.isSysAdmin();

                if (notCompany)
                    isCompany = !permissionFactory.isCompany();

                if (sysAdmin && company && (hasSysAdmin || isCompany)) {
                    hasSysAdmin = true;
                    isCompany = true;
                }
                if (hasPermission && !hasInvalidPermission && hasComponent && !hasInvalidComponent && hasClient && !hasInvalidClient && hasUserType && !hasInvalidUserType && hasSysAdmin && isCompany && isClient && hasRole && !hasInvalidRole)
                    elem.show();
                else
                    elem.hide();

            }
        };
    }

})();
sharedModule.directive("preview", function () {
    function link(scope, element, attr) {
        var iframe = document.createElement('iframe');

        if (attr.stylee) {
            var att1 = document.createAttribute("style");
            att1.value = attr.stylee;
            iframe.setAttributeNode(att1);
        }

        //var att2 = document.createAttribute("onload");
        //att2.value = "javascript:window.resizeIframe(this);";
        //iframe.setAttributeNode(att2);
        
        var element0 = element[0];
        element0.appendChild(iframe);
        
        var body = iframe.contentDocument.body;

        //setTimeout(function() {
        //    body.innerHTML = scope.content;
        //}, 2000);

        scope.$watch('content', function () {
            console.log("Load");
            body.innerHTML = "<b>Test</b>"; // scope.content;
        });
        console.log("Load init");
    }

    return {
        link: link,
        restrict: 'EA',
        scope: {
            content: '='
        }
    };
});
//angular.module("app").filter
//("range", function () {
//    var filter =
//        function (arr, lower, upper) {
//            for (var i = lower; i <= upper; i++) arr.push(i);
//            return arr;
//        };
//    return filter;
//});
(function () {
    'use strict';
    sharedModule.directive('sageResizeHeight', sageResizeHeight);

    sageResizeHeight.$inject = ['$rootScope', '$window'];
    function sageResizeHeight($rootScope, $window) {
        function setMaxHeight(element, offset) {
            element.css({
                'max-height': ($window.outerHeight - offset) + 'px'
            });
        };
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {

                var offset = attrs['sageResizeHeight'];
                if (!offset)
                    offset = 280;
                setMaxHeight(element, offset);
                element.css({
                    'overflow-y': 'auto'
                });
                element.addClass('webkit-scrollbar');
                angular.element($window).bind('resize', function () {
                    setMaxHeight(element, offset);
                });

            }
        };
    }

    sharedModule.directive('resizeHeight', ['$document', '$window',
    function ($document, $window) {

        var setMaxHeight = function (element, offset) {
            element.css({
                'height': ($window.innerHeight - offset) + 'px'
            });
        };

        return {
            restrict: 'A',
            link: function (scope, element, attrs) {

                var offset = attrs['resizeHeight'];

                if (!offset)
                    offset = 250;

                setMaxHeight(element, offset);
                //element.css({
                //    'overflow': 'auto'
                //});

                angular.element($window).bind('resize', function () {
                    setMaxHeight(element, offset);
                });

            }
        };
    }]);
})();
(function () {
    'use strict';
    sharedModule.directive('sageSwitch', sageSwitch);

    sageSwitch.$inject = [];

    function sageSwitch() {
        return {
            restrict: 'E',
            scope: {
                name: '@',
                model: '=',
                bigger: '=?'
            },
            template: '<div class="sage-switch clearfix">' +
                '<switch class="pull-left" ng-model="model"></switch>' +
                '<label ng-if="!bigger" class="sage-switch-label pull-left padding-left">{{name}}</label>' +
                '<label ng-if="bigger" class="sage-switch-label-bg pull-left padding-left"><strong>{{name}}</strong></label>' +
                '</div>'
        };
    }
})();
(function () {
    'use strict';

    function capitaliseFirstLetter(string) {
        var result = string.replace(/([A-Z])/g, " $1");
        return result.charAt(0).toUpperCase() + result.slice(1);
    }

    sharedModule.directive('sageVal', sageVal);
    sageVal.$inject = ['$compile'];

    function sageVal() {
        return {
            restrict: 'E',
            replace: true,
            template: '<div></div>',
            compile: function (element, attrs) {

                var input = element.prev('.form-control');
                if (input.length == 0)//cant find input. the previous element may be a input group, try to get the first element that is a form-control
                    input = element.prev().find('.form-control');

                if (typeof input.attr('name') === 'undefined')
                    return;

                var inputName = input.attr('name');
                var min = input.attr('min');
                var max = input.attr('max');

                //tries to get the input display name from the display-name attribute of the input.
                //if that is not present it will pull it from the input place holder
                //otherwise it will use the input's name

                var displayName = capitaliseFirstLetter(inputName);

                if (input.attr('display-name'))
                    displayName = input.attr('display-name');
                else if (input.attr('data-display-name'))
                    displayName = input.attr('data-display-name');
                else if (input.attr('placeholder'))
                    displayName = input.attr('placeholder');

                var formName;
                if (attrs['formName'])
                    formName = attrs['formName'];
                else if (element.parents('ng-form').length > 0) {
                    element.parents('ng-form').addClass("invalid");
                    formName = element.parents('ng-form').attr('name');
                } else if (element.parents('form').length > 0)
                    formName = element.parents('form').attr('name');
                else
                    formName = 'form';

                var showVarName = attrs['showflagname'] ? attrs['showflagname'] : 'submitted';

                var template = '<div ng-messages="' + formName + '.' + inputName + '.$error" ng-if="' + showVarName + '" class="error">' +
                    '<div class="error-sage-val" ng-message="required">' + displayName + ' is required</div>' +
                    '<div class="error-sage-val" ng-message="minlength">' + displayName + ' is too short</div>' +
                    '<div class="error-sage-val" ng-message="maxlength">' + displayName + ' is too long</div>' +
                    '<div class="error-sage-val" ng-message="min">' + displayName + ' should be >= ' + min +'</div>' +
                    '<div class="error-sage-val" ng-message="max">' + displayName + ' should be <= '+max+'</div>' +
                    '<div class="error-sage-val" ng-message="email">' + displayName + ' is not a valid email address</div>' +
                    '</div>';
                element.html(template);
            }
        };
    }
})();
(function () {
    'use strict';

    sharedModule.directive('simpleTimePicker', dir);
    dir.$inject = [];

    function dir() {
        return {
            template: '<div><div class="row">' +
                '<div class="{{cssClass}}">' +
                '<p class="input-group mBottom0">' +
                '<input type="number" step="1" min="0" max="23" ng-model="m.hr" required ng-model-options="{ debounce: 500 }" class="form-control"/>' +
                '<span class="input-group-btn" style="width: 0; border: 0px"></span>' +
                '<input type="number" step="1" min="0" max="59" ng-model="m.mn" required ng-model-options="{ debounce: 500 }" class="form-control"/>' +
                '</p></div></div><div class="text-danger" ng-if="timeErrorMsg">{{timeErrorMsg}}</div>' +
                '</div>',
            restrict: 'AE',
            transclude: true,
            replace: true,
            scope: {
                ngModel: '=',
                cssClass: '@?'
            },
            controller: ["$scope", "baseFactory", function ($scope, baseFactory) {
                if (typeof $scope.ngModel === "undefined")
                    console.log('Simple time picker model not defined');
                if (typeof $scope.cssClass === "undefined")
                    $scope.cssClass = 'col-xs-5';

                // Split
                var strArr = $scope.ngModel.split(':');
                $scope.m = {
                    hr: parseInt(strArr[0]),
                    mn: parseInt(strArr[1])
                };
                $scope.timeErrorMsg = null;

                $scope.$watchCollection('m', function (v) {
                    if (v.hr > 23 || v.mn > 59) {
                        $scope.timeErrorMsg = "Invalid time 1";
                    } else if (v.hr < 0 || v.mn < 0) {
                        $scope.timeErrorMsg = "Invalid time 2";
                    } else if (typeof v.hr === "undefined" || typeof v.mn === "undefined") {
                        $scope.timeErrorMsg = "Invalid time 3";
                    } else {
                        $scope.timeErrorMsg = null;
                        var hr = v.hr.toString();
                        var mn = v.mn.toString();

                        // if single digit
                        if (hr.length < 2)
                            hr = "0" + hr;
                        if (mn.length < 2)
                            mn = "0" + mn;

                        $scope.ngModel = hr + ":" + mn;
                    }
                });
            }],
            link: function (scope, ele, attr) {
            }
        };
    }
})();
(function () {
    'use strict';
    sharedModule.directive('skyMegaMenu', dir1);
    sharedModule.directive('skyMegaMenuDropdown', dir2);
    sharedModule.directive('skyMegaMenuDropdownMenu', dir3);

    dir1.$inject = [];
    function dir1() {
        return {
            restrict: 'C',
            scope: true,
            controller: ['$scope', '$timeout', function ($scope, $timeout) {
                var self = this;
                this.openMenu = function (elem, attr) {
                    var hov = 1;
                    var t;
                    elem.bind('click', function () {
                        if (elem.hasClass('drop-active')) {
                            elem.removeClass('drop-active');
                        } else {
                            angular.element('[sky-mega-menu-dropdown]').removeClass('drop-active');
                            $timeout(function () {
                                elem.addClass('drop-active');
                                // $scope.viewtab(attr);
                                // console.log('Click')
                            }, 10);
                        }
                    });
                    if (typeof attr.hoverEnabled !== 'undefined') {
                        elem.bind('mouseover', function () {
                            clearTimeout(t);
                            hov = 1;
                            if (!elem.hasClass('drop-active')) {
                                t = setTimeout(function () {
                                    elem.addClass('drop-active');
                                }, 10);
                            }
                        });
                        elem.bind('mouseout', function () {
                            hov = 0;
                            setTimeout(function () {
                                if (hov === 0) {
                                    elem.removeClass('drop-active');
                                }
                            }, 300);
                        });
                    }
                };

                angular.element(document).bind('click', function (event) {
                    angular.element('[sky-mega-menu-dropdown]').removeClass('drop-active');
                });
            }],
            link: function (scope, elem, attr) {
            }
        };
    }

    dir2.$inject = ['$timeout'];
    function dir2($timeout) {
        return {
            restrict: 'A',
            require: '?^skyMegaMenu',
            scope: true,
            link: function (scope, elem, attr, dropdownCtrl) {
                dropdownCtrl.openMenu(elem, attr);
            }
        };
    }

    dir3.$inject = ['$timeout'];
    function dir3($timeout) {
        return {
            restrict: 'EAC',
            require: '?^skyMegaMenu',
            scope: true,
            controller: [function () {
            }],
            link: function (scope, elem, attr) {
                $timeout(function () {
                    angular.forEach(elem.find('a'), function (a) {
                        var attrs = [];
                        angular.forEach(angular.element(a)[0].attributes, function (attrr) {
                            attrs.push(attrr.name);
                        });

                        if (attrs.indexOf('stop-event') < 0) {
                            angular.element(a).bind('click', function (e) {
                                // console.log('clicked');

                                // Add hide
                                elem.addClass('hidden');
                                $timeout(function () {
                                    // Remove hidden
                                    elem.removeClass('hidden');
                                }, 100);
                            });
                        }
                    });
                }, 0);
            }
        };
    }
})();
sharedModule.directive('stopEvent', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            element.bind('click', function (e) {
                e.stopPropagation();
            });
        }
    };
});
(function () {
    'use strict';

    sharedModule.directive('stringBinding', dir);
    dir.$inject = [];
    function dir() {
        return {
            restrict: 'A',
            require: 'ngModel',
            priority: 1000,
            scope: {
                model: '=ngModel'
            },
            link: function (scope, element, attrs, ngModelCtrl) {
                if (scope.model && typeof scope.model === 'number') {
                    scope.model = scope.model.toString();
                }
            }
        };
    }
})();
(function () {
    'use strict';
    sharedModule.directive('timeago', dir);
    dir.$inject = [];

    function dir() {
        return {
            restrict: 'A',
            link: function ($scope, $element, attrs, ctrl, $transclude) {
                $scope.$watch(attrs.timeago, function (dte) {
                    if (dte == null) {
                        $element.text('');
                    } else {
                        //var el = $dir("")($scope);
                        $element.attr('title', moment(dte).format());
                        $element.text(moment(dte).fromNow());
                    }
                });
            }
        };
    }
})();
(function () {
    'use strict';
    sharedModule.directive('toggleButton', dir);
    dir.$inject = [];

    function dir() {
        return {
            require: 'ngModel',
            priority: 100,
            scope: {
                activeText: '@activeText',
                inactiveText: '@inactiveText',
                lightState: '=ngModel',
                onToggle: '&onSelected'
            },
            replace: true,
            transclude: true,
            template: '<div>' +
                '<span ng-transclude></span> ' +
                '<span class="btn-group {{cssclass}}"><button class="btn {{state.value ? \'btn-primary\': \'\'}}" ng-click="state.toggle()">{{activeText}}</button>' +
                '<button class="btn {{!state.value ? \'btn-primary\': \'\'}}" ng-click="state.toggle()">{{inactiveText}}</button>' +
                '</span></div>',
            link: function (scope, elem, attr) {
                scope.cssclass = attr.class;
                var hasModelValue = typeof scope.lightState !== 'undefined';

                scope.lightState = scope.lightState || scope.inactiveText;

                scope.state = {
                    value: hasModelValue ? scope.lightState === scope.activeText : false,
                    toggle: function () {
                        this.value = !this.value;
                        scope.lightState = this.value ? scope.activeText : scope.inactiveText;

                        scope.onToggle({ $toggleState: scope.lightState });
                    }
                };
            }
        };
    }
})();

angular.module('appSharedModule')
    .directive('videojs', function () {
        var linker = function (scope, element, attrs) {
            attrs.type = attrs.type || "video/" + scope.videoExtension;

            var setup = {
                'techOrder': ['html5'],
                'controls': true,
                'preload': 'auto',
                'autoplay': false,
                'fluid': true
            };

            attrs.id = "videojs" + window.randomString();
            element.attr('id', attrs.id);
            element.attr('poster', attrs.poster);

            var player = videojs(attrs.id, setup);
            player.src({
                src: scope.videoUrl + '#.' + scope.videoExtension,
                type: attrs.type
            });
            scope.$on('$destroy', function () {
                player.dispose();
            });
        };
        return {
            restrict: 'A',
            link: linker,
            scope: {
                videoUrl: '@',
                videoExtension: '@'
            }
        };
    });
(function () {
    'use strict';

    sharedModule
        .directive('zoom', [function () {
            function link(scope, element, attrs) {
                var $ = angular.element;
                var originalContainer = $(element[0].querySelector('.orig-container'));
                var original = $(element[0].querySelector('.original'));
                var originalImg = original.find('img');
                var zoomed = $(element[0].querySelector('.zoomed'));
                var zoomedImg = zoomed.find('img');

                var mark = $('<div id="markZoom"></div>')
                    .addClass('mark hide')
                    .css('position', 'absolute')
                    .css('height', scope.markHeight + 'px')
                    .css('width', scope.markWidth + 'px');

                $(originalContainer).append(mark);

                originalContainer
                    .on('mouseenter', function (evt) {
                        mark.removeClass('hide');
                        zoomed.addClass('in');

                        var offset = calculateOffset(evt);
                        moveMark(offset.X, offset.Y);
                    })
                    .on('mouseleave', function (evt) {
                        mark.addClass('hide');
                        zoomed.removeClass('in');
                    })
                    .on('mousemove', function (evt) {
                        var offset = calculateOffset(evt);
                        moveMark(offset.X, offset.Y);
                    });

                scope.$on('mark:moved', function (event, data) {
                    updateZoomed.apply(this, data);
                });

                function moveMark(offsetX, offsetY) {
                    var dx = scope.markWidth,
                        dy = scope.markHeight,
                        x = offsetX - dx / 2,
                        y = offsetY - dy / 2;

                    var img = document.getElementById('origZoomImg');
                    var ow = img.clientWidth - dx;
                    var oh = img.clientHeight - dx;

                    x = x >= 0 ? x : 0;
                    y = y >= 0 ? y : 0;

                    x = x <= ow ? x : ow;
                    y = y <= oh ? y : oh;

                    mark
                        .css('left', x + 'px')
                        .css('top', y + 'px');

                    scope.$broadcast('mark:moved', [
                        x, y, dx, dy, originalImg[0].height, originalImg[0].width
                    ]);
                }

                function updateZoomed(originalX, originalY, originalDx, originalDy, originalHeight, originalWidth) {

                    var zoomLvl = scope.zoomLvl;
                    scope.$apply(function () {
                        var img = document.getElementById('origZoomImg');
                        var ow = img.clientWidth + 50;
                        //ow = ow < 250 ? ow : 250;

                        zoomed
                            .css('height', zoomLvl * originalDy + 'px')
                            .css('width', zoomLvl * originalDx + 'px')
                            .css('left', ow + 'px');
                        zoomedImg
                            .attr('src', scope.src)
                            .css('height', zoomLvl * originalHeight + 'px')
                            .css('width', zoomLvl * originalWidth + 'px')
                            .css('left', -zoomLvl * originalX + 'px')
                            .css('top', -zoomLvl * originalY + 'px');
                    });
                }

                var rect;
                function calculateOffset(mouseEvent) {
                    rect = rect || mouseEvent.target.getBoundingClientRect();
                    var offsetX = mouseEvent.clientX - rect.left;
                    var offsetY = mouseEvent.clientY - rect.top;

                    return {
                        X: offsetX,
                        Y: offsetY
                    };
                }

                attrs.$observe('ngSrc', function (data) {
                    scope.src = attrs.ngSrc;
                }, true);


                attrs.$observe('zoomLvl', function (data) {
                    scope.zoomLvl = data;
                }, true);
            }

            return {
                restrict: 'EA',
                scope: {
                    markHeight: '@markHeight',
                    markWidth: '@markWidth',
                    src: '@zoomSrc',
                    zoomLvl: "@zoomLvl",
                    zoomAlt: "@zoomAlt"
                },
                template: [
                    '<div class="orig-container"><div class="original">',
                    '<img id="origZoomImg" ng-src="{{src}}" alt="{{zoomAlt}}"/>',
                    '</div>',
                    '<div class="zoomed fadde">',
                    '<img alt="{{zoomAlt}}"/>',
                    '</div></div>'
                ].join(''),
                link: link
            };
        }]);
})();
(function () {
    'use strict';
    sharedModule.controller('importExportPage', importExportPage);
    importExportPage.$inject = ['$scope'];

    function importExportPage($scope) {
        $scope.exportConfig = exportConfig;

        init();
        function init() {
            $scope.options = {
                importUrl: $scope.importUrl,
                importExportName: $scope.importExportName,
                validFileTypes: $scope.validFileTypes,
                options: null
            };
        }

        function exportConfig(url) {
            window.location.href = url || $scope.exportUrl;
        }

    }
})();
(function () {
    'use strict';
    sharedModule.controller('sageImport', sageImport);
    sageImport.$inject = ['$scope', '$rootScope', '$timeout', 'baseFactory', 'IMPORT_CONSTANTS'];

    function sageImport($scope, $rootScope, $timeout, baseFactory, IMPORT_CONSTANTS) {

        $scope.changeFile = changeFile;
        $scope.onFileSelect = onFileSelect;
        $scope.importConfig = importConfig;

        init();
        function init() {
            $scope.doc = {};
            if (!$scope.options)
                $scope.options = {};
            if (!$scope.options.fileLabel)
                $scope.options.fileLabel = 'File';
            if ($scope.options.existingDoc)
                $scope.doc = $scope.options.existingDoc;
        }

        //Upload Document


        function isFileValid(filename) {
            $scope.error = null;
            var fileParts = filename.toLowerCase().split('.');

            var validFileTypes = $scope.validFileTypes.split(',');
            var valid = false;

            angular.forEach(validFileTypes, function (fileType) {
                if (fileType === fileParts[fileParts.length - 1])
                    valid = true;
            });

            if (!valid)
                $scope.error = 'File is invalid';

            return valid;
        };

        function onFileSelect($files) {
            if (isFileValid($files[0].name)) {
                $scope.disableSubmitButton = true;
                $scope.progress = 0;
                $scope.upload = baseFactory
                .upload('/api/upload/file', { oldfolder: '' }, $files)
                .progress(function (evt) {
                    $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                }).success(function (data) {

                    if (!data.isErrored) {
                        resetInputFile();
                        $scope.doc.fileFolder = data.object.fileFolder;
                        $scope.doc.fileName = data.object.fileName;
                        $scope.doc.isUploaded = true;
                        if ($scope.options) {
                            $rootScope.$emit(IMPORT_CONSTANTS.FILE_IMPORTED + $scope.options.messageIdentifier, $scope.doc);
                            if ($scope.options.clearAfterImport)
                                changeFile();
                        }
                    }
                    $scope.disableSubmitButton = false;


                });
            } else {
                resetInputFile();
                changeFile();
            }
        };

        function changeFile() {
            $scope.doc = {};
        };


        function resetInputFile() {
            var elems = document.getElementsByTagName('input');
            for (var i = 0; i < elems.length; i++) {
                if (elems[i].type == 'file') {
                    elems[i].value = null;
                }
            }
        }

        function importConfig() {
            return baseFactory.fetch($scope.importUrl + '?filepath=' + '\\' + $scope.doc.fileFolder + '\\' + $scope.doc.fileName).then(function (rrdata) {
                if (rrdata.object !== null) {
                    resetInputFile();
                    changeFile();
                    $rootScope.$emit(IMPORT_CONSTANTS.FILE_IMPORTED_SAVED, rrdata.object);
                }
            });
        };
    }
})();
sharedModule.directive('sageImport',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                importUrl: '=',
                importExportName: '=',
                validFileTypes: '=',
                options: '='
                //hideImportButton: '=',
                //fileLabelName
            },
            templateUrl: '/app/modules/shared/directives/importExportPage/sageImport.html',
            controller: 'sageImport'
        };
    }]);
sharedModule.directive('sageImportExportPage',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                importUrl: '@',
                exportUrl: '@',
                importExportName: '@',
                validFileTypes: '@'
            },
            templateUrl: '/app/modules/shared/directives/importExportPage/importExportPage.html',
            controller: 'importExportPage'
        };
    }]);
sharedModule.directive('sageImportExportPage2',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                importUrl: '@',
                exportUrl: '@',
                importExportName: '@',
                validFileTypes: '@'
            },
            templateUrl: '/app/modules/shared/directives/importExportPage/importExportPage2.html',
            controller: 'importExportPage'
        };
    }]);
sharedModule.directive('sageImportExportPage3',
    [
    function () {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                importUrl: '@',
                exportUrl: '@',
                importExportName: '@',
                validFileTypes: '@'
            },
            templateUrl: '/app/modules/shared/directives/importExportPage/importExportPage3.html',
            controller: 'importExportPage'
        };
    }]);
/**
 * dirPagination - AngularJS module for paginating (almost) anything.
 *
 *
 * Credits
 * =======
 *
 * Daniel Tabuenca: https://groups.google.com/d/msg/angular/an9QpzqIYiM/r8v-3W1X5vcJ
 * for the idea on how to dynamically invoke the ng-repeat directive.
 *
 * I borrowed a couple of lines and a few attribute names from the AngularUI Bootstrap project:
 * https://github.com/angular-ui/bootstrap/blob/master/src/pagination/pagination.js
 *
 * Copyright 2014 Michael Bromley <michael@michaelbromley.co.uk>
 */

(function () {

    /**
     * Config
     */
    var moduleName = 'angularUtils.directives.dirPagination';
    var DEFAULT_ID = '__default';

    /**
     * Module
     */
    angular.module(moduleName, [])
        .directive('dirPaginate', ['$compile', '$parse', 'paginationService', dirPaginateDirective])
        .directive('dirPaginateNoCompile', noCompileDirective)
        .directive('dirPaginationControls', ['paginationService', 'paginationTemplate', dirPaginationControlsDirective])
        .filter('itemsPerPage', ['paginationService', itemsPerPageFilter])
        .service('paginationService', paginationService)
        .provider('paginationTemplate', paginationTemplateProvider)
        .run(['$templateCache', dirPaginationControlsTemplateInstaller]);

    function dirPaginateDirective($compile, $parse, paginationService) {

        return {
            terminal: true,
            multiElement: true,
            priority: 100,
            compile: dirPaginationCompileFn
        };

        function dirPaginationCompileFn(tElement, tAttrs) {

            var expression = tAttrs.dirPaginate;
            // regex taken directly from https://github.com/angular/angular.js/blob/v1.4.x/src/ng/directive/ngRepeat.js#L339
            var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);

            var filterPattern = /\|\s*itemsPerPage\s*:\s*(.*\(\s*\w*\)|([^\)]*?(?=\s+as\s+))|[^\)]*)/;
            if (match[2].match(filterPattern) === null) {
                throw 'pagination directive: the \'itemsPerPage\' filter must be set.';
            }
            var itemsPerPageFilterRemoved = match[2].replace(filterPattern, '');
            var collectionGetter = $parse(itemsPerPageFilterRemoved);

            addNoCompileAttributes(tElement);

            // If any value is specified for paginationId, we register the un-evaluated expression at this stage for the benefit of any
            // dir-pagination-controls directives that may be looking for this ID.
            var rawId = tAttrs.paginationId || DEFAULT_ID;
            paginationService.registerInstance(rawId);

            return function dirPaginationLinkFn(scope, element, attrs) {

                // Now that we have access to the `scope` we can interpolate any expression given in the paginationId attribute and
                // potentially register a new ID if it evaluates to a different value than the rawId.
                var paginationId = $parse(attrs.paginationId)(scope) || attrs.paginationId || DEFAULT_ID;
                // In case rawId != paginationId we deregister using rawId for the sake of general cleanliness
                // before registering using paginationId
                paginationService.deregisterInstance(rawId);
                paginationService.registerInstance(paginationId);

                var repeatExpression = getRepeatExpression(expression, paginationId);
                addNgRepeatToElement(element, attrs, repeatExpression);

                removeTemporaryAttributes(element);
                var compiled = $compile(element);

                var currentPageGetter = makeCurrentPageGetterFn(scope, attrs, paginationId);
                paginationService.setCurrentPageParser(paginationId, currentPageGetter, scope);

                if (typeof attrs.totalItems !== 'undefined') {
                    paginationService.setAsyncModeTrue(paginationId);
                    scope.$watch(function () {
                        return $parse(attrs.totalItems)(scope);
                    }, function (result) {
                        if (0 <= result) {
                            paginationService.setCollectionLength(paginationId, result);
                        }
                    });
                } else {
                    paginationService.setAsyncModeFalse(paginationId);
                    scope.$watchCollection(function () {
                        return collectionGetter(scope);
                    }, function (collection) {
                        if (collection) {
                            var collectionLength = (collection instanceof Array) ? collection.length : Object.keys(collection).length;
                            paginationService.setCollectionLength(paginationId, collectionLength);
                        }
                    });
                }

                // Delegate to the link function returned by the new compilation of the ng-repeat
                compiled(scope);

                // When the scope is destroyed, we make sure to remove the reference to it in paginationService
                // so that it can be properly garbage collected
                scope.$on('$destroy', function destroyDirPagination() {
                    paginationService.deregisterInstance(paginationId);
                });
            };
        }

        /**
         * If a pagination id has been specified, we need to check that it is present as the second argument passed to
         * the itemsPerPage filter. If it is not there, we add it and return the modified expression.
         *
         * @param expression
         * @param paginationId
         * @returns {*}
         */
        function getRepeatExpression(expression, paginationId) {
            var repeatExpression,
                idDefinedInFilter = !!expression.match(/(\|\s*itemsPerPage\s*:[^|]*:[^|]*)/);

            if (paginationId !== DEFAULT_ID && !idDefinedInFilter) {
                repeatExpression = expression.replace(/(\|\s*itemsPerPage\s*:\s*[^|\s]*)/, "$1 : '" + paginationId + "'");
            } else {
                repeatExpression = expression;
            }

            return repeatExpression;
        }

        /**
         * Adds the ng-repeat directive to the element. In the case of multi-element (-start, -end) it adds the
         * appropriate multi-element ng-repeat to the first and last element in the range.
         * @param element
         * @param attrs
         * @param repeatExpression
         */
        function addNgRepeatToElement(element, attrs, repeatExpression) {
            if (element[0].hasAttribute('dir-paginate-start') || element[0].hasAttribute('data-dir-paginate-start')) {
                // using multiElement mode (dir-paginate-start, dir-paginate-end)
                attrs.$set('ngRepeatStart', repeatExpression);
                element.eq(element.length - 1).attr('ng-repeat-end', true);
            } else {
                attrs.$set('ngRepeat', repeatExpression);
            }
        }

        /**
         * Adds the dir-paginate-no-compile directive to each element in the tElement range.
         * @param tElement
         */
        function addNoCompileAttributes(tElement) {
            angular.forEach(tElement, function (el) {
                if (el.nodeType === 1) {
                    angular.element(el).attr('dir-paginate-no-compile', true);
                }
            });
        }

        /**
         * Removes the variations on dir-paginate (data-, -start, -end) and the dir-paginate-no-compile directives.
         * @param element
         */
        function removeTemporaryAttributes(element) {
            angular.forEach(element, function (el) {
                if (el.nodeType === 1) {
                    angular.element(el).removeAttr('dir-paginate-no-compile');
                }
            });
            element.eq(0).removeAttr('dir-paginate-start').removeAttr('dir-paginate').removeAttr('data-dir-paginate-start').removeAttr('data-dir-paginate');
            element.eq(element.length - 1).removeAttr('dir-paginate-end').removeAttr('data-dir-paginate-end');
        }

        /**
         * Creates a getter function for the current-page attribute, using the expression provided or a default value if
         * no current-page expression was specified.
         *
         * @param scope
         * @param attrs
         * @param paginationId
         * @returns {*}
         */
        function makeCurrentPageGetterFn(scope, attrs, paginationId) {
            var currentPageGetter;
            if (attrs.currentPage) {
                currentPageGetter = $parse(attrs.currentPage);
            } else {
                // If the current-page attribute was not set, we'll make our own.
                // Replace any non-alphanumeric characters which might confuse
                // the $parse service and give unexpected results.
                // See https://github.com/michaelbromley/angularUtils/issues/233
                var defaultCurrentPage = (paginationId + '__currentPage').replace(/\W/g, '_');
                scope[defaultCurrentPage] = 1;
                currentPageGetter = $parse(defaultCurrentPage);
            }
            return currentPageGetter;
        }
    }

    /**
     * This is a helper directive that allows correct compilation when in multi-element mode (ie dir-paginate-start, dir-paginate-end).
     * It is dynamically added to all elements in the dir-paginate compile function, and it prevents further compilation of
     * any inner directives. It is then removed in the link function, and all inner directives are then manually compiled.
     */
    function noCompileDirective() {
        return {
            priority: 5000,
            terminal: true
        };
    }

    function dirPaginationControlsTemplateInstaller($templateCache) {
        $templateCache.put('angularUtils.directives.dirPagination.template', '<ul class="pagination" ng-if="1 < pages.length || !autoHide"><li ng-if="boundaryLinks" ng-class="{ disabled : pagination.current == 1 }"><a href="" ng-click="setCurrent(1)">&laquo;</a></li><li ng-if="directionLinks" ng-class="{ disabled : pagination.current == 1 }"><a href="" ng-click="setCurrent(pagination.current - 1)">&lsaquo;</a></li><li ng-repeat="pageNumber in pages track by tracker(pageNumber, $index)" ng-class="{ active : pagination.current == pageNumber, disabled : pageNumber == \'...\' || ( ! autoHide && pages.length === 1 ) }"><a href="" ng-click="setCurrent(pageNumber)">{{ pageNumber }}</a></li><li ng-if="directionLinks" ng-class="{ disabled : pagination.current == pagination.last }"><a href="" ng-click="setCurrent(pagination.current + 1)">&rsaquo;</a></li><li ng-if="boundaryLinks"  ng-class="{ disabled : pagination.current == pagination.last }"><a href="" ng-click="setCurrent(pagination.last)">&raquo;</a></li></ul>');
    }

    function dirPaginationControlsDirective(paginationService, paginationTemplate) {

        var numberRegex = /^\d+$/;

        var DDO = {
            restrict: 'AE',
            scope: {
                maxSize: '=?',
                onPageChange: '&?',
                paginationId: '=?',
                autoHide: '=?'
            },
            link: dirPaginationControlsLinkFn
        };

        // We need to check the paginationTemplate service to see whether a template path or
        // string has been specified, and add the `template` or `templateUrl` property to
        // the DDO as appropriate. The order of priority to decide which template to use is
        // (highest priority first):
        // 1. paginationTemplate.getString()
        // 2. attrs.templateUrl
        // 3. paginationTemplate.getPath()
        var templateString = paginationTemplate.getString();
        if (templateString !== undefined) {
            DDO.template = templateString;
        } else {
            DDO.templateUrl = function (elem, attrs) {
                return attrs.templateUrl || paginationTemplate.getPath();
            };
        }
        return DDO;

        function dirPaginationControlsLinkFn(scope, element, attrs) {

            // rawId is the un-interpolated value of the pagination-id attribute. This is only important when the corresponding dir-paginate directive has
            // not yet been linked (e.g. if it is inside an ng-if block), and in that case it prevents this controls directive from assuming that there is
            // no corresponding dir-paginate directive and wrongly throwing an exception.
            var rawId = attrs.paginationId || DEFAULT_ID;
            var paginationId = scope.paginationId || attrs.paginationId || DEFAULT_ID;

            if (!paginationService.isRegistered(paginationId) && !paginationService.isRegistered(rawId)) {
                var idMessage = (paginationId !== DEFAULT_ID) ? ' (id: ' + paginationId + ') ' : ' ';
                if (window.console) {
                    console.warn('Pagination directive: the pagination controls' + idMessage + 'cannot be used without the corresponding pagination directive, which was not found at link time.');
                }
            }

            if (!scope.maxSize) { scope.maxSize = 9; }
            scope.autoHide = scope.autoHide === undefined ? true : scope.autoHide;
            scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : true;
            scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : false;

            var paginationRange = Math.max(scope.maxSize, 5);
            scope.pages = [];
            scope.pagination = {
                last: 1,
                current: 1
            };
            scope.range = {
                lower: 1,
                upper: 1,
                total: 1
            };

            scope.$watch('maxSize', function (val) {
                if (val) {
                    paginationRange = Math.max(scope.maxSize, 5);
                    generatePagination();
                }
            });

            scope.$watch(function () {
                if (paginationService.isRegistered(paginationId)) {
                    return (paginationService.getCollectionLength(paginationId) + 1) * paginationService.getItemsPerPage(paginationId);
                }
            }, function (length) {
                if (0 < length) {
                    generatePagination();
                }
            });

            scope.$watch(function () {
                if (paginationService.isRegistered(paginationId)) {
                    return (paginationService.getItemsPerPage(paginationId));
                }
            }, function (current, previous) {
                if (current != previous && typeof previous !== 'undefined') {
                    goToPage(scope.pagination.current);
                }
            });

            scope.$watch(function () {
                if (paginationService.isRegistered(paginationId)) {
                    return paginationService.getCurrentPage(paginationId);
                }
            }, function (currentPage, previousPage) {
                if (currentPage != previousPage) {
                    goToPage(currentPage);
                }
            });

            scope.setCurrent = function (num) {
                if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) {
                    num = parseInt(num, 10);
                    paginationService.setCurrentPage(paginationId, num);
                }
            };

            /**
             * Custom "track by" function which allows for duplicate "..." entries on long lists,
             * yet fixes the problem of wrongly-highlighted links which happens when using
             * "track by $index" - see https://github.com/michaelbromley/angularUtils/issues/153
             * @param id
             * @param index
             * @returns {string}
             */
            scope.tracker = function (id, index) {
                return id + '_' + index;
            };

            function goToPage(num) {
                if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) {
                    var oldPageNumber = scope.pagination.current;

                    scope.pages = generatePagesArray(num, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange);
                    scope.pagination.current = num;
                    updateRangeValues();

                    // if a callback has been set, then call it with the page number as the first argument
                    // and the previous page number as a second argument
                    if (scope.onPageChange) {
                        scope.onPageChange({
                            newPageNumber: num,
                            oldPageNumber: oldPageNumber
                        });
                    }
                }
            }

            function generatePagination() {
                if (paginationService.isRegistered(paginationId)) {
                    var page = parseInt(paginationService.getCurrentPage(paginationId)) || 1;
                    scope.pages = generatePagesArray(page, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange);
                    scope.pagination.current = page;
                    scope.pagination.last = scope.pages[scope.pages.length - 1];
                    if (scope.pagination.last < scope.pagination.current) {
                        scope.setCurrent(scope.pagination.last);
                    } else {
                        updateRangeValues();
                    }
                }
            }

            /**
             * This function updates the values (lower, upper, total) of the `scope.range` object, which can be used in the pagination
             * template to display the current page range, e.g. "showing 21 - 40 of 144 results";
             */
            function updateRangeValues() {
                if (paginationService.isRegistered(paginationId)) {
                    var currentPage = paginationService.getCurrentPage(paginationId),
                        itemsPerPage = paginationService.getItemsPerPage(paginationId),
                        totalItems = paginationService.getCollectionLength(paginationId);

                    scope.range.lower = (currentPage - 1) * itemsPerPage + 1;
                    scope.range.upper = Math.min(currentPage * itemsPerPage, totalItems);
                    scope.range.total = totalItems;
                }
            }
            function isValidPageNumber(num) {
                return (numberRegex.test(num) && (0 < num && num <= scope.pagination.last));
            }
        }

        /**
         * Generate an array of page numbers (or the '...' string) which is used in an ng-repeat to generate the
         * links used in pagination
         *
         * @param currentPage
         * @param rowsPerPage
         * @param paginationRange
         * @param collectionLength
         * @returns {Array}
         */
        function generatePagesArray(currentPage, collectionLength, rowsPerPage, paginationRange) {
            var pages = [];
            var totalPages = Math.ceil(collectionLength / rowsPerPage);
            var halfWay = Math.ceil(paginationRange / 2);
            var position;

            if (currentPage <= halfWay) {
                position = 'start';
            } else if (totalPages - halfWay < currentPage) {
                position = 'end';
            } else {
                position = 'middle';
            }

            var ellipsesNeeded = paginationRange < totalPages;
            var i = 1;
            while (i <= totalPages && i <= paginationRange) {
                var pageNumber = calculatePageNumber(i, currentPage, paginationRange, totalPages);

                var openingEllipsesNeeded = (i === 2 && (position === 'middle' || position === 'end'));
                var closingEllipsesNeeded = (i === paginationRange - 1 && (position === 'middle' || position === 'start'));
                if (ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)) {
                    pages.push('...');
                } else {
                    pages.push(pageNumber);
                }
                i++;
            }
            return pages;
        }

        /**
         * Given the position in the sequence of pagination links [i], figure out what page number corresponds to that position.
         *
         * @param i
         * @param currentPage
         * @param paginationRange
         * @param totalPages
         * @returns {*}
         */
        function calculatePageNumber(i, currentPage, paginationRange, totalPages) {
            var halfWay = Math.ceil(paginationRange / 2);
            if (i === paginationRange) {
                return totalPages;
            } else if (i === 1) {
                return i;
            } else if (paginationRange < totalPages) {
                if (totalPages - halfWay < currentPage) {
                    return totalPages - paginationRange + i;
                } else if (halfWay < currentPage) {
                    return currentPage - halfWay + i;
                } else {
                    return i;
                }
            } else {
                return i;
            }
        }
    }

    /**
     * This filter slices the collection into pages based on the current page number and number of items per page.
     * @param paginationService
     * @returns {Function}
     */
    function itemsPerPageFilter(paginationService) {

        return function (collection, itemsPerPage, paginationId) {
            if (typeof (paginationId) === 'undefined') {
                paginationId = DEFAULT_ID;
            }
            if (!paginationService.isRegistered(paginationId)) {
                throw 'pagination directive: the itemsPerPage id argument (id: ' + paginationId + ') does not match a registered pagination-id.';
            }
            var end;
            var start;
            if (angular.isObject(collection)) {
                itemsPerPage = parseInt(itemsPerPage) || 9999999999;
                if (paginationService.isAsyncMode(paginationId)) {
                    start = 0;
                } else {
                    start = (paginationService.getCurrentPage(paginationId) - 1) * itemsPerPage;
                }
                end = start + itemsPerPage;
                paginationService.setItemsPerPage(paginationId, itemsPerPage);

                if (collection instanceof Array) {
                    // the array just needs to be sliced
                    return collection.slice(start, end);
                } else {
                    // in the case of an object, we need to get an array of keys, slice that, then map back to
                    // the original object.
                    var slicedObject = {};
                    angular.forEach(keys(collection).slice(start, end), function (key) {
                        slicedObject[key] = collection[key];
                    });
                    return slicedObject;
                }
            } else {
                return collection;
            }
        };
    }

    /**
     * Shim for the Object.keys() method which does not exist in IE < 9
     * @param obj
     * @returns {Array}
     */
    function keys(obj) {
        if (!Object.keys) {
            var objKeys = [];
            for (var i in obj) {
                if (obj.hasOwnProperty(i)) {
                    objKeys.push(i);
                }
            }
            return objKeys;
        } else {
            return Object.keys(obj);
        }
    }

    /**
     * This service allows the various parts of the module to communicate and stay in sync.
     */
    function paginationService() {

        var instances = {};
        var lastRegisteredInstance;

        this.registerInstance = function (instanceId) {
            if (typeof instances[instanceId] === 'undefined') {
                instances[instanceId] = {
                    asyncMode: false
                };
                lastRegisteredInstance = instanceId;
            }
        };

        this.deregisterInstance = function (instanceId) {
            delete instances[instanceId];
        };

        this.isRegistered = function (instanceId) {
            return (typeof instances[instanceId] !== 'undefined');
        };

        this.getLastInstanceId = function () {
            return lastRegisteredInstance;
        };

        this.setCurrentPageParser = function (instanceId, val, scope) {
            instances[instanceId].currentPageParser = val;
            instances[instanceId].context = scope;
        };
        this.setCurrentPage = function (instanceId, val) {
            instances[instanceId].currentPageParser.assign(instances[instanceId].context, val);
        };
        this.getCurrentPage = function (instanceId) {
            var parser = instances[instanceId].currentPageParser;
            return parser ? parser(instances[instanceId].context) : 1;
        };

        this.setItemsPerPage = function (instanceId, val) {
            instances[instanceId].itemsPerPage = val;
        };
        this.getItemsPerPage = function (instanceId) {
            return instances[instanceId].itemsPerPage;
        };

        this.setCollectionLength = function (instanceId, val) {
            instances[instanceId].collectionLength = val;
        };
        this.getCollectionLength = function (instanceId) {
            return instances[instanceId].collectionLength;
        };

        this.setAsyncModeTrue = function (instanceId) {
            instances[instanceId].asyncMode = true;
        };

        this.setAsyncModeFalse = function (instanceId) {
            instances[instanceId].asyncMode = false;
        };

        this.isAsyncMode = function (instanceId) {
            return instances[instanceId].asyncMode;
        };
    }

    /**
     * This provider allows global configuration of the template path used by the dir-pagination-controls directive.
     */
    function paginationTemplateProvider() {

        var templatePath = 'angularUtils.directives.dirPagination.template';
        var templateString;

        /**
         * Set a templateUrl to be used by all instances of <dir-pagination-controls>
         * @param {String} path
         */
        this.setPath = function (path) {
            templatePath = path;
        };

        /**
         * Set a string of HTML to be used as a template by all instances
         * of <dir-pagination-controls>. If both a path *and* a string have been set,
         * the string takes precedence.
         * @param {String} str
         */
        this.setString = function (str) {
            templateString = str;
        };

        this.$get = function () {
            return {
                getPath: function () {
                    return templatePath;
                },
                getString: function () {
                    return templateString;
                }
            };
        };
    }
})();
(function () {
    'use strict';
    angular.module('appSharedModule')
        .config(['$httpProvider', function ($httpProvider) {
            $httpProvider.interceptors.push(['$injector', function ($injector) {
                return $injector.get('AuthInterceptor');
            }]);
        }])
        .factory('AuthInterceptor', ["$rootScope", "$injector", "$q", function ($rootScope, $injector, $q) {
            return {
                responseError: function (response) {
                    if (response.status === 401) {
                        console.log('not authorized');
                        if (response.config.method === "POST" || response.config.method === "DELETE" || response.config.method === "PUT")
                            $rootScope.$broadcast('auth-not-authenticated', response);
                    }
                    if (response.status === 403) {
                        console.log('not authorized');
                        // $rootScope.$broadcast(AUTH_EVENTS.notAuthorized, response);
                    }
                    if (response.status === 419 || response.status === 440) {
                        console.log('session timeout');
                        // $rootScope.$broadcast(AUTH_EVENTS.sessionTimeout, response);
                    }
                    if (response.status === 404) {
                        console.log('not found');
                        if (response.config.headers['Accept'].indexOf('text/html') >= 0)
                            $injector.get('$state').go('anonymous.http404');
                    }
                    if (response.status === 500) {
                        console.log('server error');
                        $injector.get('$state').go('anonymous.http500');
                    }
                    return $q.reject(response);
                }
            };
        }])
        .factory('SessionService', ['$rootScope', '$cookies', '$cookieStore', function ($rootScope, $cookies, $cookieStore) {
            var getCookie = function () {
                try {
                    var userData = angular.fromJson($cookies.get(CLIENT_NAME + '_D'));

                    if (typeof $rootScope.currentUser === 'undefined') {
                        $rootScope.currentUser = {
                            id: userData.id,
                            userId: userData.userId,
                            fullName: userData.fullName,
                            email: userData.email,
                            username: userData.username,
                            roles: userData.roles,
                            isSysAdmin: userData.isSysAdmin,
                            photoThumbnailUrl: userData.photoThumbnailUrl,
                            permissions: userData.permissions
                        };
                    }

                    return userData;
                } catch (er) {
                    return {
                        id: null,
                        userId: null,
                        userRoles: []
                    };
                }
            };
            var getId = function () {
                return getCookie().id;
            };
            var getUserId = function () {
                return getCookie().userId;
            };
            var getUserRoles = function () {
                return getCookie().roles;
            };
            var getAccessToken = function () {
                return getCookie().accessToken;
            };
            var getIsAdmin = function () {
                return getCookie().isAdmin;
            };
            var getPhotoThumbnailUrl = function () {
                return getCookie().photoThumbnailUrl;
            };
            return {
                id: getId(),
                userId: getUserId(),
                userRoles: getUserRoles(),
                accessToken: getAccessToken(),
                photoThumbnailUrl: getPhotoThumbnailUrl(),
                isAdmin: getIsAdmin(),
                create: function (user, callback) {
                    var sessionId = 0;
                    var userId = user.userId;
                    var username = user.username;
                    var email = user.email;
                    var userRoles = user.roles;
                    var fullName = user.fullName;
                    var isSysAdmin = user.isSysAdmin;
                    var photoThumbnailUrl = user.photoThumbnailUrl;
                    var permissions = user.permissions;

                    $cookies.put(CLIENT_NAME + '_D', angular.toJson({
                        id: sessionId,
                        userId: userId,
                        roles: userRoles,
                        fullName: fullName,
                        username: username,
                        email: email,
                        isSysAdmin: isSysAdmin,
                        photoThumbnailUrl: photoThumbnailUrl
                    }));

                    $rootScope.currentUser = {
                        id: sessionId,
                        userId: userId,
                        roles: userRoles,
                        fullName: fullName,
                        username: username,
                        email: email,
                        isSysAdmin: isSysAdmin,
                        photoThumbnailUrl: photoThumbnailUrl,
                        permissions: permissions
                    };

                    this.id = sessionId;
                    this.userId = userId;
                    this.username = username;
                    this.fullName = fullName;
                    this.roles = userRoles;
                    this.isSysAdmin = isSysAdmin;
                    this.photoThumbnailUrl = photoThumbnailUrl;

                    if (typeof callback !== "undefined")
                        return callback();
                    return;
                },
                checkRoles: function (authorizedRoles) {
                    console.log(this.roles, authorizedRoles);
                    var userRoles = [];

                    angular.forEach(this.roles, function (usr) {
                        userRoles.push(usr.toLowerCase());
                    });

                    var countTrue = 0;
                    for (var i = 0; i < authorizedRoles.length; i++) {
                        var role = authorizedRoles[i];
                        if (role == '*') {
                            countTrue++;
                            continue;
                        }

                        if (userRoles.indexOf(role) >= 0) {
                            countTrue++;
                        }
                    }

                    return countTrue > 0;
                },
                destroy: function () {
                    this.id = null;
                    this.userId = null;
                    this.username = null;
                    this.fullName = null;
                    this.roles = null;
                    this.isSysAdmin = null;
                    this.photoThumbnailUrl = null;
                    $cookieStore.remove(CLIENT_NAME + '_D');
                }
            };
        }]);

})();
(function () {
    'use strict';
    angular.module('appSharedModule').factory('baseFactory',
        ['$http', '$location', '$state', '$rootScope', 'progressbar', '$q', '$timeout', 'toaster', 'CLIENT_DATA', 'ALLOWED_ANONYMOUS_ACCESS', '$upload',
            function ($http, $location, $state, $rootScope, progressbar, $q, $timeout, toaster, CLIENT_DATA, ALLOWED_ANONYMOUS_ACCESS, $upload) {

                var deferredAbort = $q.defer();

                function setBuildNumberFromResponse(response) {
                    if (response && response.data && response.data.buildNumber && response.data.buildNumber.length > 0 && $rootScope.buildNumber != response.data.buildNumber) {
                        $rootScope.buildNumber = response.data.buildNumber;
                    }
                }

                var handleNotification = function (data) {
                    var isErrored = false;

                    if (data.notification != null) {
                        var nn = data.notification;
                        //this is passed back if any of the returned notifications are ERROR or WARNING.
                        isErrored = !(nn.type == 'success' || nn.type == 'info');
                        if (nn.notify && $location.path() != '/login')
                            toaster.pop(nn.type, "", nn.message, timeout);

                    } else if (data.notifications != null && data.notifications.length > 0) {
                        var notifications = data.notifications;

                        //this is passed back if any of the returned notifications are ERROR or WARNING.
                        isErrored = false;

                        angular.forEach(notifications, function (n) {
                            if (!isErrored)
                                isErrored = !(n.type == 'success' || n.type == 'info');

                            if (n.notify && $location.path() != '/login')
                                toaster.pop(n.type, "", n.message);
                        });
                    }

                    // console.log($state.current.name);
                    return isErrored;
                };

                var timeout = 4000;

                var getErrorMessage = function (response) {
                    var errMsg = null;
                    if (response.data != null) {
                        if (response.data.message)
                            errMsg = response.data.message;

                        if (response.data.exceptionMessage) {
                            if (errMsg)
                                errMsg += ': ' + response.data.exceptionMessage;
                            else
                                errMsg = response.data.exceptionMessage;
                        }
                    }
                    return errMsg;
                };

                var handleErrors = function (response) {
                    if ($state.current.noLoginRequired) {
                        return { object: response.data };
                    }

                    if (typeof $rootScope.noLoginRequiredRoutes !== 'undefined')
                        if ($rootScope.noLoginRequiredRoutes.indexOf($location.path()) >= 0) {
                            return { object: response.data };
                        }

                    //unauthorised
                    if (response.status === 401 && !response.config.ignoreAuthModule) {
                        $http({
                            method: "GET",
                            url: IS_AUTHORISED_URL
                        }).then(
                            function (result) { //onSuccess
                                //called the method successfully. The user is logged in
                                if (result && result.data) {
                                    $state.go('base.home');
                                    $rootScope.Unauthorised = true;
                                } else {
                                    if ($rootScope.clientName && ALLOWED_ANONYMOUS_ACCESS.indexOf($rootScope.clientName) < 0) {
                                        $location.path('/login');
                                    }
                                }
                            },
                            function () {

                                //failure. The user is not logged in. redirect them to the login
                                if ($rootScope.clientName && ALLOWED_ANONYMOUS_ACCESS.indexOf($rootScope.clientName) < 0) {
                                    $location.path('/login');
                                } else {
                                    if ($location.$$path != "/") {
                                        if ($rootScope.clientName == 'Fildes') {
                                            if (!$rootScope.nextState.noLoginRequired)
                                                $state.go('base.home');
                                        } else {
                                            $state.go('base.home');
                                        }
                                    }
                                }
                            });
                        return { object: response.data };
                    }
                    var errMsg = getErrorMessage(response);
                    if (errMsg)
                        toastr.error(errMsg);
                    // return response.data;
                    return { object: response.data };
                };

                var handleNotifications = function (notifications, isPersistError, isNotify, isNotifyWarning) {
                    var SUCCESS = 0;
                    var ERROR = 1;
                    var INFO = 2;
                    var WARNING = 3;
                    var isperr = typeof isPersistError === 'undefined' ? false : isPersistError;
                    var isnotiff = typeof isNotify === 'undefined' ? true : isNotify;
                    isNotifyWarning = typeof isNotifyWarning === 'undefined' ? true : isNotifyWarning;

                    //this is passed back if any of the returned notifications are ERROR or WARNING.
                    var isErrored = false;

                    angular.forEach(notifications, function (notification) {

                        switch (notification.validationType) {
                            case SUCCESS:
                                if (isnotiff)
                                    toastr.success(notification.errorMessage);
                                break;
                            case ERROR:
                                toastr.error(notification.errorMessage, '', {
                                    timeOut: isperr ? 0 : timeout
                                });
                                isErrored = true;
                                break;
                            case INFO:
                                toastr.info(notification.errorMessage);
                                break;
                            case WARNING:
                                if (isNotifyWarning)
                                    toastr.warning(notification.errorMessage);
                                isErrored = true;
                                break;
                        }
                    });

                    return isErrored;
                };

                return {
                    simplecall: function (method, url, model) {

                        var config = {
                            ClientKey: 1,
                            IsMobile: false
                        };
                        return $http({
                            method: method,
                            headers: config,
                            url: url,
                            data: model,
                            ignoreLoadingBar: true,
                            cache: false
                        }).then(
                            function (response) { //onSuccess
                                setBuildNumberFromResponse(response);
                                response.data.isErrored = false;
                                return response.data;
                            },
                            function () { //onError
                                return { isErrored: true };
                            }
                        );
                    },
                    post: function (url, model, isNotifyOnSuccess, isNotifyOnwarning) {
                        //if (getAccessToken() == null)
                        //    return null;
                        progressbar.start();

                        var config = {
                            ClientKey: 1,
                            IsMobile: false
                        };

                        // check if its a moment date
                        var newModel = angular.copy(model);
                        var dateArr = ['date', 'orderDate', 'deliveryDate', 'upliftDate'];
                        if (url.indexOf('/api/calendar/saveEvent') < 0) {
                            dateArr.push('start');
                            dateArr.push('end');
                        }

                        if (Array.isArray(newModel)) {
                            angular.forEach(newModel, function (m) {
                                angular.forEach(dateArr, function (param) {
                                    if (typeof m[param] !== "undefined" && m[param] !== null) {
                                        if (typeof m[param] !== "string") {
                                            m[param] = moment(m[param]).format('YYYY-MM-DD');
                                        } else if (moment(m[param]).isValid()) {
                                            m[param] = moment(m[param]).format('YYYY-MM-DD');
                                        }
                                    }
                                });
                            });
                        } else if (typeof newModel === "object") {
                            var checkProperty = function (obj) {
                                for (var k in obj) {
                                    if (dateArr.indexOf(k) >= 0) {
                                        obj[k] = moment(obj[k]).format('YYYY-MM-DD');
                                    } else if (typeof obj[k] === "object") {
                                        checkProperty(obj[k]);
                                    }
                                }
                            };
                            checkProperty(newModel);
                        }

                        toastr.clear();

                        return $http({
                            method: 'POST',
                            headers: config,
                            url: url,
                            data: newModel,
                            timeout: deferredAbort.promise
                        }).then(
                            function (response) { //onSuccess
                                setBuildNumberFromResponse(response);
                                try {
                                    response.data.isErrored = handleNotifications(response.data.errors, response.data.isPersistError, isNotifyOnSuccess, isNotifyOnwarning);
                                } catch (er) {
                                    // console.log(response);
                                } finally {
                                    progressbar.complete();
                                    return response.data;
                                }
                            },
                            function (response) { //onError
                                setBuildNumberFromResponse(response);
                                response.data.isErrored = true;
                                if ($location.path() != '/login')
                                    if (response.data == "") {
                                        toaster.pop('error', response.status + " Error", "Server error");
                                    } else {
                                        toaster.pop('error', "", response.data.message + ': ' + response.data.exceptionMessage, timeout);
                                    }
                                progressbar.complete();
                                return response.data;
                            }
                        );
                    },
                    put: function (url, model) {
                        return $http({
                            method: 'PUT',
                            url: url,
                            data: model
                        }).then(
                            function (response) { //onSuccess
                                setBuildNumberFromResponse(response);
                                response.data.isErrored = handleNotifications(response.data.errors);
                                return response.data;
                            },
                            handleErrors
                        );
                    },
                    call: function (url, data) {
                        return $http.post(url, data)
                            .then(
                                function (response) { //onSuccess
                                    setBuildNumberFromResponse(response);
                                    response.data.isErrored = handleNotifications(response.data.errors);
                                    return response.data;
                                },
                                handleErrors
                            );
                    },
                    remove: function (url, model) {
                        //need to write delete method this way as delete is a reserved word in IE8
                        return $http.post(url, model)
                            .then(
                                function (response) { //onSuccess
                                    setBuildNumberFromResponse(response);
                                    response.data.isErrored = handleNotifications(response.data.errors);
                                    return response.data;
                                },
                                handleErrors
                            );
                    },
                    //fetch is used for GETs. Must use a different func as we are passing values back with the params property
                    //rather than the data property
                    fetch: function (url, params) {
                        return $http({
                            method: "GET",
                            url: url,
                            params: params
                        }).then(
                            function (response) { //onSuccess
                                setBuildNumberFromResponse(response);
                                if (typeof response.data.errors !== 'undefined') {//unhandled error.
                                    response.data.isErrored = handleNotifications(response.data.errors);
                                }

                                if (typeof response.data.exceptionMessage !== 'undefined') {
                                    toastr.error(response.data.exceptionMessage);
                                }
                                return response.data;
                            }, handleErrors);
                    },
                    //
                    typeAheadFetch: function (url, filterStr, id) {
                        if (filterStr.length < 3)
                            return [];

                        var params = { s: filterStr };
                        if (id)
                            params.id = id;

                        return this.fetch(
                            url,
                            params
                        ).then(
                            function (response) { //onSuccess
                                setBuildNumberFromResponse(response);
                                return response.object === 'null' ? [] : response.object;
                            },
                            function () { //onError
                                return [];
                            }
                        );
                    },
                    upload: function (url, model, files, isNotifyOnSuccess) {
                        var config = {
                            ClientKey: 1,
                            IsMobile: true
                        };
                        return $upload
                            .upload({
                                url: CLIENT_DATA.api_http + url + '?' + $rootScope.objToParam(model),
                                headers: config,
                                method: 'POST',
                                file: files[0]
                            })
                            .success(function (response) {
                                setBuildNumberFromResponse(response);
                                if (typeof response.errors !== 'undefined') {//unhandled error.
                                    response.isErrored = handleNotifications(response.errors, response.isPersistError, isNotifyOnSuccess);
                                }

                                if (typeof response.exceptionMessage !== 'undefined') {
                                    toastr.error(response.exceptionMessage);
                                }
                                return response;
                            }).error(function (response) {
                                return response;
                            });
                    },
                    genericGet: function (url, params) {
                        return this.fetch(url, params)
                            .then(function (response) {
                                setBuildNumberFromResponse(response);
                                return response.object;
                            });
                    },
                    //
                    genericPost: function (url, params) {
                        return this.call(url, params)
                            .then(function (response) {
                                setBuildNumberFromResponse(response);
                                return response.object;
                            });
                    }
                };
            }]);
})();
(function () {
    'use strict';
    sharedModule.factory("clientHelperFactory", ['$rootScope', function ($rootScope) {
        var isTwcClient = function () {
            var hasClientRole = false;

            var notClients = ["TWC", "RETAILBLINDS"];
            if (!$rootScope.clientName || notClients.indexOf($rootScope.clientName) < 0) {
                return false;
            }

            if (!$rootScope.user) {
                return false;
            }

            angular.forEach($rootScope.user.roles, function (role) {
                if (role.trim().toLowerCase() === "client admin" || role.trim().toLowerCase() === "client user") {
                    hasClientRole = true;
                }
            });
            return hasClientRole;
        };

        var isTwcWorkOrderScanning = function () {
            var hasClientRole = false;

            var notClients = ["TWC"];
            if (!$rootScope.clientName || notClients.indexOf($rootScope.clientName) < 0) {
                return false;
            }

            if (!$rootScope.user) {
                return false;
            }

            angular.forEach($rootScope.user.roles, function (role) {
                if (role.trim().toLowerCase() === "work order scanning") {
                    hasClientRole = true;
                }
            });
            return hasClientRole;
        };

        return {
            isTwcClient: function () {
                return isTwcClient();
            },
            isTwcWorkOrderScanning: function () {
                return isTwcWorkOrderScanning();
            }
        };
    }]);
})();
// http://unscriptable.com/2009/03/20/debouncing-javascript-methods/
// adapted from angular's $timeout code
sharedModule.factory('$debounce', ['$rootScope', '$browser', '$q', '$exceptionHandler',
    function ($rootScope, $browser, $q, $exceptionHandler) {
        var deferreds = {},
            methods = {},
            uuid = 0;

        function debounce(fn, delay, invokeApply) {
            var deferred = $q.defer(),
                promise = deferred.promise,
                skipApply = (angular.isDefined(invokeApply) && !invokeApply),
                timeoutId, cleanup,
                methodId, bouncing = false;

            // check we dont have this method already registered
            angular.forEach(methods, function (value, key) {
                if (angular.equals(methods[key].fn, fn)) {
                    bouncing = true;
                    methodId = key;
                }
            });

            // not bouncing, then register new instance
            if (!bouncing) {
                methodId = uuid++;
                methods[methodId] = { fn: fn };
            } else {
                // clear the old timeout
                deferreds[methods[methodId].timeoutId].reject('bounced');
                $browser.defer.cancel(methods[methodId].timeoutId);
            }

            var debounced = function () {
                // actually executing? clean method bank
                delete methods[methodId];

                try {
                    deferred.resolve(fn());
                } catch (e) {
                    deferred.reject(e);
                    $exceptionHandler(e);
                }

                if (!skipApply) $rootScope.$apply();
            };

            timeoutId = $browser.defer(debounced, delay);

            // track id with method
            methods[methodId].timeoutId = timeoutId;

            cleanup = function (reason) {
                delete deferreds[promise.$$timeoutId];
            };

            promise.$$timeoutId = timeoutId;
            deferreds[timeoutId] = deferred;
            promise.then(cleanup, cleanup);

            return promise;
        }


        // similar to angular's $timeout cancel
        debounce.cancel = function (promise) {
            if (promise && promise.$$timeoutId in deferreds) {
                deferreds[promise.$$timeoutId].reject('canceled');
                return $browser.defer.cancel(promise.$$timeoutId);
            }
            return false;
        };

        return debounce;
    }]);
(function () {
    'use strict';
    sharedModule.factory('enumFactory', ['$rootScope', 'baseFactory', function ($rootScope, baseFactory) {
        return {
            getEnumsFromServer: function () {
                return baseFactory.fetch(
                    'api/system/getEnums',
                    {}
                ).then(function (data) {
                    $rootScope.enums = data.object;
                    return true;
                }, function (data) {
                    return false;
                });
            },

            getEnum: function (name) {
                if ($rootScope.enums) {
                    var retValues = null;
                    angular.forEach($rootScope.enums, function (enumVal) {
                        if (enumVal.name.toLowerCase() == name.toLowerCase()) {
                            retValues = enumVal.values;
                        }
                    });
                    return retValues;
                } else {
                    return null;
                }
            },

            getEnumId: function (values, name) {
                if (typeof name === 'undefined')
                    return null;
                var val;
                angular.forEach(values, function (enumVal) {
                    if (name.toLowerCase() === enumVal.value.toLowerCase())
                        val = enumVal;
                });
                return val ? val.id : null;
            },

            getSelectedEnum: function (name, id) {
                var selectedEnum = this.getEnum(name);
                var retEnum;
                angular.forEach(selectedEnum, function (enumVal) {
                    if (id === enumVal.id)
                        retEnum = enumVal;
                });
                return retEnum;
            }
        };
    }]);
})();
(function () {
    'use strict';
    sharedModule.factory('gridControlTemplateFactory', [function () {

        var getDropdownStart = function (permRequired) {
            var template = permRequired ? '<div perm-required="' + permRequired + '" class="controls">' : '<div class="controls">';
            template += '<div class="btn-group"> ' +
                        '<button type="button" class="btn btn-xs btn-primary dropdown-toggle" data-toggle="dropdown">' +
                        '<span class="glyphicon glyphicon-cog"></span> <span class="caret"></span>' +
                        '</button>' +
                        '<ul class="dropdown-menu" role="menu">';

            return template;
        };

        var getDropdownEnd = function () {
            return '</ul></div></div>';
        };

        return {
            setDocCellTemplate: function () {
                return '<div class="media">' +
                    '<div class="media-left media-middle">' +
                    '<a href="#">' +
                    '<i class=\"fi fi-{{row.entity.fileExtension}}\"></i>' +
                    '</a>' +
                    '</div>' +
                    '<div class="media-body">' +
                    '<a class=\"dx-link text-bold\" href=\"{{row.entity.link}}\" target="_blank" rel="nofollow noreferrer noopener">{{row.entity.name}}</a>' +
                    '<p class="pTop5">' +
                    '<small class="text-muted mright5" filesize="row.entity.fileSize"></small><small class="text-muted mLeft10">|</small>' +
                    '<small class="text-muted mLeft10"><i class=\"fa fa-calendar-check-o mRight5\"></i>{{row.entity.dateCreated | date:\'d MMM yyyy\'}}</small>' +
                    '</p>' +
                    '</div>';
            },
            getUserTemplate: function () {
                var template = getDropdownStart('sysadmin.SysAdminUsers.View');

                template += '<li perm-required="sysadmin.SysAdminUsers.View"><a href="#/admin/users/view/{{COL_FIELD}}">View User</a></li>';
                template += '<li class="divider"></li>';
                template += '<li perm-required="sysadmin.SysAdminUsers.Edit"><a href="#" no-nav data-ng-click="deleteEntity(COL_FIELD)">Delete User</a></li>';
                template += getDropdownEnd();

                return template;
            }
        };


    }]);
})();
(function () {
    'use strict';
    sharedModule.factory('listFactory', [function () {
        return {
            add: function (list, item) {
                if (!item || !list)
                    return;
                list.push(item);
            },
            remove: function (list, item) {
                if (!item || !list)
                    return;
                var index = -1;
                for (var i = 0; i < list.length; i++) {
                    if (list[i] == item) {
                        index = i;
                        break;
                    }
                }
                if (index >= 0)
                    list.splice(index, 1);
            },
            removeItem: function (list, item) {
                if (!item || !list)
                    return;
                var index = -1;
                for (var i = 0; i < list.length; i++) {
                    if (list[i].itemNumber == item.itemNumber) {
                        index = i;
                        break;
                    }
                }
                if (index >= 0)
                    list.splice(index, 1);
            },
            duplicate: function (list, item) {
                var newItem = angular.copy(item);
                newItem.id = 0;
                list.push(newItem);
            }
        };
    }]);


})();
(function () {
    'use strict';
    sharedModule.factory('membershipFactory',
        ['$http', '$q', '$route', '$state', 'baseFactory', '$rootScope', '$location', 'enumFactory', 'SessionService',
            function ($http, $q, $route, $state, baseFactory, $rootScope, $location, enumFactory, SessionService) {

                var ping = function () {

                    if ($rootScope.noLoginRequired && !$rootScope.isAthenticated) { //no login required
                        $rootScope.noLoginRequired = false;
                        return true;
                    }

                    return baseFactory.fetch('/api/security/ping')
                        .then(function (data) {
                            if (!data.isErrored && data.object && data.object.authenticatedUser !== null) {
                                setUser(data.object.authenticatedUser);
                                return true;
                            }
                            else {
                                clearUser(data.object.authenticatedUser);
                                if (!$state.current.noLoginRequired)
                                    $rootScope.$emit(NO_LOGGED_IN_USER);
                                return false;
                            }
                        });

                };

                function checkImpersonation() {
                    if (!$rootScope.impersonate && $rootScope.user && $rootScope.user.impersonateCustomerId) {
                        $rootScope.impersonate = { name: $rootScope.user.impersonateCustomerName, customerId: $rootScope.user.impersonateCustomerId };
                        $rootScope.$emit(IS_IMPERSONATING);
                    }
                }

                //sets the AuthenticatedUser object to the rootScope
                var setUser = function (authUser) {
                    $rootScope.isAthenticated = authUser != null;
                    $rootScope.user = authUser;

                    if (typeof authUser == 'undefined' || authUser == null)
                        console.log('ping error');
                    checkImpersonation();
                    $rootScope.$emit(USER_ON_ROOT, authUser);
                    //$rootScope.$emit(UNACTIONED_NOTIFICATIONS_UPDATED);
                };

                var clearUser = function (authUser) {
                    //
                    if (authUser == null && $rootScope.user != null && $rootScope.user.fullyPassedAuthentication)
                        $rootScope.$emit(LOGOUT_USER);
                };

                return {
                    ping: function () {
                        return ping();
                    },
                    ping2: function (callback) {
                        return callback(ping());
                    },
                    ping3: function (callback) {
                        return baseFactory.fetch('/api/security/ping').then(function (data) {
                            if ($rootScope.user.userId === data.object.authenticatedUser.userId &&
                                $rootScope.user.impersonateCustomerId === data.object.authenticatedUser.impersonateCustomerId) {
                                return callback();
                            } else {
                                toastr.error("You have been logged in under a different user account. This order could not be processed");
                                return false;
                            }
                        });
                    },
                    login: function (username, password) {
                        return baseFactory.call(
                            '/api/security/login'
                            , {
                                username: username,
                                password: password
                            }
                        ).then(function (data) {
                            if (!data.isErrored && data.object && data.object.authenticatedUser) {
                                return data.object.authenticatedUser;
                            }
                            return null;
                        });
                    },
                    resetPassword: function (username) {
                        return baseFactory.fetch('/api/security/resetPassword?username=' + username)
                            .then(function (rdata) {
                                return rdata;
                            });
                    },

                    authorizePasswordResetToken: function (token) {
                        var deferred = $q.defer();

                        baseFactory.fetch(
                            '/api/userAccounts/GetPasswordResetToken/',
                            { token: token }
                        ).then(function (data) { //success
                            deferred.resolve(data);
                        }, function (data) {
                            deferred.reject(data);
                        });

                        return deferred.promise;
                    },
                    isAuthenticated: function () {
                        var isAuthenticated = !!SessionService.userId;
                        return isAuthenticated;
                    }
                };

            }]);
})();
(function () {
    'use strict';
    sharedModule.factory('modalFactory', modalFactory);
    modalFactory.$inject = ['$modal', '$rootScope', '$location', 'baseFactory', 'GRID_CONSTANTS'];
    function modalFactory($modal, $rootScope, $location, baseFactory, GRID_CONSTANTS) {
        return {
            openDeleteModal: openDeleteModal,
            openGenericModal: openGenericModal,
            openAlertModal: openAlertModal,
            deleteEntityFromGrid: deleteEntityFromGrid,
            deleteEntityFromEditScreen: deleteEntityFromEditScreen,
            openItemPricingModal: openItemPricingModal,
            openChangePriceModal: openChangePriceModal,
            openItemMoreDetailsModal: openItemMoreDetailsModal
        };

        function openDeleteModal(itemType, itemName, extraMarkup) {
            return $modal.open({
                templateUrl: '/app/modules/shared/modals/genericDeleteModal.html',
                controller: 'genericDeleteModal',
                resolve: {
                    itemToDelete: function () {
                        return {
                            type: itemType,
                            name: itemName,
                        };
                    },
                    extraMarkup: function () {
                        return extraMarkup;
                    }
                }
            });
        }

        function openGenericModal(message, buttonText) {
            return $modal.open({
                templateUrl: '/app/modules/shared/modals/genericModal.html',
                controller: 'genericModal',
                resolve: {
                    item: function () {
                        return {
                            message: message,
                            buttonText: buttonText
                        };
                    },
                    extraMarkup: function () {
                    }
                }
            });
        }

        function openAlertModal(header, message) {
            return $modal.open({
                templateUrl: '/app/modules/shared/modals/alertModal.html',
                controller: 'alertModal',
                resolve: {
                    item: function () {
                        return {
                            message: message,
                            header: header
                        };
                    },
                    extraMarkup: function () {
                    }
                }
            });
        }

        //generic function for deleting an entity from the machship grid.
        //entityName: the name of the specific entity instance we are deleting
        //entityId:the id of the specific entity instance we are deleting
        //entityType: this is displayed to the user in the delete modal. eg. 'Service'
        //extraMarkup: any extra markup that you want to appear on the delete dialog
        //url: delete url (do not include the id but include the last /)
        //gridName: the name of the grid to refresh once the delete has completed
        //$scope: the current controllers scope
        function deleteEntityFromGrid(entityName, entityId, entityType, extraMarkup, url, gridName) {
            var modal = this.openDeleteModal(entityType, entityName, extraMarkup);
            return modal.result.then(function (result) {
                if (result) {
                    baseFactory.remove(
                        url + entityId,
                        {}
                    ).then(
                        function (data) { //onsuccess
                            if (!data.isErrored && gridName) {
                                //refresh list
                                $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + gridName);
                                return result;
                            }
                        }
                    );
                }
            }, function () { });
        }

        //generic function for deleting an entity from the crud screen.
        //entityName: the name of the specific entity instance we are deleting
        //entityId:the id of the specific entity instance we are deleting
        //entityType: this is displayed to the user in the delete modal. eg. 'Service'
        //extraMarkup: any extra markup that you want to appear on the delete dialog
        //url: delete url (do not include the id but include the last /)
        //returnUrl: the url that the user should be taken to once the entity has been deleted
        function deleteEntityFromEditScreen(entityName, entityId, entityType, extraMarkup, url, returnUrl) {
            var modal = this.openDeleteModal(entityType, entityName, extraMarkup);
            modal.result.then(function (result) {
                if (result) {
                    baseFactory.remove(
                        url + entityId,
                        {}
                    ).then(
                        function (data) { //onsuccess
                            if (!data.isErrored) {
                                //refresh list
                                $location.path(returnUrl);
                            }
                        }
                    );
                }
            });
        }

        function openItemPricingModal(item, freight, isShowFreightSample) {
            var modal = $modal.open({
                templateUrl: '/app/modules/catalog/checkout/modals/productConfigModal.html',
                controller: 'productConfigModal',
                size: 'huge',
                resolve: {
                    item: function () {
                        return angular.copy(item);
                    },
                    freight: function () {
                        return angular.copy(freight || null);
                    },
                    isShowFreightSample: function () {
                        return isShowFreightSample || false;
                    }
                }
            });

            return modal.result.then(function (result) {
                if (!item.config && result.itemConfig) {
                    item.config = result.itemConfig;
                }
                item.savedConfig = result.config;
                item.quantity = result.config.quantity;
                item.cartonQuantity = result.config.cartonQuantity;
                item.total = result.config.total;
                if (item.config.selectedPrintTypeConfig !== undefined) {
                    item.config.selectedPrintTypeConfig.overridePricing = false;
                }
                return result;
            }, function () {
                return null;
            });
        }

        function openChangePriceModal(item) {
            var modal = $modal.open({
                templateUrl: '/app/modules/catalog/checkout/modals/changePriceModal.html',
                controller: 'changePriceModal',
                resolve: {
                    item: function () {
                        return item;
                    }
                }
            });

            return modal.result.then(function (updatedItem) {
                return updatedItem;
            }, function () {
                return null;
            });
        }

        function openItemMoreDetailsModal(item, detailsMode) {
            var modal = $modal.open({
                templateUrl: '/app/modules/order/orderItemDetails/orderItemDetailsModal.html',
                controller: 'orderItemDetailsModal',
                //size: 'lg',
                resolve: {
                    item: function () {
                        return item;
                    },
                    detailsMode: function () {
                        return detailsMode;
                    }
                }
            });

            return modal.result.then(function (answeredQuestions) {
                item.questions = answeredQuestions;
                return;
            });
        }
    }
})();
(function () {
    'use strict';

    sharedModule.factory("RemotePagerFactory", factory);

    factory.$inject = ["$rootScope", "$http", "baseFactory"];
    function factory($rootScope, $http, baseFactory) {

        var remotePager = function (model, retrieveSize) {
            this.dataUrl = typeof model === 'string' ? model : model.url;
            this.items = [];
            this.busy = false;
            this.isLoadMore = true;
            this.isLoading = false;
            this.after = '';

            this.params = {
                startDate: moment('19700101', 'YYYYMMDD').format('YYYY-M-DD'),
                endDate: moment().format('YYYY-M-DD'),
                startIndex: 1,
                retrieveSize: retrieveSize || 5
            };
            if (typeof model !== 'string')
                for (var k in model) {
                    if (k != 'url') {
                        this.params[k] = model[k];
                    }
                }
        };

        remotePager.prototype.reload = function (model) {
            var ths = this;
            ths.busy = true;
            console.log("Reload pager");

            // Reset
            ths.items = [];
            ths.isLoadMore = true;
            ths.params.startDate = moment('19700101', 'YYYYMMDD').format('YYYY-M-DD');
            ths.params.endDate = moment().format('YYYY-M-DD');
            ths.params.startIndex = 1;

            if (typeof model !== 'undefined')
                for (var k in model) {
                    if (k !== 'url') {
                        this.params[k] = model[k];
                    }
                }

            baseFactory.fetch(ths.dataUrl + ths.after, ths.params).then(function (rrdata) {
                var tempItems = rrdata.object === null ? [] : rrdata.object;

                for (var i = 0; i < tempItems.length; i++) {
                    ths.items.push(tempItems[i]);
                }

                ths.isLoadMore = tempItems.length === ths.params.retrieveSize && ths.items.length > 0;
                ths.params.startIndex = ths.items.length + 1;

                ths.busy = false;
                // console.log('Reloaded Page');
                $rootScope.$emit("REMOTE-PAGER-RELOADED", { items: ths.items, startIndex: rrdata.startIndex });
            });
        };

        remotePager.prototype.nextPage = function () {
            var ths = this;
            if (ths.busy || !ths.isLoadMore) return;
            // console.log(ths)
            ths.busy = true;
            baseFactory.fetch(ths.dataUrl + ths.after, ths.params).then(function (rrdata) {
                var tempItems = rrdata.object === null ? [] : rrdata.object;

                for (var i = 0; i < tempItems.length; i++) {
                    ths.items.push(tempItems[i]);
                }
                
                ths.isLoadMore = tempItems.length === ths.params.retrieveSize && ths.items.length > 0;
                ths.params.startIndex = ths.items.length + 1;

                ths.busy = false;
                // console.log('Next page');
                $rootScope.$emit("REMOTE-PAGER-NEXT", { items: ths.items, startIndex: rrdata.startIndex });
            });
        };

        remotePager.prototype.fileTypeCssClass = function (ft) {
            var cssClass = "";
            switch (ft) {
                case "pdf":
                    cssClass = "fa fa-file-pdf-o pdf";
                    break;
                case "xls":
                case "xlsx":
                    cssClass = "fa fa-file-excel-o excel";
                    break;
                case "doc":
                case "docx":
                    cssClass = "fa fa-file-word-o word";
                    break;
                case "ppt":
                case "pptx":
                    cssClass = "fa fa-file-powerpoint-o powerpoint";
                    break;
                case "zip":
                case "rar":
                    cssClass = "fa fa-file-archive-o archive";
                    break;
                case "mp3":
                case "wma":
                    cssClass = "fa fa-file-audio-o audio";
                    break;
                case "avi":
                case "mp4":
                case "mov":
                    cssClass = "fa fa-file-video-o video";
                    break;
                case "jpg":
                case "jpeg":
                case "png":
                case "gif":
                    cssClass = "fa fa-file-image-o image";
                    break;
                case "txt":
                    cssClass = "fa fa-file-text-o text";
                    break;
                case "key":
                    cssClass = "fa fa-file-code-o code";
                    break;
                default:
                    cssClass = "fa fa-file-o file";
            }

            return cssClass;
        };

        remotePager.prototype.photoCardCol = function (indx) {
            var cssClass = "col-md-3";
            var isEven = true;
            var i = 0;
            while (i <= indx) {
                if (isEven) {
                    cssClass = "col-md-3";
                    isEven = false;
                    i = i + 4;
                } else {
                    cssClass = "col-md-4";
                    isEven = true;
                    i = i + 3;
                }
            }
            return cssClass;
        };

        remotePager.prototype.videoCardCol = function (indx) {
            var cssClass = "col-md-4";
            var isEven = true;
            var i = 0;
            while (i <= indx) {
                if (isEven) {
                    cssClass = "col-md-4";
                    isEven = false;
                    i = i + 3;
                } else {
                    cssClass = "col-md-3";
                    isEven = true;
                    i = i + 4;
                }
            }
            return cssClass;
        };


        remotePager.prototype.setThumbnail = function (d) {
            var doc = angular.copy(d);
            //console.log(doc.isLink)
            //console.log(doc.thumbnail)
            if (doc.isVideo && doc.thumbnail.indexOf('/Download/DownloadCdnDocument?path=') >= 0) {
                var link = doc.thumbnail.replace("/Download/DownloadCdnDocument?path=", "/download/thumbnail?guid=").replace(/\\/, "&filename=");
                // console.log(link)
                return link;
            } else {
                return doc.thumbnail;
            }
        };

        return remotePager;
    }
})();
(function () {
    'use strict';
    angular.module('appSharedModule').factory('permissionFactory', permissionFactory);
    permissionFactory.$inject = ['$rootScope', 'enumFactory'];

    function permissionFactory($rootScope, enumFactory) {
        function checkPermission(userPermission, requiredPermission) {
            if (userPermission >= requiredPermission)
                return true;
            return false;
        };

        function hasAnyPermission(requiredComponent) {
            //no permissions saved by angular for this user
            if (!$rootScope.user || !$rootScope.user.rolePermissions)
                return false;

            if ($rootScope.user.isSysAdmin)
                return true;

            var components = enumFactory.getEnum('componentType');

            var requiredComponentInt = enumFactory.getEnumId(components, requiredComponent);
            var hasPermission = false;

            //check if user has any permission for component
            angular.forEach($rootScope.user.rolePermissions, function (permissionSet) {
                if (permissionSet.componentType === requiredComponentInt && permissionSet.permissionType !== null && permissionSet.permissionType !== 0)
                    hasPermission = true;
            });
            return hasPermission;
        }

        function hasClient(clientName) {
            if (clientName.toLowerCase() === $rootScope.clientName.toLowerCase())
                return true;
            return false;
        }

        function hasPermission(permissionString) {
            var items = permissionString.split('.');

            var requiredComponent = items[0];
            var requiredSubcomponent = items[1];
            var requiredPermission = items[2];

            var components = enumFactory.getEnum('componentType');
            var subComponents = enumFactory.getEnum('subComponentType');
            var permissions = enumFactory.getEnum('permissionType');

            //no user is logged in. the authService will handle logging the user in so just return.
            if (typeof $rootScope.user === 'undefined' || $rootScope.user === null) {
                return false;
            }

            //no permissions saved by angular for this user
            if (typeof $rootScope.user.rolePermissions === 'undefined' || $rootScope.user.rolePermissions === null)
                return false;

            if ($rootScope.user.isSysAdmin)
                return true;

            var requiredComponentInt = enumFactory.getEnumId(components, requiredComponent);

            var requiredSubcomponentInt = enumFactory.getEnumId(subComponents, requiredSubcomponent);
            var requiredPermLevelInt = enumFactory.getEnumId(permissions, requiredPermission);

            var userHasPermission = false;

            //check if user has permission for entire component
            angular.forEach($rootScope.user.rolePermissions, function (permissionSet) {
                //access to entire component
                if (permissionSet.componentType === requiredComponentInt && permissionSet.subComponentType == null
                    && checkPermission(permissionSet.permissionType, requiredPermLevelInt)) {
                    userHasPermission = true;
                }
                //access to subcomponent
                if (permissionSet.componentType === requiredComponentInt && permissionSet.subComponentType == requiredSubcomponentInt
                    && checkPermission(permissionSet.permissionType, requiredPermLevelInt)) {
                    userHasPermission = true;
                }
            });
            // console.log(permissionString, userHasPermission);
            return userHasPermission;
        }

        return {
            //takes an array of permission strings and returns true if ANY of the permissions are valid
            //eg. ['company.companyCategories.edit', 'company.companyOrders.view']
            hasPermission: function (permissions) {
                if (permissions.length == 0)
                    return true;
                var userHasPermission = false;
                angular.forEach(permissions, function (perm) {
                    if (hasPermission(perm))
                        userHasPermission = true;
                });
                return userHasPermission;
            },
            ///takes a list of comma separated permissions COMPONENTS. Returns true if any of the permissions match. This does not take subcomponents into account
            //ie. takes '['sysadmin','sysadmin']'
            hasAnyPermissionList: function (requiredComponents) {
                //no permissions saved by angular for this user
                if (!$rootScope.user || !$rootScope.user.rolePermissions)
                    return false;

                if ($rootScope.user.isSysAdmin)
                    return true;

                //no permission passed in. Show the element
                if (!requiredComponents)
                    return false;
                var items = requiredComponents;
                var hasAnyComponent = false;
                angular.forEach(items, function (item) {
                    var hasPermission = hasAnyPermission(item.trim());
                    if (hasPermission)
                        hasAnyComponent = true;
                });
                return hasAnyComponent;
            },
            //takes a single permission COMPONENT and returns true if any of the permissions below it match. This does not take subcomponents into account
            //ie. takes sysadmin
            hasAnyPermission: function (requiredComponent) {
                return hasAnyPermission(requiredComponent);
            },
            //takes an array of client names. ie ['twc', 'ppi']
            //these types must exactly match
            hasClient: function (clients) {
                if (!clients)
                    return true;
                //no client set
                if (!$rootScope.clientName)
                    return false;
                var userHasClient = false;
                angular.forEach(clients, function (client) {
                    if (hasClient(client))
                        userHasClient = true;
                });
                return userHasClient;
            },
            //takes an array of role names. ie ['admin', 'super user']
            //these types must exactly match
            hasRole: function (roles) {
                if (!roles)
                    return true;
                //user not logged in or no client set
                if (!$rootScope.user || !$rootScope.user.roles)
                    return false;
                var userHasRole = false;
                angular.forEach(roles, function (outerRole) {
                    angular.forEach($rootScope.user.roles, function (innerRole) {
                        if (outerRole.toLowerCase() === innerRole.toLowerCase()) {
                            userHasRole = true;
                        }
                    });
                });
                return userHasRole;
            },

            //takes an array of userTypes. ie ['Client', 'Company']
            //these types must exactly match
            hasUserType: function (userTypes) {
                if (!userTypes || userTypes.length == 0 || !$rootScope.user)
                    return false;

                var userTypesEnum = enumFactory.getEnum('userType');
                var hasType = false;
                angular.forEach(userTypes, function (type) {
                    var userTypeId = enumFactory.getEnumId(userTypesEnum, type);
                    if (userTypeId == type)
                        hasType = true;
                });

                return hasType;
            },

            isSysAdmin: function () {
                if (!$rootScope.user)
                    return false;
                return $rootScope.user.isSysAdmin ? $rootScope.user.isSysAdmin : false;
            },

            isCompany: function () {
                if (!$rootScope.user)
                    return false;
                return $rootScope.user.customerId === "" && $rootScope.user.customerName === "";
            },

            isClient: function () {
                if (!$rootScope.user)
                    return false;
                return $rootScope.user.customerId !== "" && $rootScope.user.customerName !== "";
            }
        };
    }
})();
(function () {
    'use strict';
    sharedModule
        .service('promptFactory', ['$rootScope', '$modal', function ($rootScope, $modal) {
            this.confirm = function (msg, callback, config) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/shared/modals/confirmModal.html',
                    controller: ConfirmModalCtrl,
                    size: 'sm',
                    backdrop: 'static',
                    resolve: {
                        msg: function () {
                            return msg;
                        },
                        config: function () {
                            return config || { confirm: 'Yes', cancel: 'No', buttonSize: 'btn-sm' };
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                    callback(ddata);
                }, function () {
                    // $log.info('Modal dismissed at: ' + new Date());
                });
            };
            this.confirmMd = function (msg, callback, config) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/shared/modals/confirmModal.html',
                    controller: ConfirmModalCtrl,
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        msg: function () {
                            return msg;
                        },
                        config: function () {
                            return config || { confirm: 'Yes', cancel: 'No', buttonSize: 'btn-sm' };
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                    callback(ddata);
                }, function () {
                    // $log.info('Modal dismissed at: ' + new Date());
                });
            };
            this.dialog = function (title, msg, size, inputValue, successBtn, errorBtn, callback, config) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/shared/modals/promptWithCustomFieldsModal.html',
                    controller: PromptModalCtrl,
                    size: size,
                    backdrop: 'static',
                    resolve: {
                        title: function () {
                            return title;
                        },
                        msg: function () {
                            return msg;
                        },
                        inputValue: function () {
                            return inputValue;
                        },
                        successBtn: function () {
                            return successBtn;
                        },
                        errorBtn: function () {
                            return errorBtn;
                        },
                        config: function () {
                            return config || { placeholder: 'Enter notes...' };
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                    callback(ddata);
                }, function () {
                    // $log.info('Modal dismissed at: ' + new Date());
                });
            };
        }]);

    var ConfirmModalCtrl = ['$scope', '$modalInstance', 'msg', 'config', function ($scope, $modalInstance, msg, config) {
        $scope.msg = msg;
        $scope.config = { confirm: 'Yes', cancel: 'No', buttonSize: 'btn-sm' };
        if (typeof config.confirm !== 'undefined') {
            $scope.config.confirm = config.confirm;
        }
        if (typeof config.cancel !== 'undefined') {
            $scope.config.cancel = config.cancel;
        }
        if (typeof config.buttonSize !== 'undefined') {
            $scope.config.buttonSize = config.buttonSize;
        }

        $scope.ok = function () {
            $modalInstance.close(true);
        };
        $scope.cancel = function () {
            $modalInstance.close(false);
            // $modalInstance.dismiss(false);
        };
    }];

    var PromptModalCtrl = ['$scope', '$modalInstance', 'IMPORT_CONSTANTS', 'msg', 'inputValue', 'successBtn', 'errorBtn', 'title', 'config',
        function ($scope, $modalInstance, IMPORT_CONSTANTS, msg, inputValue, successBtn, errorBtn, title, config) {
            $scope.config = config;
            $scope.title = title;
            $scope.msg = msg;
            $scope.formResult = {
                inputValue: inputValue,
                fileFolder: null,
                fileName: null,
                isUploaded: false,
                result: false
            };
            $scope.successBtn = successBtn;
            $scope.errorBtn = errorBtn;

            $scope.ok = function (m) {
                m.result = true;
                $modalInstance.close(m);
            };
            $scope.cancel = function (m) {
                m.result = false;
                $modalInstance.close(m);
            };
            $scope.importOptions = {
                hideImportButton: true,
                hideLabel: false,
                messageIdentifier: $scope.formResult.$$hashKey,
                clearAfterImport: false
            };
            $scope.$onRootScope(IMPORT_CONSTANTS.FILE_IMPORTED + $scope.formResult.$$hashKey, function (e, doc) {
                $scope.formResult.fileFolder = doc.fileFolder;
                $scope.formResult.fileName = doc.fileName;
                $scope.formResult.isUploaded = doc.isUploaded;
            });
        }];

    var DialogModalCtrl = ['$scope', '$modalInstance', 'msg', 'successBtn1', 'successBtn2', 'errorBtn',
        function ($scope, $modalInstance, msg, successBtn1, successBtn2, errorBtn) {
            $scope.msg = msg;
            $scope.successBtn1 = successBtn1;
            $scope.successBtn2 = successBtn2;
            $scope.errorBtn = errorBtn;

            $scope.ok1 = function (m) {
                $modalInstance.close(m);
            };
            $scope.ok2 = function (m) {
                $modalInstance.close(m);
            };
            $scope.cancel = function () {
                $modalInstance.close(false);
                // $modalInstance.dismiss(false);
            };
        }];

})();
(function () {
    'use strict';
    sharedModule.factory('QodoCarouselFactory', [function () {

        var PureJSCarousel = function (settings) {
            try {
                this.carousel = document.querySelector(settings.carousel);
                this.slides = this.carousel.querySelectorAll(settings.slide);
                this.btnNext = this.carousel.querySelector(settings.btnNext) || null;
                this.btnPrev = this.carousel.querySelector(settings.btnPrev) || null;
                this.activeIndex = settings.activeIndex || 0;
                this.oneByOne = settings.oneByOne || false;
                this.speed = settings.speed || 400;
                this.delay = settings.delay || 0;
                this.effect = settings.effect || 'linear';
                this.infinite = settings.infinite || false;
                this.autoplay = settings.autoplay || false;
                this.autoplayDelay = settings.autoplayDelay || 400;
                this.autoplayDirection = settings.autoplayDirection || 'next';

                this.autoplayTimer = null;
                this.minPos = null;
                this.slidesToShow = null;
                this.maxIndex = null;
                this.isEnabled = null;

                this.build();
            } catch (er) {
            }
        };

        PureJSCarousel.prototype.build = function () {
            var _ = this,
                dotsLength,
                i,
                windowResizeTimeout,
                windowWidth = window.innerWidth,
                windowHeight = window.innerHeight;

            _.minPos = (_.carousel.offsetWidth - (_.slides.length * _.slides[0].offsetWidth));
            _.slidesToShow = Math.round(_.carousel.offsetWidth / _.slides[0].offsetWidth);
            _.maxIndex = 0;
            _.isEnabled = 1;

            _.carousel.className += ' purejscarousel';

            //create slides container
            _.slidesContainer = document.createElement('div');
            _.carousel.insertBefore(_.slidesContainer, _.slides[0]);
            _.slidesContainer.className += ' purejscarousel-slides-container';
            if (_.infinite === true) {
                _.slidesContainer.style.marginLeft = -(_.slides[0].offsetWidth * _.slides.length) + 'px';
                _.slidesContainer.style.width = (_.slides[0].offsetWidth * _.slides.length * 3) + 'px';
            } else {
                _.slidesContainer.style.marginLeft = '0px';
                var wd = window.innerWidth < 420 ? _.slides[0].offsetWidth : window.innerWidth;
                _.slidesContainer.style.width = (wd * _.slides.length) + 'px';
            }

            if ('ontouchstart' in window || navigator.maxTouchPoints) {
                _.slidesContainer.addEventListener('touchstart', function (event) {
                    this.setAttribute('data-start-touch-x', event.targetTouches[0].pageX);
                    this.setAttribute('data-start-margin', parseInt(this.style.marginLeft));
                });
                _.slidesContainer.addEventListener('touchmove', function (event) {
                    this.setAttribute('data-active-touch-x', event.targetTouches[0].pageX);
                    this.style.marginLeft = parseInt(this.getAttribute('data-start-margin')) + (parseInt(this.getAttribute('data-active-touch-x')) - parseInt(this.getAttribute('data-start-touch-x'))) + 'px';
                });
                _.slidesContainer.addEventListener('touchend', function () {
                    var direction = parseInt(this.getAttribute('data-active-touch-x')) - parseInt(this.getAttribute('data-start-touch-x')) > 0 ? 'prev' : 'next',
                        blockWidth = _.oneByOne === true ? _.slidesContainer[0].offsetWidth : _.carousel.offsetWidth;
                    if (Math.abs(parseInt(this.getAttribute('data-active-touch-x')) - parseInt(this.getAttribute('data-start-touch-x'))) >= blockWidth / 2) {
                        if (_.infinite === true) {
                            direction === 'next' ? _.goToNextSlide() : _.goToPrevSlide();
                        } else {
                            if ((direction === 'next' && _.activeIndex < _.maxIndex) || (direction === 'prev' && _.activeIndex > 0)) {
                                direction === 'next' ? _.goToNextSlide() : _.goToPrevSlide();
                            } else {
                                if (_.slidesContainer.style.transition !== 'undefined') {
                                    _.slidesContainer.style.transition = 'margin-left ' + _.speed + 'ms' + ' ' + _.effect + ' ' + _.delay + 'ms';
                                }
                                _.slidesContainer.style.marginLeft = parseInt(this.getAttribute('data-start-margin')) + 'px';
                                if (_.slidesContainer.style.transition === 'undefined') {
                                    if (_.slidesContainer.style.transition !== 'undefined') {
                                        _.slidesContainer.style.transition = null;
                                    }
                                } else {
                                    setTimeout(function () {
                                        if (_.slidesContainer.style.transition !== 'undefined') {
                                            _.slidesContainer.style.transition = null;
                                        }
                                    }, _.speed + _.delay);
                                }
                            }
                        }
                    } else {
                        if (_.slidesContainer.style.transition !== 'undefined') {
                            _.slidesContainer.style.transition = 'margin-left ' + _.speed + 'ms' + ' ' + _.effect + ' ' + _.delay + 'ms';
                        }
                        _.slidesContainer.style.marginLeft = parseInt(this.getAttribute('data-start-margin')) + 'px';
                        if (_.slidesContainer.style.transition === 'undefined') {
                            if (_.slidesContainer.style.transition !== 'undefined') {
                                _.slidesContainer.style.transition = null;
                            }
                        } else {
                            setTimeout(function () {
                                if (_.slidesContainer.style.transition !== 'undefined') {
                                    _.slidesContainer.style.transition = null;
                                }
                            }, _.speed + _.delay);
                        }
                    }
                });
            }


            //create slides dots
            _.dotsContainer = document.createElement('div');
            _.carousel.insertBefore(_.dotsContainer, _.slides[0]);
            _.dotsContainer.className += ' purejscarousel-dots-container';
            _.dots = [];
            if (_.oneByOne === true) {
                if (_.infinite === true) {
                    dotsLength = _.slides.length;
                } else {
                    dotsLength = ((_.slidesContainer.offsetWidth - _.carousel.offsetWidth) / _.slides[0].offsetWidth) + 1;
                }
            } else {
                if (_.infinite === true) {
                    dotsLength = Math.ceil(_.slidesContainer.offsetWidth / _.carousel.offsetWidth / 3);
                } else {
                    dotsLength = Math.ceil(_.slidesContainer.offsetWidth / _.carousel.offsetWidth);
                }
            }

            for (i = 0; i < dotsLength; i++) {
                var dot = document.createElement('button');
                dot.className = 'purejscarousel-dot' + (i === 0 ? ' active' : '');
                dot.setAttribute('data-index', i);
                dot.setAttribute('type', 'button');
                addDotEventListener(dot, _);
                _.dots.push(dot);
                _.dotsContainer.appendChild(dot);
            }

            _.maxIndex = dotsLength - 1;

            //
            if (dotsLength < 1 && _.carousel.className.indexOf('no-purejscarousel-arrow') < 0) {
                _.carousel.className += ' no-purejscarousel-arrow ';
            } else if (dotsLength >= 1 && _.carousel.className.indexOf('no-purejscarousel-arrow') >= 0) {
                _.carousel.className = _.carousel.className.replace(' no-purejscarousel-arrow', '');
            }

            //create carousel btn-prev
            if (!_.btnPrev) {
                _.btnPrev = document.createElement('button');
                _.btnPrev.setAttribute('class', '');
                _.btnPrev.setAttribute('type', 'button');
                _.btnPrev.setAttribute('data-is-native', 0);
                _.carousel.insertBefore(_.btnPrev, _.slides[0]);
            } else {
                _.btnPrev.setAttribute('data-is-native', 1);
            }
            _.btnPrev.className += ' purejscarousel-btn purejscarousel-btn-prev';
            if (window.addEventListener) {
                _.btnPrev.addEventListener('click', function () {
                    _.goToPrevSlide();
                });
            } else if (window.attachEvent) {
                _.btnPrev.attachEvent('onclick', function () {
                    _.goToPrevSlide();
                });
            } else {
                _.btnPrev.onclick = function () {
                    _.goToPrevSlide();
                };
            }

            if (_.activeIndex === 0) {
                _.btnPrev.disabled = true;
            }
            //create carousel btn-next
            if (!_.btnNext) {
                _.btnNext = document.createElement('button');
                _.btnNext.setAttribute('class', '');
                _.btnNext.setAttribute('type', 'button');
                _.btnNext.setAttribute('data-is-native', 0);
                _.carousel.insertBefore(_.btnNext, _.slides[0]);
            } else {
                _.btnNext.setAttribute('data-is-native', 1);
            }
            _.btnNext.className += ' purejscarousel-btn purejscarousel-btn-next';
            if (window.addEventListener) {
                _.btnNext.addEventListener('click', function () {
                    _.goToNextSlide();
                });
            } else if (window.attachEvent) {
                _.btnNext.attachEvent('onclick', function () {
                    _.goToNextSlide();
                });
            } else {
                _.btnNext.onclick = function () {
                    _.goToNextSlide();
                };
            }
            if (_.activeIndex === _.maxIndex) {
                _.btnNext.disabled = true;
            }

            //build slides
            for (i = 0; i < _.slides.length; i++) {
                _.slides[i].className += ' purejscarousel-slide';
                _.slidesContainer.appendChild(_.slides[i]);
            }
            if (_.infinite === true) {
                for (i = 0; i < _.slides.length; i++) {
                    var slideClone = _.slides[i].cloneNode(true);
                    slideClone.className += ' purejscarousel-slide-clone';
                    _.slidesContainer.appendChild(slideClone);
                }
                for (i = 0; i < _.slides.length; i++) {
                    var slideClone = _.slides[i].cloneNode(true);
                    slideClone.className += ' purejscarousel-slide-clone';
                    _.slidesContainer.insertBefore(slideClone, _.slidesContainer.querySelectorAll('.purejscarousel-slide')[i]);
                }
            }

            if (window.addEventListener) {
                window.addEventListener('resize', windowResize);
            } else if (window.attachEvent) {
                window.attachEvent('onresize', windowResize);
            } else {
                window.onresize = windowResize;
            }

            _.autoplayTimer = _.autoplay === true ? (_.autoplayDirection === 'next' ? setTimeout(function () { _.goToNextSlide() }, _.autoplayDelay) : setTimeout(function () { _.goToPrevSlide() }, _.autoplayDelay)) : null;

            function addDotEventListener(d, c) {
                if (window.addEventListener) {
                    d.addEventListener('click', function () {
                        c.goToSlide(parseInt(this.getAttribute('data-index')));
                    });
                } else if (window.attachEvent) {
                    d.attachEvent('onclick', function () {
                        c.goToSlide(parseInt(this.getAttribute('data-index')));
                    });
                } else {
                    d.onclick = function () {
                        c.goToSlide(parseInt(this.getAttribute('data-index')));
                    };
                }
            }

            function windowResize() {
                if (window.innerWidth !== windowWidth || window.innerHeight !== windowHeight) {
                    clearTimeout(windowResizeTimeout);
                    windowResizeTimeout = setTimeout(function () {
                        _.destroy();
                        _.build();
                    }, 400);
                }
            }
        };

        PureJSCarousel.prototype.enableControl = function () {
            var i;
            this.btnNext.disabled = false;
            this.btnPrev.disabled = false;
            for (i = 0; i < this.dots.length; i++) {
                this.dots[i].disabled = false;
            }
            this.dots[this.activeIndex].disabled = true;
            if (this.infinite === false) {
                if (this.activeIndex === this.maxIndex) {
                    this.btnNext.disabled = true;
                }
                if (this.activeIndex === 0) {
                    this.btnPrev.disabled = true;
                }
            }
            if ('ontouchstart' in window || navigator.maxTouchPoints) {
                this.slidesContainer.disabled = false;
            }
        };

        PureJSCarousel.prototype.disableControl = function () {
            var i;
            this.btnNext.disabled = true;
            this.btnPrev.disabled = true;
            for (i = 0; i < this.dots.length; i++) {
                this.dots[i].disabled = true;
            }
            if ('ontouchstart' in window || navigator.maxTouchPoints) {
                this.slidesContainer.disabled = true;
            }
        };

        PureJSCarousel.prototype.goToNextSlide = function () {
            var newActiveIndex;
            if (this.btnNext.disabled === false) {
                if (this.infinite === true) {
                    newActiveIndex = this.activeIndex + 1 > this.maxIndex ? 0 : this.activeIndex + 1;
                } else {
                    newActiveIndex = this.activeIndex + 1;
                }
                this.goToSlide(newActiveIndex, 'next', 'dirBtn');
            }
        };

        PureJSCarousel.prototype.goToPrevSlide = function () {
            var newActiveIndex;
            if (this.btnPrev.disabled === false) {
                if (this.infinite === true) {
                    newActiveIndex = this.activeIndex - 1 < 0 ? this.maxIndex : this.activeIndex - 1;
                } else {
                    newActiveIndex = this.activeIndex - 1;
                }
                this.goToSlide(newActiveIndex, 'prev', 'dirBtn');
            }
        };

        PureJSCarousel.prototype.goToSlide = function (n, dir, trigger) {
            var _ = this,
                direction = dir ? dir : n > this.activeIndex ? 'next' : 'prev',
                slidesContainerWidth = this.slidesContainer.offsetWidth / (this.infinite === true ? 3 : 1),
                blockWidth = this.oneByOne === true ? this.slides[0].offsetWidth : this.carousel.offsetWidth,
                currentPos = this.infinite === true ? -slidesContainerWidth : Math.max(-blockWidth * this.activeIndex, this.minPos),
                scrollWidth = trigger === 'dirBtn' ? blockWidth : Math.abs(blockWidth * (this.activeIndex - n)),
                slidesCount,
                newPos;

            if (this.oneByOne === false && ((direction === 'next' && n === this.maxIndex) || (direction === 'prev' && this.activeIndex === this.maxIndex))) {
                scrollWidth = scrollWidth + slidesContainerWidth - ((this.maxIndex + 1) * blockWidth);
            }
            slidesCount = scrollWidth / this.slides[0].offsetWidth;
            if (this.infinite === true) {
                newPos = direction === 'next' ? currentPos - scrollWidth : currentPos + scrollWidth;
            } else {
                newPos = direction === 'next' ? Math.max(this.minPos, currentPos - scrollWidth) : Math.min(0, currentPos + scrollWidth);
            }

            this.disableControl();
            if ('transition' in document.body.style) {
                this.slidesContainer.style.transition = 'margin-left ' + this.speed + 'ms' + ' ' + this.effect + ' ' + this.delay + 'ms';
            }
            this.slidesContainer.style.marginLeft = newPos + 'px';
            if ('transition' in document.body.style) {
                this.slidesContainer.addEventListener('transitionend', scrollEnd);
            } else {
                scrollEnd();
            }

            function scrollEnd() {
                var i;
                if ('transition' in document.body.style) {
                    _.slidesContainer.style.transition = null;
                    _.slidesContainer.removeEventListener('transitionend', scrollEnd);
                }

                _.dots[_.activeIndex].className = _.dots[_.activeIndex].className.replace(' active', '');
                _.activeIndex = n;
                _.dots[_.activeIndex].className += ' active';

                if (_.infinite === true) {
                    for (i = 0; i < slidesCount; i++) {
                        if (direction === 'next') {
                            _.slidesContainer.appendChild(_.slidesContainer.children[0]);
                        } else {
                            _.slidesContainer.insertBefore(_.slidesContainer.lastElementChild, _.slidesContainer.children[0]);
                        }
                    }
                    _.slidesContainer.style.marginLeft = -_.slidesContainer.offsetWidth / 3 + 'px';
                }
                _.enableControl();
                _.autoplayTimer = _.autoplay === true ? (_.autoplayDirection === 'next' ? setTimeout(function () { _.goToNextSlide() }, _.autoplayDelay) : setTimeout(function () { _.goToPrevSlide() }, _.autoplayDelay)) : null;
            }
        };

        PureJSCarousel.prototype.destroy = function () {
            var slideClones,
                i;

            if (this.isEnabled === 1) {
                this.isEnabled = 0;

                this.carousel.className = this.carousel.className.replace(' purejscarousel', '');
                this.carousel.removeChild(this.dotsContainer);

                if (this.btnNext.getAttribute('data-is-native').toString() === '1') {
                    this.btnNext.className = this.btnNext.className.replace(' purejscarousel-btn purejscarousel-btn-next', '');
                } else {
                    this.carousel.removeChild(this.btnNext);
                    this.btnNext = null;
                }
                if (this.btnPrev.getAttribute('data-is-native').toString() === '1') {
                    this.btnPrev.className = this.btnPrev.className.replace(' purejscarousel-btn purejscarousel-btn-prev', '');
                } else {
                    this.carousel.removeChild(this.btnPrev);
                    this.btnPrev = null;
                }

                if (this.infinite === true) {
                    slideClones = this.carousel.querySelectorAll('.purejscarousel-slide-clone');
                    for (i = 0; i < slideClones.length; i++) {
                        slideClones[i].parentNode.removeChild(slideClones[i]);
                    }
                }
                for (i = 0; i < this.slides.length; i++) {
                    this.slides[i].className = this.slides[i].className.replace(' pure-js-carousel-slide', '');
                    this.carousel.insertBefore(this.slides[i], this.slidesContainer);
                }
                this.carousel.removeChild(this.slidesContainer);

                this.minPos = null;
                this.slidesToShow = null;
                this.maxIndex = null;
                this.isEnabled = null;
                if (this.autoplay === true) {
                    clearTimeout(this.autoplayTimer);
                    this.autoplayTimer = null;
                }
            }
        };

        return PureJSCarousel;
    }]);
})();
(function () {
    'use strict';
    sharedModule.factory('resolveFactory', ['$rootScope', '$q', '$location', '$http', 'enumFactory', 'baseFactory', 'membershipFactory', 'GRID_CONSTANTS',
        function ($rootScope, $q, $location, $http, enumFactory, baseFactory, membershipFactory, GRID_CONSTANTS) {

        var resolveEnums = function () {

            if (typeof $rootScope.enums === 'undefined' || !$rootScope.enums) {
                return enumFactory.getEnumsFromServer().then(function (result) {
                    if (result == true)
                        return true;
                    else
                        return false;
                });
            } else {
                return true;
            }
        };

        var checkBuildNumber = function () {
            return $http({
                method: "GET",
                url: '/api/system/getBuildNumber'
            }).then(
                function (response) { //onSuccess
                    if (!$rootScope.buildNumber) {
                        $rootScope.buildNumber = response.data.buildNumber;
                    }

                    //if ($rootScope.buildNumber !== response.data.buildNumber) {
                    //    $rootScope.buildNumber = response.data.buildNumber;
                    //    $rootScope.$emit(BUILD_NUMBER_CHANGED);
                    //}

                    return true;
                });
        };

        return {
            //setup the angular environment before any of the routes are rendered.
            baseResolve: function () {
                var deferred = $q.defer();
                var buildNumberResult = checkBuildNumber();
                var enumResult = resolveEnums(); //get all enums from the server
                var pingResult = membershipFactory.ping(); //check if there is a valid user and populate the $rootScope.user

                //dont validate the promises until ALL the above calls have been returned
                $q.all([enumResult, pingResult, buildNumberResult]).then(function (arrayOfResults) {

                    angular.forEach(arrayOfResults, function (result) {
                        if (result !== true)
                            deferred.reject('could not initialise the app.');
                    });
                    deferred.resolve(true);
                }, function () {
                    deferred.reject('could not initialise the app.');
                });
                deferred.resolve(true);

                return deferred.promise;
            },
            //setup the angular environment before any of the routes are rendered.
            homeResolve: function () {
                var deferred = $q.defer();
                var buildNumberResult = checkBuildNumber();

                //dont validate the promises until ALL the above calls have been returned
                $q.all([buildNumberResult]).then(function (arrayOfResults) {

                    angular.forEach(arrayOfResults, function (result) {
                        if (result !== true)
                            deferred.reject('could not initialise the app.');
                    });
                    deferred.resolve(true);
                }, function () {
                    deferred.reject('could not initialise the app.');
                });
                deferred.resolve(true);

                return deferred.promise;
            },
            getEntity: function (url, params) {
                //progressBarFactory.start();
                var deferred = $q.defer();

                baseFactory.fetch(
                    url, params
                ).then(function (data) { //success
                    //progressBarFactory.complete();
                    deferred.resolve(data.object);
                }, function (data) {
                    //progressBarFactory.complete();
                    deferred.reject(data);
                });

                return deferred.promise;
            },

            getBaseEntityById: function (id, url) {
                //progressBarFactory.start();
                var deferred = $q.defer();

                baseFactory.fetch(
                    url,
                    { id: id }
                ).then(function (data) { //success
                    //progressBarFactory.complete();
                    deferred.resolve(data.object);
                }, function (data) {
                    //progressBarFactory.complete();
                    deferred.reject(data);
                });

                return deferred.promise;
            },
            getGridEntity: function (url, id, retrieveSize) {
                //progressBarFactory.start();
                var deferred = $q.defer();

                if (!retrieveSize)
                    retrieveSize = GRID_CONSTANTS.DEFAULT_PAGE_SIZE;

                var pagingOptions = {
                    retrieveSize: retrieveSize,
                    startIndex: 1
                };
                if (id)
                    pagingOptions.id = id;

                baseFactory.fetch(
                    url,
                    pagingOptions
                ).then(function (data) { //success
                    if (!data.isErrored) {
                        //progressBarFactory.complete();
                        deferred.resolve({ object: data.object, totalItems: data.totalItems });

                    } else {
                        //progressBarFactory.complete();
                        deferred.reject(data);
                    }
                }, function (data) {
                    //progressBarFactory.complete();
                    deferred.reject(data);
                });

                return deferred.promise;
            },

            getGridAndBaseEntity: function (id, url) {
                //progressBarFactory.start();
                var deferred = $q.defer();

                var pagingOptions = {
                    id: id,
                    retrieveSize: GRID_CONSTANTS.DEFAULT_PAGE_SIZE,
                    startIndex: 1
                };

                baseFactory.fetch(
                    url,
                    pagingOptions
                ).then(function (data) { //success
                    if (!data.isErrored) {
                        //progressBarFactory.complete();
                        deferred.resolve(data.object);

                    } else {
                        //progressBarFactory.complete();
                        deferred.reject(data);

                    }
                }, function (data) {
                    //progressBarFactory.complete();
                    deferred.reject(data);
                });

                return deferred.promise;
            }
        };
    }]);

})();
(function () {
    'use strict';

    sharedModule.factory('sharedFactory', sharedFactory);

    sharedFactory.$inject = ['baseFactory'];

    function sharedFactory(baseFactory) {

        var searchCustomer = function (val, includeBalance, onhold) {
            var includeBal = includeBalance ? true : false;

            return baseFactory.fetch('/api/customer/SearchAll/?retrieveSize=10&startIndex=1&searchText=' + encodeURIComponent(val) + '&includeBalance=' + includeBal + '&includeOnhold=' + onhold, {})
                .then(function (response) {
                    return response.object;
                });
        };

        var searchOrder = function (val) {
            return baseFactory.fetch('/api/order/SearchOrders/?startDate=1970-01-01&retrieveSize=' + 10 + '&startIndex=' + 1 + '&searchText=' + val, {})
                .then(function (response) {
                    return response.object;
                });
        };

        var searchItem = function (val) {
            return baseFactory.fetch('api/item/search', { searchText: val, startIndex: 1, retrieveSize: 10, itemVisibility:true })
                .then(function (response) {
                    return response.object;
                });
        };

        return {
            searchCustomer: function (val, includeBalance, onhold) {
                return searchCustomer(val, includeBalance, onhold);
            },
            searchOrder: function (val) {
                return searchOrder(val);
            },
            searchItem: function (val) {
                return searchItem(val);
            }
        };

    }
})();
(function () {
    'use strict';
    sharedModule.factory('shoppingCartFactory', shoppingCartFactory);
    shoppingCartFactory.$inject = ['$rootScope', '$q', 'baseFactory', 'listFactory', 'CART_CONSTANTS', 'localStorageService'];
    function shoppingCartFactory($rootScope, $q, baseFactory, listFactory, CART_CONSTANTS, localStorageService) {
        var fromCookie = {
            get: function () {
                var cart = localStorageService.get('cart');
                if (!cart) {
                    cart = {
                        userId: null,
                        shoppingCart: "[]"
                    };
                    localStorageService.set('cart', cart);
                }
                return cart;
            },
            set: function (cart) {
                return localStorageService.set('cart', cart);
            }
        };

        return {
            getShoppingCart: getShoppingCart,
            saveShoppingCart: saveShoppingCart,
            addItemToCart: addItemToCart,
            removeItemFromCart: removeItemFromCart,
            createShoppingCartItem: createShoppingCartItem,
            getShoppingCartWithConfiguration: getShoppingCartWithConfiguration,
            getShoppingCartWithConfigurationFromQuote: getShoppingCartWithConfigurationFromQuote,
            updateCart: updateCart
        };

        function getShoppingCart() {
            if ($rootScope.clientName == "TWC" || $rootScope.clientName == "RETAILBLINDS") {
                return {
                    then: function (callback) {
                        callback([]);
                    }
                };
            } else if (($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") && !$rootScope.user) {
                return {
                    then: function (callback) {
                        var cart = fromCookie.get();
                        callback(cart ? angular.fromJson(cart.shoppingCart) : []);
                    }
                };
            } else if (($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") && $rootScope.user) {
                return baseFactory.fetch('/api/users/GetUserShoppingCart?userId=' + $rootScope.user.userId).then(function (data) {
                    var cart = fromCookie.get();
                    var items = cart ? angular.fromJson(cart.shoppingCart) : [];
                    var itemNumbers = [];
                    for (var i = 0; i < items.length; i++) {
                        itemNumbers.push(items[i].itemNumber);
                    }

                    if (!data.isErrored && data.object) {
                        var arr = data.object.shoppingCart ? angular.fromJson(data.object.shoppingCart) : [];
                        for (var i = 0; i < arr.length; i++) {
                            if (itemNumbers.indexOf(arr[i].itemNumber) < 0)
                                items.push(arr[i]);
                        }
                        return angular.copy(items);
                    }
                    return items;
                });
            } else {
                return baseFactory.fetch('/api/users/GetUserShoppingCart?userId=' + $rootScope.user.userId).then(function (data) {
                    if (!data.isErrored && data.object) {
                        var arr = data.object.shoppingCart ? angular.fromJson(data.object.shoppingCart) : [];
                        return angular.copy(arr);
                    }
                    return [];
                });
            }
        }

        function getShoppingCartWithConfigurationFromQuote(id) {
            return {};
        }

        function getShoppingCartWithConfiguration() {
            if (($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") && !$rootScope.user) {
                return {
                    then: function (callback) {
                        callback([]);
                    }
                };
            }
            return getShoppingCart().then(function (items) {
                var itemNumbers = [];

                for (var i = 0; i < items.length; i++) {
                    var item = items[i];
                    var linkedItemNumber;
                    if (item.linkedSets) {
                        angular.forEach(item.linkedSets, function (linkedSet) {
                            //need to get the pricing from the linked item
                            if (linkedSet.pricingOnLinkedItem)
                                linkedItemNumber = linkedSet.selectedItemId;
                        });
                    }
                    itemNumbers.push({
                        itemNumber: item.itemNumber,
                        pricingLinkedItemNumber: linkedItemNumber
                    });
                }

                return baseFactory.call('/api/productConfigurations/RetrieveProductConfigurations', itemNumbers).then(function (data) {
                    if (!data.isErrored) {
                        for (var i = 0; i < items.length; i++) {
                            var item = items[i];
                            for (var j = 0; j < data.object.length; j++) {
                                var config = data.object[j];
                                if (item.itemNumber.trim() === config.id.trim()) {
                                    item.config = config;
                                    for (var k in config) {
                                        item.config[k] = config[k];
                                    }
                                    item.config['additionalItems'] = item.additionalItems;
                                    item.config['additionalItemsTotalPrice'] = item.additionalItemsTotalPrice;
                                    selectLinkedItems(item);
                                }
                            }
                        }
                    }
                    return items;
                });
            });
        }

        function selectLinkedItems(item) {
            if (item.config.linkedSets && item.linkedSets) {
                angular.forEach(item.config.linkedSets, function (configLinkedSet) {
                    angular.forEach(item.linkedSets, function (linkedSet) {
                        if (configLinkedSet.id == linkedSet.setId) {
                            angular.forEach(configLinkedSet.linkedItems, function (linkedItem) {
                                if (linkedItem.id == linkedSet.selectedItemId)
                                    configLinkedSet.selectedLinkedItem = linkedItem;
                            });
                        }
                    });
                });
            }
        }

        function saveShoppingCart(shoppingCart, dontSendUpdatedMessage) {
            var jsonShoppingCart = angular.toJson(shoppingCart);
            var cart = {
                userId: !$rootScope.user ? null : $rootScope.user.userId,
                shoppingCart: jsonShoppingCart
            };
            if (($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") && !$rootScope.user) {
                fromCookie.set(cart);
                $rootScope.$emit(CART_CONSTANTS.CART_UPDATED, shoppingCart);
                return {
                    then: function (callback) {
                        callback(shoppingCart);
                    }
                };
            } else if (($rootScope.clientName == "FILDES" || $rootScope.clientName == "QODO") && $rootScope.user) {
                return baseFactory.post('/api/users/SaveUserShoppingCart', cart).then(function (data) {
                    if (!data.isErrored && !dontSendUpdatedMessage) {
                        fromCookie.set(cart);
                        $rootScope.$emit(CART_CONSTANTS.CART_UPDATED, shoppingCart);
                    }
                    return shoppingCart;
                });
            } else {
                return baseFactory.post('/api/users/SaveUserShoppingCart', cart).then(function (data) {
                    if (!data.isErrored && !dontSendUpdatedMessage) {
                        $rootScope.$emit(CART_CONSTANTS.CART_UPDATED, shoppingCart);
                    }
                    return shoppingCart;
                });
            }
        }

        function updateCart(items, dontSendUpdatedMessage) {
            var shoppingCart = [];
            angular.forEach(items, function (item) {
                shoppingCart.push(createShoppingCartItem(item));
            });
            return saveShoppingCart(shoppingCart, dontSendUpdatedMessage);
        }

        function addItemToCart(item, shoppingCart) {
            shoppingCart.push(createShoppingCartItem(item));
            return saveShoppingCart(shoppingCart);
        }

        function removeItemFromCart(item, shoppingCart) {
            listFactory.removeItem(shoppingCart, item);
            return saveShoppingCart(shoppingCart);
        }

        function createShoppingCartItem(item) {
            var linkedSets = [];
            angular.forEach(item.config.linkedSets, function (linkedSet) {
                linkedSets.push({
                    setId: linkedSet.id,
                    pricingOnLinkedItem: linkedSet.pricingOnLinkedItem,
                    selectedItemId: typeof linkedSet.selectedLinkedItem === 'undefined' ? null : linkedSet.selectedLinkedItem.id
                });
            });
            var data = {
                isConfigureItem: item.isConfigureItem,
                additionalItems: item.config.additionalItems,
                additionalItemsTotalPrice: item.config.additionalItemsTotalPrice,
                itemNumber: item.itemNumber,
                artworkApprovalFiles: item.artworkApprovalFiles,
                imageUrl: item.imageUrl,
                itemName: item.itemName,
                itemAlias: item.itemAlias,
                quantity: item.quantity,
                cartonQuantity: item.cartonQuantity,
                savedConfig: item.savedConfig,
                total: item.total,
                linkedSets: linkedSets,
                overriddenSetupTotal: typeof item.config.selectedPrintTypeConfig == 'undefined' ? 0 : item.config.selectedPrintTypeConfig.overriddenSetupTotal || 0,
                overriddenTotal: typeof item.config.selectedPrintTypeConfig == 'undefined' ? 0 : item.config.selectedPrintTypeConfig.overriddenTotal || 0,
                overridePricing: typeof item.config.selectedPrintTypeConfig == 'undefined' ? false : item.config.selectedPrintTypeConfig.overridePricing || false,
                overriddenUnitPrice: typeof item.config.selectedPrintTypeConfig == 'undefined' ? 0 : item.config.selectedPrintTypeConfig.overriddenUnitPrice || 0,
                setupTotal: typeof item.config.selectedPrintTypeConfig == 'undefined' ? 0 : item.config.selectedPrintTypeConfig.setupTotal || 0,
                unitPrice: typeof item.config.selectedPrintTypeConfig == 'undefined' ? 0 : item.config.selectedPrintTypeConfig.unitPrice || 0,
                kits: item.kits,
                kitNumber: item.kitNumber
            };

            if (item.itemPrice !== null)
                data.unitPrice = item.itemPrice;

            if (typeof item.config.unitPrices !== 'undefined' && item.config.unitPrices !== null && $rootScope.clientName == 'KINGPIN') {
                for (var i = 0; i < item.config.unitPrices.length; i++) {
                    if (item.config.unitPrices[i].minQuantity <= item.quantity && item.quantity <= item.config.unitPrices[i].maxQuantity) {
                        data.unitPrice = item.config.unitPrices[i].cost;
                        break;
                    } else if (item.config.unitPrices[i].minQuantity == null && item.quantity <= item.config.unitPrices[i].maxQuantity) {
                        data.unitPrice = item.config.unitPrices[i].cost;
                        break;
                    } else if (item.config.unitPrices[i].minQuantity <= item.quantity && item.config.unitPrices[i].maxQuantity == null) {
                        data.unitPrice = item.config.unitPrices[i].cost;
                        break;
                    }
                }
            }

            return data;
        }
    }
})();
(function () {
    'use strict';

    sharedModule.filter('appAlphaWithNaFilter', appAlphaWithNaFilter);
    appAlphaWithNaFilter.$inject = ['listFactory'];

    function appAlphaWithNaFilter(listFactory) {

        function squash(arr) {
            if (arr != null) {
                var tmp = [];
                for (var i = 0; i < arr.length; i++) {
                    if (tmp.indexOf(arr[i]) == -1) {
                        tmp.push(arr[i]);
                    }
                }
                return tmp;
            }
            return arr;
        }

        return function (options) {
            if (options.indexOf('N/A') == -1)
                return options.sort();

            //remove N/A
            listFactory.remove(options, 'N/A');

            //sort alphanumeric
            options.sort();

            //put N/A back in at the start of the list
            options.splice(0, 0, 'N/A');

            return squash(options);
        };
    }
})();
(function() {
    'use strict';
    
    sharedModule.filter('appDate', appDateFilter);
    appDateFilter.$inject = ['$filter', 'FILTER_CONSTANTS'];
    
    function appDateFilter($filter, FILTER_CONSTANTS) {
        var angularDateFilter = $filter('date');
        return function (theDate) {
            return angularDateFilter(theDate, FILTER_CONSTANTS.STANDARD_DATE_FORMAT);
        };
    }
})();
(function() {
    'use strict';
    
    sharedModule.filter('appDateTime', appDateTimeFilter);
    appDateTimeFilter.$inject = ['$filter', 'APP_CONSTANTS'];

    function appDateTimeFilter($filter, APP_CONSTANTS) {
        var angularDateFilter = $filter('date');
        return function(theDate) {
            return angularDateFilter(theDate, APP_CONSTANTS.STANDARD_DATE_TIME_FORMAT);
        };
    }
})();
(function () {
    'use strict';
    sharedModule.filter('appFromNow', appFromNowFilter);
    function appFromNowFilter() {
        return function (date) {
            if(date!=null)
                return moment(date).fromNow();
        }
    }
})();
(function() {
    'use strict';
    sharedModule.filter('appTime', appTimeFilter);
    appTimeFilter.$inject = ['$filter', 'APP_CONSTANTS'];

    function appTimeFilter($filter, APP_CONSTANTS) {
        var angularDateFilter = $filter('date');
        return function(theDate) {
            return angularDateFilter(theDate, APP_CONSTANTS.STANDARD_TIME_FORMAT);
        }
    }
})();
(function () {
    'use strict';
    sharedModule
        .filter('trustAsHtml', ['$sce', function ($sce) {
            return $sce.trustAsHtml;
        }])
        .filter('limitHtml', [function () {
            return function (text, limit, ellipsis) {
                var _getClosedTagsString = function (_tagArray) {
                    var _returnArray = [],
                    _getTagType = function (_string) {
                        return _string.replace(/<[\/]?([^>]*)>/, "$1");
                    };

                    angular.forEach(_tagArray, function (_tag, _i) {
                        if (/<\//.test(_tag)) {
                            if (_i === 0) {
                                _returnArray.push(_tag);
                            } else if (_getTagType(_tag) !== _getTagType(_tagArray[_i - 1])) {
                                _returnArray.push(_tag);
                            }
                        }
                    });
                    return _returnArray.join('');
                },
                _countNonHtmlCharToLimit = function (_text, _limit) {
                    var _isMarkup = false,
                    _isSpecialChar = false,
                    _break = false,
                    _underLimit = false,
                    _totalText = 0,
                    _totalChar = 0,
                    _element,
                    _return = {
                        textCounter: 0,
                        offsetCounter: 0,
                        setEllipsis: false,
                        overElementArray: []
                    };
                    angular.forEach(_text, function (_c) {
                        _underLimit = _return.textCounter < _limit;
                        if (_c === '<' && !_isMarkup && !_isSpecialChar) {
                            (!_underLimit) && (_element = '<');
                            _isMarkup = true;
                        } else if (_c === '&' && !_isMarkup && !_isSpecialChar) {
                            _isSpecialChar = true;
                        } else if (_isMarkup) {
                            //tracking html elements that are beyond the text limit
                            (!_underLimit) && (_element = _element + _c);
                            if (_c === '>') {
                                //push element in array if it is complete, and we are
                                //beyond text limit, to close any html that is unclosed
                                (!_underLimit) && (_return.overElementArray.push(_element));
                                _break = true;
                                _isMarkup = false;
                            }
                        } else if (_c === ';' && _isSpecialChar) {
                            _isSpecialChar = false;
                            //count as one character
                            _return.textCounter++;
                            _break = true;
                        }

                        if (_underLimit) {
                            if (!_isMarkup && !_isSpecialChar && !_break) {
                                //counting number of characters in non html string
                                _return.textCounter++;
                            }
                            _return.offsetCounter++;
                        } else {
                            _return.setEllipsis = true
                        }
                        _break = false;

                    });

                    //returns offset within html of number of non html characters found
                    return _return;
                },
                _charToLimitOutput = _countNonHtmlCharToLimit(text.toString(), limit);

                var regex = /(<([^>]+)>)/ig,
                    result = text.replace(regex, "");

                var truncatedText = result.toString().substr(0, _charToLimitOutput.offsetCounter) +
                    (result.length > _charToLimitOutput.offsetCounter ? ellipsis : '') + _getClosedTagsString(_charToLimitOutput.overElementArray);
                return truncatedText;
            }
        }]);
})();
(function () {
    'use strict';
    sharedModule.filter('propsFilter', [function () {
        return function (items, props) {
            var out = [];

            if (angular.isArray(items)) {
                items.forEach(function (item) {
                    var itemMatches = false;

                    var keys = Object.keys(props);
                    for (var i = 0; i < keys.length; i++) {
                        var prop = keys[i];
                        var text = props[prop].toLowerCase();
                        if (item[prop].toString().toLowerCase().indexOf(text) !== -1) {
                            itemMatches = true;
                            break;
                        }
                    }

                    if (itemMatches) {
                        out.push(item);
                    }
                });
            } else {
                // Let the output be the input untouched
                out = items;
            }

            return out;
        }
    }]);
})();
(function () {
    'use strict';
    sharedModule.filter('range', [function () {
        return function (input, total, min) {
            var minimumValue = typeof min === "undefined" ? 0 : min;
            total = parseInt(total);
            for (var i = minimumValue; i <= total; i++)
                input.push(i);
            return input;
        };
    }]);
})();
(function () {
    'use strict';
    sharedModule.filter('startFrom', [function () {
        return function (input, start) {
            start = +start; //parse to int
            return input.slice(start);
        }
    }]);
})();
(function () {
    'use strict';
    sharedModule
        .filter('cut', [function () {
            return function (value, wordwise, max, tail) {

                if (!value) return '';

                if (value.indexOf('<br') > 0) {
                    var arValue = value.split('<br');
                    value = arValue[0];
                    return value + (tail || ' …');
                }

                max = parseInt(max, 10);
                if (!max) return value;
                if (value.length <= max) return value;

                value = value.substr(0, max);
                if (wordwise) {
                    var lastspace = value.lastIndexOf(' ');
                    if (lastspace != -1) {
                        value = value.substr(0, lastspace);
                    }
                }

                return value + (tail || ' …');
            };
        }]);
})();
(function () {
    'use strict';

    sharedModule.filter('strNone', [function () {
        return function (input) {

            if (input == "undefined")
                return "";
            
            if (input == null)
                return "";

            if (input.length < 1)
                return "";
            return input;

        };

    }]);
})();
(function () {
    'use strict';
    sharedModule.filter('true_false', [function () {
        return function (text, length, end) {
            if (text) {
                return 'Yes';
            }
            return 'No';
        }
    }]);
})();
(function () {
    'use strict';

    sharedModule.controller('alertModal', alertModal);
    alertModal.$inject = ['$scope', '$modalInstance', 'item'];
    function alertModal($scope, $modalInstance, item) {

        $scope.item = item;

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    }

})();
(function () {
    'use strict';

    sharedModule.controller('genericDeleteModal', genericDeleteModal);
    genericDeleteModal.$inject = ['$scope', '$modalInstance', 'itemToDelete', 'extraMarkup'];
    function genericDeleteModal($scope, $modalInstance, itemToDelete, extraMarkup) {

        $scope.item = itemToDelete;
        $scope.extraMarkup = extraMarkup;

        $scope.confirm = function () {
            $modalInstance.close(true);
        };
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    }

})();
(function () {
    'use strict';

    sharedModule.controller('genericModal', genericModal);
    genericModal.$inject = ['$scope', '$modalInstance', 'item'];
    function genericModal($scope, $modalInstance, item) {

        $scope.item = item;

        $scope.ok = function () {
            $modalInstance.close(true);
        };
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    }

})();
reworkModule.controller('ShipmentCtrl',
    ['$scope', '$rootScope', '$state', '$modal', 'baseFactory', 'modalFactory', 'promptFactory', 'GRID_CONSTANTS',
        function ($scope, $rootScope, $state, $modal, baseFactory, modalFactory, promptFactory, GRID_CONSTANTS) {

            $scope.gridOptions = {
                itemType: 'shipment',
                gridName: 'shipment',
                fetchUrl: '/api/twcshipments/searchAll',
                exportUrl: '/exportGrid/getShipments/',
                initSortString: 'dateCreated desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                enableExport: true,
                displayActionMenu: true,
                enableDisplayActionMenuImport: true,
                columnDefs: [
                    { field: 'shipmentNumber', displayName: 'Container Number', customSortField: 'shipmentNumber' },
                    { field: 'origin', displayName: 'Origin', customSortField: 'origin' },
                    { field: 'destination', displayName: 'Destination', customSortField: 'destination' },
                    {
                        field: 'dateDispatch', width: '120', visibleAt: '992', displayName: 'Dispatch Date', customSortField: 'dateDispatch',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateDispatch | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    {
                        field: 'dateArrivalEst', width: '120', visibleAt: '768', displayName: 'ETA Arrival', customSortField: 'dateArrivalEst',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateArrivalEst | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    {
                        field: 'dateArrival', width: '120', visibleAt: '768', displayName: 'Actual Arrival', customSortField: 'dateArrival',
                        cellTemplate: '<div class="ngCellText"><span>{{row.entity.dateArrival | date:"dd/MM/yyyy"}}</span></div>'
                    },
                    { field: 'orderCount', displayName: 'Orders', customSortField: 'orderCount' },
                    { field: 'comments', visibleAt: '768', displayName: 'Comments', customSortField: 'comments' },
                ],
                controlColumnWidth: 85,
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                var exportOrdersUrl = '/exportGrid/getShipmentOrders/?sn=';
                return '<div class="controls">' +
                    '<div class="btn-group" dropdown>' +
                    '<button type="button" class=" btn-sm btn btn-default" dropdown-toggle>Manage <span class="caret"></span></button>' +
                    '<ul class="dropdown-menu">' +
                    '<li><a ui-sref="base.shipments.edit({id:row.entity.id})">Edit</a></li>' +
                    '<li><a ng-click="deleteShipment(row.entity)" class="cursor-pointer">Delete</a></li>' +
                    '<li class="divider"></li>' +
                    '<li><a href="' + exportOrdersUrl + '{{row.entity.shipmentNumber}}" target="_blank" rel="nofollow noreferrer noopener" class="cursor-pointer">Export</a></li>' +
                    '<li><a ng-click="shipContainer(row.entity)" class="cursor-pointer">Ship Container</a></li>' +
                    '<li permission permissions="system.workorderadmin.allow"><a ng-click="invoiceContainer(row.entity)" class="cursor-pointer">Invoice Container</a></li>' +
                    '</ul>' +
                    '</div>' +
                    '</div>';
            }

            $scope.deleteShipment = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.shipmentNumber,
                    value.id,
                    'Shipment',
                    null,
                    '/api/twcshipments/delete/',
                    $scope.gridOptions.gridName
                );
            };
            $scope.shipContainer = function (item) {
                promptFactory.confirm("Are you sure you want to ship this container?", function (result) {
                    if (result) {
                        baseFactory.post('/api/twcshipments/shipContainer/' + item.id).then(function (rrdata) {
                        });
                    }
                });
            };
            $scope.invoiceContainer = function (item) {
                promptFactory.confirm("Are you sure you want to invoice this container?", function (result) {
                    if (result) {
                        baseFactory.put('/api/twcshipments/invoice/' + item.id).then(function (rrdata) {
                        });
                    }
                });
            };
            
            $rootScope.$on(GRID_CONSTANTS.IMPORT_DATA + $scope.gridOptions.gridName, function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/shipments/modals/shipmentImportModal.html',
                    controller: 'ShipmentImportModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {}
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () {
                });
            });
        }]);
reworkModule.controller('ShipmentCreateEditCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', 'baseFactory', 'promptFactory', 'shipment',
        function ($scope, $rootScope, $state, $timeout, baseFactory, promptFactory, shipment) {

            $scope.isNew = shipment.id == 0;
            $scope.mode = shipment.id == 0 ? 'Create' : 'Update';
            $scope.m = shipment;
            $scope.n = {
                shipmentOrderNumber: null,
                shipmentCartons: null,
                order: null
            };
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";

            $scope.originLocations = ['China'];
            $scope.destinationLocations = ['Melbourne', 'Sydney', 'Adelaide', 'Brisbane'];

            $scope.dateOptions = {
                formatYear: 'yyyy',
                startingDay: 1
            };
            $scope.dateDispatchOpened = false;
            $scope.dateArrivalOpened = false;
            $scope.dateArrivalEstOpened = false;

            $scope.openDateDispatch = function ($event, cf) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateDispatchOpened = true;
                $scope.dateArrivalOpened = false;
                $scope.dateArrivalEstOpened = false;
            };
            $scope.openDateArrival = function ($event, cf) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateDispatchOpened = false;
                $scope.dateArrivalOpened = true;
                $scope.dateArrivalEstOpened = false;
            };
            $scope.openDateArrivalEst = function ($event, cf) {
                $event.preventDefault();
                $event.stopPropagation();
                $scope.dateDispatchOpened = false;
                $scope.dateArrivalOpened = false;
                $scope.dateArrivalEstOpened = true;
            };

            $scope.shipContainer = function (shipmentId) {
                promptFactory.confirm("Are you sure you want to ship this container?", function (result) {
                    if (result) {
                        baseFactory.post('/api/twcshipments/shipContainer/' + shipmentId).then(function (rrdata) {
                        });
                    }
                });
            };

            $scope.searchOrders = function (str) {
                if (str.length < 2) {
                    return [];
                }
                var dataToSend = {
                    endDate: moment().format('YYYY-MM-DD'),
                    retrieveSize: 5,
                    searchText: str,
                    startDate: "1970-01-01",
                    startIndex: 1
                };
                return baseFactory.fetch('/api/order/SearchOrders', dataToSend).then(function (rdata) {
                    var arr = [];
                    for (var i = 0; i < rdata.object.length; i++) {
                        var obj = rdata.object[i];
                        var isExist = false;
                        for (var j = 0; j < $scope.m.orders.length; j++) {
                            if ($scope.m.orders[j].orderId == obj.id) {
                                isExist = true;
                                break;
                            }
                        }
                        if (!isExist)
                            arr.push(obj);
                    }
                    return arr;
                });
            };
            $scope.addOrderShipments = function (nForm, n) {
                $rootScope.formSubmit(nForm);
                if (nForm.$valid) {
                    var item = {
                        twcOrderNumber: angular.copy(n.order.orderNumber),
                        orderId: angular.copy(n.order.id),
                        purchaseOrderNumber: angular.copy(n.order.purchaseOrderNumber),
                        orderDate: angular.copy(n.order.orderDate),
                        shipmentOrderNumber: angular.copy(n.shipmentOrderNumber),
                        shipmentCartons: angular.copy(n.shipmentCartons)
                    }
                    $scope.m.orders.push(item);
                    $scope.n = {
                        shipmentOrderNumber: null,
                        shipmentCartons: null,
                        order: null
                    };
                }
            };
            $scope.removeOrderShipment = function (indx) {
                $scope.m.orders.splice(indx, 1);
            }
            $scope.save = function (mForm, m) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;

                    var dataToSend = angular.copy(m);

                    baseFactory.post('/api/twcshipments/save', dataToSend).then(function (data) {
                        // console.log(data);
                        if (!data.isErrored) {
                            $state.go('base.shipments.edit', { id: data.object });
                        }
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
        }]);
reworkModule.controller('ShipmentImportModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', 'baseFactory',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, baseFactory) {
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.importUrl = "/api/twcshipments/import";
            $scope.doc = {
                isUploaded: false
            };

            $scope.changeFile = changeFile;
            $scope.onFileSelect = onFileSelect;
            $scope.importConfig = importConfig;


            //Upload Document
            function isFileValid(filename) {
                $scope.error = null;
                var fileParts = filename.toLowerCase().split('.');

                var validFileTypes = ['xls', 'xlsx'];
                var valid = false;

                angular.forEach(validFileTypes, function (fileType) {
                    if (fileType === fileParts[fileParts.length - 1])
                        valid = true;
                });

                if (!valid)
                    $scope.error = 'File is invalid';

                return valid;
            };

            function onFileSelect($files) {
                if (isFileValid($files[0].name)) {
                    $scope.disableSubmitButton = true;
                    $scope.progress = 0;
                    $scope.upload = baseFactory
                    .upload('/api/upload/file', { oldfolder: '' }, $files)
                    .progress(function (evt) {
                        $scope.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
                    }).success(function (data) {
                        if (!data.isErrored) {
                            resetInputFile();
                            $scope.doc['fileFolder'] = data.object.fileFolder;
                            $scope.doc['fileName'] = data.object.fileName;
                            $scope.doc['isUploaded'] = true;
                        }
                        $scope.disableSubmitButton = false;


                    });
                } else {
                    resetInputFile();
                    changeFile();
                }
            };

            function changeFile() {
                $scope.doc = {
                    isUploaded: false
                };
            };


            function resetInputFile() {
                var elems = document.getElementsByTagName('input');
                for (var i = 0; i < elems.length; i++) {
                    if (elems[i].type == 'file') {
                        elems[i].value = null;
                    }
                }
            }

            function importConfig() {
                $scope.disableSubmitButton = true;
                baseFactory.fetch($scope.importUrl + '?filepath=' + '\\' + $scope.doc.fileFolder + '\\' + $scope.doc.fileName).then(function (rdata) {
                    if (!rdata.isErrored) {
                        $modalInstance.close();
                    }
                    $scope.disableSubmitButton = false;
                });
            };

            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
(function () {
    'use strict';

    angular.module('appSharedModule').controller('SubscribeModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'STATES'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, STATES) {

        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.m = {
            state: null
        };
        $scope.isSuccess = false;
        $scope.states = STATES;

        $scope.ok = function (mForm, m) {
            // $rootScope.formSubmit(mForm);
            if (mForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;

                var dataToSend = angular.copy(m);

                baseFactory.post('/api/subscriber/save', dataToSend).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        $scope.isSuccess = true;
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };
        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();

(function () {
    'use strict';

    angular.module('appSharedModule').controller('SubscribeFormCtrl', ctrl);
    ctrl.$inject = ['$scope', '$modalInstance'];
    function ctrl($scope, $modalInstance) {

        $scope.isSuccess = true;

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
homeModule.controller('WorkOrderBulkUpdateCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$controller', 'baseFactory', 'modalFactory', 'sharedFactory',
        'promptFactory', 'categories', 'orderStatuses', 'itemStatuses', 'items', 'twcZones', 'statuses',
        function ($scope, $rootScope, $modal, $state, $controller, baseFactory, modalFactory, sharedFactory,
            promptFactory, categories, orderStatuses, itemStatuses, items, twcZones, statuses) {
                        
            angular.extend(this, $controller('BulkOrderUpdateCtrl', {
                $scope: $scope,
                categories: categories,
                orderStatuses: orderStatuses,
                itemStatuses: itemStatuses,
                items: items,
                twcZones: twcZones,
                workOrderStatuses: statuses
            }));

            $scope.steps = [
                {
                    step: 1,
                    title: 'Search Work Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Review Work Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 3,
                    title: 'Update Work Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 4,
                    title: 'Confirm Update',
                    isDone: false,
                    isEditing: false
                }
            ];
        }
    ]);
homeModule.controller('WorkOrderCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "$modal", "$timeout", "baseFactory", "permissionFactory", "blindTypes", "twcZones", "statuses",
        function ($scope, $rootScope, $state, $stateParams, $modal, $timeout, baseFactory, permissionFactory, blindTypes, twcZones, statuses) {
            var size = {
                width: window.innerWidth || document.body.clientWidth,
                height: window.innerHeight || document.body.clientHeight
            };

            $scope.reportUrl = "/DashboardReport/workOrder";
            function resizeIframe() {
                $scope.hh = document.body.scrollHeight - 250;
            }
            // $scope.resizeIframe = resizeIframe();
            // resizeIframe();

            $scope.manageCapacity = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/manageCapacityModal.html',
                    controller: 'ManageCapacityModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        categories: function () {
                            return baseFactory.fetch('/api/category/GetAll').then(function (rdata) {
                                return rdata.object || [];
                            });
                        },
                        workOrderCategories: function () {
                            return baseFactory.fetch('/api/category/GetAllWorkOrderCategories').then(function (rdata) {
                                return rdata.object || [];
                            });
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                    document.getElementById('reportDashboardFrame').contentDocument.location.reload(true);
                }, function () {
                });
            };

            $scope.exportSchedule = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/exportWorkOrderModal.html',
                    controller: 'WorkOrderExportModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        blindTypes: function () {
                            return blindTypes;
                        },
                        twcZones: function () {
                            return twcZones;
                        },
                        dateRange: function () {
                            return $scope.filter.dateRange;
                        }
                    }
                });

                modalInstance.result.then(function (ddata) {
                }, function () {
                });
            };

            $scope.getWorkOrderStatusColor = function (colour) {
                if (colour !== null)
                    return { 'background-color': colour, 'display': 'block', 'margin': '-5px' };
                return { 'background-color': 'unset' };
            };

            // NEW UI
            $scope.filter = {
                searchText: null,
                ft: null,
                sv: null,
                s: -1,
                p: "",
                sortName: "Order Number (Low to High)",
                sort: "OrderNumber asc",
                categoryId: null,
                dateRange: {
                    startDate: moment.utc('20130101', 'YYYYMMDD'),
                    endDate: moment().add(1, 'year')
                }
            };
            $scope.filterTypes = [
                { id: null, name: "All" },
                { id: "orders", name: "Orders" },
                { id: "reworks", name: "Reworks" }
            ];
            $scope.blindTypes = ["All"];
            for (var i = 0; i < blindTypes.length; i++) {
                $scope.blindTypes.push(blindTypes[i]);
            }
            $scope.twcZones = [{ id: null, name: "All Ship Via" }];
            for (var j = 0; j < twcZones.length; j++) {
                $scope.twcZones.push(twcZones[j]);
            }
            $scope.twcWorkOrderStatuses = [{ id: -1, name: 'Not Started' }, { id: -2, name: 'Not Started/On Hold' }];
            for (var k = 0; k < statuses.length; k++) {
                $scope.twcWorkOrderStatuses.push(statuses[k]);
            }
            $scope.twcWorkOrderStatuses.push({ id: 0, name: "All Statuses" });
            $scope.twcSorts = [
                { id: 1, name: "Order Number (Low to High)", sort: "OrderNumber ASC" },
                { id: 2, name: "Order Number (High to Low)", sort: "OrderNumber DESC" },
                { id: 3, name: "Date (Oldest to Newest)", sort: "OrderDate ASC" },
                { id: 4, name: "Date (Newest to Oldest)", sort: "OrderDate DESC" },
                { id: 5, name: "Delivery Date (Oldest to Newest)", sort: "DeliveryDate ASC" },
                { id: 6, name: "Delivery Date (Newest to Oldest)", sort: "DeliveryDate DESC" },
            ];
            $scope.dateRanges = {
                'Today': [moment(), moment()],
                'Next 7 Days': [moment(), moment().add(6, 'days')],
                'Next 30 Days': [moment(), moment().add(29, 'days')],
                'This Month': [moment().startOf('month'), moment().endOf('month')],
                'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
                'This Year': [moment().startOf('year'), moment().endOf('year')],
                'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')],
                'All Time': [moment.utc('20130101', 'YYYYMMDD'), moment()]
            };
            $scope.searchResult = {
                selected: 0,
                selection: 1,
                arr: []
            };

            $scope.arr1 = [];
            $scope.arr2 = [];
            $scope.arr3 = [];
            $scope.activeArr1Index = 0;
            $scope.activeArr2Index = 0;
            $scope.activeArr3Index = 0;
            $scope.currentDate = null;
            $scope.isPanel1Show = true;
            $scope.isPanel2Show = true;
            $scope.isPanel3Show = true;
            $scope.isPanel1FullScreen = false;
            $scope.isPanel2FullScreen = false;
            $scope.isPanel3FullScreen = false;
            $scope.panelFullScreen = function (panel) {
                $scope.isPanel1Show = true;
                $scope.isPanel2Show = true;
                $scope.isPanel3Show = true;
                if (panel === 1) {
                    $scope.isPanel1FullScreen = !$scope.isPanel1FullScreen;
                    $scope.isPanel2FullScreen = false;
                    $scope.isPanel3FullScreen = false;
                    if ($scope.isPanel1FullScreen) {
                        $scope.isPanel1Show = true;
                        $scope.isPanel2Show = false;
                        $scope.isPanel3Show = false;
                    }
                } else if (panel === 2) {
                    $scope.isPanel1FullScreen = false;
                    $scope.isPanel2FullScreen = !$scope.isPanel2FullScreen;
                    $scope.isPanel3FullScreen = false;
                    if ($scope.isPanel2FullScreen) {
                        $scope.isPanel1Show = false;
                        $scope.isPanel2Show = true;
                        $scope.isPanel3Show = false;
                    }
                } else if (panel === 3) {
                    $scope.isPanel1FullScreen = false;
                    $scope.isPanel2FullScreen = false;
                    $scope.isPanel3FullScreen = !$scope.isPanel3FullScreen;
                    if ($scope.isPanel3FullScreen) {
                        $scope.isPanel1Show = false;
                        $scope.isPanel2Show = false;
                        $scope.isPanel3Show = true;
                    }
                }
            };
            $scope.loadProductRange = function (indx1) {
                var dts = angular.copy($scope.filter);
                dts.startDate = moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD');
                dts.endDate = moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD');
                delete dts.dateRange;
                delete dts.sortName;
                baseFactory.fetch('/api/twcworkorders/productRanges', dts).then(function (rdata) {
                    $scope.arr1 = rdata.object || [];
                    $scope.currentDate = null;

                    if ($scope.arr1.length > 0) {
                        var total = 0;
                        for (var i = 0; i < $scope.arr1.length; i++) {
                            total = total + $scope.arr1[i].quantity;
                        }
                        // $scope.arr1.unshift({ category: 'All', quantity: total });
                        $scope.loadOrderRange($scope.arr1[indx1].categoryId, $scope.arr1[indx1].category, 0, 1);
                    } else {
                        $scope.arr2 = [];
                        $scope.arr3 = [];
                        $scope.activeArr2Index = 0;
                        $scope.activeArr3Index = 0;
                    }
                });
            };
            $scope.activeArr3StartIndex = 1;
            $scope.activeArr3RetrieveSize = 50;
            $scope.isLoading = false;
            $scope.loadOrderRange = function (catId, p, indx, startIndex) {
                var isNew = $scope.activeArr1Index !== indx || startIndex === 1;
                $scope.activeArr1Index = indx;
                var dts = angular.copy($scope.filter);
                dts.categoryId = angular.copy(catId);
                //dts.p = angular.copy(p);
                dts.startDate = moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD');
                dts.endDate = moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD');
                dts.startIndex = isNaN(startIndex) ? 1 : startIndex > 0 ? startIndex : 1;
                dts.retrieveSize = $scope.activeArr3RetrieveSize;
                delete dts.dateRange;
                delete dts.sortName;
                $scope.isLoading = true;
                $scope.isShowLoadMore = false;
                $scope.searchResult = {
                    selected: 0,
                    selection: 1,
                    arr: []
                };
                if (isNew)
                    $scope.arr3 = [];
                baseFactory.fetch('/api/twcworkorders/orders', dts).then(function (rdata) {
                    var arr = [];
                    for (var i = 0; i < rdata.object.length; i++) {
                        rdata.object[i].isSelected = false;
                        arr.push(rdata.object[i]);
                    }
                    if (isNew) {
                        $scope.arr3 = arr;
                    } else {
                        for (var j = 0; j < arr.length; j++) {
                            $scope.arr3.push(arr[j]);
                            $scope.$broadcast('::WORKORDER-PUSH-ITEM', { $item: arr[j]});
                        }
                    }
                    $scope.isLoading = false;
                    $scope.activeArr3StartIndex = $scope.arr3.length + 1;
                    $scope.isShowLoadMore = dts.retrieveSize === rdata.totalItems && $scope.filter.s >= 0;
                });
            };
            $scope.loadMore = function () {
                $scope.loadOrderRange($scope.arr1[$scope.activeArr1Index].categoryId, $scope.arr1[$scope.activeArr1Index].category, $scope.activeArr1Index, $scope.activeArr3StartIndex);
            };

            //
            $scope.selectAllRowOrders = function () {
                if ($scope.searchResult.selection === 1 || $scope.searchResult.selection === 3) {
                    $scope.searchResult.selection = 2;
                } else if ($scope.searchResult.selection === 2) {
                    $scope.searchResult.selection = 1;
                }
                for (var i = 0; i < $scope.arr3.length; i++) {
                    $scope.arr3[i].isSelected = $scope.searchResult.selection === 2;
                    $scope.$broadcast('::WORKORDER-SELECTED-ITEM', { $itemIndex: i, $isSelected: $scope.arr3[i].isSelected });
                }
                $scope.searchResult.selected = $scope.searchResult.selection === 2 ? $scope.arr3.length : 0;
                $scope.$broadcast('::WORKORDER-SELECTED-ALL', { $selection: $scope.searchResult.selection });
            };
            $scope.selectRowOrder = function (indx) {
                // 1 = All unchecked
                // 2 = All checked
                // 3 = Some checked
                $scope.arr3[indx].isSelected = !$scope.arr3[indx].isSelected;
                if ($scope.arr3[indx].isSelected) {
                    $scope.searchResult.selected++;
                }
                else {
                    $scope.searchResult.selected--;
                }
                //
                if ($scope.searchResult.selected > 0)
                    $scope.searchResult.selection = $scope.searchResult.selected === $scope.arr3.length ? 2 : 3;
                else
                    $scope.searchResult.selection = 1;
                $scope.$broadcast('::WORKORDER-SELECTED-ALL', { $selection: $scope.searchResult.selection });
            };
            $scope.filterSearh = function () {
                $scope.loadProductRange(0);
                var params = angular.copy($scope.filter);
                params.startDate = moment($scope.filter.dateRange.startDate).format('YYYY-MM-DD');
                params.endDate = moment($scope.filter.dateRange.endDate).format('YYYY-MM-DD');
                delete params.dateRange;
                delete params.sortName;
                $scope.exportUrl = "/report/workOrderExport?" + $rootScope.objToParam($scope.filter);
            };
            $scope.sortFilterSearch = function (so) {
                $scope.filter.sortName = so.name;
                $scope.filter.sort = so.sort;
                $scope.filterSearh();
            };
            $scope.$watch("filter.ft", function (v, o) {
                if (v !== o)
                    $timeout(function () {
                        $scope.filterSearh();
                    }, 500);
            });
            $scope.filterSearh();
            $scope.viewOrder = function (orderId) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/viewOrderModal.html',
                    controller: 'WorkOrderViewOrderModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {
                        order: ['resolveFactory', function (resolveFactory) {
                            return resolveFactory.getEntity('/api/order/GetCreateUpdateOrderModel?id=' + orderId);
                        }],
                        workOrderEvents: ['baseFactory', function (baseFactory) {
                            return baseFactory.fetch('/api/twcworkorders/getallevents/' + orderId).then(function (rrdata) {
                                return rrdata.object || [];
                            });
                        }],
                        workOrderEventStatuses: ['baseFactory', function (baseFactory) {
                            return baseFactory.fetch('/api/twcworkorders/getalleventstatuses/' + orderId).then(function (rrdata) {
                                return rrdata.object || [];
                            });
                        }]
                    }
                });

                modalInstance.result.then(function (ddata) {
                    $scope.loadOrderRange($scope.arr1[$scope.activeArr1Index].categoryId, $scope.arr1[$scope.activeArr1Index].category, $scope.activeArr1Index, 1);
                }, function (isReload) {
                    if (isReload)
                        $scope.loadOrderRange($scope.arr1[$scope.activeArr1Index].categoryId, $scope.arr1[$scope.activeArr1Index].category, $scope.activeArr1Index, 1);
                });
            };
            var getPrintStatus = function () {
                for (var i = 0; i < statuses.length; i++) {
                    if (statuses[i].id === 1) {
                        return statuses[i];
                    }
                }
                return null;
            };
            $scope.printWorkOrder = function (item, indx) {
                //console.log(item)
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/printWorkOrderModal.html',
                    controller: 'PrintWorkOrderModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        orders: function () {
                            return item.orderId;
                        },
                        printers: ['baseFactory', function (baseFactory) {
                            return baseFactory.fetch('/api/twcworkorders/getallprinters').then(function (rrdata) {
                                return rrdata.object || [];
                            });
                        }]
                    }
                });

                modalInstance.result.then(function (rrdata) {
                    var stat = getPrintStatus();
                    if (stat !== null && item.workOrderStatusId === null) {
                        item.workOrderStatusId = stat.id;
                        item.workOrderStatus = stat.name;
                        item.workOrderStatusColour = stat.colour;
                        $scope.$broadcast('::WORKORDER-UPDATE-STATUS', { $indx: indx, $item: item });
                    }
                }, function () {
                });
            };
            $scope.printWorkOrders = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/printWorkOrderModal.html',
                    controller: 'PrintWorkOrderModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        orders: function () {
                            var orderIds = [];
                            for (var i = 0; i < $scope.arr3.length; i++) {
                                if ($scope.arr3[i].isSelected || $scope.searchResult.selected === 0)
                                    orderIds.push($scope.arr3[i].orderId);
                            }
                            return orderIds.join();
                        },
                        printers: ['baseFactory', function (baseFactory) {
                            return baseFactory.fetch('/api/twcworkorders/getallprinters').then(function (rrdata) {
                                return rrdata.object || [];
                            });
                        }]
                    }
                });

                modalInstance.result.then(function (rrdata) {
                    var stat = getPrintStatus();
                    for (var i = 0; i < $scope.arr3.length; i++) {
                        if ($scope.arr3[i].isSelected || $scope.searchResult.selected === 0)
                            if (stat !== null && $scope.arr3[i].workOrderStatusId === null) {
                                $scope.arr3[i].workOrderStatusId = stat.id;
                                $scope.arr3[i].workOrderStatus = stat.name;
                                $scope.arr3[i].workOrderStatusColour = stat.colour;
                                $scope.$broadcast('::WORKORDER-UPDATE-STATUS', { $indx: i, $item: $scope.arr3[i] });
                            }
                    }
                }, function () {
                });
            };

            $scope.updateWorkOrderStatus = function (item, indx) {
                if (permissionFactory.isSysAdmin() || permissionFactory.hasPermission(['system.workorderadmin.allow'])) {
                    if (item.workOrderStatusId === null) {
                        $scope.printWorkOrder(item);
                        return;
                    }
                    var modalInstance = $modal.open({
                        templateUrl: '/app/modules/workOrders/modals/manageWorkOrderStatusModal.html',
                        controller: 'ManageWorkOrderStatusModalCtrl',
                        size: 'md',
                        backdrop: 'static',
                        resolve: {
                            statuses: function () {
                                return statuses;
                            },
                            workOrder: function () {
                                return {
                                    orderId: item.orderId,
                                    workOrderStatusId: item.workOrderStatusId
                                };
                            }
                        }
                    });

                    modalInstance.result.then(function (rrdata) {
                        item.workOrderStatusId = rrdata.workOrderStatusId;
                        item.workOrderStatus = rrdata.workOrderStatus;
                        item.workOrderStatusColour = rrdata.workOrderStatusColour;
                        $scope.$broadcast('::WORKORDER-UPDATE-STATUS', { $indx: indx, $item: rrdata });
                    }, function () {
                    });
                }
            };
            $scope.editComment = function (orderId, indx) {
                if (permissionFactory.isSysAdmin() || permissionFactory.hasPermission(['system.workorderadmin.allow'])) {
                    baseFactory.fetch('/api/notes/getbyorder/' + orderId).then(function (rrdata) {
                        var m = rrdata.object;
                        var modalInstance = $modal.open({
                            templateUrl: '/app/modules/order/dashboard/modals/manageSimpleNoteModal.html',
                            controller: 'ManageNoteModalCtrl',
                            size: 'md',
                            backdrop: 'static',
                            resolve: {
                                NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                                    return $ocLazyLoad.load('OcNoteModalCtrl');
                                }],
                                isNew: function () {
                                    return m.id === 0;
                                },
                                model: function () {
                                    return m;
                                },
                                contacts: function () {
                                    return [];
                                },
                                noteTypes: function () {
                                    return [];
                                }
                            }
                        });
                        modalInstance.result.then(function (obj) {
                            $scope.$broadcast('::WORKORDER-UPDATE-COMMENT', { $indx: indx, $comments: angular.copy(obj.content) });
                        }, function () {
                        });
                    });
                }
            };
        }]);

window.scheduleFrameLoad = function () {
    document.getElementById("exportScheduleButton").style.display = "block";
};
homeModule.controller('WorkOrderMainAdminCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {
            $scope.showReprocessAll = true;
            $scope.disableReprocessAll = false;
            $scope.submitReprocessAll = "Re-process All";
            $scope.reprocessAll = function () {
                $scope.disableReprocessAll = true;
                $scope.submitReprocessAll = "Re-processing...";
                $scope.$broadcast(":REPROCESS-WORKORDER-EVENTS");
            };
            $scope.$on(":REPROCESS-WORKORDER-EVENTS-DONE", function () {
                $scope.disableReprocessAll = false;
                $scope.submitReprocessAll = "Re-process All";
            });
        }
    ]);
homeModule.controller('WorkOrderManageCtrl',
    ["$scope", "$rootScope", "$state", "$stateParams", "$modal", "$timeout", "$debounce", "baseFactory", 'categories',
        function ($scope, $rootScope, $state, $stateParams, $modal, $timeout, $debounce, baseFactory, categories) {

            //
            var stillLoading = false;
            $scope.categoryOptions = angular.copy(categories);
            $scope.categories = categories;
            $scope.schedCategories = [];
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.currentCategoryId = null;
            $scope.temp = {
                id: 0,
                categoryId: null,
                categoryName: null,
                from: new Date(moment()),
                to: new Date(moment()),
                capacity: 0
            };
            $scope.dateRanges = {
                'Today': [moment(), moment()],
                //'Next 7 Days': [moment(), moment().add(6, 'days')],
                //'Next 30 Days': [moment(), moment().add(29, 'days')],
                //'This Month': [moment().startOf('month'), moment().endOf('month')],
                //'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
                //'This Year': [moment().startOf('year'), moment().endOf('year')],
                //'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')]
            };
            $scope.dateRangeChanged = function (dr) {
                $scope.updateSchedule(dr);
            };
            $scope.updateSchedule = function (temp) {
                var isNew = temp.id == 0;
                //
                var saveSchedule = function () {
                    //
                    var dataToSend = angular.copy(temp);
                    dataToSend.from = moment(dataToSend.from).format('YYYY-MM-DD');
                    dataToSend.to = moment(dataToSend.to).format('YYYY-MM-DD');
                    baseFactory.post("/api/twcworkorders/saveWorkOrderCapacity", dataToSend).then(function (data) {
                        temp.disableField = false;
                        if (!data.isErrored) {
                            temp.id = data.object;

                            if (isNew) {
                                $scope.schedCategories.push(angular.copy(temp));

                                // RESET
                                $scope.temp = {
                                    id: 0,
                                    categoryId: null,
                                    categoryName: null,
                                    from: new Date(moment()),
                                    to: new Date(moment()),
                                    capacity: 0
                                };
                            }
                        }
                    });
                };
                if (isNew) {
                    temp.categoryId = $scope.currentCategoryId;
                }
                $debounce(saveSchedule, 100);
            };
            $scope.removeSchedule = function (sc, indx) {
                baseFactory.post("/api/twcworkorders/deleteWorkOrderCapacity/" + sc.id).then(function (data) {
                    if (!data.isErrored) {
                        $scope.schedCategories.splice(indx, 1);
                    }
                });
            };
            $scope.loadCategory = function (cid) {
                stillLoading = true;
                baseFactory.fetch('/api/twcworkorders/GetAllWorkOrderCapacities', { cid: cid }).then(function (rdata) {
                    $scope.schedCategories = angular.copy(rdata.object || []);
                    $scope.currentCategoryId = cid;
                    $timeout(function () {
                        stillLoading = false;
                    }, 1000);
                });
            };

            $scope.save = function (mForm, cats) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    baseFactory.post("/api/category/saveAll", cats).then(function (data) {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
            $scope.saveCategory = function (cat) {
                $scope.disableSubmitButton = true;
                cat.disableField = true;
                //
                baseFactory.post("/api/twcworkorders/saveWorkOrderCategory", cat).then(function (data) {
                    $scope.disableSubmitButton = false;
                    cat.disableField = false;
                });
            };
            $scope.saveSched = function (mForm, schedCategories) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    for (var i = 0; i < schedCategories.length; i++) {
                        schedCategories[i].from = moment(schedCategories[i].from).format('YYYY-MM-DD');
                        schedCategories[i].to = moment(schedCategories[i].to).format('YYYY-MM-DD');
                    }
                    var dataToSend = {
                        categoryId: $scope.currentCategoryId,
                        schedules: schedCategories
                    };
                    baseFactory.post("/api/category/SaveAllWorkOrderCapacities", dataToSend).then(function (data) {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };
        }]);
homeModule.controller('WorkOrderPrinterAdminCtrl',
    ['$scope', '$rootScope', '$modal', '$state', 'baseFactory', 'modalFactory', 'GRID_CONSTANTS',
        function ($scope, $rootScope, $modal, $state, baseFactory, modalFactory, GRID_CONSTANTS) {

            $scope.gridOptions = {
                itemType: 'Printers',
                gridName: 'workOrderPrinters',
                fetchUrl: '/api/twcWorkOrders/searchallprinters',
                initSortString: 'name asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: false,
                columnDefs: [
                    { field: 'name', displayName: 'Name' },
                    { field: 'path', displayName: 'Path' },
                    { field: 'printerType', displayName: 'Type', customSortField: 'type' }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="manageWorkOrderPrinter(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deletePrinter(row.entity)" class="btn btn-danger" title="Danger"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }

            $scope.deletePrinter = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Printer',
                    null,
                    '/api/twcWorkOrders/deleteprinter/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.manageWorkOrderPrinter = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/manageWorkOrderPrinterAdminModal.html',
                    controller: 'ManageWorkOrderPrinterAdminModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        isNew: function () {
                            return m === null;
                        },
                        printer: function () {
                            return m === null ? {
                                id: 0,
                                name: "",
                                type: 1
                            } : m;
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };
        }
    ]);
homeModule.controller('WorkOrderScanningCtrl',
    ['$scope', '$rootScope', '$modal', '$window', '$timeout', 'GRID_CONSTANTS', 'baseFactory', 'RemotePagerFactory', 'promptFactory', 'modalFactory', '$state', 'clientHelperFactory',
        function ($scope, $rootScope, $modal, $window, $timeout, GRID_CONSTANTS, baseFactory, RemotePagerFactory, promptFactory, modalFactory, $state, clientHelperFactory) {
            $scope.isWorkOrderScanning = clientHelperFactory.isTwcWorkOrderScanning();
            var baseState = clientHelperFactory.isTwcWorkOrderScanning() ? 'base.home' : 'base.workOrders';
            if (!clientHelperFactory.isTwcWorkOrderScanning() && $state.current.name.indexOf('base.home.scanning') >= 0) {
                $state.go('base.workOrders.scanning');
                return;
            }
            angular.element("[workOrderScanningInput]").focus();
            $scope.pageContainerCss = {
                lhs: '',
                rhs: 'hidden-xs'
            };
            $scope.docWidth = 0;
            $scope.currentPageId = null;

            var resize = function () {
                var docHeight = (document.height !== undefined) ? document.height : document.body.offsetHeight;
                $scope.docWidth = (document.width !== undefined) ? document.width : document.body.offsetWidth;

                var ht = 0; //docWidth > 766 ? 0 : 200;

                $scope.page_items_style = {
                    height: docHeight - 180 - ht,
                    'overflow-y': 'auto',
                    'overflow-x': 'hidden'
                };
                $scope.page_item_style = {
                    height: docHeight - 260 - ht,
                    'overflow-y': 'auto',
                    'margin-bottom': 10
                };
                // loadFirstItem();
            };
            //
            $rootScope.mainContentStyle = {
                'min-height': 'initial'
            };
            resize();
            angular.element($window).bind('resize', function () {
                resize();
                $scope.$apply();
            });

            $rootScope.$on('$stateChangeSuccess', function (event, current, previous) {
                if (current.name === baseState + '.scanning') {
                    $scope.pageContainerCss = {
                        lhs: '',
                        rhs: 'hidden-xs'
                    };
                    $scope.currentPageId = null;
                }
            });

            $scope.searchParam = {
                url: '/api/twcworkorders/orders',
                searchText: '',
                isScanning: true,
                p: "All"
            };
            $scope.pageItemList = new RemotePagerFactory($scope.searchParam, 40);

            $scope.updateSearch = function () {
                $state.go(baseState + '.scanning');
                $scope.pageItemList.reload($scope.searchParam);
            };
            $scope.clearSearch = function () {
                $scope.searchParam.searchText = '';
                $scope.pageItemList.reload($scope.searchParam);
            };

            var loadFirstItem = function () {
                if ($scope.pageItemList.items.length > 0 && $scope.currentPageId === null &&
                    $state.current.name === baseState + '.scanning' && $scope.docWidth > 767) {
                    $state.go(baseState + '.scanning.view', { id: $scope.pageItemList.items[0].orderId });
                }
            };
            var loadFirstItem2 = function () {
                if ($scope.pageItemList.items.length === 1 && $scope.currentPageId === null &&
                    $state.current.name === baseState + '.scanning' && $scope.docWidth > 767) {
                    $state.go(baseState + '.scanning.view', { id: $scope.pageItemList.items[0].orderId });
                }
            };

            $rootScope.$on("UPDATE_ITEM_WORKORDERSTATUS", function (ev, arg) {
                for (var i = 0; i < $scope.pageItemList.items.length; i++) {
                    if ($scope.pageItemList.items[i].orderId === arg.orderId) {
                        $scope.pageItemList.items[i].workOrderStatusId = arg.wosId;
                        $scope.pageItemList.items[i].workOrderStatus = arg.wosName;
                        break;
                    }
                }
            });
            $rootScope.$on("PAGED_ON_ACTIVE", function () {
            });
            $rootScope.$on('REMOTE-PAGER-NEXT', function (ev, arg) {
                loadFirstItem();
            });
            $rootScope.$on('REMOTE-PAGER-RELOADED', function (ev, arg) {
                loadFirstItem2();
            });

            $scope.searchOrderNumber = function () {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/reworks/modals/searchOrderModal.html',
                    controller: 'SearchOrderDeliveryModalCtrl',
                    size: 'lg',
                    backdrop: 'static',
                    resolve: {}
                });

                modalInstance.result.then(function (orderNumber) {
                    $scope.pageItemList.reload();
                }, function () {
                });
            };
        }
    ]);
homeModule.controller('WorkOrderScanningViewCtrl',
    ['$scope', '$rootScope', '$modal', '$window', '$timeout', '$controller', '$stateParams', '$state', '$filter', 'baseFactory', 'permissionFactory', 'modalFactory',
        'promptFactory', 'order', 'statuses', 'despatchNoteTypeId', 'GRID_CONSTANTS',
        function ($scope, $rootScope, $modal, $window, $timeout, $controller, $stateParams, $state, $filter, baseFactory, permissionFactory, modalFactory,
            promptFactory, order, statuses, despatchNoteTypeId, GRID_CONSTANTS) {
            $scope.$parent.pageContainerCss = {
                lhs: 'hidden-xs',
                rhs: 'col-xs-12'
            };

            $scope.currentTab = 1;
            $scope.$parent.currentPageId = $stateParams.id;
            $scope.order = order;
            $rootScope.timeoutWorkOrderScanning = null;

            var updateWorkOrderEventStatuses = function () {
                for (var i = 0; i < $scope.order.workOrderEventStatuses.length; i++) {
                    $scope.order.workOrderEventStatuses[i].isDone = false;
                    for (var j = 0; j < $scope.order.workOrderEvents.length; j++) {
                        if ($scope.order.workOrderEvents[j].workOrderStatusId === $scope.order.workOrderEventStatuses[i].id) {
                            $scope.order.workOrderEventStatuses[i].isDone = true;
                            break;
                        }
                    }
                }
            };
            $scope.workOrderStatuses = angular.copy(statuses);
            $scope.updateWorkOrderStatus = function (orderId, workOrderStatusId, workOrderStatusName) {
                if (permissionFactory.isSysAdmin() || permissionFactory.hasPermission(['system.workorderadmin.allow'])) {
                    var updateWorkStatus = function () {
                        baseFactory.put("/api/twcworkorders/updatestatus?orderId=" + orderId + "&workOrderStatusId=" + workOrderStatusId).then(function (data) {
                            $rootScope.$emit('UPDATE_ITEM_WORKORDERSTATUS', { orderId: orderId, wosId: workOrderStatusId, wosName: workOrderStatusName });
                            clearTimeout($rootScope.timeoutWorkOrderScanning);
                            $scope.$emit('scanSearchInput');
                            reloadEvents();
                        });
                    }
                    if (workOrderStatusName.toLowerCase() === "completed") {
                        promptFactory.confirmMd("<span class=\"text-x12\">Are you sure you want to Complete this order?<br>This action cannot be undone.</span>", function (result) {
                            if (result) {
                                updateWorkStatus();
                            }
                        }, { buttonSize: '' });
                    } else {
                        updateWorkStatus();
                    }
                }
            };

            $scope.deleteWorkOrderEvent = function (item) {
                var label = $filter('date')(item.eventDate, 'dd MMM - HH:mm');
                promptFactory.confirm("Are you sure you want to delete this work order event? <strong>" + label + " " + (item.name || item.workOrderStatus) + "</strong>", function (result) {
                    if (result) {
                        baseFactory.remove('/api/twcworkorders/deleteevent/' + item.id).then(function (rrdata) {
                            if (!rrdata.isErrored) {
                                var indx = -1;
                                for (var i = 0; i < $scope.order.workOrderEvents.length; i++) {
                                    if ($scope.order.workOrderEvents[i].id === item.id) {
                                        indx = i;
                                        break;
                                    }
                                }
                                if (indx >= 0) {
                                    $scope.order.workOrderEvents.splice(indx, 1);
                                    updateWorkOrderEventStatuses();
                                }
                            }
                        });
                    }
                });
            };

            var reloadEvents = function () {
                baseFactory.fetch('/api/twcworkorders/getallevents/' + $stateParams.id).then(function (rrdata) {
                    $scope.order.workOrderEvents = rrdata.object || [];
                    //
                    updateWorkOrderEventStatuses();
                    $rootScope.timeoutWorkOrderScanning = setTimeout(function () {
                        if ($state.current.name.indexOf('base.workOrders.scanning') >= 0) {
                            try {
                                if ($scope.$parent.currentPageId === $stateParams.id)
                                    reloadEvents();
                            } catch (er) {
                                console.log(er);
                            }
                        }
                    }, 10000);
                });
            };
            reloadEvents();
            //
            $scope.gridOptions = {
                itemType: 'Despatch notes',
                gridName: 'despatchNotes',
                fetchUrl: '/api/notes/searchall?orderId=' + order.id + '&typeId=' + despatchNoteTypeId,
                initSortString: 'date desc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                enableDateRange: true,
                columnDefs: [],
                controlCellTemplateHtml: controlHtml(),
                controlColumnWidth: '100%',
                headerRowHeight: 1
            };

            function controlHtml() {
                return '<div ng-include src="\'/app/modules/order/dashboard/views/noteTemplate.html\'"></div>';
            }

            function notesDetailsTemplate() {
                return '<div class="ngCellText">' +
                    '<div style="white-space: pre-line;">{{row.entity.content}}</div>' +
                    '</div>';
            }

            $scope.deleteEntity = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.noteType,
                    value.id,
                    'Despatch Note',
                    null,
                    '/api/notes/deletenote/',
                    $scope.gridOptions.gridName
                );
            };
            $scope.openManageNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/dashboard/modals/manageSimpleNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return false;
                        },
                        model: function () {
                            return m;
                        },
                        contacts: function () {
                            return [];
                        },
                        noteTypes: function () {
                            return [];
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () { });
            };
            $scope.createDespatchNote = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/order/dashboard/modals/manageSimpleNoteModal.html',
                    controller: 'ManageNoteModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        NoteModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                            return $ocLazyLoad.load('OcNoteModalCtrl');
                        }],
                        isNew: function () {
                            return true;
                        },
                        model: function () {
                            return {
                                id: 0,
                                noteTypeId: despatchNoteTypeId,
                                orderId: m.id,
                                customerId: m.customerId,
                                customerName: m.customerName,
                                contactId: null,
                                isVisibleCustomer: false,
                                date: moment().format()
                            };
                        },
                        contacts: function () {
                            return [];
                        },
                        noteTypes: function () {
                            return [];
                        }
                    }
                });

                modalInstance.result.then(function () {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function () { });
            };
        }
    ]);
homeModule.controller('WorkOrderStatusesCtrl',
    ['$scope', '$rootScope', '$modal', 'GRID_CONSTANTS', 'baseFactory', 'modalFactory', '$state',
        function ($scope, $rootScope, $modal, GRID_CONSTANTS, baseFactory, modalFactory, $state) {
            $scope.gridOptions = {
                itemType: 'Work Order Statuses',
                gridName: 'AdminWorkOrderStatus',
                fetchUrl: '/api/twcworkorders/searchAllStatuses',
                initSortString: 'sortOrder asc',
                enableSorting: true,
                enableSearching: true,
                enablePaging: true,
                columnDefs: [
                    { field: 'name', displayName: 'Name' },
                    { field: 'sortOrder', displayName: 'Sort Order' },
                    {
                        field: 'colour', displayName: 'Colour', width: 100, sortable: false,
                        cellTemplate: '<div class="orderStatus text-center" style="padding:5px;" ng-style="getWorkOrderStatusColor(row.entity.colour)"> {{row.entity.colour}} ' + '</div>'
                    }
                ],
                controlCellTemplateHtml: controlHtml()
            };

            function controlHtml() {
                return '<div class="controls">' +
                    '<div class="btn-group btn-group-sm pull-right">' +
                    '<a ng-click="manageWorkOrderStatus(row.entity)" class="btn btn-default" title="Edit"><i class="glyphicon glyphicon-edit"></i></a>' +
                    '<a ng-click="deleteWorkOrderStatus(row.entity)" class="btn btn-danger" title="Delete"><i class="glyphicon glyphicon-remove"></i></a>' +
                    '</div></div>';
            }
            $scope.getWorkOrderStatusColor = function (colour) {
                if (colour !== null)
                    return { 'background-color': colour };
                return { 'background-color': 'unset' };
            };

            $scope.deleteWorkOrderStatus = function (value) {
                modalFactory.deleteEntityFromGrid(
                    value.name,
                    value.id,
                    'Work Order Status',
                    null,
                    '/api/twcworkorders/deleteStatus/',
                    $scope.gridOptions.gridName
                );
            };

            $scope.manageWorkOrderStatus = function (m) {
                var modalInstance = $modal.open({
                    templateUrl: '/app/modules/workOrders/modals/manageWorkOrderStatusAdminModal.html',
                    controller: 'ManageWorkOrderStatusAdminModalCtrl',
                    size: 'md',
                    backdrop: 'static',
                    resolve: {
                        gridName: function () {
                            return $scope.gridOptions.gridName;
                        },
                        isNew: function () {
                            return m === null;
                        },
                        model: function () {
                            return m === null ? {
                                id: 0,
                                name: "",
                                sortOrder: 1,
                                colour: null
                            } : m;
                        }
                    }
                });

                modalInstance.result.then(function (rrrdata) {
                    $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                }, function (isReload) {
                    isReload = typeof isReload === "undefined" ? false : isReload;
                    if (isReload)
                        $rootScope.$emit(GRID_CONSTANTS.REFRESH_GRID_PREFIX + $scope.gridOptions.gridName);
                });
            };
        }
    ]);
homeModule.controller('WorkOrderUltracutCtrl',
    ['$scope', '$rootScope', '$modal', '$state', '$controller', '$timeout', 'baseFactory', 'modalFactory', 'sharedFactory',
        'promptFactory', 'categories', 'orderStatuses', 'itemStatuses', 'items', 'twcZones', 'statuses',
        function ($scope, $rootScope, $modal, $state, $controller, $timeout, baseFactory, modalFactory, sharedFactory,
            promptFactory, categories, orderStatuses, itemStatuses, items, twcZones, statuses) {
            angular.extend(this, $controller('BulkOrderUpdateCtrl', {
                $scope: $scope,
                categories: categories,
                orderStatuses: orderStatuses,
                itemStatuses: itemStatuses,
                items: items,
                twcZones: twcZones,
                workOrderStatuses: statuses
            }));

            $scope.bulkSearchUrl = '/api/twcworkorders/searchallultracut';
            $scope.bulkSearchExportUrl = '/exportGrid/getallultracut/';
            $scope.steps = [
                {
                    step: 1,
                    title: 'Find Orders',
                    isDone: false,
                    isEditing: false
                },
                {
                    step: 2,
                    title: 'Export Orders',
                    isDone: false,
                    isEditing: false
                }
            ];
            $scope.printedArr = [
                { id: null, name: "All" },
                { id: true, name: "Yes" },
                { id: false, name: "No" }
            ];
            $scope.templates = [
                { id: "S0" },
                { id: "S0-Spring" },
                { id: "S0-Motorised" },
                { id: "S1" },
                { id: "S1-Spring" },
                { id: "S1-Motorised" },
                { id: "S5" },
                { id: "S6" },
                { id: "S7" },
                { id: "S8 Down" },
                { id: "S8 Up" },
                { id: "S9" },
                { id: "No deductions" },
                { id: "Roman VAR" }
            ];

            var updateExportLink = function () {
                var arrOrderIds = [];
                for (var k = 0; k < $scope.searchResult.result.length; k++) {
                    if ($scope.searchResult.result[k].isSelected)
                        arrOrderIds.push($scope.searchResult.result[k].orderItemId);
                }
                var indx = $scope.searchResult.exportUrl.indexOf('&items=');
                if (indx > 0)
                    $scope.searchResult.exportUrl = $scope.searchResult.exportUrl.slice(0, indx);

                if (arrOrderIds.length > 0) {
                    return $scope.bulkSearchExportUrl + "?items=" + arrOrderIds.join();
                } else {
                    return $scope.searchResult.exportUrl;
                }
            };

            $scope.selectRowOrder2 = function (r) {
                // 1 = All unchecked
                // 2 = All checked
                // 3 = Some checked
                if (!$scope.disableSubmitButton) {
                    r.isSelected = !r.isSelected;
                    if (r.isSelected)
                        $scope.searchResult.selected++;
                    else
                        $scope.searchResult.selected--;
                    //
                    if ($scope.searchResult.selected > 0)
                        $scope.searchResult.selection = $scope.searchResult.selected === $scope.searchResult.result.length ? 2 : 3;
                    else
                        $scope.searchResult.selection = 1;
                    // Reset
                    updateExportLink();
                }
            };
            $scope.selectAllRowOrders2 = function () {
                if (!$scope.disableSubmitButton) {
                    if ($scope.searchResult.selection === 1 || $scope.searchResult.selection === 3) {
                        $scope.searchResult.selection = 2;
                    } else if ($scope.searchResult.selection === 2) {
                        $scope.searchResult.selection = 1;
                    }
                    for (var i = 0; i < $scope.searchResult.result.length; i++) {
                        $scope.searchResult.result[i].isSelected = $scope.searchResult.selection === 2;
                    }
                    $scope.searchResult.selected = $scope.searchResult.selection === 2 ? $scope.searchResult.result.length : 0;
                }
                updateExportLink();
            };
            $scope.exportOrders = function () {
                var url = updateExportLink();
                var indx = url.indexOf('items=');

                for (var i = 0; i < $scope.searchResult.result.length; i++) {
                    if (indx > 0) {
                        if ($scope.searchResult.result[i].isSelected) {
                            $scope.searchResult.result[i].ultracutExport = new Date();
                        }
                    } else {
                        $scope.searchResult.result[i].ultracutExport = new Date();
                    }
                }

                window.location.href = url;
            };

            // PUBLIC
            $scope.m1.status = null;
            $scope.m1.printed = false;
            $scope.m1.selectedTemplates = [];
            $scope.m1.orderDate = {
                startDate: moment().subtract(6, 'days'),
                endDate: moment()
            };
            $scope.m1.completionDate = {
                startDate: moment(),
                endDate: moment().add(6, 'days')
            };
        }
    ]);
sharedModule.directive("workOrderTable", ['$compile', '$filter', 'permissionFactory', function ($compile, $filter, permissionFactory) {
    function link(scope, element, attr) {

            var getWorkOrderStatusColor = function (colour) {
                if (colour !== null)
                    return 'background-color: ' + colour + '; display: block; margin: -5px;';
                return 'background-color: unset;';
            };
        var generateRows = function (item) {
            var rows = [];
            // ROW 1
            var rowClass = '';
            if (item.isOnHold) rowClass += 'danger';
            if (item.orderOnHold) rowClass += 'warning';

            // COLUMNS
            var cols = [
                '<td ng-click="selectRowOrder(' + i + ')"><i class="fa fa-square"></i></td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + item.customerName + '</td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + item.orderNumber + '</td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + item.prontoOrderNumber + '</td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + item.purchaseOrderNumber + '</td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + $filter('date')(item.orderDate, 'dd/MM/yyyy') + '</td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + item.itemName + '</td>',
                '<td></td>',
                '<td class="ellipsis" ng-click="viewOrder(' + item.orderId + ')">' + item.shipVia + '</td>',
                '<td class="ellipsis text-center" ng-click="viewOrder(' + item.orderId + ')">' + item.qty + '</td>',
                '<td class="ellipsis" ng-click="editComment(' + item.orderId + ', ' + i + ')" title="Edit Comments">' + (item.comments || '') + '</td>'
            ];

            if (permissionFactory.hasPermission('system.workorderadmin.allow')) {
                cols[7] = '<td><div><a ng-click="updateWorkOrderStatus(' + i + ')" title="Update Status" class="cursor-pointer orderStatus text-center padding-5" style="' + getWorkOrderStatusColor(item.workOrderStatusColour) + '">' + item.workOrderStatus + '</a></div></td>';
                if (item.workOrderStatusId === null) {
                    cols.push('<td class="text-right"><a class="cursor-pointer" ng-click="printWorkOrder(' + i + ')">Print</a></td>');
                } else {
                    cols.push('<td class="text-right"><a class="cursor-pointer" ng-click="printWorkOrder(' + i + ')">Reprint</a></td>');
                }
            } else {
                cols[7] = '<td><div><span class="orderStatus text-center padding-5" style="' + getWorkOrderStatusColor(item.workOrderStatusColour) + '">' + item.workOrderStatus + '</span></div></td>';
            }

            rows.push('<tr class="' + rowClass + '">' + cols.join('') + '</tr>');
            // ROW 2
            if (item.orderDescription)
                rows.push('<tr><td colspan="' + theadHdr.length + '" class="p-left20" ng-click="viewOrder(' + item.orderId + ')">' + item.orderDescription + '</td></tr>');
            return rows.join('');
        };
        // THEAD
        var theadHdr = [
            '<th style="width: 23px;" class="cursor-pointer" ng-click="selectAllRowOrders()" title="Select All"><i class="fa fa-square"></i></th>',
            '<th style="width: 120px">Customer</th>',
            '<th style="min-width: 100px">Order</th>',
            '<th style="width: 80px">Pronto</th>',
            '<th style="min-width: 100px">PO</th>',
            '<th style="width: 90px">Date</th>',
            '<th>Item</th>',
            '<th style="width: 100px">Status</th>',
            '<th class="text-nowrap" style="width: 100px">Ship Via</th>',
            '<th class="text-center" style="width: 90px">Qty</th>',
            '<th style="max-width: 200px">Comments</th>'
        ];
        if (permissionFactory.hasPermission('system.workorderadmin.allow'))
            theadHdr.push('<th permission permissions="system.workorderadmin.allow" style="width: 70px"></th>');

        var thead = '<thead><tr>' + theadHdr.join('') + '</tr></thead>';
        if (scope.arr.length === 0) {
            element.html(thead + '<tbody><tr><td colspan="10" class="text-center">No data found.</td></tr></tbody>');
        } else {
            var tbodyArr = [];
            for (var i = 0; i < scope.arr.length; i++) {
                var item = scope.arr[i];
                tbodyArr.push('<tbody class="tbody-group">' + generateRows(item) + '</tbody>');
            }
            element.html(thead + tbodyArr.join(''));
            $compile(element.contents())(scope);
        }
        //
        scope.selectAllRowOrders = function () {
            scope.selectAllRows();
        };
        scope.selectRowOrder = function (indx) {
            angular.element("tbody:eq(" + indx + ") td:eq(0) i", element).attr('class', !scope.arr[indx].isSelected ? 'fa fa-check-square' : 'fa fa-square');
            scope.selectRow({ $itemIndex: indx });
        };
        scope.viewOrder = function (orderId) {
            scope.view({ $orderId: orderId });
        };
        scope.editComment = function (orderId, indx) {
            scope.comment({ $orderId: orderId, $itemIndex: indx });
        };
        scope.updateWorkOrderStatus = function (indx) {
            scope.updateStatus({ $item: scope.arr[indx], $itemIndex: indx });
        };
        scope.printWorkOrder = function (indx) {
            scope.print({ $item: scope.arr[indx], $itemIndex: indx });
        };
        // UPDATE STATUS
        scope.$on('::WORKORDER-SELECTED-ALL', function (e, v) {
            angular.element("thead tr th:eq(0) i", element).attr('class', v.$selection === 1 ? 'fa fa-square' : v.$selection === 2 ? 'fa fa-check-square' : 'fa fa-minus-square');
        });
        scope.$on('::WORKORDER-SELECTED-ITEM', function (e, v) {
            angular.element("tbody:eq(" + v.$itemIndex + ") td:eq(0) i", element).attr('class', v.$isSelected ? 'fa fa-check-square' : 'fa fa-square');
        });

        // UPDATE STATUS
        scope.$on('::WORKORDER-UPDATE-STATUS', function (e, v) {
            console.log(v);
            angular.element("tbody:eq(" + v.$indx + ") td:eq(7) div a", element).text(v.$item.workOrderStatus);
            angular.element("tbody:eq(" + v.$indx + ") td:eq(7) div a", element).attr('style', getWorkOrderStatusColor(v.$item.workOrderStatusColour));
        });

        // UPDATE COMMENT
        scope.$on('::WORKORDER-UPDATE-COMMENT', function (e, v) {
            angular.element("tbody:eq(" + v.$indx + ") td:eq(10)", element).text(v.$comments);
            scope.arr[v.$indx].comments = v.$comments;
        });

        scope.$on('::WORKORDER-PUSH-ITEM', function (e, v) {
            var tbody = '<tbody class="tbody-group">' + generateRows(v.$item) + '</tbody>';
            angular.element(element).append(tbody);
        });
    }
    return {
        link: link,
        restrict: 'A',
        scope: {
            arr: '=',
            view: '&viewOrder',
            selectAllRows: '&',
            selectRow: '&',
            comment: '&editComment',
            updateStatus: '&',
            print: '&printWorkOrder'
        }
    };
}]);
homeModule.controller('WorkOrderExportModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', 'baseFactory', 'blindTypes', 'twcZones', 'dateRange',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, baseFactory, blindTypes, twcZones, dateRange) {
            //
            $scope.categories = [{ id: null, name: "All", isSelected: false }];
            $scope.twcZones = [{ id: null, name: "All", isSelected: false }];
            $scope.types = [
                { id: null, name: "All", isSelected: false },
                { id: 'orders', name: "Orders", isSelected: false },
                { id: 'reworks', name: "Reworks", isSelected: false }
            ];
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.m = {
                startDate: moment().subtract(29, 'days'),
                endDate: moment(),
                bt: null
            };
            $scope.updateExportUrl = function () {
                var cArr = [];
                for (var i = 0; i < $scope.categories.length; i++) {
                    if ($scope.categories[i].id === null && $scope.categories[i].isSelected)
                        break;
                    if ($scope.categories[i].id !== null && $scope.categories[i].isSelected) {
                        cArr.push($scope.categories[i].id);
                    }
                }
                var svArr = [];
                for (i = 0; i < $scope.twcZones.length; i++) {
                    if ($scope.twcZones[i].id === null && $scope.twcZones[i].isSelected)
                        break;
                    if ($scope.twcZones[i].id !== null && $scope.twcZones[i].isSelected) {
                        svArr.push($scope.twcZones[i].id);
                    }
                }
                var tArr = [];
                for (var j = 0; j < $scope.types.length; j++) {
                    if ($scope.types[j].id === null && $scope.types[j].isSelected)
                        break;
                    if ($scope.types[j].id !== null && $scope.types[j].isSelected) {
                        tArr.push($scope.types[j].id);
                    }
                }
                var params = {
                    startDate: moment(dateRange.startDate).format('YYYY-MM-DD'),
                    endDate: moment(dateRange.endDate).format('YYYY-MM-DD')
                };
                //
                if (cArr.length > 0)
                    params.c = cArr.join();
                if (tArr.length > 0)
                    params.t = tArr.join();
                if (svArr.length > 0)
                    params.sv = svArr.join();
                //
                $scope.exportUrl1 = "/report/workorderExport?isExcel=false&isSummary=true&" + $rootScope.objToParam(params);
                $scope.exportUrl2 = "/report/workorderExport?isExcel=true&isSummary=true&" + $rootScope.objToParam(params);
                $scope.exportUrl3 = "/report/workorderExport?isExcel=false&isSummary=false&" + $rootScope.objToParam(params);
                $scope.exportUrl4 = "/report/workorderExport?isExcel=true&isSummary=false&" + $rootScope.objToParam(params);
            };
            //
            $scope.selectItem = function (indx, str, isSelected) {
                if (indx > 0) {
                    $scope[str][indx].isSelected = isSelected;
                    var ctr = 0;
                    for (var j = 1; j < $scope[str].length; j++) {
                        if ($scope[str][j].isSelected) ctr++;
                    }
                    $scope[str][0].isSelected = ctr === ($scope[str].length - 1);
                } else {
                    for (var i = 0; i < $scope[str].length; i++) {
                        $scope[str][i].isSelected = isSelected;
                    }
                }
                $scope.updateExportUrl();
            };
            //
            for (var i = 0; i < blindTypes.length; i++) {
                $scope.categories.push({
                    id: blindTypes[i],
                    name: blindTypes[i],
                    isSelected: false
                });
            }
            //
            for (i = 0; i < twcZones.length; i++) {
                $scope.twcZones.push({
                    id: twcZones[i].id,
                    name: twcZones[i].name,
                    isSelected: false
                });
            }
            $scope.updateExportUrl();
            //
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
homeModule.controller('ManageCapacityModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', 'baseFactory', 'categories', 'workOrderCapacities', 'workOrderCategories',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, baseFactory, categories, workOrderCapacities, workOrderCategories) {
            //
            $scope.categoryOptions = angular.copy(categories);
            $scope.categories = categories;
            $scope.schedCategories = workOrderCapacities;
            $scope.scheduledCategories = workOrderCategories;
            $scope.disableSubmitButton = false;
            $scope.submitTxt = "Save";
            $scope.currentTab = 1;
            $scope.temp = {
                id: 0,
                categoryId: null,
                categoryName: null,
                from: new Date(moment()),
                to: new Date(moment()),
                capacity: 0
            };
            $scope.dateRanges = {
                'Today': [moment(), moment()],
                //'Next 7 Days': [moment(), moment().add(6, 'days')],
                //'Next 30 Days': [moment(), moment().add(29, 'days')],
                //'This Month': [moment().startOf('month'), moment().endOf('month')],
                //'Next Month': [moment().add(1, 'month').startOf('month'), moment().add(1, 'month').endOf('month')],
                //'This Year': [moment().startOf('year'), moment().endOf('year')],
                //'Next Year': [moment().add(1, 'year').startOf('year'), moment().add(1, 'year').endOf('year')]
            };

            //
            $scope.addSchedule = function (temp) {
                for (var i = 0; i < $scope.categoryOptions.length; i++) {
                    if (temp.categoryId === $scope.categoryOptions[i].id) {
                        temp.categoryName = $scope.categoryOptions[i].name;
                        break;
                    }
                }
                $scope.schedCategories.push(angular.copy(temp));

                // RESET
                $scope.temp = {
                    id: 0,
                    categoryId: null,
                    categoryName: null,
                    from: new Date(moment()),
                    to: new Date(moment()),
                    capacity: 0
                };
            };
            $scope.removeSchedule = function (sc, indx) {
                $scope.schedCategories.splice(indx, 1);
            };
            $scope.tabSelected = function (tab) {
                $scope.currentTab = tab;
            };

            $scope.save = function (mForm, cats) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    baseFactory.post("/api/category/saveAll", cats).then(function (data) {
                        if (!data.isErrored)
                            $modalInstance.close();
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };

            $scope.saveSched = function (mForm, schedCategories) {
                $rootScope.formSubmit(mForm);
                if (mForm.$valid) {
                    $scope.submitTxt = "Saving...";
                    $scope.disableSubmitButton = true;
                    //
                    for (var i = 0; i < schedCategories.length; i++) {
                        schedCategories[i].from = moment(schedCategories[i].from).format('YYYY-MM-DD');
                        schedCategories[i].to = moment(schedCategories[i].to).format('YYYY-MM-DD');
                    }
                    baseFactory.post("/api/category/SaveAllScheduledCapacities", schedCategories).then(function (data) {
                        if (!data.isErrored)
                            $modalInstance.close();
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    });
                }
            };

            //
            $scope.cancel = function () {
                $modalInstance.dismiss();
            };
        }]);
(function () {
    homeModule.controller('ManageWorkOrderPrinterAdminModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'isNew', 'printer'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, isNew, printer) {

        $scope.mode = isNew ? 'Add' : 'Edit';
        $scope.printerTypes = [
            { id: 1, name: "Work Order" },
            { id: 2, name: "Label" },
            { id: 3, name: "Label Small" },
            { id: 4, name: "Label Tube" }
        ];
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.m = angular.copy(printer);

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                var dataToSend = angular.copy(n);
                //
                baseFactory.post("/api/twcworkorders/savePrinter", dataToSend).then(function (data) {
                    if (!data.isErrored) {
                        $modalInstance.close(n);
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
(function () {
    homeModule.controller('ManageWorkOrderStatusAdminModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'isNew', 'model', 'gridName'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, isNew, model, gridName) {
        $scope.isNew = isNew;
        $scope.mode = isNew ? "Add" : "Edit";
        $scope.submitTxt = "Save";
        $scope.bgcolors = ["#F0AD4E", "#D8C233", "#8BBF61", "#008800", "#3695D5", "#76268F", "#424242", "#13072C", "#d9534f"];
        $scope.m = angular.copy(model);

        // Is add another item
        var isReload = false;
        $scope.isAddAnotherField = false;
        $scope.onChangeAAF = function (isAaf) {
            $scope.isAddAnotherField = isAaf;
        };
        $scope.setBgColor = function (bg) {
            $scope.m.colour = bg;
        };

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                var dataToSend = angular.copy(n);
                //
                baseFactory.post("/api/twcworkorders/saveStatus", dataToSend).then(function (data) {
                    // console.log(data);
                    if (!data.isErrored) {
                        if ($scope.isAddAnotherField) {
                            // Reset
                            $scope.m = angular.copy(model);
                            $scope.submitTxt = "Save";
                            $scope.disableSubmitButton = false;
                            isReload = true;
                        } else {
                            $modalInstance.close(n);
                        }
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
(function () {
    homeModule.controller('ManageWorkOrderStatusModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', 'baseFactory', 'statuses', 'workOrder'];
    function ctrl($scope, $rootScope, $modalInstance, baseFactory, statuses, workOrder) {
        $scope.statuses = angular.copy(statuses);
        $scope.submitTxt = "Save";
        $scope.disableSubmitButton = false;
        $scope.m = angular.copy(workOrder);

        $scope.ok = function (nForm, n) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                $scope.submitTxt = "Saving...";
                $scope.disableSubmitButton = true;
                var dataToSend = angular.copy(n);
                //
                baseFactory.put("/api/twcworkorders/updatestatus?orderId=" + dataToSend.orderId + "&workOrderStatusId=" + dataToSend.workOrderStatusId).then(function (data) {
                    for (var i = 0; i < statuses.length; i++) {
                        if (n.workOrderStatusId === statuses[i].id) {
                            n.workOrderStatus = statuses[i].name;
                            n.workOrderStatusColour = statuses[i].colour;
                            break;
                        }
                    }
                    if (!data.isErrored) {
                        $modalInstance.close(n);
                    } else {
                        $scope.submitTxt = "Save";
                        $scope.disableSubmitButton = false;
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
(function () {
    homeModule.controller('PrintWorkOrderModalCtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$modalInstance', '$timeout', 'localStorageService', 'baseFactory', 'orders', 'printers'];
    function ctrl($scope, $rootScope, $modalInstance, $timeout, localStorageService, baseFactory, orders, printers) {

        var settings = localStorageService.get('pwoSettings');
        var encodeQueryData = function (data) {
            var ret = [];
            for (var d in data) {
                if (typeof data[d] !== 'undefined' && data[d] !== null)
                    ret.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d]));
            }
            return ret.join("&");
        };

        if (isNaN(orders))
            $scope.ctr = orders.split(',');
        $scope.disableSubmitButton = false;
        $scope.submitTxt = "Print";
        $scope.workOrderPrinters = printers;
        if (!settings) {
            $scope.m = {
                orders: orders,
                isWorkOrder: true,
                isLabel: false,
                isPdf: true,
                numberOfCopies: 1,
                workOrderPrinterId: null,
                labelPrinterId: null
            };
        } else {
            $scope.m = settings;
            $scope.m.orders = orders;
        }
        for (var i = 0; i < printers.length; i++) {
            if ($scope.m.workOrderPrinterId === null && printers[i].type === 1) {
                $scope.m.workOrderPrinterId = printers[i].id;
            } else if ($scope.m.labelPrinterId === null && (printers[i].type === 2 || printers[i].type === 3)) {
                $scope.m.labelPrinterId = printers[i].id;
            } else {
                break;
            }
        }
        $scope.setPdf = function (isPdf) {
            $scope.m.isPdf = isPdf;
        };
        $scope.$watchCollection('m', function (v) {
            // console.log(v);
            $scope.exportUrl = '/report/twcworkorders?' + encodeQueryData(v);
        });
        $scope.filterLabelType = function (item) {
            return item.type === 2 || item.type === 3 || item.type === 4;
        };

        $scope.printWorkOrder = function (nForm, dataToSend) {
            $rootScope.formSubmit(nForm);
            if (nForm.$valid) {
                var dts = angular.copy(dataToSend);
                $scope.disableSubmitButton = true;
                if (dts.isPdf) {
                    dts.workOrderPrinterId = null;
                    dts.labelPrinterId = null;
                }
                var pwoSettings = angular.copy(dts);
                delete pwoSettings.orders;
                localStorageService.set('pwoSettings', pwoSettings);
                //
                baseFactory.put("/api/twcworkorders/print?" + encodeQueryData(dts)).then(function (data) {
                    $scope.disableSubmitButton = false;
                    if (!data.isErrored) {
                        if (data.object) {
                            window.location.href = '/report/twcworkorders?' + encodeQueryData(dts);
                        }
                        $timeout(function () {
                            $modalInstance.close();
                        }, 100);
                    }
                });
            }
        };

        $scope.cancel = function () {
            $modalInstance.dismiss();
        };
    }
})();
homeModule.controller('WorkOrderViewOrderModalCtrl',
    ['$scope', '$rootScope', '$state', '$timeout', '$modalInstance', '$controller', 'baseFactory', 'permissionFactory', 'order', 'workOrderEvents', 'workOrderEventStatuses',
        function ($scope, $rootScope, $state, $timeout, $modalInstance, $controller, baseFactory, permissionFactory, order, workOrderEvents, workOrderEventStatuses) {
            //
            $scope.hideMainTabs = true;
            order.workOrderEvents = workOrderEvents;
            order.workOrderEventStatuses = workOrderEventStatuses;
            angular.extend(this, $controller('DashboardOrderManageCtrl', {
                $scope: $scope,
                order: order,
                orderCustomFields: [],
                categories: []
            }));
            var isReload = false;

            $scope.disableDelayOrderButton = false;
            $scope.delayOrder = function () {
                $scope.disableDelayOrderButton = true;
                baseFactory.post('/api/twcSchedules/delayOrder/' + order.id).then(function (rdata) {
                    $scope.disableDelayOrderButton = false;
                    $modalInstance.close(rdata.object);
                });
            };
            $scope.updateWorkOrderStatus = function (orderId, workOrderStatusId) {
                if (permissionFactory.isSysAdmin() || permissionFactory.hasPermission(['system.workorderadmin.allow'])) {
                    baseFactory.put("/api/twcworkorders/updatestatus?orderId=" + orderId + "&workOrderStatusId=" + workOrderStatusId).then(function (data) {
                        isReload = true;
                        baseFactory.fetch('/api/twcworkorders/getallevents/' + orderId).then(function (rrdata) {
                            $scope.order.workOrderEvents = rrdata.object || [];
                            for (var i = 0; i < $scope.order.workOrderEventStatuses.length; i++) {
                                for (var j = 0; j < $scope.order.workOrderEvents.length; j++) {
                                    if ($scope.order.workOrderEvents[j].workOrderStatusId === $scope.order.workOrderEventStatuses[i].id) {
                                        $scope.order.workOrderEventStatuses[i].isDone = true;
                                        break;
                                    }
                                }
                            }
                        });
                    });
                }
            };
            //
            $scope.cancel = function () {
                $modalInstance.dismiss(isReload);
            };
        }]);
homeModule.controller('WorkOrderViewOrderDetailsModalCtrl',
    ['$scope', '$rootScope', '$controller', '$modal', 'baseFactory', 'modalFactory', '$timeout',
        'GRID_CONSTANTS', '$state', '$stateParams', 'resolveFactory', 'lazyLoadGoogleApi', 'TIMES',
        function ($scope, $rootScope, $controller, $modal, baseFactory, modalFactory, $timeout,
            GRID_CONSTANTS, $state, $stateParams, resolveFactory, lazyLoadGoogleApi, TIMES) {
            if ($rootScope.clientName === "FILDES" || $rootScope.clientName === "QODO") {
                angular.extend(this, $controller('CheckoutCtrl', {
                    $scope: $scope,
                    order: $scope.$parent.origOrder,
                    orderCustomFields: [],
                    itemCustomField: [],
                    printers: [],
                    items: [],
                    customerContacts: []
                }));
            } else if ($rootScope.clientName === "TFT") {
                $scope.job = angular.fromJson($scope.$parent.order.uiData);
                $scope.times = TIMES;
                // console.log($scope.job);

                $scope.mapId = window.randomString();
                $scope.job.showMap = false;
                $scope.$on('mapInitialized', function (evt, evtMap) {
                    $scope.map = evtMap;
                    $timeout(function () {
                        $scope.mapLatLng = new google.maps.LatLng($scope.job.location.latitude, $scope.job.location.longitude);
                        $scope.map.setCenter($scope.mapLatLng);
                        $scope.map.setZoom(10);

                        $scope.marker = new google.maps.Marker({
                            position: $scope.mapLatLng,
                            title: $scope.job.address
                        });
                        $scope.marker.setMap($scope.map);
                    }, 500);
                });
                $scope.centerChanged = function (event) {
                    $timeout(function () {
                        try {
                            $scope.map.panTo($scope.marker.getPosition());
                        } catch (er) {
                            $scope.mapLatLng = new google.maps.LatLng($scope.job.location.latitude, $scope.job.location.longitude);
                            $scope.map.setCenter($scope.mapLatLng);
                            $scope.map.setZoom(10);

                            $scope.marker = new google.maps.Marker({
                                position: $scope.mapLatLng,
                                title: $scope.job.address
                            });
                            $scope.marker.setMap($scope.map);
                        }
                    }, 500);
                };
                lazyLoadGoogleApi.then(function () {
                    $scope.job.showMap = true;
                });
            } else if ($scope.$parent.isStandard) {
                if ($rootScope.clientName === "KINGPIN") {
                    baseFactory.fetch('/api/item/getCategories').then(function (result) {
                        angular.extend(this, $controller('standardOrderKingpinController', {
                            $scope: $scope,
                            order: $scope.$parent.origOrder,
                            isNew: false,
                            customerContacts: [],
                            categories: result.object
                        }));
                    });
                } else {
                    baseFactory.fetch('/api/item/getCategories').then(function (result) {
                        angular.extend(this, $controller('standardOrderPpiController', {
                            $scope: $scope,
                            order: $scope.$parent.origOrder,
                            categories: result.object,
                            isNew: false,
                            customerContacts: { object: [] }
                        }));
                    });
                }
            } else if ($rootScope.clientName === "PPI") {
                baseFactory.fetch('/api/category/GetAll').then(function (result) {
                    angular.extend(this, $controller('editOrder', {
                        $scope: $scope,
                        orderData: { object: $scope.$parent.origOrder },
                        categories: result,
                        orderCustomFields: { object: [] },
                        isNew: false
                    }));
                });
            } else {
                angular.extend(this, $controller('createOrder', {
                    $scope: $scope,
                    order: $scope.$parent.order,
                    detailsMode: true
                }));
            }
        }]);
(function () {
    'use strict';
    homeModule.controller('HomeAboutUsCtrl', ctrl);
    ctrl.$inject = ['$scope', '$location'];
    function ctrl($scope, $location) {
        $scope.gotoAnchor = function (x) {
            var newHash = 'anchor' + x;
            if ($location.hash() !== newHash) {
                // set the $location.hash to `newHash` and
                // $anchorScroll will automatically scroll to it
                $location.hash('anchor' + x);
            } else {
                // call $anchorScroll() explicitly,
                // since $location.hash hasn't changed
                $anchorScroll();
            }
        };
    }
})();
(function () {
    'use strict';

    app.controller('AppRootAdvancedCtrl', ctrl);

    ctrl.$inject = ['$scope', '$rootScope', '$controller', '$state', '$location', '$route', '$timeout', 'baseFactory'];
    function ctrl($scope, $rootScope, $controller, $state, $location, $route, $timeout, baseFactory) {

        $rootScope.noLoginRequiredRoutes = [
            '/artwork'
        ];

        angular.extend(this, $controller('AppRootCtrl', { $scope: $scope }));
        $scope.showFooter = true;

        //no session. redirect the user to the login page
        $scope.$onRootScope(LOGOUT_USER, function () {
            $rootScope.showBlanket = true;

            baseFactory.call('/api/security/logout', {}).then(function () {
                $rootScope.user = null;
                $rootScope.impersonate = null;
                $rootScope.isAthenticated = false;
                $rootScope.showBlanket = false;
                $rootScope.$emit(NO_LOGGED_IN_USER);

                window.location = "/";
            });
        });
        $scope.$onRootScope('$stateChangeSuccess', function (ev, nxt) {
            if (nxt.name == "base.home") {
                $rootScope.containerCssClass = "container";
            } else {
                $rootScope.containerCssClass = "container-fluid";
            }
        });
    }
})();
(function () {
    'use strict';

    homeModule.controller('HomePPICtrl', ctrl);
    ctrl.$inject = ['$scope', '$rootScope', '$sce', '$modal', 'Carousel', 'QodoCarouselFactory', 'dataContent'];
    function ctrl($scope, $rootScope, $sce, $modal, Carousel, QodoCarouselFactory, dataContent) {
        $scope.Carousel = Carousel;
        $scope.dataContent = dataContent;
        $scope.banner = "banner" + window.randomString();
        $scope.hotDeals = "hotDeals" + window.randomString();
        $scope.showCarousel = false;
        $scope.swiping = false;

        setTimeout(function () {
            $scope.showCarousel = true;
        }, 10);

        $scope.carousel = {
            active: 0,
            interval: 5000,
            noWrapSlides: false
        };
        $scope.carousel1 = {
            active: 0,
            interval: 10000,
            noWrapSlides: true
        };

        $scope.groupByCount = function (items, cnt) {
            var ctr = 0;
            var groupCtr = 1;
            var group = [];
            var results = [];

            for (var x = 0; x < items.length; x++) {
                items[x].id = x;
                if (ctr >= cnt) {
                    results.push({
                        id: groupCtr,
                        items: group
                    });
                    group = [];
                    ctr = 0;
                    groupCtr++;
                }

                group.push(items[x]);
                ctr++;
            }
            if (group.length > 0) {
                results.push({
                    id: groupCtr,
                    items: group
                });
            }
            return results;
        };
        $scope.trustSrc = function (src) {
            return $sce.trustAsResourceUrl(src);
        }
        $scope.openVideo = function (m) {
            if ($scope.swiping) {
                $scope.swiping = false;
                return;
            }

            var modalInstance = $modal.open({
                templateUrl: '/app/modules/admin/items/editItemModal/editVideoGalleryModal/viewSimpleMediaModal.html',
                controller: 'ViewSimpleMediaModalCtrl',
                size: 'lg',
                resolve: {
                    SimpleMediaModule: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('OcViewSimpleMediaCtrl');
                    }],
                    doc: function () {
                        return m;
                    },
                }
            });

            modalInstance.result.then(function (c) {
            }, function (r) {
            });
        };

        if (!$scope.dataContent.isSpecialGrouped) {
            //$scope.dataContent.specials = $scope.groupByCount($scope.dataContent.specials, 4);
            $scope.dataContent.isSpecialGrouped = true;
        }

        $scope.swipeFunc = function () {
            // console.log("swiping...");
        };
        $scope.redirectUrl = function (url) {
            if ($scope.swiping) {
                $scope.swiping = false;
                return;
            }

            if (url != null)
                if (url.length > 0) {
                    // url = url.replace('www.promotrends.com.au', 'localhost:5191');
                    if ($rootScope.isAthenticated) {
                        url = url.replace('#/product/catalog', '#/catalog');
                    } else {
                        url = url.replace('#/catalog', '#/product/catalog');
                    }
                    window.location.href = url;
                }
        };
        // Best Sellers
        setTimeout(function () {
            var elementExist1 = document.getElementById("specialCarousel");
            if (elementExist1)
                $scope.specialCarousel = new QodoCarouselFactory({
                    carousel: '#specialCarousel',
                    slide: '.slide',
                    oneByOne: true
                });
        }, 500);
    }
})();
