bim_gdpr-1.0.0-rc3/libraries/dev/bim-gdpr/bim-gdpr.js

libraries/dev/bim-gdpr/bim-gdpr.js
/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "/";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ({

/***/ "./bim-gdpr/js/bim-gdpr.js":
/*!*********************************!*\
  !*** ./bim-gdpr/js/bim-gdpr.js ***!
  \*********************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var bim_gdpr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bim-gdpr */ "./node_modules/bim-gdpr/src/bgdpr.js");
/* harmony import */ var bim_gdpr_src_core_services_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bim-gdpr/src/core/services/ServiceEvents */ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js");


document.addEventListener('DOMContentLoaded', function () {
  if (drupalSettings.bim_gdpr) {
    var _drupalSettings$bim_g2;

    // Action on service add.
    bim_gdpr__WEBPACK_IMPORTED_MODULE_0__["default"].on(bim_gdpr_src_core_services_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceHasBeenAdded).then(function (data) {
      var _drupalSettings$bim_g;

      var service = data.data.service;
      var serviceData = drupalSettings.bim_gdpr.services_hierarchy.services.filter(function (item) {
        return item.id == service.id;
      })[0]; // Init groups.

      if (((_drupalSettings$bim_g = drupalSettings.bim_gdpr.services_hierarchy.groups) === null || _drupalSettings$bim_g === void 0 ? void 0 : _drupalSettings$bim_g.length) && serviceData && serviceData.parent.length > 0) {
        bim_gdpr__WEBPACK_IMPORTED_MODULE_0__["default"].getGroupById(serviceData.parent).addService(service);
      }

      service.setWeight(serviceData.weight);
    }); // Add groups.

    if ((_drupalSettings$bim_g2 = drupalSettings.bim_gdpr.services_hierarchy.groups) === null || _drupalSettings$bim_g2 === void 0 ? void 0 : _drupalSettings$bim_g2.length) {
      drupalSettings.bim_gdpr.services_hierarchy.groups.forEach(function (group) {
        group = bim_gdpr__WEBPACK_IMPORTED_MODULE_0__["default"].createGroup(group.id, group.label, group.description);
        group.setWeight(group.weight);
      });
    }
  }
});

/***/ }),

/***/ "./node_modules/bim-gdpr/src/bgdpr.js":
/*!********************************************!*\
  !*** ./node_modules/bim-gdpr/src/bgdpr.js ***!
  \********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _core_Core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core/Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _core_tools_Tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");



/* harmony default export */ __webpack_exports__["default"] = (_core_Core__WEBPACK_IMPORTED_MODULE_0__["Core"]);

// Accessibility out of webpack
if( window[_core_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"]] ){
    const tmp = window[_core_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"]]
    window[_core_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"]] = _core_Core__WEBPACK_IMPORTED_MODULE_0__["Core"]
    for(let i in tmp){
        window[_core_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"]][i] = tmp[i]
    }
}
else{
    window[_core_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"]] = _core_Core__WEBPACK_IMPORTED_MODULE_0__["Core"]
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/Core.js":
/*!************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/Core.js ***!
  \************************************************/
/*! exports provided: Core */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Core", function() { return Core; });
/* harmony import */ var _groups_GroupManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./groups/GroupManager */ "./node_modules/bim-gdpr/src/core/groups/GroupManager.js");
/* harmony import */ var _services_ServiceManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./services/ServiceManager */ "./node_modules/bim-gdpr/src/core/services/ServiceManager.js");
/* harmony import */ var _view_ViewManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./view/ViewManager */ "./node_modules/bim-gdpr/src/core/view/ViewManager.js");
/* harmony import */ var _services_Service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./services/Service */ "./node_modules/bim-gdpr/src/core/services/Service.js");
/* harmony import */ var _groups_Group__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./groups/Group */ "./node_modules/bim-gdpr/src/core/groups/Group.js");
/* harmony import */ var _services_ServiceEvents__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./services/ServiceEvents */ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js");
/* harmony import */ var _local_LocalManager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./local/LocalManager */ "./node_modules/bim-gdpr/src/core/local/LocalManager.js");
/* harmony import */ var _view_TemplateAbstract__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./view/TemplateAbstract */ "./node_modules/bim-gdpr/src/core/view/TemplateAbstract.js");
/* harmony import */ var _tools_PseudoPromise__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tools/PseudoPromise */ "./node_modules/bim-gdpr/src/core/tools/PseudoPromise.js");










const $scriptjs = __webpack_require__(/*! scriptjs */ "./node_modules/scriptjs/dist/script.js")


class CoreClass {

	constructor() {
		this.logs = false
		this.testMode = false
		this.autoShow = true
		this.observables = []
		this.viewManager = _view_ViewManager__WEBPACK_IMPORTED_MODULE_2__["ViewManager"]
		this.serviceManager = _services_ServiceManager__WEBPACK_IMPORTED_MODULE_1__["ServiceManager"]
		this.groupManager = _groups_GroupManager__WEBPACK_IMPORTED_MODULE_0__["GroupManager"]
		this.localManager = _local_LocalManager__WEBPACK_IMPORTED_MODULE_6__["LocalManager"]

		this.autoShowCallback = () => {
			if (this.testMode || this.serviceManager.getPendingServices().length) {
				this.showView()
			}
		}
	}

	/**
	 * Init and launch wrapper.
	 */
	init() {
		this.serviceManager.init()
		this.groupManager.init()
		this.viewManager.init()
		this.localManager.init()

		// Run services.
		this.getServiceManager().getEnabledServicesList().map(service => {
			this.getServiceManager().startService(service)
		})

		// Auto show
		if (this.autoShow) {
			window.removeEventListener('DOMContentLoaded', this.autoShowCallback)
			window.addEventListener('DOMContentLoaded', this.autoShowCallback)
		}

		this.on(_services_ServiceEvents__WEBPACK_IMPORTED_MODULE_5__["ServiceEvents"].serviceStatusHasChanged).subscribe((data) => this.initDomData());

		return this
	}

	/**
	 * Allow testing of 'fr-FR' instead of simply 'fr'
	 */
	allowTryRegionalisation() {
		this.localManager.allowTryRegionalisation()
		return this
	}

	/**
	 * Enable logs.
	 */
	disableLogs() {
		this.logs = false
		return this
	}

	/**
	 * Return true if logs are enabled.
	 */
	logsAreEnabled() {
		return this.logs
	}

	/**
	 * Returns the service manager.
	 */
	getServiceManager() {
		return this.serviceManager
	}

	/**
	 * Returns the service if exists.
	 *
	 * @param {string} serviceId
	 *
	 * @returns {Service}
	 */
	getServiceById(serviceId) {
		return this.getServiceManager().getServiceById(serviceId)
	}

	/**
	 * Returns the group manager
	 */
	getGroupManager() {
		return this.groupManager
	}

	/**
	 * Returns the service if exists.
	 *
	 * @param {string} serviceId
	 *
	 * @returns {Service}
	 */
	getGroupById(groupId) {
		return this.getGroupManager().getGroupById(groupId)
	}

	/**
	 * Return the template Manager object.
	 *
	 * @returns {ViewManager}
	 */
	getViewManager() {
		return this.viewManager
	}

	/**
	 * Return the local manager.
	 *
	 * @returns {LocalManager}
	 */
	getLocalManager() {
		return this.localManager
	}

	/**
	 * Allows to redefine the event that display
	 * the popup at start.
	 *
	 * @param {boolean} eventName
	 */
	disableAutoShow() {
		this.autoShow = false
		window.removeEventListener('DOMContentLoaded', this.autoShowCallback)
		return this
	}

	/**
	 * Dispatch rxjs event.
	 */
	trigger(name, data) {
		if (this.logs) {
			console.log(`Trigger ${name}`, data)
		}

		if (this._observableIsDefined(name)) {
			this.observables[name].onResolve({name, data})
		}

		return this
	}

	/**
	 * Returns an subject.
	 *
	 * @param {*} name
	 *
	 * @returns {Subject}
	 */
	on(name) {
		if (!this._observableIsDefined(name)) {
			this.observables[name] = new _tools_PseudoPromise__WEBPACK_IMPORTED_MODULE_8__["PseudoPromise"]()
		}
		return this.observables[name]
	}

	/**
	 * Check if observable is defined and used.
	 * @param {*} name
	 */
	_observableIsDefined(name) {
		return this.observables
			&& this.observables[name]
			&& typeof (this.observables[name].onResolve) === 'function'
	}

	/**
	 * Create and a service and return it
	 *
	 * @returns {Service}
	 */
	createService(service) {
		return this.serviceManager.createService(service)
	}

	/**
	 * Add a service
	 *
	 * @returns {Service}
	 */
	addService(service) {
		this.serviceManager.createService(service)
		return this
	}

	/**
	 * Returns a new group.
	 *
	 * @param {string} id
	 * @param {string} name
	 * @param {string} description
	 *
	 * @returns {Group}
	 */
	createGroup(id, name, description) {
		return this.groupManager.createGroup(id, name, description)
	}

	/**
	 * Show view.
	 */
	showView() {
		this.viewManager.show()
		return this
	}

	/**
	 * Hide view
	 */
	hideView() {
		this.viewManager.hide()
		return this
	}

	/**
	 * Set the template of the view.
	 *
	 * @param {*} template
	 *
	 * @returns {CoreClass}
	 */
	setTemplate(template) {
		this.viewManager.getView().setTemplate(template)
		return this
	}

	/**
	 * Set the template of the view.
	 *
	 * @param {*} template
	 *
	 * @returns {TemplateAbstract}
	 */
	createTemplate(template) {
		this.viewManager.getView().setTemplate(template)
		return this.getTemplate()
	}

	/**
	 * Set the template of the view.
	 *
	 * @returns {TemplateAbstract}
	 */
	getTemplate() {
		return this.viewManager.getView().getTemplate()
	}

	/**
	 * Add a distant script
	 */
	addScript(url, callback) {
		$scriptjs(url, callback)
		return this
	}

	/**
	 * Remove script
	 * @param {string} script
	 */
	removeScript(script) {
		document.querySelectorAll('script[src="' + script + '"]').forEach(item => item.parentNode.removeChild(item))
		return this
	}

