Source: components/admin/controllers/cameras.controller.js

/**
 * @ngdoc controllers
 * @name Cameras
 * @module s4c.components.admin.controllers.Cameras
 *
 * @description
 * `AdminCamerasCtrl` Controller da tela de Câmeras do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    AdminCamerasCtrl.$inject = [
        '$scope',
        '$http',
        '$mdDialog',
        'API_ENDPOINT',
        'ngFileReader',
        'MapaEndereco',
        '$rootScope',
        'FileUploader'
    ];

    angular.module('s4c.controllers.AdminCamerasCtrl', [
        's4c.services.Categoria',
        's4c.directives.ngFileReader'
    ]).controller('AdminCamerasCtrl', AdminCamerasCtrl);

    function AdminCamerasCtrl($scope, $http, $mdDialog, API_ENDPOINT, ngFileReader, MapaEndereco, $rootScope, FileUploader) {

        $scope.res = $rootScope.res;

        function AdicionarCategoriaCtrl($scope, $mdDialog, categoriaCamera, res) {

            $scope.res = res;

            //$scope.ip = '';

            categoriaCamera ? $scope.categoriaCamera = categoriaCamera : null;

            categoriaCamera ? $scope.modo = $scope.res('COMUM_EDITAR') : $scope.modo = $scope.res('COMUM_NOVA');

            $scope.cancelar = $mdDialog.cancel;

            /**
             * @method ok
             */
            $scope.ok = function () {
                if ($scope.formCategoria.$valid) {
                    //var atributos = {};
                    //atributos.ip = $scope.ip;
                    //$scope.categoriaCamera.atributos = atributos;
                    $mdDialog.hide($scope.categoriaCamera);
                }
            };

            /**
             * @method exibirCamposTipoCategoria
             */
            $scope.exibirCamposTipoCategoria = function () {
                if ($scope.categoriaCamera.tipo == 'wowza') {
                    $scope.visibleDivWowza = true;
                }
                else {
                    $scope.visibleDivWowza = false;
                }
            };

            if ($scope.categoriaCamera != null && $scope.categoriaCamera.tipo == "wowza") {
                $scope.visibleDivWowza = true;
                //$scope.ip = $scope.categoriaCamera.atributos.ip;
            }
            else {
                $scope.visibleDivWowza = false;
            }
        }

        var basicColumns = [{
            headerName: '',
            width: 150,
            checkboxSelection: true,
            suppressSorting: true,
            suppressMenu: true
        }, {
            headerName: $scope.res('COMUM_NOME'),
            width: 500,
            field: "nome",
            editable: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_DESCRICAO'),
            width: 500,
            field: "descricao",
            editable: true,
            cellClicked: fecharMapa,
            volatile: true
        },
        {
            headerName: $scope.res('COMUM_BAIRRO'),
            width: 200,
            field: "bairro",
            editable: true,
            cellClicked: abrirMapa,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_LATITUDE'),
            width: 300,
            field: "latitude",
            editable: true,
            cellClicked: abrirMapa,
            newValueHandler: atualizarLatitude,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_LONGITUDE'),
            width: 300,
            field: "longitude",
            editable: true,
            cellClicked: abrirMapa,
            newValueHandler: atualizarLongitude,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_NUMERO'),
            width: 300,
            field: "numero",
            editable: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_ALTURA'),
            width: 300,
            field: "altura",
            editable: true,
            suppressSorting: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_LARGURA'),
            width: 300,
            field: "largura",
            editable: true,
            suppressSorting: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: "URL",
            width: 400,
            field: "url",
            editable: true,
            suppressSorting: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_IDENTIFICADOR'),
            width: 500,
            field: "chave_estrangeira",
            editable: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: $scope.res('COMUM_URLICONE'),
            width: 400,
            field: "urlIcone",
            editable: true,
            suppressSorting: true,
            cellClicked: fecharMapa,
            volatile: true
        }, {
            headerName: $scope.res('GRAVACAO_CONTROLE'),
            width: 550,
            enableCellEdit: false,
            cellRenderer: controlRecord
        }, {
            headerName: $scope.res('GRAVACAO_CONTINUA'),
            width: 550,
            field: 'continuousRecording',
            cellRenderer: controlContinuousRecording
        }, {
            headerName: $scope.res('GRAVACAO_LIMITE_DVR'),
            width: 300,
            field: "limiteArmazenamentoDvr",
            editable: true,
            cellClicked: fecharMapa,
            volatile: true
        }
        ];

        /**
         * @method controlContinuousRecording
         * @param {*} params 
         */
        function controlContinuousRecording(params) {

            var html;

            if ($scope.categoriaCamera.tipo != 'wowza') {
                html = '<div style="text-align: center;"><a>' + $scope.res('GRAVACAO_NAO_DISPONIVEL') + '</a></div>';
            }
            else {
                html = '<div style="text-align: right;"><input type="checkbox" ng-model="data.continuousRecording" style="display:inherit;"/></div>';
            }

            return html;
        }

        /**
         * @method controlRecord
         * @param {*} params 
         */
        function controlRecord(params) {

            var camera = getCameraById(params.data.id);
            var html;

            if ($scope.categoriaCamera.tipo != 'wowza') {
                html = '<div style="text-align: center;"><a>' + $scope.res('GRAVACAO_NAO_DISPONIVEL') + '</a></div>';
            }
            else if (camera.recording) {
                html = '<div style="text-align: center;">' +
                    '<a href="javascript:;" ng-click="stopRecord(' + camera.id + ',' + params.rowIndex + ');" ><img src="/assets/images/Camera/stop_24px.png"></img></a></div>';
            }
            else {
                html = '<div style="text-align: center;">' +
                    '<a href="javascript:;" ng-click="startRecord(' + camera.id + ',' + params.rowIndex + ');" ><img src="/assets/images/Camera/rec_24px.png"></img></a></div>';
            }

            return html;
        }

        /**
         * @method getCameraById
         * @param {*} id 
         */
        function getCameraById(id) {
            var camera;

            _.each($scope.gridOptions.rowData, function (row) {
                if (row.id == id) {
                    camera = row;
                }
            });

            return camera;
        }

        /**
         * @method setRecordingCamera
         * @param {*} camera 
         */
        function setRecordingCamera(camera) {
            var index = 0;

            _.each($scope.gridOptions.rowData, function (row) {
                if (row.id == camera.id) {
                    $scope.gridOptions.rowData[index].recording = camera.recording;
                }

                index++;
            });
        }


        /**
         * @method startRecord
         * @param {*} id
         * @param {*} index
         */
        $scope.startRecord = function (id, index) {

            var camera = getCameraById(id);

            if (camera.recording) {
                $mdDialog.show($mdDialog.alert()
                    .title($scope.res('COMUM_ERRO'))
                    .content($scope.res('GRAVACAO_EM_ANDAMENTO'))
                    .ok($scope.res('COMUM_OK')));
                return;
            }

            var recording = 'true';

            $.ajax({
                type: "GET",
                url: $scope.categoriaCamera.atributos.ip + "dvrstreamrecord?app=" + $scope.categoriaCamera.atributos.application
                    + "&streamname=" + camera.nome + ".stream&action=start" + "&instancename=" + camera.nome,
                success: function (data) {

                    $http.post(API_ENDPOINT + "cameras/record/" + camera.id, recording).then(function (response) {
                        setRecordingCamera(response.data);

                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('GRAVACAO_INICIADA'))
                                .ok($scope.res('COMUM_OK')));

                        $scope.gridOptions.api.refreshView();

                    }, function (err) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_ERRO'))
                                .content(err.data.message)
                                .ok($scope.res('COMUM_OK')));
                    });
                },
                error: function (data) {
                    $mdDialog.show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res("GRAVACAO_ERRO_INICIAR"))
                        .ok($scope.res('COMUM_OK')));
                }
            });
        }

        /**
         * @method stopRecord
         * @param {*} id
         * @param {*} index
         */
        $scope.stopRecord = function (id, index) {

            var camera = getCameraById(id);

            if (!camera.recording) {
                $mdDialog.show($mdDialog.alert()
                    .title($scope.res('COMUM_ERRO'))
                    .content($scope.res("GRAVACAO_EM_ANDAMENTO_ERRO"))
                    .ok($scope.res('COMUM_OK')));
                return;
            }

            var recording = 'false';

            $.ajax({
                type: "GET",
                url: $scope.categoriaCamera.atributos.ip + "dvrstreamrecord?app=" + $scope.categoriaCamera.atributos.application
                    + "&streamname=" + camera.nome + ".stream&action=stop" + "&instancename=" + camera.nome,
                success: function (data) {

                    $http.post(API_ENDPOINT + "cameras/record/" + camera.id, recording).then(function (response) {
                        setRecordingCamera(response.data);

                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('GRAVACAO_PARADA'))
                                .ok($scope.res('COMUM_OK')));

                        $scope.gridOptions.api.refreshView();

                    }, function (err) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_ERRO'))
                                .content(err.data.message)
                                .ok($scope.res('COMUM_OK')));
                    });
                },
                error: function (data) {
                    $mdDialog.show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res("GRAVACAO_ERRO_PARAR"))
                        .ok($scope.res('COMUM_OK')));
                }
            });
        }

        $scope.gridOptions = {
            rowSelection: 'multiple',
            enableSorting: true,
            columnDefs: basicColumns,
            rowData: [],
            angularCompileHeaders: true,
            angularCompileRows: true,
            headerCellRenderer: headerCellRendererFunction,
            selectionChanged: onSelectionChanged,
            pinnedColumnCount: 1,
            enableColResize: true
        };

        /**
         * @method onFileSelected
         * @param {*} file 
         */
        function onFileSelected(file) {
            var json = KMLParser.loadKML(file.contents);
            var rows = [];

            _.each(json.body, function (row) {
                var positionIndex = json.head.indexOf('geojson');

                if (positionIndex < 0) {
                    return;
                }

                var data = {
                    _id: _.uniqueId(row),
                    nome: row[0],
                    descricao: row[1],
                    latitude: JSON.parse(row[positionIndex]).coordinates[1],
                    longitude: JSON.parse(row[positionIndex]).coordinates[0],
                    CategoriaCameraId: $scope.categoriaCamera.id
                };
                rows.push(data);
            });

            $scope.gridOptions.api.sizeColumnsToFit();
            $scope.gridOptions.rowData = rows;
            $scope.gridOptions.api.onNewRows();
            $scope.gridOptions.api.setSortModel([{
                field: 'nome',
                sort: 'asc'
            }]);
        }

        $scope.exibeMapa = false;
        $scope.lastSelectedRow = {};

        ngFileReader.on('fileSelectedCAMERAS', onFileSelected);

        $scope.$on('$destroy', function () {
            MapaEndereco.limparEventos();
        });

        MapaEndereco.on('atualizarCoordenadas', function (coordenadas) {
            if ($scope.gridOptions != null && $scope.gridOptions.selectedRows != null && $scope.gridOptions.selectedRows.length === 1) {
                var row = $scope.gridOptions.selectedRows[0];

                row.latitude = coordenadas.latitude;
                row.longitude = coordenadas.longitude;

                $scope.gridOptions.api.refreshView();
            }
        });

        /**
         * @method onSelectionChanged
         */
        function onSelectionChanged() {
            if ($scope.gridOptions != null && $scope.gridOptions.selectedRows != null && $scope.gridOptions.selectedRows.length === 1 && $scope.exibeMapa) {
                var row = $scope.gridOptions.selectedRows[0];

                if (row._id != $scope.lastSelectedRow._id) {
                    MapaEndereco.atualizarCoordenadas(row.latitude, row.longitude);
                    $scope.lastSelectedRow = row;
                }
            } else {
                fecharMapa();
            }
        }

        /**
         * @method abrirMapa
         */
        function abrirMapa() {
            $scope.exibeMapa = true;
        }

        /**
         * @method fecharMapa
         */
        function fecharMapa() {
            $scope.exibeMapa = false;
        }

        /**
         * @method atualizarLatitude
         */
        function atualizarLatitude(params) {
            var latitude = params.newValue;
            var longitude = params.data.longitude;
            MapaEndereco.atualizarCoordenadas(latitude, longitude);
        }

        /**
         * @method atualizarLongitude
         * @param {*} params 
         */
        function atualizarLongitude(params) {
            var latitude = params.data.latitude;
            var longitude = params.newValue;
            MapaEndereco.atualizarCoordenadas(latitude, longitude);
        }

        /**
         * @method atualizarEndereco
         * @param {*} params 
         */
        function atualizarEndereco(params) {
            MapaEndereco.atualizarEndereco(params.newValue);
        }

        /**
         * @method checkboxClick
         * @param {*} params 
         */
        function checkboxClick(params) {
            angular.element(params.eventSource).find('input').click();
            params.event.stopPropagation();
        }

        /**
         * @method headerCellRendererFunction
         * @param {*} params 
         */
        function headerCellRendererFunction(params) {
            var eHeader = document.createElement('span');
            var eTitle = document.createTextNode(params.colDef.headerName);

            eHeader.appendChild(eTitle);

            if (params.colDef.headerName == '') {
                eHeader.style.textAlign = 'center';
                eHeader.style.verticalAlign = 'center';
            } else {

                var eEdit = document.createElement('md-icon');

                eEdit.setAttribute('class', 'menu-icon');
                eEdit.setAttribute('style', 'float: right');
                eEdit.setAttribute('md-svg-icon', 'menu:edit');
                eEdit.setAttribute('alt', 'editar');
                eEdit.setAttribute('ng-click', 'definirValorDaColuna($event, this,"' + params.colDef.field + '")');

                eHeader.appendChild(eEdit);
            }


            return eHeader.outerHTML;
        }

        /**
         * @method definirValorDaColuna
         * 
         * @param {*} event 
         * @param {*} domNode 
         * @param {*} field 
         */
        function definirValorDaColuna(event, domNode, field) {
            event.stopPropagation();
            $mdDialog.show({
                controller: function ($scope, res) {
                    $scope.res = res;
                    $scope.ok = function () {
                        $mdDialog.hide($scope.coluna.valor);
                    };

                    $scope.cancelar = $mdDialog.cancel;
                },
                templateUrl: 'app/components/admin/modulos/manutencao/pois/definirValorDaColuna.html',
                locals: {
                    res: $scope.res
                },
                parent: domNode
            }).then(function (valor) {
                _.each($scope.gridOptions.rowData, function (row) {
                    row[field] = valor;
                });
                $scope.gridOptions.api.refreshView();
            });
        }

        /**
         * @method deletarSelecionados
         */
        function deletarSelecionados() {

            var selecionados = _.map($scope.gridOptions.api.getSelectedNodes(), 'data._id');
            $scope.rowsDeleted.push(_.map($scope.gridOptions.api.getSelectedNodes(), 'data'));

            _.remove($scope.gridOptions.rowData, function (row) {
                return _.includes(selecionados, row._id)
            });

            $scope.gridOptions.api.onNewRows();
        }

        /**
         * @method adicionarNovaLinha
         */
        function adicionarNovaLinha() {
            $scope.gridOptions.rowData.unshift({
                CategoriaCameraId: $scope.categoriaCamera.id,
                _id: _.uniqueId()
            });
            $scope.gridOptions.api.onNewRows();
            $scope.gridOptions.api.setSortModel($scope.gridOptions.api.getSortModel());
        }

        /**
         * @method salvar
         */
        function salvar() {
            var rows = $scope.gridOptions.rowData;

            var _id = 1;
            rows = _.map(rows, function (row) {
                row._id = _id++;
                row.poiGeometrico = 'SRID=4326;POINT(' + row.longitude + ' ' + row.latitude + ')';
                if (!row.urlIcone) {
                    row.urlIcone = $scope.categoriaCamera.urlIcone;
                }
                return row;
            });

            $http.post(API_ENDPOINT + "cameras/categoria_camera/" + $scope.categoriaCamera.id, rows)
                .then(function () {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('MENSAGEM_SUCESSO_ATUALIZACAO_CAMERAS'))
                            .ok($scope.res('COMUM_OK')));

                    //Cria o stream no Wowza para cada câmera
                    if ($scope.categoriaCamera.tipo == 'wowza') {

                        _.each(rows, function (row) {
                            $.ajax({
                                type: "GET",
                                url: $scope.categoriaCamera.atributos.ip + "createstream?streamname=" + row.nome + "&source=" + row.url
                                    + "&appname=" + $scope.categoriaCamera.atributos.application + "&instancename=" + row.nome,
                                success: function (data) {
                                    $mdDialog
                                        .show($mdDialog.alert()
                                            .title($scope.res('COMUM_SUCESSO'))
                                            .content($scope.res('Stream da câmera ' + row.nome + ' criado com sucesso'))
                                            .ok($scope.res('COMUM_OK')));

                                },
                                error: function (data) {
                                    $mdDialog.show($mdDialog.alert()
                                        .title($scope.res('COMUM_ERRO'))
                                        .content("Erro na criação do stream da câmera " + row.nome)
                                        .ok($scope.res('COMUM_OK')));
                                }
                            });
                        });

                        _.each($scope.rowsDeleted, function (row) {
                            $.ajax({
                                type: "GET",
                                url: $scope.categoriaCamera.atributos.ip + "deletestream?streamname=" + row.nome +
                                    "&appname=" + $scope.categoriaCamera.atributos.application + "&instancename=" + row.nome,
                                success: function (data) {
                                },
                                error: function (data) {
                                    $mdDialog.show($mdDialog.alert()
                                        .title($scope.res('COMUM_ERRO'))
                                        .content("Erro na exclusão do stream da câmera " + row.nome)
                                        .ok($scope.res('COMUM_OK')));
                                }
                            });
                        });
                    }

                    buscarCamerasPorCategoria();

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method adicionarCategoria
         */
        function adicionarCategoria() {

            $mdDialog.show({
                controller: AdicionarCategoriaCtrl,
                templateUrl: 'app/components/admin/modulos/manutencao/cameras/dialogCategoriaCamera.html',
                parent: document.body,
                locals: {
                    categoriaCamera: null,
                    res: $scope.res
                }
            }).then(function (categoriaCamera) {
                $http.post(API_ENDPOINT + "categoria_camera/", categoriaCamera)
                    .then(function (response) {
                        var _categoriaCamera = response.data;
                        _categoriaCamera.selected = true;
                        $scope.categorias.push(_categoriaCamera);
                        $scope.categoriaCamera = _categoriaCamera;

                        $scope.gridOptions.rowData = [];
                        $scope.gridOptions.api.onNewRows();
                        $scope.gridOptions.api.sizeColumnsToFit();
                        $scope.gridOptions.api.setSortModel([{
                            field: 'nome',
                            sort: 'asc'
                        }]);

                    });
            }, function (cancel) {
                _initCategoriaCamera();
            })
        }

        /**
         * @method editarCategoriaCamera
         */
        function editarCategoriaCamera() {
            $mdDialog.show({
                controller: AdicionarCategoriaCtrl,
                templateUrl: 'app/components/admin/modulos/manutencao/cameras/dialogCategoriaCamera.html',
                parent: document.body,
                locals: {
                    categoriaCamera: $scope.categoriaCamera,
                    res: $scope.res
                }
            }).then(function (categoriaCamera) {
                $http.put(API_ENDPOINT + "categoria_camera/" + categoriaCamera.id, categoriaCamera)
                    .then(function (response) {
                        $scope.categoriaCamera = response.data;
                        $http.get(API_ENDPOINT + "categoria_camera")
                            .then(function (result) {
                                $scope.categorias = result.data;
                            }, function (err) {
                                $mdDialog
                                    .show($mdDialog.alert()
                                        .title($scope.res('COMUM_ERRO'))
                                        .content(err.data.message)
                                        .ok($scope.res('COMUM_OK')));
                            });

                    });
            })
        }

        /**
         * @method ativarCategoria
         */
        function ativarCategoria() {

            if (!$scope.categoriaCamera || $scope.categoriaCamera == 'nova') {
                adicionarCategoria();
            } else {
                buscarCamerasPorCategoria();
            }

        }

        /**
         * @method _initCategoriaCamera
         */
        function _initCategoriaCamera() {
            $scope.categoriaCamera = null;
            $scope.gridOptions.rowData = [];
            $scope.gridOptions.api.onNewRows();
        }

        /**
         * @method excluirCategoriaCamera
         */
        function excluirCategoriaCamera() {
            var confirm = $mdDialog.confirm()
                .title($scope.res('CATEGORIACAMERA_TITULO'))
                .content($scope.res('CATEGORIACAMERA_REMOVER'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_CANCELAR'));

            $mdDialog.show(confirm)
                .then(function () {
                    $http.delete(API_ENDPOINT + "categoria_camera/" + $scope.categoriaCamera.id)
                        .then(function (response) {
                            _initCategoriaCamera();
                            carregarCategorias();
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_SUCESSO'))
                                    .content($scope.res('CATEGORIACAMERA_DELETE_SUCESSO'))
                                    .ok($scope.res('COMUM_OK')));

                        }, function (err) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content(err.data.message)
                                    .ok($scope.res('COMUM_OK')));
                        });

                }, function () {
                    console.log('cancel');
                });

        }

        /**
         * @method buscarCamerasPorCategoria
         */
        function buscarCamerasPorCategoria() {

            if (!$scope.categoriaCamera.id) {
                $scope.categoriaCamera = JSON.parse($scope.categoriaCamera);
            }

            if (!$scope.rowsDeleted) {
                $scope.rowsDeleted = [];
            }

            $http.get(API_ENDPOINT + "cameras/categoria_camera/" + $scope.categoriaCamera.id)
                .then(function (result) {
                    _.each(result.data, function (camera) {
                        camera._id = _.uniqueId();
                        camera.latitude = JSON.parse(camera.poiGeometrico).coordinates[1];
                        camera.longitude = JSON.parse(camera.poiGeometrico).coordinates[0];
                    });

                    $scope.gridOptions.api.sizeColumnsToFit();
                    $scope.gridOptions.rowData = result.data;
                    $scope.gridOptions.api.onNewRows();
                    $scope.gridOptions.api.setSortModel([{
                        field: 'nome',
                        sort: 'asc'
                    }]);
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method carregarCategorias
         */
        function carregarCategorias() {
            $http.get(API_ENDPOINT + "categoria_camera")
                .then(function (result) {
                    $scope.categorias = result.data;
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        carregarCategorias();

        /**
         * @method exportarExcel
         */
        function exportarExcel() {
            var data = {};
            var rows = $scope.gridOptions.rowData;
            data.cameras = rows;
            data.headers = [];

            if ($scope.categoriaCamera.tipo == 'wowza') {
                for (var index in rows) {
                    var camera = data.cameras[index];
                    camera.controleGravacao = $scope.categoriaCamera.atributos.ip + "dvrstreamrecord?app=" + $scope.categoriaCamera.atributos.application
                        + "&streamname=" + camera.nome + ".stream&action=start" + "&instancename=" + camera.nome;
                    if (camera.recording) {
                        camera.continuousRecording = "SIM";
                    }
                    else {
                        camera.continuousRecording = "NÃO";
                    }
                }
            }

            for (var index in $scope.gridOptions.columnDefs) {
                if ($scope.gridOptions.columnDefs[index].headerName != null && $scope.gridOptions.columnDefs[index].headerName != "" && $scope.gridOptions.columnDefs[index].headerName != "+") {
                    data.headers.push($scope.gridOptions.columnDefs[index].headerName);
                }
            }

            $http
                .post(API_ENDPOINT + 'cameras/excel/download', data, { responseType: 'arraybuffer', })
                .then(function (res) {

                    var a = document.createElement("a");
                    document.body.appendChild(a);
                    a.style = "display: none";

                    var file = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
                    var fileURL = URL.createObjectURL(file);

                    a.href = fileURL;
                    a.download = $scope.categoriaCamera.nome + ".xlsx";
                    a.click();

                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content('Arquivo gerado com sucesso.')
                            .ok($scope.res('COMUM_OK')));
                }, function (err) {
                    console.log(err);
                });
        }

        $scope.input = angular.element('input.uploadArquivo');

        var uploader = $scope.uploader = new FileUploader(),
            uploadCallbackQueue = [];

        uploader.clearQueue();

        $scope.uploader.alias = 'arquivo';
        $scope.uploader.removeAfterUpload = true;

        $scope.uploader.filters.push({
            'name': 'enforceMaxFileSize',
            'fn': function (item, evt) {

                $scope.tamFile = item.size;

                return true;
            }
        });

        $scope.uploader.onCompleteItem = function (item, response) {
            $scope.mensagem = response;
        };

        $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
            item.novoNome = item.file.name;
            enviarArquivo();
        }

        /**
         * @method enviarArquivo
         */
        function enviarArquivo() {

            if ($scope.tamFile > 35000) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('EXCEL_POI_EM_PROCESSAMENTO'))
                        .ok($scope.res('COMUM_OK')));
            }

            $scope.isUploading = true;
            uploader.url = '/cameras/excel/addCamerasFromExcel/' + JSON.parse($scope.categoriaCamera.id);
            uploader.uploadAll();
            $scope.gridOptions.rowData = [];
            uploadCallbackQueue = [];
            uploadCallbackQueue.push(function () {
                $scope.isUploading = false;
                $scope.arquivosPraSubir = false;
                uploader.clearQueue();
                ativarCategoria();
                if ($scope.mensagem.status == "200") {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_AVISO'))
                            .content($scope.res('EXCEL_POI_PROCESSADO'))
                            .ok($scope.res('COMUM_OK')));
                }
                else {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_AVISO'))
                            .content($scope.mensagem.message)
                            .ok($scope.res('COMUM_OK')));
                }
            });
        }

        $scope.uploader.onBeforeUploadItem = function (item) {
            item.url = uploader.url;
            var token = window.sessionStorage.getItem('s4cToken');
            var tokenObj = JSON.parse(token);
            item.headers = {
                'Authorization': 'Bearer ' + tokenObj.access_token
            };
        };

        $scope.uploader.onProgressItem = function (fileItem, progress) {
            console.info('onProgressItem', fileItem, progress);
        };

        $scope.uploader.onCompleteAll = function (result) {
            _.each(uploadCallbackQueue, function (callback) {
                callback();
            });
        };

        $scope.importFile = function () {
            $("#arquivo").click();
        };

        angular.extend($scope, {
            definirValorDaColuna: definirValorDaColuna,
            fecharMapa: fecharMapa,
            ativarCategoria: ativarCategoria,
            excluirCategoriaCamera: excluirCategoriaCamera,
            deletarSelecionados: deletarSelecionados,
            adicionarNovaLinha: adicionarNovaLinha,
            salvar: salvar,
            editarCategoriaCamera: editarCategoriaCamera,
            exportarExcel: exportarExcel
        });
    }

}());