Source: angular-app/services/mockupEditorService.js

'use strict';

suxessServices.service('mockupEditorService', [

    'Restangular',
    '$uibModal',
    '$q',

    function ( Restangular, $uibModal, $q ) {

        /**
         * Returns function that can be injected to mockup editor for image selection..
         *
         * @param {Restangular} project - current project
         */
        this.getProjectImageSelector = function ( project ) {

            return function() {

                var views = 'angular-app/templates/views/mockup-editor/';
                var dialog = $uibModal.open({

                    templateUrl: views+'mockup-editor-image-selection-dialog.html',
                    controller:  'mockupEditorImageSelectionController',
                    resolve:{

                        project: function () {

                            return project;

                        }

                    }

                });

                return dialog.result;

            };

        };

        /**
         * Saves state of current editor, returns Promise with updated elements.
         * @param {Restangular} mockup
         * @param {SUXESS.MockupEditor} editor
         *
         * @return {Promise}
         */
        this.saveState = function ( mockup, editor ) {

            var elements = mockup.all('elements');
            var state = editor.getState();
            var updatePromises = [];
            var promise;

            for(var i = 0; i< state.length; i++) {

                if( state[i].deleted && state[i].id !== undefined) {

                    Restangular.restangularizeElement(mockup,state[i],'elements').remove();

                }
                else if( state[i].id === undefined ) {

                    updatePromises.push(elements.post(state[i]));

                } else {

                    promise = Restangular.restangularizeElement(mockup,state[i],'elements').put();
                    updatePromises.push(promise);

                }

            }

            return $q.all(updatePromises);

        };

        /**
         * Loads state of current editor, returns Promise.
         * @param {Restangular} mockup
         * @param {SUXESS.MockupEditor} editor
         *
         * @return {Promise}
         */
        this.loadState = function ( mockup, editor ) {

            var deferred = $q.defer();
            var elements = mockup.all('elements');

            elements.getList().then(

                function ( elementStates ) {

                    editor.loadState(elementStates);
                    deferred.resolve( elementStates.length );

                },
                deferred.reject
            );

            return deferred.promise;

        };
        /**
         *
         * @param {Restangular} mockup
         * @return {Promise}
         */
        this.createMockupEditorHash = function ( mockup, project ) {

            var deferred = $q.defer();

            var obj = {
                editor: new SUXESS.MockupEditor({
                    imageSelection: this.getProjectImageSelector(project)
                }),
                render: null
            };

            this.loadState( mockup, obj.editor).then(
                function ( numOfelems ) {

                    obj.render = obj.editor.render();
                    deferred.resolve(obj);

                },
                deferred.reject

            );

            return deferred.promise;

        };

    }

]);