	/**
	 * Add a css script.
	 *
	 * @param {string} url
	 * @param {string} media
	 */
	addCss(url, media) {
		const head = document.querySelector('head');
		const link = document.createElement('link');
		link.rel = 'stylesheet';
		link.type = 'text/css';
		link.href = url;
		link.media = media || 'all';
		head.appendChild(link);

		return this
	}

	/**
	 * Add a css script.
	 *
	 * @param {string} url
	 * @param {string} media
	 */
	removeCss(url) {
		document.querySelectorAll('link[href="' + url + '"]').forEach(item => item.parentNode.removeChild(item))
		return this
	}

	/**
	 * Init dom attributes.
	 */
	initDomData() {
		this.viewManager.initDomData()
		return this
	}

	/**
	 * Add translation
	 *
	 * @param {obj} translation
	 */
	addTranslation(translation) {
		this.localManager.addTranslation('global', translation)
		return this
	}
}

const Core = new CoreClass();


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/groups/Group.js":
/*!********************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/groups/Group.js ***!
  \********************************************************/
/*! exports provided: Group */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Group", function() { return Group; });
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _GroupEvents__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./GroupEvents */ "./node_modules/bim-gdpr/src/core/groups/GroupEvents.js");
/* harmony import */ var _services_ServiceStatusManager__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../services/ServiceStatusManager */ "./node_modules/bim-gdpr/src/core/services/ServiceStatusManager.js");





class Group{

    constructor(id, name, description){
        this._id = id
        this._name = name
        this._description = description
        this.services = []
    }

    get id(){
        return this._id
    }

    get name(){
        return this._name
    }

    get description(){
        return this._description
    }

    get status(){
        const nbServices = this.services.length
        if( this.services.filter( service => {return service.isEnabled()}).length === nbServices ){
            return _services_ServiceStatusManager__WEBPACK_IMPORTED_MODULE_3__["ServiceStatus"].enabled
        }
        if( this.services.filter( service => {return service.isDisabled()}).length === nbServices ){
            return _services_ServiceStatusManager__WEBPACK_IMPORTED_MODULE_3__["ServiceStatus"].disabled
        }
        return _services_ServiceStatusManager__WEBPACK_IMPORTED_MODULE_3__["ServiceStatus"].pending
    }

    set id(id){
        this._id = id
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(ServiceEvents.groupHasChanged, {group: this})
    }

    set name(name){
        this._name = name
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_GroupEvents__WEBPACK_IMPORTED_MODULE_2__["GroupEvents"].groupHasChanged, {group: this})
    }

    set description(description){
        this._description = description
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_GroupEvents__WEBPACK_IMPORTED_MODULE_2__["GroupEvents"].groupHasChanged, {group: this})
    }

    /**
     * Return tru of all elements are mandatory.
     */
    isMandatory(){
        return this.services.filter( service => {
            return service.isMandatory()
        }).length === this.services.length
    }

    /**
     * Add a service into the group.
     *
     * @param {*} services 
     * 
     * @returns {Group}
     */
    addService(services){
        if(services){
            if( Array.isArray(services) ){
                services.map( service => this._doAddService(service) )
            }
            else{
                this._doAddService(services)
            }
        }
        return this
    }

    /**
     * Return the list of services.
     */
    getServicesList(){
        return this.services
    }

    /**
     * Add a service if possible.
     * 
     * @returns {Group}
     */
    _doAddService(serviceData){
        let service = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getServiceById(serviceData.id)
        
        if( service ){
            this.services.push(service)
            this.services = this.services.sort((a,b) => Object(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["sortByWeight"])(a,b))

            // View needs rebuild
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_GroupEvents__WEBPACK_IMPORTED_MODULE_2__["GroupEvents"].groupHasChanged, {group: this})
        }

        return this
    }

    /**
     * Accept all services
     * 
     * @returns {Group}
     */
    enableAll(){
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().enableService(this.services)
        return this
    }

    /**
     * Deny ALl services.
     * 
     * @returns {Group}
     */
    disableAll(){
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().disableService(this.services)
        return this
    }

    /**
     * Toggle all services.
     */
    toggleAll(){
        const status = this.status
        if( status !== _services_ServiceStatusManager__WEBPACK_IMPORTED_MODULE_3__["ServiceStatus"].enabled ){
            this.enableAll()
        }
        else{
            this.disableAll()
        }
        return this
    }

    /**
     * Set weight of group.
     * @param {*} weight 
     * 
     * @returns {Group}
     */
    setWeight(weight){
        this.weight = weight
        if( _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getGroupManager().getGroupById(this.id) ){
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_GroupEvents__WEBPACK_IMPORTED_MODULE_2__["GroupEvents"].groupHasChanged, {group:this})
        }

        return this
    }
}

/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/groups/GroupEvents.js":
/*!**************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/groups/GroupEvents.js ***!
  \**************************************************************/
/*! exports provided: GroupEvents */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupEvents", function() { return GroupEvents; });
const GroupEvents = {
    groupListHasChanged: 'group-list-has-changed',
    groupHasChanged: 'group-list-has-changed',
}

/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/groups/GroupManager.js":
/*!***************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/groups/GroupManager.js ***!
  \***************************************************************/
/*! exports provided: GroupManager */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupManager", function() { return GroupManager; });
/* harmony import */ var _Group__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Group */ "./node_modules/bim-gdpr/src/core/groups/Group.js");
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _GroupEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GroupEvents */ "./node_modules/bim-gdpr/src/core/groups/GroupEvents.js");
/* harmony import */ var _view_ViewEvents__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../view/ViewEvents */ "./node_modules/bim-gdpr/src/core/view/ViewEvents.js");







/**
 * Group manager.
 */
class GroupManagerClass{

    constructor(){
        this.groups = []
    }

    /**
     * Init behaviors when group or grouplist has changed.
     */
    init(){
        _Core__WEBPACK_IMPORTED_MODULE_2__["Core"].on(_GroupEvents__WEBPACK_IMPORTED_MODULE_3__["GroupEvents"].groupListHasChanged).subscribe( (name, data) => this.sortGroups() )
        _Core__WEBPACK_IMPORTED_MODULE_2__["Core"].on(_GroupEvents__WEBPACK_IMPORTED_MODULE_3__["GroupEvents"].groupHasChanged).subscribe( (name, data) => this.sortGroups() )
    }

    /**
     * Add a group.
     *
     * @param {string} id 
     * @param {string} name 
     * @param {string} description 
     */
    createGroup(id, name, description){
        if( !this.getGroupById(id) ){
            const group = new _Group__WEBPACK_IMPORTED_MODULE_0__["Group"](id, name,description)
            group.weight = typeof(group.weight) !== 'undefined'  ? group.weight : this.groups.length
            this.groups.push(group)

            this.sortGroups()

            _Core__WEBPACK_IMPORTED_MODULE_2__["Core"].trigger(_GroupEvents__WEBPACK_IMPORTED_MODULE_3__["GroupEvents"].groupListHasChanged, {groupManager:this})
            return group;
        }
        else{
            if (this.logs){
                throw `Group ${id} already exists`
            }
        }
        return false
    }

    /**
     * Returns the list of all groups.
     */
    getGroupsList(){
        return this.groups
    }

    /**
     * Returns the group by id.
     *
     * @param {string} id 
     */
    getGroupById(id){
        return this.groups.filter( group => { return group.id === id })[0]
    }

    /**
     * Sort the groups by weight.
     */
    sortGroups(){
        this.groups = this.groups.sort((a,b) => Object(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["sortByWeight"])(a,b))

        // Needs rebuild.
        _Core__WEBPACK_IMPORTED_MODULE_2__["Core"].trigger(_view_ViewEvents__WEBPACK_IMPORTED_MODULE_4__["ViewEvents"].needsRebuild, {type:'all'})

        return this
    }

    /**
     * Return the list of ungrouped services.
     */
    getUnGroupedServices(){
        let groupedServices = []

        // Get all grouped Services.
        this.groups.map( group => {
            groupedServices = groupedServices.concat(group.getServicesList().map(service => { return service.id }))
        })

        // Disctinct services.
        try {
            groupedServices = [...new Set(groupedServices)]
        }
        catch (e) {
            groupedServices.filter((value, index, self) =>{
                self.indexOf(value) === index
            })
        }

        // unGroupedServices
        let unGroupedServices = 
            _Core__WEBPACK_IMPORTED_MODULE_2__["Core"].getServiceManager().getServicesList().map( service => {return service.id})
                 .filter( id => { return groupedServices.indexOf(id) === -1 })
                .map( id => { return _Core__WEBPACK_IMPORTED_MODULE_2__["Core"].getServiceManager().getServiceById(id)})

        return unGroupedServices
    }
}

const GroupManager = new GroupManagerClass()


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/local/LocalManager.js":
/*!**************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/local/LocalManager.js ***!
  \**************************************************************/
/*! exports provided: LocalManager, l, html */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LocalManager", function() { return LocalManager; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return l; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "html", function() { return html; });
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _tools_PseudoPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/PseudoPromise */ "./node_modules/bim-gdpr/src/core/tools/PseudoPromise.js");



class LocalManagerClass {

	constructor() {
		this.enableCache = true
		this.tryRegionalisation = false

		this.setUserLanguage()

		this.alreadyLoaded = []
	}

	/**
	 * Init the localizer.
	 */
	init() {
	}

	/**
	 * Return true if defaultLanguage passed is different of the user language.
	 * @param {*} defaultLanguage
	 */
	hasToLoadTranslation(defaultLanguage) {
		const userLanguage = this.getUserLanguage()
		return (this.tryRegionalisation && defaultLanguage !== userLanguage)
			|| (!this.tryRegionalisation && defaultLanguage.split('-')[0] !== userLanguage.split('-')[0])
	}

	/**
	 * Default language.
	 */
	setDefaultLanguage(defaultLanguage) {
		this.defaultLanguage = defaultLanguage
	}

	/**
	 * Try full language file 'fr-FR' instead of 'fr'
	 */
	allowTryRegionalisation() {
		this.tryRegionalisation = true
		return this
	}

	/**
	 * Force the user language.
	 *
	 * If language is null, then we user browser language.
	 *
	 * @param {string} language
	 */
	setUserLanguage(language = null) {
		if (!language) {
			this.userLanguage = navigator.language || navigator.browserLanguage ||
				navigator.systemLanguage || navigator.userLang || null;
		} else {
			this.userLanguage = language
		}
		this.translations = this.translations || {}
		this.translations[this.userLanguage] = this.translations[this.userLanguage] || {}
	}

