Source: directives/file-reader/file-reader.js


/**
 * @ngdoc directives
 * @name FileReader
 * @module s4c.directives.filereader.FileReader
 *
 * @description Componente para importação de arquivo, usado para leitura de arquivos kml e kmz
 *
 *
 *@example
 *   <ng-file-reader hide-input="true" element-id="admin-cameras-btn-upload"></ng-file-reader>
 * 
 */
(function () {
    'use strict';

    function ngFileReader(ngFileReader) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/file-reader/file-reader.html',
            replace: true,
            scope: {
                'hideInput': '@'
            },
            link: function ($scope, $elem, $attrs) {

                angular.element(document.querySelector('#' + $attrs.elementId)).on('click', function () {
                    $elem.click();
                });

		        /**
		         * Descompacta um arquivo zipado
		         * 
		         * @method unzip
		         *
		         * @param file {File}  Arquivo a ser descompactado
		         * @param callback {Function} Função a ser chamada após término do método
		         *
		         */
                function unzip(file, callback) {
                    zip.workerScriptsPath = "/assets/js/lib/";
                    // use a zip.BlobReader object to read zipped data stored into blob variable
                    zip.createReader(new zip.BlobReader(file), function (zipReader) {
                        // get entries from the zip file
                        zipReader.getEntries(function (entries) {
                            _.each(entries, function (entry) {
                                var extn_ = entry.filename.split(".").pop();
                                if (extn_ == 'kml') {
                                    // get data from the files
                                    entry.getData(new zip.BlobWriter("text/plain"), function (data) {
                                        // close the reader and calls callback function with uncompressed data as parameter
                                        zipReader.close();
                                        callback(data);
                                    });
                                }
                            });
                        });
                    }, onerror);
                }

                function onerror(message) {
                    console.error(message);
                }

		        /**
		         * Retorna o arquivo chamando a função responsável pela leitura, 
		         * como cada módulo pode ter a sua implementação, é aqui que será definida qual implementação deve ser chamada 
		         * 
		         * @method returnFile
		         *
		         * @param file {File}  Arquivo a ser lido
		         * 
		         *
		         */
                function returnFile(file) {
                    var fileReader = new FileReader();
                    fileReader.onload = function (e) {
                        var contents = e.target.result;
                        if ($attrs.elementId == 'admin-pois-btn-upload') {
                            ngFileReader.fileSelectedPOI({
                                contents: contents
                            });
                        } else if ($attrs.elementId == 'admin-rotas-btn-upload') {
                            ngFileReader.fileSelectedROTAS({
                                contents: contents
                            });
                        } else if ($attrs.elementId == 'admin-cameras-btn-upload') {
                            ngFileReader.fileSelectedCAMERAS({
                                contents: contents
                            });
                        } else if ($attrs.elementId == 'admin-area-atuacao-btn-upload') {
                            ngFileReader.fileSelectedAREAATUACAO({
                                contents: contents
                            });
                        } else {
                            ngFileReader.fileSelected({
                                contents: contents
                            });
                        }

                        $elem.wrap('<form>').closest('form').get(0).reset();
                        $elem.unwrap();
                    };

                    fileReader.readAsText(file);
                }

                $elem.on('change', function (changeEvent) {
                    var files = changeEvent.target.files;
                    if (files.length) {

                        var extn = files[0].name.split(".").pop();

                        if (extn == 'kmz') {
                            unzip(files[0], returnFile);
                        } else {
                            returnFile(files[0]);
                        }
                    }
                });
            }
        };
    }

    /**
     * @ngdoc overview
     * @name s4c.components.fileUploader
     */
    angular.module('s4c.directives.ngFileReader', [])
        .directive('ngFileReader', ngFileReader);
}());