Show:
/**
 ResourceListView is responsible for managing the UI of selecting, adding and deleting resources (i.e.: video, images and swfs)
 as well as property management of resources, such as renaming a resource.
 @class CompResourcesList
 @constructor
 @return {Object} instantiated CompResourcesList
 **/
define(['jquery', 'backbone', 'bootstrapfileinput', 'video', 'platform'], function ($, Backbone, bootstrapfileinput, videojs, platform) {

    var ResourceListView = BB.View.extend({

        /**
         Init the ChannelList component and enable sortable channels UI via drag and drop operations.
         @method _init
         @return none
         **/
        initialize: function () {
            var self = this;
            self.m_property = BB.comBroker.getService(BB.SERVICES['PROPERTIES_VIEW']);
            self.m_property.initPanel(Elements.RESOURCE_LIST_PROPERTIES);
            self.m_videoPlayer = undefined;
            self._listenInputChange();
            self._initVideo();
            $('input[type=file]').bootstrapFileInput();
            self._listenRemoveResource();
            $(Elements.FILE_SELECTION).change(function (e) {
                self._onFileSelected(e);
            });
            self.render();
        },

        /**
         When user changes text update msdb, we use xSavePlayerData
         as a json boilerplate that we append values to and save it in msdb as player_data
         @method _listenInputChange
         @return none
         **/
        _listenInputChange: function () {
            var self = this;
            var onChange = _.debounce(function (e) {
                var text = $(e.target).val();
                if (BB.lib.isEmpty(text))
                    return;
                text = BB.lib.cleanProbCharacters(text,1);
                pepper.setResourceRecord(self.m_selected_resource_id, 'resource_name', text);
                var elem = self.$el.find('[data-resource_id="' + self.m_selected_resource_id + '"]');
                elem.find('span').text(text);
            }, 333);
            $(Elements.SELECTED_LIB_RESOURCE_NAME).on("input", onChange);
        },

        /**
         Listen to remove resource event
         @method _listenRemoveResource
         @return none
         **/
        _listenRemoveResource: function () {
            var self = this;
            $(Elements.FILE_REMOVE).on('click', function (e) {
                if (self.m_selected_resource_id == undefined)
                    return;
                // notify before so channel instances can remove blocks & after so channelList refresh UI
                BB.comBroker.fire(BB.EVENTS.REMOVING_RESOURCE, this, null, self.m_selected_resource_id);
                pepper.removeResource(self.m_selected_resource_id);
                pepper.removeBlocksWithResourceID(self.m_selected_resource_id);
                pepper.removeResourceFromBlockCollectionInScenes(self.m_selected_resource_id);
                pepper.removeResourceFromBlockCollectionsInChannel(self.m_selected_resource_id);
                self.render();
                self._listenResourceSelected();
                BB.comBroker.fire(BB.EVENTS.REMOVED_RESOURCE, this, null, self.m_selected_resource_id);
            });
        },

        /**
         Listen to resource selection, populate the properties panel and open it if needed.
         @method _listenResourceSelected
         **/
        _listenResourceSelected: function () {
            var self = this;

            $(Elements.CLASS_RESOURCES_LIST_ITEMS).off('click');
            $(Elements.CLASS_RESOURCES_LIST_ITEMS).on('click', function (e) {
                var resourceElem = $(e.target).closest('li');
                self.m_selected_resource_id = $(resourceElem).data('resource_id');
                $(Elements.CLASS_RESOURCES_LIST_ITEMS).removeClass('activated').find('a').removeClass('whiteFont');
                $(resourceElem).addClass('activated').find('a').addClass('whiteFont');
                var recResource = pepper.getResourceRecord(self.m_selected_resource_id);
                $(Elements.SELECTED_LIB_RESOURCE_NAME).val(recResource['resource_name']);
                self.m_property.viewPanel(Elements.RESOURCE_LIST_PROPERTIES);

                if (platform.name == 'Chrome'){
                    self._populateResourcePreviewCDN(recResource);
                } else {
                    self._populateResourcePreviewLegacy(recResource);
                }
                return false;
            });
        },

        /**
         Populate the resource preview with loaded resource file (none CDN)
         @method _populateResourcePreviewLegacy
         @param {Object} i_recResource
         **/
        _populateResourcePreviewLegacy: function (i_recResource) {
            var self = this;
            var path;
            if (self.m_videoPlayer){
                self.m_videoPlayer.pause();
                self.m_videoPlayer.load();
            }

            switch (i_recResource['resource_type']){
                case 'jpg': {
                    var ext = 'jpg';
                }
                case 'png': {
                    if (!ext)
                        ext = 'png';
                    path = window.g_protocol + pepper.getUserData().domain + '/Resources/business' +  pepper.getUserData().businessID + '/resources/' + pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + ext;
                    $(Elements.RESOURCE_PREVIEW_VIDEO).hide();
                    $(Elements.RESOURCE_PREVIEW_IMAGE).fadeIn();
                    $(Elements.RESOURCE_PREVIEW_SVG).hide();
                    var $img = $(Elements.RESOURCE_PREVIEW_IMAGE).find('img');
                    $img.attr('src',path);
                    break;
                }
                case 'mp4': {
                    var ext = 'mp4';
                }
                case 'flv': {
                    if (!ext)
                        ext = 'flv';
                    $(Elements.RESOURCE_PREVIEW_IMAGE).hide();
                    $(Elements.RESOURCE_PREVIEW_SVG).hide();
                    $(Elements.RESOURCE_PREVIEW_VIDEO).fadeIn();
                    path = window.g_protocol + pepper.getUserData().domain + '/Resources/business' +  pepper.getUserData().businessID + '/resources/' + pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + ext;
                    $(Elements.VIDEO_PREVIEW).find('video:nth-child(1)').attr("src",path);
                    break
                }
                case 'swf': {
                    path = './_assets/flash.png';
                    $(Elements.RESOURCE_PREVIEW_VIDEO).hide();
                    $(Elements.RESOURCE_PREVIEW_SVG).hide();
                    $(Elements.RESOURCE_PREVIEW_IMAGE).fadeIn();
                    var $img = $(Elements.RESOURCE_PREVIEW_IMAGE).find('img');
                    $img.attr('src',path);
                    break
                }
                case 'svg': {
                    path = window.g_protocol + pepper.getUserData().domain + '/Resources/business' +  pepper.getUserData().businessID + '/resources/' + pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + 'svg';
                    $(Elements.RESOURCE_PREVIEW_VIDEO).hide();
                    $(Elements.RESOURCE_PREVIEW_IMAGE).hide();
                    $(Elements.RESOURCE_PREVIEW_SVG).fadeIn();
                    var $img = $(Elements.RESOURCE_PREVIEW_SVG).find('object');
                    var urlPath = $.base64.encode(path);
                    var srvPath = 'https://secure.digitalsignage.com/proxyRequest/' + urlPath;

                    // load svg and force w/h
                    $.get(srvPath, function(svg) {
                        var svgHeight, svgWidth, re;

                        svgHeight = svg.match(/(height=")([^\"]*)/)[2];
                        re = new RegExp('height="' + svgHeight + '"', "ig");
                        svg = svg.replace(re, 'height="100"');

                        svgWidth = svg.match(/(width=")([^\"]*)/)[2];
                        re = new RegExp('width="' + svgWidth + '"', "ig");
                        svg = svg.replace(re, 'width="100"');

                        $('#resourcePreviewSVG').empty();
                        var s = new String(svg);
                        $('#resourcePreviewSVG').append(svg).wrap('<center>');
                    });
                    break
                }
            }
        },

        /**
         Populate the resource preview with loaded resource file (CDN)
         @method _populateResourcePreviewCDN
         @param {Object} i_recResource
         **/
        _populateResourcePreviewCDN: function (i_recResource) {
            var self = this;
            if (self.m_videoPlayer){
                self.m_videoPlayer.pause();
                self.m_videoPlayer.load();
            }
            var path = window.g_protocol + 's3.signage.me/business' +  pepper.getUserData().businessID + '/resources/';

            switch (i_recResource['resource_type']){
                case 'jpg': {
                    var ext = 'jpg';
                }
                case 'png': {
                    if (!ext)
                        ext = 'png';
                    path += pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + ext;
                    $(Elements.RESOURCE_PREVIEW_VIDEO).hide();
                    $(Elements.RESOURCE_PREVIEW_IMAGE).fadeIn();
                    $(Elements.RESOURCE_PREVIEW_SVG).hide();
                    var $img = $(Elements.RESOURCE_PREVIEW_IMAGE).find('img');
                    $img.attr('src',path);
                    break;
                }
                case 'mp4': {
                    var ext = 'mp4';
                }
                case 'flv': {
                    if (!ext)
                        ext = 'flv';
                    $(Elements.RESOURCE_PREVIEW_IMAGE).hide();
                    $(Elements.RESOURCE_PREVIEW_SVG).hide();
                    $(Elements.RESOURCE_PREVIEW_VIDEO).fadeIn();
                    path += pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + ext;
                    // path = window.g_protocol + pepper.getUserData().domain + '/Resources/business' +  pepper.getUserData().businessID + '/resources/' + pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + ext;
                    $(Elements.VIDEO_PREVIEW).find('video:nth-child(1)').attr("src",path);
                    break
                }
                case 'swf': {
                    path = './_assets/flash.png';
                    $(Elements.RESOURCE_PREVIEW_VIDEO).hide();
                    $(Elements.RESOURCE_PREVIEW_SVG).hide();
                    $(Elements.RESOURCE_PREVIEW_IMAGE).fadeIn();
                    var $img = $(Elements.RESOURCE_PREVIEW_IMAGE).find('img');
                    $img.attr('src',path);
                    break
                }
                case 'svg': {
                    path = window.g_protocol + pepper.getUserData().domain + '/Resources/business' +  pepper.getUserData().businessID + '/resources/' + pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + 'svg';
                    // path += pepper.getResourceNativeID(i_recResource['resource_id']) + '.' + 'svg';
                    $(Elements.RESOURCE_PREVIEW_VIDEO).hide();
                    $(Elements.RESOURCE_PREVIEW_IMAGE).hide();
                    $(Elements.RESOURCE_PREVIEW_SVG).fadeIn();
                    var $img = $(Elements.RESOURCE_PREVIEW_SVG).find('object');
                    var urlPath = $.base64.encode(path);
                    var srvPath = 'https://secure.digitalsignage.com/proxyRequest/' + urlPath;

                    // load svg and force w/h
                    $.get(srvPath, function(svg) {
                        var svgHeight, svgWidth, re;

                        svgHeight = svg.match(/(height=")([^\"]*)/)[2];
                        re = new RegExp('height="' + svgHeight + '"', "ig");
                        svg = svg.replace(re, 'height="100"');

                        svgWidth = svg.match(/(width=")([^\"]*)/)[2];
                        re = new RegExp('width="' + svgWidth + '"', "ig");
                        svg = svg.replace(re, 'width="100"');

                        $('#resourcePreviewSVG').empty();
                        var s = new String(svg);
                        $('#resourcePreviewSVG').append(svg).wrap('<center>');
                    });
                    break
                }
            }
            log('Loading file from ' + path);
        },

        /**
         init HTML5 video.js component
         @method _listenAutoPopup
         **/
        _initVideo: function(){
            var self = this;
            videojs(BB.lib.unhash(Elements.VIDEO_PREVIEW)).ready(function () {
                self.m_videoPlayer = this;
            });
        },

        /**
         On selecting new resources through multi-upload from local machine.
         @method _onFileSelected
         @return {number} -1 on fail or 1 on pass
         **/
        _onFileSelected: function (e) {
            var self = this;
            var status = pepper.uploadResources('file');
            if (status.length==0){
                bootbox.alert($(Elements.BOOTBOX_SUPPORTED_EXTENSIONS).text());
                return -1;
            }

            self.render();
            self._listenResourceSelected();
            self._listenRemoveResource();
            var navigationView = BB.comBroker.getService(BB.SERVICES.NAVIGATION_VIEW);
            bootbox.alert($(Elements.MSG_BOOTBOX_WAIT_UPLOAD_RESOURCE).text());
            navigationView.save(function(){
            })
            setTimeout(function() {
                bootbox.hideAll();
            }, 3000);
            return 1;
        },


        /**
         Populate the UI with all resources for the account (i.e.: videos, images, swfs).
         @method render
         @return none
         **/
        render: function () {
            var self = this;
            $(Elements.RESOURCE_LIB_LIST).empty();

            var recResources = pepper.getResources();
            $(recResources).each(function (i) {
                // dont process deleted resources
                if (recResources[i]['change_type'] == 3)
                    return;
                var size = (parseInt(recResources[i]['resource_bytes_total']) / 1000).toFixed(2);
                var resourceDescription = 'size: ' + size + 'K dimenstion: ' + recResources[i]['resource_pixel_width'] + 'x' + recResources[i]['resource_pixel_height'];
                var resourceFontAwesome = BB.PepperHelper.getFontAwesome(recResources[i]['resource_type'])
                if (_.isUndefined(resourceFontAwesome)){
                    bootbox.alert($(Elements.MSG_BOOTBOX_FILE_FORMAT_INVALID).text());
                } else {
                    var snippet = '<li class="' + BB.lib.unclass(Elements.CLASS_RESOURCES_LIST_ITEMS) + ' list-group-item" data-resource_id="' + recResources[i]['resource_id'] + '">' +
                        '<a href="#">' +
                        '<i class="fa ' + resourceFontAwesome + '"></i>'+
                        '<span>' + recResources[i]['resource_name'] + '</span>' +
                        '<p>' + '' + '</p></a>' +
                        '</a>' +
                        '</li>';

                    $(Elements.RESOURCE_LIB_LIST).append($(snippet));
                }
            });
            self._listenResourceSelected();
        },

        /**
         Unrender, future support
         @method unrender
         **/
        unrender: function(){
            var self = this;
        }
    });

    return ResourceListView;

});