	/**
	 * Return the user language.
	 */
	getUserLanguage() {
		if (!this.userLanguage) {
			this.setUserLanguage()
		}
		return this.userLanguage
	}

	/**
	 * Adds a transaltion file
	 *
	 * @param {*} data
	 */
	addTranslation(id, data) {
		if (typeof (data) === 'string') {
			// Check if path can replace {LANGUAGE_TOKEN} by the language id.
			if (data.indexOf(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["LANGUAGE_TOKEN"]) > -1) {
				this.loadFile(data)
				return this
			}
			throw `The translation path does not have a "${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["LANGUAGE_TOKEN"]}" to replace`
		} else {
			this._doAddTranslation(id, this.getCleanLocalisationData(data), true)
		}
	}

	/**
	 * Return a clean object with loalisation.
	 *
	 * @param data
	 *
	 * @return {}
	 */
	getCleanLocalisationData(data) {
		const result = {};
		Object.keys(data).forEach(key => {
			const item = data[key];
			if (typeof (item) === 'string') {
				result[key] = item;
			} else if (item.value && typeof (item.value) === 'string') {
				result[key] = item.value;
			}
		})
		return result;
	}

	/**
	 * Load the user language.
	 */
	loadUserLanguageData(isTryinRegionalisation = false) {
		// Load translations.
		this.addTranslation(this.languageBaseUrl)
	}

	/**
	 * Load the File.
	 */
	loadFile(_path) {
		let userLanguage = this.getUserLanguage()
		userLanguage = this.tryRegionalisation ? userLanguage : userLanguage.split('-')[0]
		const path = _path.split(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["LANGUAGE_TOKEN"]).join(userLanguage)

		if (this.alreadyLoaded.indexOf(path) > -1) {
			return
		}

		const translation = this.getStoredTranslationByPath(path)
		if (translation) {
			this._doAddTranslation(path, translation)
		} else {
			this._doLoadFile(path, userLanguage)
		}
	}

	/**
	 * Load file.
	 *
	 * @param {string} path
	 */
	_doLoadFile(path, language) {
		const reject = (data) => {
			// On test en mode pas de regionalisation.
			if (data.language.indexOf('-') > -1 && this.tryRegionalisation) {
				this.loadFile(path)
			} else {
				console.error(`Cannot load translation file ${data.path}`)
			}
		}

		let xhr = new XMLHttpRequest();
		const data = {
			path: path,
			language: language,
		}

		xhr.onload = () => {
			if (xhr.status >= 200 && xhr.status < 300) {
				data.result = xhr.response
				this.loadFileContent(data)
			} else {
				reject(data)
			}
		};

		xhr.onerror = () => {
			reject(data)
		};
		xhr.open('get', data.path)
		xhr.send()
	}

	/**
	 * Add the po to storage.
	 */
	loadFileContent(data) {
		try {
			const translation = JSON.parse(data.result)
			this.storeLanguage(data.path, translation)
			this._doAddTranslation(data.path, translation)
		} catch (error) {
			console.error(`translation file is not correct (${data.path})`)
		}
	}

	/**
	 * Enable a translation from po.
	 * @param {string} translation
	 */
	_doAddTranslation(path, translation, force = false) {
		// hack gt to add and not replace...
		this._appendTranslation(this.getUserLanguage(), translation, force)
		this.alreadyLoaded.push(path)
		this.onLoadString()
	}

	/**
	 * Hack this.gt.addTranslation to append translations.
	 */
	_appendTranslation(language, translations, force = false) {
		if (!this.translations[language]) {
			this.translations[language] = translations;
		}

		// If force, the translation is priority
		if (force) {
			this.translations[language] = {...this.translations[language], ...translations}
		} else {
			this.translations[language] = {...translations, ...this.translations[language]}
		}
	}

	/**
	 * Store language.
	 *
	 * @param {string} path
	 * @param {*} translation
	 */
	storeLanguage(path, translation) {
		if (!this.enableCache) {
			return
		}
		const storedLanguages = this.getStoredLanguages()
		if (storedLanguages) {
			storedLanguages[path] = translation
			localStorage.setItem(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"] + 'l', JSON.stringify(storedLanguages))
		}
	}

	/**
	 * Return the local stored language.
	 */
	getStoredLanguages() {
		if (typeof (localStorage) !== undefined) {
			let stored = {}
			try {
				stored = JSON.parse(localStorage.getItem(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"] + 'l'))
			} catch (error) {

			}
			return stored || {}
		}
		return null
	}

	/**
	 * Return the local stored translatin.
	 *
	 * @param {string} path
	 */
	getStoredTranslationByPath(path) {
		const storedLanguages = this.getStoredLanguages()
		if (storedLanguages) {
			return storedLanguages[path]
		}
		return false
	}

	/**
	 * When a translation is loaded.
	 */
	onLoadString() {
		// Parse each translation.
		const translationList = this.translations[this.getUserLanguage()];
		if (translationList) {
			for (let id in translationList) {
				this.replaceTranslationInDOM(id, translationList[id]);
			}
		}
	}


	/**
	 * Replace the translation in the DOM according to id.
	 */
	replaceTranslationInDOM(id, translation) {
		document.querySelectorAll(`[${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}l="${this.getTranslationId(id)}"]`).forEach(
			element => {
				let replaceData = null
				try {
					replaceData = JSON.parse(decodeURIComponent(element.getAttribute(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"] + 'l-data')))
				} catch (error) {
					replaceData = null
				}
				element.innerHTML = this.translate(id, replaceData)
			}
		)
	}

	/**
	 * Return a translated string with dynamic data.
	 *
	 * @param {string} id
	 * @param {Obj} replaceData
	 */
	translate(id, replaceData) {
		// Result
		let result = this.translations[this.getUserLanguage()][id] || id

		// Use info.
		if (typeof result === 'object' && typeof result.value != "undefined") {
			result = result.value
		}

		// Replace
		if (replaceData) {
			Object.keys(replaceData).map(key => {
				result = result.split(key).join(replaceData[key])
			})
		}
		return result
	}

	/**
	 * Wrap a translated text with span in order to replace it dynamically
	 *
	 * @param {*} id
	 */
	html(id, replaceData) {
		const replaceDataAttr = encodeURIComponent(JSON.stringify(replaceData))
		const result = `<span ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}l="${this.getTranslationId(id)}" ${replaceData ? `${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}l-data="${replaceDataAttr}"` : ``}>${this.translate(id, replaceData)}</span>`
		return result
	}

	/**
	 * Returns the translation id, for attribute value.
	 */
	getTranslationId(translation) {
		return translation.replace(/(<([^>]+)>)/ig, "");
	}
}

const LocalManager = new LocalManagerClass()
const l = function (id, replaceData) {
	return LocalManager.translate(id, replaceData)
}
const html = function (id, replaceData) {
	return LocalManager.html(id, replaceData)
}



/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/local/LocalizedElementAbstract.js":
/*!**************************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/local/LocalizedElementAbstract.js ***!
  \**************************************************************************/
/*! exports provided: LocalizedElementAbstract */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LocalizedElementAbstract", function() { return LocalizedElementAbstract; });
/* harmony import */ var _LocalManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./LocalManager */ "./node_modules/bim-gdpr/src/core/local/LocalManager.js");


class LocalizedElementAbstract{

    constructor(id){
        this.id = id
        this.localManager = _LocalManager__WEBPACK_IMPORTED_MODULE_0__["LocalManager"]
        this.defaultLanguage = 'en'
        this.translations = this.getDefaultTranslations()
    }


    /**
     * Load transaltions.
     */
    initTranslations(){
        this.getTranslations().map( (data, key) => {
            let id = `${this.id}-${key}`
            if( typeof(data) === 'string'){
                if(this.localManager.hasToLoadTranslation(this.getDefaultLanguage()) ){
                    this.localManager.addTranslation(id, data)
                }
            }
            else{
                this.localManager.addTranslation(id, data)
            }
        })
        return this
    }

    /**
     * Set the default language.
     *
     * @param {string} language 
     */
    setDefaultLanguage(language){
        this.defaultLanguage = language
        return this
    }

    /**
     * Return the default language of the item.
     */
    getDefaultLanguage(){
        return this.defaultLanguage
    }

    /**
     * Return the default translation file list.
     */
    getDefaultTranslations(){
        return []
    }

    /**
     * Return the translation file list
     */
    getTranslations(){
        return this.translations
    }
    
    /**
     * Set the translation file list
     */
    setTranslations(fileList){
        this.translations = fileList
        return this
    }

    /**
     * Add a translation if user language is different of the default language
     * 
     * @param {*} data 
     *   po file path or json data
     */
    addTranslation(data){
        this.translations.push(data)
        this.initTranslations()
        return this
    }
}

/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/services/Service.js":
/*!************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/services/Service.js ***!
  \************************************************************/
/*! exports provided: Service */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Service", function() { return Service; });
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _ServiceEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ServiceEvents */ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js");
/* harmony import */ var _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ServiceStatusManager */ "./node_modules/bim-gdpr/src/core/services/ServiceStatusManager.js");
/* harmony import */ var _local_LocalizedElementAbstract__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../local/LocalizedElementAbstract */ "./node_modules/bim-gdpr/src/core/local/LocalizedElementAbstract.js");





class Service extends _local_LocalizedElementAbstract__WEBPACK_IMPORTED_MODULE_3__["LocalizedElementAbstract"] {

	constructor(id, name, description) {
		super(id)
		this._id = id
		this._name = name
		this._description = description
	}

	get id() {
		return this._id
	}

	get name() {
		return this._name
	}

	get description() {
		return this._description
	}

	get status() {
		return _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_2__["ServiceStatusManager"].getServiceStatus(this)
	}

	set id(id) {
		this._id = id
		_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceHasChanged, {service: this})
	}

	set name(name) {
		this._name = name
		_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceHasChanged, {service: this})
	}

	set description(description) {
		this._description = description
		_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceHasChanged, {service: this})
	}

	/**
	 * Init the element
	 */
	init() {
		super.initTranslations()
		return this;
	}

	/**
	 * Return the cookie patterns.
	 *
	 * Cookies with an id matching with this pattern will be removed when
	 * when service will stop.
	 */
	getCookiePatterns() {
		return []
	}

