{"version":3,"file":"jquery.assetManager.js","names":[],"sources":["../resources/javascript/jquery.assetManager.js"],"sourcesContent":["/**\n * Core Asset Manager\n *\n * jQuery plugin to control the various functions of the Asset field\n */\n(function($){\n    $.assetManager = function(el, options){\n        // To avoid scope issues, use 'base' instead of 'this'\n        // to reference this class from internal events and functions.\n        var base = this;\n\n        // Access to jQuery and DOM versions of element\n        base.$el = $(el);\n        base.el = el;\n        base.$assets = $('.core-asset-items', base.$el);\n        base.$input = $('.core-asset-input', base.$el);\n        base.$uploader = $('.core-asset-uploader', base.$el);\n        base.$messagePane = $('.core-asset-messages', base.$el).first();\n        base.$itemNode = null;\n\n        //state\n        base._originalOrder = [];\n        //state change messages\n        base._stateMessages =  {\n            'reordered' : 'Media changed - Please save to confirm',\n            'deleted' : 'Media deleted - Please save to confirm deletion',\n        };\n\n        // Add a reverse reference to the DOM object\n        base.$el.data(\"assetManager\", base);\n\n        base.init = function(){\n            base.options = $.extend({},$.assetManager.defaultOptions, options);\n            base.initControls();\n            if (base.options.sortable){\n                base.initSortable();\n            }\n            base.initUploader();\n            $(base.$el).on('click', '.modal', function(e){\n                e.preventDefault();\n                e.stopPropagation();\n                var $this = $(this);\n\n                var $loader = $('<div class=\"assetmodal--loading\">').height(300);\n\n                $.modal($loader, {\n                    onShow: function(dialog) {\n                        if ($(dialog.data).parents('.overlay__container').length) {\n                            $(dialog.data).html('<div class=\"loader loader--large\"></div>');\n                        }\n\n                        $.modal.defaults.onShow(dialog);\n                        $.get($this.attr(\"href\"), \"\", function(data) {\n                            if ($(dialog.data).parents('.overlay__container').length) {\n                                $('#overlay').addClass('overlay--wide');\n                            }\n                            $(dialog.data).attr('id', 'assetmodal-data');\n                            $(dialog.data).addClass('asset-crop');\n                            $(dialog.data).removeClass('assetmodal--loading');\n                            $(dialog.data).html( data );\n                            $.modal.defaults.onShow(dialog);\n                            $.assetManager.setupCrops();\n                        });\n                    }\n                });\n            });\n        }\n\n        base.initControls = function(){\n            $(base.$el).on('click', base.options.sortableItem + ' .delete', function(e){\n                if (!!$.sortable){\n                    base.$assets.sortable('destroy');\n                }\n                var $item = $(this).closest(base.options.sortableItem);\n                $item.remove();\n                if (typeof base.$uploader.getUploader === 'function' && base.$uploader.getUploader().pluploader) {\n                    base.$uploader.getUploader().pluploader.splice();\n                }\n                base.updateValues();\n                base.initSortable();\n                base.$messagePane.removeClass('complete');\n                base.say(base._stateMessages.deleted, 'success');\n                e.preventDefault();\n            });\n        }\n\n        base.initSortable = function(){\n            if (base.$assets.hasClass('sortable') && !!jQuery.ui.sortable){\n                var connection = $(base.options.sortableContainer).length > 1;\n                base.$assets.sortable({\n                    items: base.options.sortableItem,\n                    placeholder: base.options.sortablePlaceholder,\n                    containment: connection ? false : 'parent',\n                    connectWith: connection ? base.options.sortableContainer : false,\n                    start: function(e, ui) {\n                    },\n                    update: function(e,ui){\n                        base.updateValues();\n\n                        //deleting assets and uploading assets take priority\n                        if(!base.hasOriginalOrder()) {\n                            base.debug('Asset order changed');\n                            base.$messagePane.removeClass('complete');\n                            base.say(base._stateMessages.reordered, 'success');\n                        } else {\n                            base.debug('Asset order same as original');\n                            if(base.$messagePane.text() === base._stateMessages.reordered) {\n                                base.$messagePane.hide();\n                            }\n                        }\n                    }\n                }).disableSelection();\n\n                //only call this if not populated before,\n                //initSortable gets called multiple times\n                if(base._originalOrder.length === 0) {\n                    base.setOrder();\n                }\n            }\n        }\n\n        base.initUploader = function(){\n            if (0 < base.$uploader.length && !!jQuery.uploader){\n                base.$uploader.uploader(\n                    base.options.uploadUrl,\n                    base.postParams(),\n                    {\n                        uploadComplete: base.uploadComplete,\n                        beforeUpload: base.beforeUpload,\n                        messagePane: base.$messagePane,\n                        debug: base.options.debug,\n                        chunkSize: base.options.chunkSize,\n                        dimensions: base.options.dimensions,\n                        mimeTypes: base.options.mimeTypes || \"\"\n                    }\n                );\n                base.$itemNode = $('.core-asset-item-template', base.$el).first().clone();\n                base.$itemNode.removeClass('core-asset-item-template').addClass(base.options.sortableItem.substring(1));\n            }\n            $(base.$el).on('click', '.core-asset-continue-upload', function(e){\n                var uploader = base.$uploader.getUploader();\n                uploader.startUpload();\n                e.preventDefault();\n            });\n        }\n\n        base.hasOriginalOrder = function(){\n            var currentOrder = base.getOrder();\n\n            if (currentOrder.length !== base._originalOrder.length) return false;\n\n            for (var i = 0; i < currentOrder.length; i++) {\n                if(currentOrder[i] !== base._originalOrder[i]) return false;\n            }\n\n            return true;\n        }\n\n        base.setOrder = function(){\n            base.$assets.find(base.options.sortableItem).each(function(){\n                base._originalOrder.push($(this).attr('data-id'));\n            });\n        }\n\n        base.getOrder = function(){\n            var order = [];\n            base.$assets.find(base.options.sortableItem).each(function(){\n                order.push($(this).attr('data-id'));\n            });\n\n            return order;\n        }\n\n        base.postParams = function(){\n            params = {}\n            params.model_field = $('.core-asset-model-field', base.$el).val();\n            params.model_class = $('.core-asset-model-class', base.$el).val();\n            params.model_id = $('.core-asset-model-id', base.$el).val();\n            params.model_contained = $('.core-asset-model-contained', base.$el).val();\n            return params;\n        }\n\n        base.updateValues = function(){\n            var $items = $(base.options.sortableItem, base.$assets);\n            var v = '';\n            if (0 < $items.length) {\n                var ids = new Array();\n                $items.each(function(){\n                    ids.push(parseInt($(this).data('id')));\n                });\n                v = ids.join(base.options.seperator);\n                $('p', base.$assets).remove();\n            }else{\n                base.$assets.append('<p>No media currently associated with this field</p>');\n            }\n            base.$input.val(v);\n        }\n\n        base.beforeUpload = function(numberQueued){\n            var $items = $(base.options.sortableItem, base.$assets);\n            base.debug('Number of assets is ' + base.$assets.length);\n\n            if (0 < base.options.maxFiles && $items.length + numberQueued > base.options.maxFiles) {\n                // Clear queue\n                base.$uploader.getUploader().pluploader.splice();\n                if (base.options.maxFiles == 1) {\n                    base.say('Only ' + base.options.maxFiles + ' file is allowed here', 'error');\n                } else {\n                    base.say('Only ' + base.options.maxFiles + ' files are allowed here', 'error');\n                }\n                return false;\n            }\n\n            return true;\n        }\n\n        base.uploadComplete = function(data){\n            if (data.error){ return; }\n            var $item = base.$itemNode.clone();\n            $item.data('id', data.assetId);\n            $('a.modal', $item).attr('href', '/cp/assets/crop/'+data.assetId).html(data.tag);\n            base.$assets.append($item);\n            base.updateValues();\n        }\n\n        base.uploadError = function(data){\n            base.debug(data);\n        }\n\n        base.say = function(msg, type, percent){\n            base.debug('MESSAGE : ' + msg);\n\n            if (type == 'success' || type == 'error') {\n                var icon = base.$messagePane.data(type + '-icon');\n                if (icon) {\n                    var cl = \"core-asset-messages__icon core-asset-messages__icon--\" + type;\n                    var svg = '<svg role=\"img\" class=\"symbol-icon ' + cl + '\"><use href=\"' + icon + '\"></use></svg>'\n                    msg = svg + msg;\n                }\n            }\n\n            if (percent && base.$messagePane.data('progress')) {\n                msg = msg + '<div class=\"core-asset-messages__progress\" style=\"width: ' + percent +'%\"></div>';\n            }\n\n            base.$messagePane.html(msg).show();\n        }\n\n        base.debug = function(){\n            if (true === base.options.debug && !!window.console && !!window.console.log){\n                window.console.log.apply(window.console, arguments);\n            }\n        };\n\n        base._save = function(){\n            var data = base.postParams();\n            data.ids = base.$input.val();\n            $.post(\n                base.options.saveUrl,\n                data,\n                function(){\n                    //base.say('Changes saved', true);\n                },\n                'json'\n            );\n        }\n\n        // Run initializer\n        base.init();\n    };\n\n    $.assetManager.defaultOptions = {\n        saveUrl: '/api/assets/save',\n        seperator: ',',\n        sortableContainer: '.core-asset-items',\n        sortableItem: '.core-asset-item',\n        sortablePlaceholder: 'core-asset-item-placeholder',\n        uploadUrl: '/api/assets/upload',\n        maxFiles: 0,\n        chunkSize: 0,\n        keySupport: true,\n        debug: false\n    };\n\n    $.assetManager.setupCrops = function(options) {\n        if (!!$.fn.assetCropper) {\n            $('#crops .cropper').assetCropper(options);\n        };\n        if (!!$.fn.tabs) {\n            var options = {\n                current: 'active',\n                tabs: 'li'\n            };\n\n            $('#assetmodal-data > .modaltabs, #assetmodal-data .overlay__legacy > .modaltabs')\n                .tabs('#assetmodal-data .panel-content > div', options);\n            $('#crops > .tabs').tabs('#crops .pane', options);\n\n            $('.js-crop-form').each(function() {\n                var $form = $(this);\n\n                $form.ajaxForm({\n                    success: function(response, status, xhr) {\n                        var $response = $(response).find('form');\n                        $response.find('header').remove();\n                        $form.html($response.html());\n                        $('body').removeClass('d3r-page-disabled');\n                    }\n                });\n            });\n\n            if ($('#rotate').length > 0) {\n                $('#rotate a').on('click', function (e) {\n                    e.preventDefault();\n                    $.get($(this).attr('href'), function(data, status, xhr) {\n                        if ('success' == status) {\n                            if ($('#assetmodal-data').length > 0) {\n                                $(\"#assetmodal-data\").fadeOut().load('/cp/assets/crop/'+$('#crops').data('asset'), function(data) {\n                                    $(\"#assetmodal-data\").fadeIn();\n                                    $.assetManager.setupCrops();\n                                });\n                            } else {\n                                window.location.reload();\n                            };\n                        };\n                    }, 'json');\n                });\n            };\n        };\n        if ($('#simplemodal-container').length > 0) {\n            $.modal.defaults.onShow();\n        };\n    };\n\n    $.fn.assetManager = function(options){\n        return this.each(function(){\n            (new $.assetManager(this, options));\n        });\n    };\n\n    $.fn.getAssetManager = function(){\n        return this.data(\"assetManager\");\n    }\n\n})(jQuery);\n"],"mappings":"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"}