	/**
	 * Return the local storage patterns.
	 *
	 * Local storage with an id matching with this pattern will be removed when
	 * when service will stop.
	 */
	getLocalStoragePatterns(){
		return []
	}

	/**
	 * Return the list of scripts path to add.
	 */
	getRelatedScripts() {
		return []
	}

	/**
	 * Return the list of css path to add.
	 */
	getRelatedCss() {
		return []
	}

	/**
	 * Action when service is enabled.
	 */
	onEnable() {
	}

	/**
	 * Action when service is disabled.
	 */
	onDisable() {
	}

	/**
	 * Service run
	 */
	start() {
		if (_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].logsAreEnabled()) {
			console.log(`Start ${this.name} (${this.id})`)
		}
	}

	/**
	 * Service stop
	 */
	stop() {
		if (_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].logsAreEnabled()) {
			console.log(`Stop ${this.name} (${this.id})`)
		}
	}

	/**
	 * Is Mandatory
	 */
	isMandatory() {
		return false
	}

	/**
	 * Is Enabled
	 */
	isEnabled() {
		return this.status === _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_2__["ServiceStatus"].enabled
	}

	/**
	 * Is disabled
	 */
	isDisabled() {
		return this.status === _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_2__["ServiceStatus"].disabled
	}

	/**
	 * Is Pending
	 */
	isPending() {
		return this.status === _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_2__["ServiceStatus"].pending
	}

	/**
	 * Set weiught
	 */
	setWeight(weight) {
		this.weight = weight

		// If the service is already in the added services
		// we sort the services list
		if (_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getServiceById(this.id)) {
			_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceListHasChanged, {
				serviceManager: _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager()
			})
		}

		return this
	}
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js":
/*!******************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/services/ServiceEvents.js ***!
  \******************************************************************/
/*! exports provided: ServiceEvents */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServiceEvents", function() { return ServiceEvents; });
const ServiceEvents = {
    serviceListHasChanged: 'service-list-has-changed',
    serviceHasChanged: 'service-has-changed',
    serviceStatusHasChanged: 'service-status-has-changed',
    serviceStart: 'service-start',
    serviceStop: 'service-stop',
    serviceHasBeenAdded: 'service-has-been-added',
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/services/ServiceManager.js":
/*!*******************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/services/ServiceManager.js ***!
  \*******************************************************************/
/*! exports provided: ServiceManager */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServiceManager", function() { return ServiceManager; });
/* harmony import */ var _Service__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Service */ "./node_modules/bim-gdpr/src/core/services/Service.js");
/* harmony import */ var _ServiceEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ServiceEvents */ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js");
/* harmony import */ var _ServicePlaceholder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ServicePlaceholder */ "./node_modules/bim-gdpr/src/core/services/ServicePlaceholder.js");
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ServiceStatusManager */ "./node_modules/bim-gdpr/src/core/services/ServiceStatusManager.js");







/**
 * The service interface.
 */
const ServiceInterface = {
    id: 'id',
    name: 'Name',
    description: 'description',
    start: function () {
    },
}

/**
 * The service manager.
 */
class ServiceManagerClass {

    constructor() {
        this.services = []
        this.servicePlaceholder = new _ServicePlaceholder__WEBPACK_IMPORTED_MODULE_2__["ServicePlaceholder"]()
    }

    /**
     * Return the list of services.
     */
    getServicesList() {
        return this.services
    }

    /**
     * Return the list of enabled services.
     */
    getEnabledServicesList() {
        return this.services.filter(service => {
            return service.isEnabled()
        })
    }

    /**
     * Return the list of disabled services
     */
    getDisabledServicesList() {
        return this.services.filter(service => {
            return service.isDisabled()
        })
    }

    /**
     * Return the list of pending services
     */
    getPendingServices() {
        return this.services.filter(service => {
            return service.isPending()
        })
    }

    /**
     * Return the list of mandatory services.
     */
    getMandatoryServicesList() {
        return this.services.filter(service => {
            return service.isMandatory()
        })
    }

    /**
     * Init the default behaviors
     */
    init() {
        this.servicePlaceholder.init();
        _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].on(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceListHasChanged).subscribe((data) => this.sortServices())
    }

    /**
     * Add a service
     *
     * @param {object} serviceData
     */
    createService(serviceData) {
        let service = serviceData

        // Check if service is a class.
        if (!(this.isService(serviceData))) {
            service = this.overrideService(serviceData)
            if (!service) {
                return null
            }
        }

        if (!this.getServiceById(service.id)) {
            // Add weight to service
            service.weight = typeof (serviceData.weight) !== 'undefined' ? service.weight : this.services.length
            service.init()
            this.services.push(service)

            // Init enabled services.
            if (service.isEnabled()) {
                this.startService(service)
            }

            // Dispatch event.
            _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceHasBeenAdded, {
                service: service
            })

            // Dispatch event.
            _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceListHasChanged, {
                services: this.services
            })
            return service
        } else {
            throw `Service ${id} already exists`
        }
        return null
    }

    /**
     * Return a service from obj that match Service Interface
     * @param {*} serviceData
     */
    overrideService(serviceData) {
        let service = null
        if (Object(_tools_Tools__WEBPACK_IMPORTED_MODULE_3__["checkInterface"])(ServiceInterface, serviceData, _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].logsAreEnabled())) {
            service = new _Service__WEBPACK_IMPORTED_MODULE_0__["Service"]()
            // Pseudo extension from object.
            for (let i in serviceData) {
                service[i] = serviceData[i]
            }

            // Proto
            if (Object.getOwnPropertyNames(Object.getPrototypeOf(serviceData)).indexOf('start') > -1) {
                Object.getOwnPropertyNames(Object.getPrototypeOf(serviceData)).map(
                    propertyName => {
                        service[propertyName] = serviceData[propertyName]
                    }
                )

                if ('function' === typeof (serviceData.getDefaultTranslations)) {
                    service.setTranslations(serviceData.getDefaultTranslations())
                }
            }
        }
        return service
    }

    /**
     * Return a service by id.
     *
     * @param {string} id
     *
     * @returns {Service}
     */
    getServiceById(id) {
        return this.services.filter(service => {
            return service.id === id
        })[0]
    }

    /**
     * Sort services
     */
    sortServices() {
        if (this.services.length > 1) {
            this.services = this.services.sort((a, b) => Object(_tools_Tools__WEBPACK_IMPORTED_MODULE_3__["sortByWeight"])(a, b))
        }
        return this
    }

    /**
     * Return true if data is a service.
     * @param {*} serviceData
     */
    isService(serviceData) {
        return serviceData instanceof _Service__WEBPACK_IMPORTED_MODULE_0__["Service"]
    }

    /**
     * Enable all services.
     */
    enableAll() {
        this.enableService(this.services)
    }

    /**
     * Enable the service
     *
     * @param {Service} service
     */
    enableService(service, dispacth = true) {
        if (Array.isArray(service)) {
            // Treat only enabled services.
            const servicesToEnable = service.filter(s => {
                return !s.isEnabled()
            })

            if (servicesToEnable.length) {
                servicesToEnable.map(s => {
                    this.enableService(s, false)
                })
                _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceStatusHasChanged, {services: servicesToEnable})
            }
        } else if (service && !service.isEnabled()) {
            _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__["ServiceStatusManager"].setServiceStatus(service, _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__["ServiceStatus"].enabled)
            service.onEnable()
            this.startService(service)
            if (dispacth) {
                _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceStatusHasChanged, {services: [service]})
            }
        }
    }

    /**
     * Start the service.
     *
     * @param {Service} service
     */
    startService(service) {
        if( !service.isRuning ){
            service.isRuning = true
            service.getRelatedScripts().map(script => {
                if (typeof (script) === 'string') {
                    _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].addScript(script)
                } else {
                    try {
                        if (script.path) {
                            _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].addScript(script.path, script.callback)
                        }
                    } catch (error) {
                        console.error(error);
                    }
                }
            })

            service.start()
            _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceStart, {service: service})
        }
    }

    /**
     * Disable all
     */
    disableAll() {
        this.disableService(this.services)
    }

    /**
     * Disable the service
     *
     * @param {Service} service
     */
    disableService(service, dispatch = true) {
        if (Array.isArray(service)) {
            // Treat only enabled services.
            const servicesToDisable = service.filter(s => {
                return !s.isDisabled()
            })

            if (servicesToDisable.length > 0) {
                servicesToDisable.forEach(s => {
                    this.disableService(s, false)
                })
                _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceStatusHasChanged, {services: servicesToDisable})
            }
        } else if (service) {
            const serviceIsEnabled = service.isEnabled()
            if ((serviceIsEnabled || service.isPending()) && !service.isMandatory()) {
                if (service.isEnabled()) {
                    this.stopService(service)
                    service.onDisable()
                }
                _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__["ServiceStatusManager"].setServiceStatus(service, _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__["ServiceStatus"].disabled)
                if (dispatch) {
                    _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceStatusHasChanged, {services: [service]})
                }
            }
        }
    }

    /**
     * Start the service.
     *
     * @param {Service} service
     */
    stopService(service) {
        if( service.isRuning ){
            service.isRuning = false
            service.stop()

            // Delete cookies.
            this.deleteCookies(service)

            // Delete local storage
            this.deleteLocalStorage(service)

            // Delete scripts.
            service.getRelatedScripts().map(script => {
                if (typeof (script) === 'string') {
                    _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].removeScript(script)
                } else if (script.path) {
                    _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].removeScript(script.path)
                }
            })

            _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].trigger(_ServiceEvents__WEBPACK_IMPORTED_MODULE_1__["ServiceEvents"].serviceStop, {service: service})
        }

    }


    /**
     * Delete cookies linked to the service.
     *
     * @param {Service} service
     */
    deleteCookies(service) {
        try {
            const listOfCookies = Object.keys(_ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__["Cookies"].get())
            const cookiesPatterns = service.getCookiePatterns()
            if (listOfCookies.length && cookiesPatterns.length) {
                listOfCookies
                    .filter(cookieName => this.filterFromPatterns(cookieName, cookiesPatterns))
                    .map(cookieName => _ServiceStatusManager__WEBPACK_IMPORTED_MODULE_5__["Cookies"].remove(cookieName))
            }
        } catch (error) {

        }
    }

    /**
     * Delete localStorage linked to the service.
     *
     * @param {Service} service
     */
    deleteLocalStorage(service) {
        if (window.localStorage) {
            try {
                // service.getLocalStoragePatterns()
                const localStorageNames = Object.keys(window.localStorage)
                const localStoragePatterns = service.getLocalStoragePatterns()
                if (localStorageNames.length && localStoragePatterns.length) {
                    localStorageNames
                        .filter(storageName => this.filterFromPatterns(storageName, localStoragePatterns))
                        .map(storageName => {
                            window.localStorage.removeItem(storageName)

                        })
                }
            } catch (error) {
            }
        }
    }

    /**
     * Returns the list that matches patterns.
     *
     * @param {string} item
     * @param {Array} patternsList
     */
    filterFromPatterns(item, patternsList) {
        for (let i in patternsList) {
            if (item.match(patternsList[i])) {
                return true
            }
        }
        return false
    }

    /**
     * Toggle service
     */
    toggleService(service) {
        if (service.isEnabled()) {
            this.disableService(service)
        } else {
            this.enableService(service)
        }
    }
}

const ServiceManager = new ServiceManagerClass();


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/services/ServicePlaceholder.js":
/*!***********************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/services/ServicePlaceholder.js ***!
  \***********************************************************************/
/*! exports provided: ServicePlaceholder */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServicePlaceholder", function() { return ServicePlaceholder; });
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _ServiceEvents__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ServiceEvents */ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js");
/* harmony import */ var _Service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Service */ "./node_modules/bim-gdpr/src/core/services/Service.js");





class ServicePlaceholder{

    /**
     * Init
     */
    init(){
        // On status change.
        _Core__WEBPACK_IMPORTED_MODULE_1__["Core"].on(_ServiceEvents__WEBPACK_IMPORTED_MODULE_2__["ServiceEvents"].serviceStatusHasChanged).subscribe((data)=>{
            if(data.data && data.data.services){
                data.data.services.map( service => this.initServiceDOM( service ) );
            }
        })

        // On dom loaded.
        window.addEventListener( 'DOMContentLoaded' , () => this.onDomLoaded())
    }

    /**
     * Init the dom associated
     *
     * @param {*} data 
     */
    initServiceDOM(service) {
        const selectorOn = `[${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}visible-if-enabled="${service.id}"]`
        const selectorOff = `[${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}hidden-if-enabled="${service.id}"]`

        if( service.isEnabled() ){
            document.querySelectorAll(selectorOn).forEach(
                element => this.showElement(element) );
            document.querySelectorAll(selectorOff).forEach(
                element => this.hideElement(element) );
        }
        else{
            document.querySelectorAll(selectorOn).forEach(
                element => this.hideElement(element) );
            document.querySelectorAll(selectorOff).forEach(
                element => this.showElement(element) );
        }   
    }
    
    /**
     * On dom loaded.
     */
    onDomLoaded(){
        // Show enabled placeholder
        const selectorOn = `${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}visible-if-enabled`
        document.querySelectorAll(`[${selectorOn}]`)
            .forEach( element => {
                const service = this.getServiceFromElement(element, selectorOn)
                this.initDOMItem(element, service, this.showElement, this.hideElement)
             } )

        // Hide enabled placeholder
        const selectorOff = `${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}hidden-if-enabled`
        document.querySelectorAll(`[${selectorOff}]`)
            .forEach( element => {
                const service = this.getServiceFromElement(element, selectorOff)
                this.initDefaultPlacehoder(element, service)
                this.initDOMItem(element, service, this.hideElement, this.showElement)
             })
    }

    /**
     * Init a dom element according to service.
     *
     * @param {DOMElement} element 
     * @param {Service} selector 
     * @param {function} enabledCallback 
     * @param {function} disabledCallback 
     */
    initDOMItem( element, service, enabledCallback, disabledCallback ){
        if( service && service.isEnabled() ){
            enabledCallback(element)
        }
        else{
            disabledCallback(element)
        }
    }

    /**
     * Return the service related to the element
     * 
     * @param {Element} element 
     * @param {string} selector 
     */
    getServiceFromElement(element, selector){
        return _Core__WEBPACK_IMPORTED_MODULE_1__["Core"].getServiceById(element.getAttribute(selector))
    }

    /**
     * Add a default placeholder if needed
     *
     * @param {Element} element 
     * @param {*} service 
     */
    initDefaultPlacehoder(element, service){
        if(element.innerHTML.trim().length == 0){
            try {                
                const content = _Core__WEBPACK_IMPORTED_MODULE_1__["Core"].getTemplate().initDefaultPlaceholder(element, service)
                if( content ){
                    element.innerHTML = content
                }
            } catch (error) {   
            }
        }        
    }

    /**
     * Hide element.
     *
     * @param {*} element 
     */
    hideElement(element){
        element.outerHTML = element.outerHTML.replace(/div/g,"noscript");
    }

    /**
     * Show element.
     * 
     * @param {*} element 
     */
    showElement(element){
        element.outerHTML = element.outerHTML.replace(/noscript/g,"div")
                                .replace(/&lt;/g,"<")
                                .replace(/&gt;/g,">")

    }
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/services/ServiceStatusManager.js":
/*!*************************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/services/ServiceStatusManager.js ***!
  \*************************************************************************/
/*! exports provided: Cookies, ServiceStatus, ServiceStatusManager */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cookies", function() { return Cookies; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServiceStatus", function() { return ServiceStatus; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ServiceStatusManager", function() { return ServiceStatusManager; });
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");


const Cookies = __webpack_require__(/*! js-cookie */ "./node_modules/js-cookie/src/js.cookie.js");

const ServiceStatus = {
	enabled: 1,
	pending: -1,
	disabled: 0,
}

class ServiceStatusManagerClass {

	constructor() {
		this.useLocalStorage = true
	}

	getServiceStatus(service, retry = true) {
		// If a status is defined in cookie, we return the value
		const allStatus = this.getData()
		if (typeof (allStatus[service.id]) !== 'undefined') {
			return allStatus[service.id]
		}

		if (retry) {
			this.setServiceStatus(service, ServiceStatus.pending)
			return this.getServiceStatus(service, false);
		}

		return ServiceStatus.pending
	}

	setServiceStatus(service, status) {
		const allStatus = this.getData()
		allStatus[service.id] = status
		if (this.useLocalStorage && localStorage) {
			localStorage.setItem(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"], JSON.stringify(allStatus));
		} else {
			Cookies.set(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"], allStatus)
		}
	}

	getData() {
		// Check localstorage first.
		let storage = null
		if(  this.useLocalStorage ){
			storage = localStorage.getItem(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]);
		}
		let data = storage || Cookies.get(_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]) || {}
		try {
			data = JSON.parse(data)
		} catch (error) {
		}
		return data
	}
}

const ServiceStatusManager = new ServiceStatusManagerClass()


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/tools/PseudoPromise.js":
/*!***************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/tools/PseudoPromise.js ***!
  \***************************************************************/
/*! exports provided: PseudoPromise */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PseudoPromise", function() { return PseudoPromise; });
class PseudoPromise{
	constructor( callback ){
		this.resolvers = []
		this.rejecters = []

		if(callback){
			callback( this.onResolve, this.onReject )
		}
	}

	then( callback ){
		this.resolvers.push(callback)
		return this
	}

	subscribe(callback){
		return this.then(callback)
	}

	catch( callback ){
		this.rejecters.push(callback)
		return this
	}

	callAll(callbacks, ...data){
		for(let i=0; i < callbacks.length ; i++){
			callbacks[i](...data)
		}
	}

	onResolve( ...data ){
		this.callAll(this.resolvers, ...data)
	}

	onReject( ...data ){
		this.callAll(this.rejecters, ...data)
	}
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/tools/Tools.js":
/*!*******************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/tools/Tools.js ***!
  \*******************************************************/
/*! exports provided: ID, PREFIX, CDN, LANGUAGE_TOKEN, sortByWeight, checkInterface */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ID", function() { return ID; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PREFIX", function() { return PREFIX; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CDN", function() { return CDN; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LANGUAGE_TOKEN", function() { return LANGUAGE_TOKEN; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sortByWeight", function() { return sortByWeight; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkInterface", function() { return checkInterface; });
/**
 * Data prefix.
 */
const ID = 'bgdpr'
const PREFIX = 'data-' + ID + '-'
const CDN = 'https://cdn.jsdelivr.net/gh/tsecher/bim-gdpr@master/'
// export const CDN = '/src/node_modules/bim-gdpr/'
const LANGUAGE_TOKEN = '%'

/**
 * Sort callback
 */
const sortByWeight = function(a,b){
    a = a.weight;
    b = b.weight;
    if( a > b ){
        return 1
    }
    if( a < b){
        return -1
    }
    return 0
}

/**
 * Check interface.
 */
const checkInterface = function(interfaceObj, obj, log=true){
    const incorrectProperties = []
    
    // Parse each property
    for( let i in interfaceObj ){
        // If the property of the serviceData is not the same as the default property,
        // then this is not a valid object.
        const type = typeof(interfaceObj[i])
        const valueType = typeof(obj[i])
        if( type !== valueType ){
            incorrectProperties.push({
                type : type,
                name : i,
                value: obj[i],
                valueType: valueType
            })
        }
    }
    if( incorrectProperties.length ){
        if( log ){
            const sep = '\r\n\t - '
            const missingList = sep + incorrectProperties.map(i => {return `waiting for ${i.name} (${i.type}) and got value ${i.value} (${i.valueType}) ` }).join(sep);
            throw `The object ${obj} does not match interface ${interfaceObj}. Here are missing or bad typed properties : ${missingList} \r\n Please check the doc to make your service valid`
        }
        return false
    }

    return true
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/view/TemplateAbstract.js":
/*!*****************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/view/TemplateAbstract.js ***!
  \*****************************************************************/
/*! exports provided: TemplateAbstract */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplateAbstract", function() { return TemplateAbstract; });
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _groups_Group__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../groups/Group */ "./node_modules/bim-gdpr/src/core/groups/Group.js");
/* harmony import */ var _local_LocalManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../local/LocalManager */ "./node_modules/bim-gdpr/src/core/local/LocalManager.js");
/* harmony import */ var _local_LocalizedElementAbstract__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../local/LocalizedElementAbstract */ "./node_modules/bim-gdpr/src/core/local/LocalizedElementAbstract.js");
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");






class TemplateAbstract extends _local_LocalizedElementAbstract__WEBPACK_IMPORTED_MODULE_3__["LocalizedElementAbstract"]{

    constructor(id){
        super(id)
        this.css = this.getDefaultCssList();
    }

    /**
     * Init the template.
     */
    initTemplate(){
        super.initTranslations()
        this.getCssList().map( css => _Core__WEBPACK_IMPORTED_MODULE_4__["Core"].addCss(css) )

    }

    /**
     * Return the list of default css urls.
     */
    getDefaultCssList(){
        return []
    }

    /**
     * Return css urls.
     */
    getCssList(){
        return this.css
    }

    /**
     * Update css urls list.
     *
     * @param {*} css
     */
    setCssList(css){
        this.css = css
        return this
    }


    /**
     * Wrap the content
     * @param {*} content
     */
    wrapper(content){
        return `
        <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-wrapper">
            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view">
                <span class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-hide" ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}view-hide>close</span>
                <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-content">
                    ${content}
                </div>
            </div>
        </div>`
    }

    /**
     * Return the content when no service is declared.
     *
     * @returns {string}
     */
    getNoServiceMarkup(){
        const content = `
            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-main">
                <div class="title">${this.html('Vos données personnelles')}</div>
                <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-head">
                    ${this.html(`Ce site ne déclare pas de services qui pourraient recquérir et exploiter des données personnelles.`)}
                </div>
            </div>`

        return this.wrapper(content)
    }

    /**
     * Return the wrapper content.
     *
     * @param {string} content
     */
    getContent(markup){
        return `
        <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-main">
            <div class="title">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Vos données personnelles')}</div>
            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-head">        
                ${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])(`Ce site utilise des services pour améliorer votre expérience utilisateur et vous proposer certains contenus externes. 
                Certains de ces services peuvent recquérir et exploiter des données personnelles. 
                Vous pouvez gérer leur activation via ce panneau accessible à tout moment.<br/>Vous pouvez également accéder et gérer en détail l'ensemble des services que le site propose.`)}
            </div>

            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-quick">
                <button ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}all-enable="accept_all">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Tout accepter')}</button>
                <button ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}all-disable="deny_all">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Tout refuser')}</button>
                <button ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}view-toggle-detail>${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Voir le détail')}</button>
            </div>
        </div>
        <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-detail">
            ${markup}
        </div>`
    }

    /**
     * Returns the markup of the view.
     */
    getViewMarkup(content){
        let markup = ''

        switch(content.type){
            case 'groups':
                markup = content.groups.join('')
                break
            case 'services':
                markup = content.services.join('')
                break
        }

        return this.wrapper(this.getContent(markup))
    }



    /**
     * Return the markup of a single service.
     *
     * @param {*} service
     */
    getServiceMarkup(service){
        return `
            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-service line"  ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}service="${service.id}" ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}status="${service.status}">
                <div>
                    <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-service-name">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])(service.name)}</div>
                    <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-service-description">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])(service.description)}</div>
                </div>
                <div>
                    <button data-bgdpr-service-toggle="${service.id}">
                        <span class="enable">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Activer')}</span>
                        <span class="disable">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Désactiver')}</span>
                    </button>  
                </div>
            </div>
        `
    }

    /**
     * Return the markup of a group
     *
     * @param {Group} group
     */
    getGroupMarkup(group, serviceMarkupList){
        return `
        <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group">
            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group-head line" ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}group="${group.id}" ${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["PREFIX"]}status="${group.status}">
                <div>
                    <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group-name">${group.name} ${group.isMandatory() ? `<span class='mandatory'>${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])(`(nécessaire au fonctionnement du site)`)}</span>` : ''}</div>
                    <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group-description">${group.description}</div>
                    <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group-detail">
                        <a class="more" href="Javascript:void();" data-bgdpr-group-toggle-detail="${group.id}">Detail</a>  
                    </div>
                </div>
                <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group-quick question">
                    <button data-bgdpr-group-toggle="${group.id}">
                        <span class="enable">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Tout activer')}</span>
                        <span class="disable">${Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Tout désactiver')}</span>
                    </button>
                </div>
            </div>

            <div class="${_tools_Tools__WEBPACK_IMPORTED_MODULE_0__["ID"]}-view-group-services">
                ${serviceMarkupList.join('')}
            </div>
        </div>
        `
    }

    /**
     * Element to translate.
     *
     * @param {string} id
     * @param {*} data
     */
    html(id, data){
        return Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])(id, data)
    }

    /**
     * Return the pseudo group text.
     */
    getUngroupedTitle(){
        return Object(_local_LocalManager__WEBPACK_IMPORTED_MODULE_2__["html"])('Other')
    }

    /**
     * Tempp dom add
     */
    getShowPromise(){
    }

    /**
     * Temp dom remove.
     */
    getHidePromise(){
    }

    /**
     * Return the parent element that should contain the view.
     *
     * @returns {HTMLBodyElement}
     */
    getParentElement(){
        if( !this.parent ){
            this.parent = document.querySelector('body');
        }
        return this.parent
    }
}


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/view/View.js":
/*!*****************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/view/View.js ***!
  \*****************************************************/
/*! exports provided: TemplateInterface, View */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplateInterface", function() { return TemplateInterface; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "View", function() { return View; });
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _view_ViewEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../view/ViewEvents */ "./node_modules/bim-gdpr/src/core/view/ViewEvents.js");
/* harmony import */ var _groups_Group__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../groups/Group */ "./node_modules/bim-gdpr/src/core/groups/Group.js");
/* harmony import */ var _services_ServiceEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../services/ServiceEvents */ "./node_modules/bim-gdpr/src/core/services/ServiceEvents.js");
/* harmony import */ var _services_Service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../services/Service */ "./node_modules/bim-gdpr/src/core/services/Service.js");
/* harmony import */ var _groups_GroupEvents__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../groups/GroupEvents */ "./node_modules/bim-gdpr/src/core/groups/GroupEvents.js");
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _TemplateAbstract__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TemplateAbstract */ "./node_modules/bim-gdpr/src/core/view/TemplateAbstract.js");










const TemplateInterface = {
    init: function(){},
}

class ViewClass{

    constructor(){
        this.timeoutValue = 200
        this.rebuildTimeout = null
        this.needsRebuild('all')
    }

    init(){
        if( !this.template ){
            throw `${_tools_Tools__WEBPACK_IMPORTED_MODULE_6__["ID"]} :  No template defined`
        }

        // Add listeners for rebuild.
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].on(_view_ViewEvents__WEBPACK_IMPORTED_MODULE_1__["ViewEvents"].needsRebuild).subscribe((data)=> {
            this.needsRebuild( data.data ? data.data.type : 'all', data.data ? data.data.data: {} )
        });

        // Services events
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].on(_services_ServiceEvents__WEBPACK_IMPORTED_MODULE_3__["ServiceEvents"].serviceHasChanged).subscribe(data => this.needsRebuild('service', data.data))
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].on(_services_ServiceEvents__WEBPACK_IMPORTED_MODULE_3__["ServiceEvents"].serviceListHasChanged).subscribe(data => this.needsRebuild('all', {}))

        // Group events
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].on(_groups_GroupEvents__WEBPACK_IMPORTED_MODULE_5__["GroupEvents"].groupHasChanged).subscribe(data => this.needsRebuild('group', data.data))
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].on(_groups_GroupEvents__WEBPACK_IMPORTED_MODULE_5__["GroupEvents"].groupListHasChanged).subscribe(data => this.needsRebuild('all', {}))


        this.initTemplate()

        return this
    }

     /**
     * Indicates that view needs rebuild
     */
    needsRebuild(type, data){
        this._needsRebuildData = this._needsRebuildData || []
        switch(type){
            case 'all':
                if(!this.hasToRebuildAll() ){
                    this._needsRebuildData = [{'type':'all'}]
                }
                break;
            case 'group':
                if( this.hasToRebuildGroup(data.group) ){
                    this._needsRebuildData.push({'type':'group', element:data.group})
                }
                break;
            case 'service':
                if( this.hasToRebuildService(data.service) ){
                    this._needsRebuildData.push({'type':'service', element:data.service})
                }
                break;
        }

        // Launch the timeout in order to build only necessary each time
        window.clearTimeout(this.rebuildTimeout)
        this.rebuildTimeout=window.setTimeout(()=>this.rebuild(), this.timeoutValue)
        return this
    }
    
    /**
     * 
     */
    hasToRebuildAll(){         
         return this._needsRebuildData 
                    && this._needsRebuildData.filter(item => {return item.type === 'all'}).length > 0
    }

    /**
     * 
     * @param {Group} group 
     */
    hasToRebuildGroup(group){
        // If all rebuild is already asked, then no group rebuild needed
        return !this.hasToRebuildAll()
    }

    /**
     * @param {Service} service
     */
    hasToRebuildService(service){
        // If all rebuild is already asked, then no group rebuild needed
        if(this.hasToRebuildAll()){
            return false
        }
        return true
    }

    /**
     * Return the template
     * 
     * @returns {TemplateAbstract}
     */
    getTemplate(){
        return this.template
    }

    /**
     * Update the template.
     * @param {*} templateData
     */
    setTemplate(templateData){
        let template = templateData
        if( !this.isTemplate(templateData) ){
            template = this.overrideTemplate(templateData, _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].logsAreEnabled())
            if( !template ){
                if( _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].logsAreEnabled() ){
                    console.error('Bad template')
                }
                return this
            }
        }

        this.template = template
        this.view = null

        return this
    }

    /**
     * Init the template.
     */
    initTemplate(){
        if( this.template ){
            // Init template.
            this.template.initTemplate()
            this.template.init()
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_view_ViewEvents__WEBPACK_IMPORTED_MODULE_1__["ViewEvents"].needsRebuild, {type:'all'})    
        }

        return this
    }

    /**
     * Return a template from obj that match Template Interface
     * @param {*} templateData
     */
    overrideTemplate(templateData, logs=false){
        let template = null
        if( Object(_tools_Tools__WEBPACK_IMPORTED_MODULE_6__["checkInterface"])( TemplateInterface, templateData, logs) ){
            template = new _TemplateAbstract__WEBPACK_IMPORTED_MODULE_7__["TemplateAbstract"]()
            // Pseudo extension from object.
            for( let i in templateData){
                template[i] = templateData[i]
            }

            // Proto
            if(  Object.getOwnPropertyNames(Object.getPrototypeOf(templateData)).indexOf('init') > -1 ){
                Object.getOwnPropertyNames(Object.getPrototypeOf(templateData)).map(
                    propertyName => {
                        template[propertyName] = templateData[propertyName]
                    }
                )

                

                if( 'function' === typeof(templateData.getDefaultTranslations) ){
                    template.setTranslations( templateData.getDefaultTranslations() )
                }
                if( 'function' === typeof(templateData.getDefaultCssList) ){
                    template.setCssList( templateData.getDefaultCssList() )
                }
            }            
        }
        
        return template
    }

    /**
     * Check if data is an eligible tempalte
     * @param {*} templateData 
     */
    isTemplate(templateData){
        return templateData instanceof _TemplateAbstract__WEBPACK_IMPORTED_MODULE_7__["TemplateAbstract"]
    }

    /**
     * Rebuild needed
     */
    rebuild(){
        if( this._needsRebuildData && this.view ){
            // IF all is needed
            if( this.hasToRebuildAll() ){
                if( _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getServicesList().length ){
                    this.view.innerHTML = this.getViewMarkup()
                }
                else{
                    this.view.innerHTML = this.template.getNoServiceMarkup()
                }
                
            }
            else{
                this._needsRebuildData.map( rebuildData => {

                    // Get the view of the specific element.
                    let content = '';
                    switch( rebuildData.type ){
                        case 'service':
                            content = this.template.getServiceMarkup(rebuildData.element);
                            break
                        case 'group': 
                            content = this.template.getGroupMarkup(rebuildData.element, this.getServicesMarkupList(rebuildData.element.getServicesList()));
                            break
                    }

                    const selector = `[${_tools_Tools__WEBPACK_IMPORTED_MODULE_6__["PREFIX"]}view-${rebuildData.type}="${rebuildData.element.id}"]`
                    const elements =  this.view.querySelectorAll(selector)
                    elements.forEach( el => {
                        el.innerHTML = content
                    })
                    
                })
            }

            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_view_ViewEvents__WEBPACK_IMPORTED_MODULE_1__["ViewEvents"].hasRebuild)
            this._needsRebuildData = null
        }

        return this
    }

    /**
     * Return the view element.
     */
    getViewElement(){
        if( !this.view ){
            this.view = document.createElement('div')
            this.view.setAttribute( _tools_Tools__WEBPACK_IMPORTED_MODULE_6__["PREFIX"]+'view', '')
            this.view.classList.add(this.getTemplate().id)
            this.rebuild()
        }
        return this.view
    }

    /**
     * Return the markup of the view
     */
    getViewMarkup(){
        // Organise the data for template.
        const content = this.getContentMarkupFromData(this.getViewData())
        return this.template.getViewMarkup(content)
    }

    /**
     * Return the data for the view.
     */
    getViewData(){
        const data = {}
        const groupManager = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getGroupManager()
        const serviceManager = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager()
        const groups = groupManager.getGroupsList();
        if(groups.length){
            data.type = 'group'
            data.data = {}
            data.data.groups = groups
            data.data.ungrouped_services = groupManager.getUnGroupedServices()
            if( data.data.ungrouped_services.length !== serviceManager.getServicesList().length ){
                return data;
            }
        }
        
        // If no groups or no service in group :
        data.type = 'services'
        data.data = {}
        data.data.services = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getServicesList()

        return data
    }

    /**
     * Return the list of service markup.
     */
    getContentMarkupFromData(data){
        let content = ''
        switch(data.type){
            case 'group':
                content = this.getContentForGroupedView(data.data)
                break
            case 'services':
                content = this.getContentForServicesView(data.data)
            break
            default: 
                content=''
        }

        return content
    }

    /**
     * Return the content markup for grouped views.
     * @param {obj} data 
     */
    getContentForGroupedView(data){
        let content = {
            type: 'groups',
            groups: []
        }
        // Display groups.
        
        data.groups.map( group => { 
            content.groups.push( this.getGroupMarkup(group) )
        })

        // Display other ungrouped services.
        if( data.ungrouped_services.length ){
            content.groups.push( this.getUngroupedMarkup(data.ungrouped_services) )
        }

        return content
    }

    /**
     * REturn the content markup for views without group
     */
    getContentForServicesView(data){    
        let content = {
            type: 'services',
            services: this.getServicesMarkupList(data.services)
        }

        return content
    }

    /**
     * 
     * @param {*} servicesList 
     */
    getServicesMarkupList(servicesList){
        return servicesList.map( service => {
            return `<div ${_tools_Tools__WEBPACK_IMPORTED_MODULE_6__["PREFIX"]}view-service="${service.id}">${this.template.getServiceMarkup(service)}</div>`
        })
    }

    /**
     * Get the markup of un^ped services using a pseudo Group 'other'
     */
    getUngroupedMarkup(ungroupedServicesList){
        const pseudoGroup = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].createGroup('default', this.template.getUngroupedTitle(), '')
        ungroupedServicesList.map( service => pseudoGroup.addService(service))
        return this.getGroupMarkup(pseudoGroup, this.getServicesMarkupList(ungroupedServicesList))
    }

    /**
     * Return the markup of a group
     *
     * @param {*} group 
     */
    getGroupMarkup(group){
        const servicesList = group.getServicesList();
        if( servicesList.length ){
            const serviceMarkupList = this.getServicesMarkupList(servicesList)
            return `<div ${_tools_Tools__WEBPACK_IMPORTED_MODULE_6__["PREFIX"]}view-group="${group.id}">${this.template.getGroupMarkup(group, serviceMarkupList)}</div>`
        }
        return ``
    }
}

const View = new ViewClass()


/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/view/ViewEvents.js":
/*!***********************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/view/ViewEvents.js ***!
  \***********************************************************/
/*! exports provided: ViewEvents */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewEvents", function() { return ViewEvents; });
const ViewEvents = {
    needsRebuild: 'needs-rebuild',
    hasRebuild: 'has-rebuild',
    beforeShowView: 'before-show-view',
    afterShowView: 'after-show-view',
    beforeHideView: 'before-hide-view',
    afterHideView: 'after-hide-view',
}

/***/ }),

/***/ "./node_modules/bim-gdpr/src/core/view/ViewManager.js":
/*!************************************************************!*\
  !*** ./node_modules/bim-gdpr/src/core/view/ViewManager.js ***!
  \************************************************************/
/*! exports provided: ViewManager */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewManager", function() { return ViewManager; });
/* harmony import */ var _Core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Core */ "./node_modules/bim-gdpr/src/core/Core.js");
/* harmony import */ var _tools_Tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/Tools */ "./node_modules/bim-gdpr/src/core/tools/Tools.js");
/* harmony import */ var _View__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./View */ "./node_modules/bim-gdpr/src/core/view/View.js");
/* harmony import */ var _ViewEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ViewEvents */ "./node_modules/bim-gdpr/src/core/view/ViewEvents.js");





class ViewManagerClass {

    /**
     *
     */
    constructor() {
        this.view = _View__WEBPACK_IMPORTED_MODULE_2__["View"]
    }

    /**
     * REturn the wrapper element.
     */
    get parentElement() {
        return this.getView().getTemplate().getParentElement()
    }

    /**
     * Init.
     */
    init() {
        this.view.init();
        if( !this.actions ){
            this.initBehaviors()
            this.initActions()
        }

    }

    /**
     * Init behaviors
     */
    initActions() {
        // All
        this.addAction('all-enable', () => {
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().enableAll()
            this.hide()
        })
        this.addAction('all-disable', () => {
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().disableAll()
            this.hide()
        })

        // View
        this.addAction('view-toggle-detail', () => this.toggleDetailPanel())
        this.addAction('view-hide', () => this.hide())
        this.addAction('view-show', () => this.show())

        // Group
        this.addAction('group-toggle-detail', (data) => {
            this.view.view.querySelector(`[${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}view-group="${data.elemId}"]`).classList.toggle(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-detail')
        })
        this.addAction('group-toggle', (data) => {
            data.group.toggleAll()
        })

        // Service.
        this.addAction('service-enable', (data) => {
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().enableService(data.service)
        })
        this.addAction('service-disable', (data) => {
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().disableService(data.service)
        })
        this.addAction('service-toggle', (data) => {
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().toggleService(data.service)
        })
    }

    /**
     * Return the template manager
     *
     * @returns {View}
     */
    getView() {
        return this.view
    }

    /**
     * Return true if is displayed.
     */
    isDisplayed() {
        return document.querySelector(`[${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}view]`)
    }

    /**
     * Show interface
     */
    show() {
        if (!this.isDisplayed()) {

            this.parentElement.appendChild(this.view.getViewElement())
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ViewEvents__WEBPACK_IMPORTED_MODULE_3__["ViewEvents"].beforeShowView, {})
            try {
                this.getView().getTemplate().getShowPromise().then(() => {
                    this._doShow()
                })
            } catch (error) {
                this._doShow()
            }

        }
    }

    /**
     * Add class that show the element.
     */
    _doShow() {
        this.parentElement.classList.add(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-on')
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ViewEvents__WEBPACK_IMPORTED_MODULE_3__["ViewEvents"].afterShowView, {})
    }

    /**
     * Hide interface
     */
    hide() {
        if (this.isDisplayed()) {

            // Considering that pending elements are now disabled, because no explicit consentment but
            // user has been prompted.
            if (!_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].testMode) {
                _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().enableService(_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getMandatoryServicesList())
                _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().disableService(_Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getPendingServices())
            }
            _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ViewEvents__WEBPACK_IMPORTED_MODULE_3__["ViewEvents"].beforeHideView, {})

            // Remove classes
            this.parentElement.classList.remove(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-on')
            this.parentElement.classList.remove(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-detail')
            this.parentElement.querySelectorAll('.' + _tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-detail').forEach(item => {
                item.classList.remove(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-detail')
            })

            try {
                this.getView().getTemplate().getHidePromise().then(() => {
                    this._doHide()
                })
            } catch (error) {
                this._doHide()
            }
        }
    }

    /**
     * Remove view from dom.
     */
    _doHide() {
        try {
            this.parentElement.removeChild(this.view.getViewElement())
        }
        catch(e){}
        _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].trigger(_ViewEvents__WEBPACK_IMPORTED_MODULE_3__["ViewEvents"].afterHideView, {})
    }

    /**
     * Add actions callback.
     *
     * @param {string} type
     * @param {*} callback
     */
    addAction(type, callback) {
        // Init actions list.
        this.actions = this.actions || []
        // Init action type liste
        this.actions[type] = this.actions[type] || []
        this.actions[type].push(callback)
    }

    /**
     * Add action to element
     */
    initBehaviors(attribute, callback) {
        callback = (evt) => {
            this.initEventOnItem(evt.target, attribute, callback)
        }
        document.removeEventListener('click', callback)
        document.addEventListener('click', callback)
    }

    initEventOnItem(item, attribute, callback) {
        let done = false
        // Parse all attributes
        for (let att, i = 0, atts = item.attributes, n = (atts ? atts.length : 0); i < n; i++) {
            att = atts[i];
            // If attributes has matching prefix
            if (att.nodeName.indexOf(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]) === 0) {
                let attrData = att.nodeName.split('-'),
                    type = attrData.slice(2).join('-')

                switch (attrData[2]) {
                    case 'service':
                        const service = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getServiceById(att.nodeValue)
                        this.callAction(type, {service: service, elemId: att.nodeValue})
                        done = true
                        break
                    case 'group':
                        const group = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getGroupManager().getGroupById(att.nodeValue)
                        this.callAction(type, {group: group, elemId: att.nodeValue})
                        done = true
                        break
                    case 'view':
                    case 'all':
                        this.callAction(type, {})
                        done = true
                        break
                }
            }
        }

        // Look up into fathers.
        if (item.parentNode && !done) {
            this.initEventOnItem(item.parentNode, attribute, callback)
        }
    }

    /**
     * Call the list of attached action.
     *
     * @param {string} type
     * @param {*} data
     */
    callAction(type, data) {
        this.actions = this.actions || []
        // Init action type liste
        this.actions[type] = this.actions[type] || []

        this.actions[type].map(callback => {
            callback(data)
        })
    }

    /**
     * Toggle detail.
     */
    toggleDetailPanel() {
        this.parentElement.classList.toggle(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-detail')
    }

    /**
     * Return true if the detail panel is open.
     */
    detailPanelIsOpen() {
        return this.parentElement.classList.contains(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["ID"] + '-detail')
    }

    /**
     * Init dom data.
     */
    initDomData() {
        // Service
        window.setTimeout(() => {
            document.querySelectorAll(`[${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}service][${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}status]`).forEach(item => {
                const service = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getServiceManager().getServiceById(item.getAttribute(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"] + 'service'))
                if (service) {
                    item.setAttribute(`${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}status`, service.status)
                }
            })
            document.querySelectorAll(`[${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}group][${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}status]`).forEach(item => {
                const service = _Core__WEBPACK_IMPORTED_MODULE_0__["Core"].getGroupManager().getGroupById(item.getAttribute(_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"] + 'group'))
                if (service) {
                    item.setAttribute(`${_tools_Tools__WEBPACK_IMPORTED_MODULE_1__["PREFIX"]}status`, service.status)
                }
            })
        }, 10)
    }
}

const ViewManager = new ViewManagerClass()


/***/ }),

/***/ "./node_modules/js-cookie/src/js.cookie.js":
/*!*************************************************!*\
  !*** ./node_modules/js-cookie/src/js.cookie.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
 * JavaScript Cookie v2.2.1
 * https://github.com/js-cookie/js-cookie
 *
 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
 * Released under the MIT license
 */
;(function (factory) {
	var registeredInModuleLoader;
	if (true) {
		!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
				__WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		registeredInModuleLoader = true;
	}
	if (true) {
		module.exports = factory();
		registeredInModuleLoader = true;
	}
	if (!registeredInModuleLoader) {
		var OldCookies = window.Cookies;
		var api = window.Cookies = factory();
		api.noConflict = function () {
			window.Cookies = OldCookies;
			return api;
		};
	}
}(function () {
	function extend () {
		var i = 0;
		var result = {};
		for (; i < arguments.length; i++) {
			var attributes = arguments[ i ];
			for (var key in attributes) {
				result[key] = attributes[key];
			}
		}
		return result;
	}

	function decode (s) {
		return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);
	}

	function init (converter) {
		function api() {}

		function set (key, value, attributes) {
			if (typeof document === 'undefined') {
				return;
			}

			attributes = extend({
				path: '/'
			}, api.defaults, attributes);

			if (typeof attributes.expires === 'number') {
				attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);
			}

			// We're using "expires" because "max-age" is not supported by IE
			attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';

			try {
				var result = JSON.stringify(value);
				if (/^[\{\[]/.test(result)) {
					value = result;
				}
			} catch (e) {}

			value = converter.write ?
				converter.write(value, key) :
				encodeURIComponent(String(value))
					.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);

			key = encodeURIComponent(String(key))
				.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)
				.replace(/[\(\)]/g, escape);

			var stringifiedAttributes = '';
			for (var attributeName in attributes) {
				if (!attributes[attributeName]) {
					continue;
				}
				stringifiedAttributes += '; ' + attributeName;
				if (attributes[attributeName] === true) {
					continue;
				}

				// Considers RFC 6265 section 5.2:
				// ...
				// 3.  If the remaining unparsed-attributes contains a %x3B (";")
				//     character:
				// Consume the characters of the unparsed-attributes up to,
				// not including, the first %x3B (";") character.
				// ...
				stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
			}

			return (document.cookie = key + '=' + value + stringifiedAttributes);
		}

		function get (key, json) {
			if (typeof document === 'undefined') {
				return;
			}

			var jar = {};
			// To prevent the for loop in the first place assign an empty array
			// in case there are no cookies at all.
			var cookies = document.cookie ? document.cookie.split('; ') : [];
			var i = 0;

			for (; i < cookies.length; i++) {
				var parts = cookies[i].split('=');
				var cookie = parts.slice(1).join('=');

				if (!json && cookie.charAt(0) === '"') {
					cookie = cookie.slice(1, -1);
				}

				try {
					var name = decode(parts[0]);
					cookie = (converter.read || converter)(cookie, name) ||
						decode(cookie);

					if (json) {
						try {
							cookie = JSON.parse(cookie);
						} catch (e) {}
					}

					jar[name] = cookie;

					if (key === name) {
						break;
					}
				} catch (e) {}
			}

			return key ? jar[key] : jar;
		}

		api.set = set;
		api.get = function (key) {
			return get(key, false /* read as raw */);
		};
		api.getJSON = function (key) {
			return get(key, true /* read as json */);
		};
		api.remove = function (key, attributes) {
			set(key, '', extend(attributes, {
				expires: -1
			}));
		};

		api.defaults = {};

		api.withConverter = init;

		return api;
	}

	return init(function () {});
}));


/***/ }),

/***/ "./node_modules/scriptjs/dist/script.js":
/*!**********************************************!*\
  !*** ./node_modules/scriptjs/dist/script.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
  * $script.js JS loader & dependency manager
  * https://github.com/ded/script.js
  * (c) Dustin Diaz 2014 | License MIT
  */

(function (name, definition) {
  if ( true && module.exports) module.exports = definition()
  else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
				__WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))
  else {}
})('$script', function () {
  var doc = document
    , head = doc.getElementsByTagName('head')[0]
    , s = 'string'
    , f = false
    , push = 'push'
    , readyState = 'readyState'
    , onreadystatechange = 'onreadystatechange'
    , list = {}
    , ids = {}
    , delay = {}
    , scripts = {}
    , scriptpath
    , urlArgs

  function every(ar, fn) {
    for (var i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f
    return 1
  }
  function each(ar, fn) {
    every(ar, function (el) {
      fn(el)
      return 1
    })
  }

  function $script(paths, idOrDone, optDone) {
    paths = paths[push] ? paths : [paths]
    var idOrDoneIsDone = idOrDone && idOrDone.call
      , done = idOrDoneIsDone ? idOrDone : optDone
      , id = idOrDoneIsDone ? paths.join('') : idOrDone
      , queue = paths.length
    function loopFn(item) {
      return item.call ? item() : list[item]
    }
    function callback() {
      if (!--queue) {
        list[id] = 1
        done && done()
        for (var dset in delay) {
          every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = [])
        }
      }
    }
    setTimeout(function () {
      each(paths, function loading(path, force) {
        if (path === null) return callback()
        
        if (!force && !/^https?:\/\//.test(path) && scriptpath) {
          path = (path.indexOf('.js') === -1) ? scriptpath + path + '.js' : scriptpath + path;
        }
        
        if (scripts[path]) {
          if (id) ids[id] = 1
          return (scripts[path] == 2) ? callback() : setTimeout(function () { loading(path, true) }, 0)
        }

        scripts[path] = 1
        if (id) ids[id] = 1
        create(path, callback)
      })
    }, 0)
    return $script
  }

  function create(path, fn) {
    var el = doc.createElement('script'), loaded
    el.onload = el.onerror = el[onreadystatechange] = function () {
      if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) return;
      el.onload = el[onreadystatechange] = null
      loaded = 1
      scripts[path] = 2
      fn()
    }
    el.async = 1
    el.src = urlArgs ? path + (path.indexOf('?') === -1 ? '?' : '&') + urlArgs : path;
    head.insertBefore(el, head.lastChild)
  }

  $script.get = create

  $script.order = function (scripts, id, done) {
    (function callback(s) {
      s = scripts.shift()
      !scripts.length ? $script(s, id, done) : $script(s, callback)
    }())
  }

  $script.path = function (p) {
    scriptpath = p
  }
  $script.urlArgs = function (str) {
    urlArgs = str;
  }
  $script.ready = function (deps, ready, req) {
    deps = deps[push] ? deps : [deps]
    var missing = [];
    !each(deps, function (dep) {
      list[dep] || missing[push](dep);
    }) && every(deps, function (dep) {return list[dep]}) ?
      ready() : !function (key) {
      delay[key] = delay[key] || []
      delay[key][push](ready)
      req && req(missing)
    }(deps.join('|'))
    return $script
  }

  $script.done = function (idOrDone) {
    $script([null], idOrDone)
  }

  return $script
});


/***/ }),

/***/ 0:
/*!***************************************!*\
  !*** multi ./bim-gdpr/js/bim-gdpr.js ***!
  \***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(/*! /home/tsecher/Sites/drupal/sandbox/www/web/modules/custom/bim_gdpr/libraries/src/bim-gdpr/js/bim-gdpr.js */"./bim-gdpr/js/bim-gdpr.js");


/***/ })

/******/ });

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc