(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[13],{

/***/ 1519:
/***/ (function(module, exports) {

/*
 * Tine 2.0
 * 
 * @package     Phone
 * @license     http://www.gnu.org/licenses/agpl.html AGPL3
 * @author      Lars Kneschke <l.kneschke@metaways.de>
 * @copyright   Copyright (c) 2008-2012 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 * TODO         refactor this!
 */
Ext.namespace('Tine.Phone');
/**************************** dialer form / function *******************************/

Tine.Phone.Application = Ext.extend(Tine.Tinebase.Application, {
  /**
   * holds the users' phones
   * @type {Ext.data.JsonStore}
   */
  userPhonesStore: null,
  init: function init() {
    // create store (get from initial data)
    this.userPhonesStore = new Ext.data.JsonStore({
      fields: Tine.Voipmanager.Model.SnomPhone,
      // initial data from http request
      data: Tine.Phone.registry.get('Phones'),
      autoLoad: true,
      id: 'id'
    });
    new Tine.Phone.AddressbookGridPanelHook({
      app: this
    });
  }
});
/**
 * dial function
 * - opens the dialer window if multiple phones/lines are available
 * - directly calls dial json function if number is set and just 1 phone and line are available
 * 
 * @param string phone number to dial
 * 
 * @todo use window factory later
 * @todo what todo if no lines are available?
 */

Tine.Phone.dialPhoneNumber = function (number) {
  var phonesStore = Tine.Tinebase.appMgr.get('Phone').userPhonesStore;
  var lines = phonesStore.getAt(0) ? phonesStore.getAt(0).data.lines : []; // check if only one phone / one line exists and number is set

  if (phonesStore.getTotalCount() == 1 && lines.length == 1 && number) {
    // call Phone.dialNumber
    Ext.Ajax.request({
      url: 'index.php',
      params: {
        method: 'Phone.dialNumber',
        number: number,
        phoneId: phonesStore.getAt(0).id,
        lineId: lines[0].id
      },
      success: function success(_result, _request) {// success
      },
      failure: function failure(result, request) {// show error message?
      }
    });
  } else {
    // open dialer box (with phone and lines selection)
    var dialerPanel = new Tine.Phone.DialerPanel({
      number: number ? number : null
    });
    var dialer = Tine.WindowFactory.getWindow({
      title: 'Dial phone number',
      id: 'dialerWindow',
      modal: true,
      width: 400,
      height: 150,
      layout: 'fit',
      plain: true,
      bodyStyle: 'padding:5px;',
      closeAction: 'close',
      items: [dialerPanel]
    });
  }
};
/**
 * register special renderer for direction and destination
 */


Tine.widgets.grid.RendererManager.register('Phone', 'Call', 'direction', function (v) {
  var t = Tine.Tinebase.appMgr.get('Phone').i18n;

  switch (v) {
    case 'in':
      return '<img src="images/call-incoming.png" width="12" height="12" alt="contact" ext:qtip="' + Ext.util.Format.htmlEncode(t._('Incoming call')) + '"/>';
      break;

    case 'out':
      return '<img src="images/call-outgoing.png" width="12" height="12" alt="contact" ext:qtip="' + Ext.util.Format.htmlEncode(t._('Outgoing call')) + '"/>';
      break;
  }
});
Tine.widgets.grid.RendererManager.register('Phone', 'Call', 'destination', function (v) {
  if (v.toString().toLowerCase() == 'unknown') {
    var t = Tine.Tinebase.appMgr.get('Phone').i18n;
    return t._('unknown number');
  }

  return Ext.util.Format.htmlEncode(v);
});
Tine.widgets.grid.RendererManager.register('Phone', 'Call', 'line_id', function (v) {
  return v && v.hasOwnProperty('linenumber') ? v.linenumber : '';
});
Tine.widgets.grid.RendererManager.register('Phone', 'Call', 'contact_id', function (v) {
  return v && v.hasOwnProperty('n_fn') ? v.n_fn : '';
});
/***************************** utils ****************************************/

Ext.namespace('Tine.Phone.utils');
/**
 * checks if given argument is syntactically a callable/valid number
 * 
 * @todo: synchrosize this with the asterisk rules
 */

Tine.Phone.utils.isCallable = function (number) {
  return !number.toString().replace(/^\+|[ \-\/]/g, '').match(/[^0-9]/);
};

/***/ }),

/***/ 1520:
/***/ (function(module, exports) {

Ext.namespace('Tine.Phone');
Tine.Phone.PhoneTreePanel = Ext.extend(Ext.tree.TreePanel, {
  // private
  id: 'phone-tree',
  rootVisible: false,
  border: false,
  collapsible: true,
  baseCls: 'ux-arrowcollapse',
  // state stuff
  stateful: true,
  stateId: 'phone-phonetreepanel',
  stateEvents: ['collapse', 'expand', 'click'],

  /**
   * holds the users' phones
   * @type {Ext.data.JsonStore}
   */
  store: null,

  /**
   * last selected node
   * 
   * @type {Ext.tree.TreeNode} 
   */
  ctxNode: null,

  /**
   * initializes the component
   */
  initComponent: function initComponent() {
    Tine.Phone.PhoneTreePanel.superclass.initComponent.call(this, arguments);
    this.setRootNode(new Ext.tree.TreeNode({
      cls: 'treemain',
      allowDrag: false,
      allowDrop: true,
      id: 'phone-root',
      icon: false
    })); // create context menu

    var contextMenu = new Ext.menu.Menu({
      plugins: [{
        ptype: 'ux.itemregistry',
        key: 'Tinebase-MainContextMenu'
      }],
      items: [this.grid.action_editPhoneSettings],
      listeners: {
        scope: this,
        hide: function hide() {
          this.ctxNode = null;
        }
      }
    });
    this.on('contextmenu', function (node, event) {
      event.stopEvent();
      this.ctxNode = node;

      if (node.id != 'phone-root') {
        contextMenu.showAt(event.getXY());
      }
    }, this);
    this.on('click', function (node, event) {
      this.onNodeClick(node, event);
    }, this);
    this.store = this.app.userPhonesStore;
  },

  /**
   * is called on single click on an node of the phoneTreePanel
   * 
   * @param {Ext.tree.TreeNode} node
   * @param {} event
   */
  onNodeClick: function onNodeClick(node, event) {
    this.ctxNode = node;
    this.grid.store.load();
  },

  /**
   * returns the currently selected node
   * 
   * @return {Ext.tree.TreeNode}
   */
  getActiveNode: function getActiveNode() {
    return this.ctxNode || this.getSelectionModel().getSelectedNode();
  },

  /**
   * updates the phone tree panel after an crud action and on load
   */
  updateTree: function updateTree() {
    // remove all children first
    var rootNode = this.getRootNode();
    rootNode.eachChild(function (child) {
      this.removeChild(child);
    }); // add phones from store to tree menu

    this.store.each(function (record) {
      var label = record.data.description == '' ? record.data.macaddress : Ext.util.Format.ellipsis(Ext.util.Format.htmlEncode(record.data.description), 30);
      var node = new Ext.tree.TreeNode({
        id: record.id,
        record: record,
        text: label,
        iconCls: 'PhoneIconCls',
        qtip: Ext.util.Format.htmlEncode(record.data.description),
        leaf: true
      });
      rootNode.appendChild(node);
    }, this);
  },

  /**
   * @see Ext.Component
   */
  getState: function getState() {
    var root = this.getRootNode();
    var state = {
      selected: this.grid.ctxNode ? this.grid.ctxNode.id : null
    };
    return state;
  },
  // private
  initState: function initState() {
    if (Ext.state.Manager) {
      var id = this.getStateId();

      if (id) {
        var state = Ext.state.Manager.get(id);

        if (state) {
          if (this.fireEvent('beforestaterestore', this, state) !== false) {
            this.applyState(Ext.apply({}, state));
            this.fireEvent('staterestore', this, state);
          }
        } else {
          (function () {
            var root = this.getRootNode();

            if (root.firstChild) {
              root.firstChild.select();
            }
          }).defer(100, this);
        }
      }
    }
  },

  /**
   * applies state to cmp
   * 
   * @param {Object} state
   */
  applyState: function applyState(state) {
    (function () {
      var node = state.selected ? this.getNodeById(state.selected) : this.getRootNode().firstChild;

      if (node) {
        node.select();
      }
    }).defer(100, this);
  }
});

/***/ }),

/***/ 1521:
/***/ (function(module, exports) {

/*
 * Tine 2.0
 * 
 * @package     Phone
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */
Ext.ns('Tine.Phone');
/**
 * @namespace   Tine.Phone
 * @class       Tine.Phone.AddressbookGridPanelHook
 * 
 * <p>Phone Addressbook Hook</p>
 * <p>
 * </p>
 * 
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * 
 * @constructor
 */

Tine.Phone.AddressbookGridPanelHook = function (config) {
  Tine.log.info('initialising phone addressbook hooks');
  Ext.apply(this, config); // NOTE: due to the action updater this action is bound the the adb grid only!

  this.phoneMenu = new Ext.menu.Menu({
    items: [],
    plugins: [{
      ptype: 'ux.itemregistry',
      key: 'Tinebase-MainContextMenu'
    }]
  });
  this.callContactAction = new Ext.Action({
    text: this.app.i18n._('Call contact'),
    iconCls: 'PhoneIconCls',
    disabled: this.useActionUpdater ? true : false,
    scope: this,
    actionUpdater: this.useActionUpdater ? this.updateAction : Ext.emptyFn,
    menu: this.phoneMenu,
    listeners: {
      scope: this,
      render: this.useActionUpdater ? this.onRender : Ext.emptyFn
    }
  });
  this.callContactBtn = Ext.apply(new Ext.SplitButton(this.callContactAction), {
    scale: 'medium',
    rowspan: 2,
    iconAlign: 'top',
    arrowAlign: 'right'
  }), // register in toolbar + contextmenu
  Ext.ux.ItemRegistry.registerItem(this.keyPrefix + '-Contact-GridPanel-ActionToolbar-leftbtngrp', this.callContactBtn, 30);
  Ext.ux.ItemRegistry.registerItem(this.keyPrefix + '-Contact-GridPanel-ContextMenu', this.callContactAction, 80);
};

Ext.apply(Tine.Phone.AddressbookGridPanelHook.prototype, {
  /**
   * do we use the grids action updater
   * 
   * @type Boolean
   */
  useActionUpdater: true,

  /**
   * contact to call
   * 
   * @type Tine.Addressbook.Model.Contact
   */
  contact: null,

  /**
   * @property app
   * @type Tine.Phone.Application
   * @private
   */
  app: null,

  /**
   * hook registry prefix
   * @type String
   */
  keyPrefix: 'Addressbook',

  /**
   * @property callContactAction
   * @type Ext.Action
   * @private
   */
  callContactAction: null,

  /**
   * @property callContactBtn
   * @type Ext.Button
   * @private
   */
  callContactBtn: null,

  /**
   * @property ContactGridPanel
   * @type Tine.Addressbook.ContactGridPanel
   * @private
   */
  ContactGridPanel: null,

  /**
   * @property phoneMenu
   * @type Ext.menu.Menu
   * @private
   */
  phoneMenu: null,

  /**
   * get addressbook contact grid panel
   */
  getContactGridPanel: function getContactGridPanel() {
    if (!this.ContactGridPanel) {
      this.ContactGridPanel = Tine.Tinebase.appMgr.get('Addressbook').getMainScreen().getCenterPanel();
    }

    return this.ContactGridPanel;
  },

  /**
   * calls a contact
   * @param {Button} btn 
   */
  onCallContact: function onCallContact(btn) {
    var number;
    var contact = this.contact ? this.contact : this.getContactGridPanel().grid.getSelectionModel().getSelected();

    if (!contact) {
      return;
    }

    if (!Ext.isEmpty(contact.get(btn.field))) {
      number = contact.get(btn.field);
    } else if (!Ext.isEmpty(contact.data.tel_work)) {
      number = contact.data.tel_work;
    } else if (!Ext.isEmpty(contact.data.tel_cell)) {
      number = contact.data.tel_cell;
    } else if (!Ext.isEmpty(contact.data.tel_cell_private)) {
      number = contact.data.tel_cell_private;
    } else if (!Ext.isEmpty(contact.data.tel_home)) {
      number = contact.data.tel_home;
    }

    Tine.Phone.dialPhoneNumber(number);
  },

  /**
   * add to action updater the first time we render
   */
  onRender: function onRender() {
    var actionUpdater = this.getContactGridPanel().actionUpdater,
        registeredActions = actionUpdater.actions;

    if (registeredActions.indexOf(this.callContactAction) < 0) {
      actionUpdater.addActions([this.callContactAction]);
    }
  },

  /**
   * updates call menu
   * 
   * @param {Ext.Action} action
   * @param {Object} grants grants sum of grants
   * @param {Object} records
   */
  updateAction: function updateAction(action, grants, records) {
    if (action.isHidden()) {
      return;
    }

    this.phoneMenu.removeAll();
    action.setDisabled(true);

    if (records.length == 1) {
      var contact = records[0];

      if (!contact) {
        return false;
      }

      if (!Ext.isEmpty(contact.data.tel_work)) {
        this.phoneMenu.add({
          text: this.app.i18n._('Work') + ' ' + contact.data.tel_work + '',
          scope: this,
          handler: this.onCallContact,
          field: 'tel_work'
        });
        action.setDisabled(false);
      }

      if (!Ext.isEmpty(contact.data.tel_home)) {
        this.phoneMenu.add({
          text: this.app.i18n._('Home') + ' ' + contact.data.tel_home + '',
          scope: this,
          handler: this.onCallContact,
          field: 'tel_home'
        });
        action.setDisabled(false);
      }

      if (!Ext.isEmpty(contact.data.tel_cell)) {
        this.phoneMenu.add({
          text: this.app.i18n._('Cell') + ' ' + contact.data.tel_cell + '',
          scope: this,
          handler: this.onCallContact,
          field: 'tel_cell'
        });
        action.setDisabled(false);
      }

      if (!Ext.isEmpty(contact.data.tel_cell_private)) {
        this.phoneMenu.add({
          text: this.app.i18n._('Cell private') + ' ' + contact.data.tel_cell_private + '',
          scope: this,
          handler: this.onCallContact,
          field: 'tel_cell_private'
        });
        action.setDisabled(false);
      }
    }
  },

  /**
   * set contact for action and update phoneMenu items
   * 
   * @param {Tine.Addressbook.Model.Contact} contact
   */
  setContactAndUpdateAction: function setContactAndUpdateAction(contact) {
    this.contact = contact;
    this.updateAction(this.callContactAction, null, [contact]);
  }
});

/***/ }),

/***/ 1522:
/***/ (function(module, exports) {

/*
 * Tine 2.0
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <a.stintzing@metaways.de>
 * @copyright   Copyright (c) 2012-2019 Metaways Infosystems GmbH (http://www.metaways.de)
 */
Ext.ns('Tine.Phone');
/**
 * @namespace   Tine.Phone
 * @class       Tine.Phone.CallEditDialog
 * @extends     Tine.widgets.dialog.EditDialog
 * 
 * <p>Call Compose Dialog</p>
 * <p></p>
 * 
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Alexander Stintzing <a.stintzing@metaways.de>
 * 
 * @param       {Object} config
 * @constructor
 * Create a new Tine.Phone.CallEditDialog
 */

Tine.Phone.CallGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
  /**
   * the panel holds the phones available for the user
   * 
   * @type {Ext.tree.TreePanel}
   */
  phoneTreePanel: null,

  /**
   * 
   * @type {Ext.Action}
   */
  editPhoneSettingsAction: null,

  /**
   * initializes the component
   */
  initComponent: function initComponent() {
    Tine.Phone.CallGridPanel.superclass.initComponent.call(this);
    this.initPhoneTreePanel();
  },

  /**
   * @private
   */
  initActions: function initActions() {
    this.action_editPhoneSettings = new Ext.Action({
      text: this.app.i18n._('Edit phone settings'),
      iconCls: 'PhoneIconCls',
      handler: this.onEditPhoneSettings.createDelegate(this),
      scope: this,
      actionUpdater: function actionUpdater(action, grants, records) {
        if (this.phoneTreePanel.getActiveNode()) {
          this.action_editPhoneSettings.setDisabled(0);
        } else {
          this.action_editPhoneSettings.setDisabled(1);
        }
      }
    });
    this.action_dialNumber = new Ext.Action({
      text: this.app.i18n._('Dial number'),
      tooltip: this.app.i18n._('Initiate a new outgoing call'),
      handler: this.onDialNumber,
      iconCls: 'action_DialNumber',
      scope: this,
      actionUpdater: function actionUpdater(action, grants, records) {
        if (records.length != 1) {
          this.action_dialNumber.setDisabled(1);
        } else {
          this.action_dialNumber.setDisabled(0);
        }
      }
    }); // register actions in updater

    this.actionUpdater.addActions([this.action_editPhoneSettings, this.action_dialNumber]);
    this.getActionToolbar();
  },

  /**
   * row doubleclick handler
   * 
   * @param {} grid
   * @param {} row
   * @param {} e
   */
  onRowDblClick: function onRowDblClick(grid, row, e) {
    this.onDialNumber(grid, row, e);
  },

  /**
   * get action toolbar
   * 
   * @return {Ext.Toolbar}
   */
  getActionToolbar: function getActionToolbar() {
    if (!this.actionToolbar) {
      this.actionToolbar = new Ext.Toolbar({
        items: [{
          xtype: 'buttongroup',
          plugins: [{
            ptype: 'ux.itemregistry',
            key: this.app.appName + '-' + this.recordClass.prototype.modelName + '-GridPanel-ActionToolbar-leftbtngrp'
          }],
          items: [Ext.apply(new Ext.Button(this.action_editPhoneSettings), {
            scale: 'medium',
            rowspan: 2,
            iconAlign: 'top'
          }), Ext.apply(new Ext.Button(this.action_dialNumber), {
            scale: 'medium',
            rowspan: 2,
            iconAlign: 'top'
          })]
        }]
      });
    }

    if (this.filterToolbar && typeof this.filterToolbar.getQuickFilterField == 'function') {
      this.actionToolbar.add('->', this.filterToolbar.getQuickFilterField());
    }

    return this.actionToolbar;
  },

  /**
   * add custom items to context menu
   * 
   * @return {Array}
   */
  getContextMenuItems: function getContextMenuItems() {
    var items = ['-', this.action_dialNumber];
    return items;
  },

  /**
   * is called on dial a number
   */
  onDialNumber: function onDialNumber() {
    var record = this.grid.getSelectionModel().getSelected(),
        number = false;

    if (record) {
      if (record.get('resolved_destination') != '') {
        number = record.get('resolved_destination');
      } else {
        number = record.get('destination');
      }
    }

    Tine.Phone.dialPhoneNumber(number);
  },

  /**
   * initializes the phone tree panel
   */
  initPhoneTreePanel: function initPhoneTreePanel() {
    this.phoneTreePanel = new Tine.Phone.PhoneTreePanel({
      app: this.app,
      title: this.app.i18n._('Phones'),
      grid: this
    });
    var westPanel = this.app.getMainScreen().getWestPanel().getPortalColumn();
    westPanel.add(this.phoneTreePanel);
    this.phoneTreePanel.updateTree();
  },

  /**
   * called before store queries for data
   */
  onStoreBeforeload: function onStoreBeforeload(store, options) {
    Tine.Phone.CallGridPanel.superclass.onStoreBeforeload.apply(this, arguments);
    var node = this.phoneTreePanel.getActiveNode();

    if (node && node.hasOwnProperty('attributes')) {
      var r = node.attributes.record;
      if (!options.params) options.params = {};
      options.params.filter = [{
        field: 'phone_id',
        operator: 'AND',
        value: [{
          field: ':id',
          operator: 'equals',
          value: r.get('id')
        }]
      }];
    }
  },

  /**
   * is called on edit phone button click
   */
  onEditPhoneSettings: function onEditPhoneSettings() {
    var node = this.phoneTreePanel.getActiveNode();

    if (node) {
      var rp = Tine.Phone.myphoneBackend;

      rp.recordReader = function (response) {
        var record = new Tine.Phone.Model.MyPhone(Ext.decode(response.responseText));
        var recordId = record.get(record.idProperty);
        record.id = recordId ? recordId : 0;
        return record;
      };

      var popupWindow = Tine.Voipmanager.SnomPhoneEditDialog.openWindow({
        recordProxy: rp,
        record: node.attributes.record,
        appName: 'Phone',
        modelName: 'MyPhone'
      });
    } else {
      Ext.Msg.show({
        title: this.app.i18n._('No phone selected'),
        msg: this.app.i18n._('Please select the desired phone in the tree!'),
        icon: Ext.MessageBox.INFO,
        buttons: Ext.Msg.OK,
        scope: this
      });
    }
  }
});

/***/ }),

/***/ 1523:
/***/ (function(module, exports) {

/*
 * Tine 2.0
 * 
 * @package     Phone
 * @license     http://www.gnu.org/licenses/agpl.html AGPL3
 * @author      Lars Kneschke <l.kneschke@metaways.de>
 * @copyright   Copyright (c) 2008-2013 Metaways Infosystems GmbH (http://www.metaways.de)
 *
 */
Ext.namespace('Tine.Phone');
/**
 * dialer form
 * 
 * @todo use macaddress or description/name as display value?
 */

Tine.Phone.DialerPanel = Ext.extend(Ext.form.FormPanel, {
  id: 'dialerPanel',
  translation: null,
  // initial phone number
  number: null,
  // config settings
  defaults: {
    xtype: 'textfield',
    anchor: '100%',
    allowBlank: false
  },
  bodyStyle: 'padding:5px;',
  buttonAlign: 'right',
  phoneStore: null,
  linesStore: null,
  // private
  initComponent: function initComponent() {
    var me = this;
    this.translation = new Locale.Gettext();
    this.translation.textdomain('Phone'); // set stores

    this.phoneStore = Tine.Tinebase.appMgr.get('Phone').userPhonesStore; //this.setLineStore(this.phoneStore.getAt(0).id);

    this.setLineStore(null);
    /***************** form fields *****************/

    this.items = [new Tine.widgets.customfields.CustomfieldsCombo({
      fieldLabel: this.translation._('Phone'),
      store: this.phoneStore,
      mode: 'local',
      editable: false,
      stateful: true,
      stateEvents: ['select'],
      displayField: 'description',
      valueField: 'id',
      id: 'phoneId',
      name: 'phoneId',
      triggerAction: 'all',
      listeners: {
        scope: this,
        // reload lines combo on change
        select: function select(combo, newValue, oldValue) {
          //console.log('set line store for ' + newValue.data.id);
          this.setLineStore(newValue.data.id);
        }
      }
    }), {
      xtype: 'combo',
      fieldLabel: this.translation._('Line'),
      name: 'lineId',
      displayField: 'linenumber',
      valueField: 'id',
      mode: 'local',
      store: this.linesStore,
      triggerAction: 'all',
      disabled: this.linesStore.getCount() <= 1
    }, {
      fieldLabel: this.translation._('Number'),
      name: 'phoneNumber'
    }];
    /******************* action buttons ********************/
    // cancel action

    this.cancelAction = new Ext.Action({
      text: this.translation._('Cancel'),
      iconCls: 'action_cancel',
      handler: function handler() {
        me.ownerCt.ownerCt.close();
      }
    }); // dial action

    this.dialAction = new Ext.Action({
      scope: this,
      text: this.translation._('Dial'),
      iconCls: 'action_DialNumber',
      handler: function handler() {
        var form = this.getForm();

        if (form.isValid()) {
          Ext.Ajax.request({
            url: 'index.php',
            params: {
              method: 'Phone.dialNumber',
              number: form.findField('phoneNumber').getValue(),
              phoneId: form.findField('phoneId').getValue(),
              lineId: form.findField('lineId').getValue()
            },
            success: function success(_result, _request) {
              me.ownerCt.ownerCt.close();
            },
            failure: function failure(response, request) {
              var responseText = Ext.util.JSON.decode(response.responseText);
              Ext.Msg.show({
                title: this.translation._('Error'),
                msg: responseText.data.message ? responseText.data.message : this.translation._('Not possible to dial.'),
                icon: Ext.MessageBox.ERROR,
                buttons: Ext.Msg.OK
              });
            },
            scope: this
          });
        }
      }
    });
    this.buttons = [this.cancelAction, this.dialAction];
    /************** other initialisation ****************/

    this.initMyFields.defer(300, this);
    Tine.Phone.DialerPanel.superclass.initComponent.call(this);
  },

  /**
   * init form fields
   * 
   * @todo add prefered phone/line selections
   */
  initMyFields: function initMyFields() {
    // focus number field or set initial value
    if (this.number != null) {
      this.getForm().findField('phoneNumber').setValue(this.number);
    } else {
      this.getForm().findField('phoneNumber').focus();
    } // get combos


    var phoneCombo = this.getForm().findField('phoneId');
    var lineCombo = this.getForm().findField('lineId'); // select first combo values

    if (!phoneCombo.getState() && this.phoneStore.getAt(0)) {
      phoneCombo.setValue(this.phoneStore.getAt(0).id);
    } else {
      // update line store again (we need this, because it is changed when dlg is opened the second time)
      this.setLineStore(phoneCombo.getValue());
    }

    var firstLine = this.linesStore.getAt(0);

    if (firstLine) {
      this.getForm().findField('lineId').setValue(firstLine.id);
    }
  },

  /**
   * get values from phones store
   */
  setLineStore: function setLineStore(phoneId) {
    if (this.linesStore == null) {
      this.linesStore = new Ext.data.Store({});
    } else {
      // empty store
      this.linesStore.removeAll();
    }

    var form = this.getForm();

    if (phoneId == null) {
      if (form) {
        phoneId = form.findField('phoneId').getValue();
      } else if (this.phoneStore.getAt(0)) {
        // get first phone
        phoneId = this.phoneStore.getAt(0).id;
      } else {
        return;
      }
    }

    var phone = this.phoneStore.getById(phoneId);

    if (phone) {
      for (var i = 0; i < phone.data.lines.length; i++) {
        var lineRecord = new Tine.Voipmanager.Model.SnomLine(phone.data.lines[i], phone.data.lines[i].id);
        this.linesStore.add(lineRecord);
      }
    } // disable lineCombo if only 1 line available


    if (form) {
      var lineCombo = form.findField('lineId');
      var count = this.linesStore.getCount();
      lineCombo.setDisabled(count <= 1);

      if (count) {
        // set first line
        lineCombo.setValue(this.linesStore.getAt(0).id);
      }
    }
  }
});

/***/ }),

/***/ 1524:
/***/ (function(module, exports, __webpack_require__) {

// style-loader: Adds some css to the DOM by adding a <style> tag

// load the styles
var content = __webpack_require__(1525);
if(typeof content === 'string') content = [[module.i, content, '']];
// Prepare cssTransformation
var transform;

var options = {"hmr":true}
options.transform = transform
// add the styles to the DOM
var update = __webpack_require__(19)(content, options);
if(content.locals) module.exports = content.locals;
// Hot Module Replacement
if(false) {}

/***/ }),

/***/ 1525:
/***/ (function(module, exports, __webpack_require__) {

var escape = __webpack_require__(187);
exports = module.exports = __webpack_require__(18)(false);
// imports


// module
exports.push([module.i, "/**\n * Tine 2.0\n * \n * @package     Phone\n * @license     http://www.gnu.org/licenses/agpl.html AGPL3\n * @author      Lars Kneschke <l.kneschke@metaways.de>\n * @copyright   Copyright (c) 2008 Metaways Infosystems GmbH (http://www.metaways.de)\n * @version     $Id:Phone.css 4159 2008-09-02 14:15:05Z p.schuele@metaways.de $\n *\n */\n\n \n.PhoneIconCls {\n    background-image:url(" + escape(__webpack_require__(235)) + ") !important;\n}\n\n.action_DialNumber {\n    background-image:url(" + escape(__webpack_require__(1526)) + ") !important;\n}", ""]);

// exports


/***/ }),

/***/ 1526:
/***/ (function(module, exports) {

module.exports = "\"data:image/svg+xml,%3C?xml version='1.0' encoding='utf-8'?%3E %3C!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E %3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 42.5 42.5' style='enable-background:new 0 0 42.5 42.5;' xml:space='preserve' width='42.5' height='42.5'%3E %3Cpath d='M9.4,15.1c-0.2-0.2-0.4-0.5-0.7-0.9c-0.2-0.4-0.4-0.7-0.5-1C8,12.8,8,12,8.3,10.9c0.3-1,0.8-1.9,1.4-2.5 c0.2-0.2,0.4-0.4,0.6-0.5s0.5-0.3,0.7-0.5s0.5-0.3,0.6-0.3c0.1-0.1,0.4-0.2,0.8-0.4c0.4-0.2,0.6-0.3,0.7-0.3C14.2,6,15.1,5.6,16,5.4 C17.4,5.1,19.1,5,21.1,5s3.6,0.2,5.1,0.6c0.9,0.2,1.8,0.6,2.8,1c0.1,0,0.3,0.2,0.7,0.3c0.4,0.2,0.7,0.3,0.8,0.4 c0.1,0.1,0.4,0.2,0.7,0.4s0.5,0.3,0.8,0.5c0.2,0.2,0.4,0.3,0.6,0.5c0.7,0.7,1.1,1.5,1.5,2.5c0.3,1.1,0.4,1.9,0.2,2.4 c-0.1,0.3-0.3,0.6-0.5,0.9c-0.2,0.4-0.4,0.7-0.6,0.8c-0.1,0.1-0.2,0.2-0.3,0.2c-0.2,0.1-0.6,0-1.4-0.3c-0.2-0.1-0.5-0.1-0.9-0.3 c-0.4-0.1-0.7-0.2-1.1-0.3c-0.3-0.1-0.6-0.2-0.9-0.3c0,0-0.2,0-0.5-0.1s-0.5-0.1-0.6-0.2c-0.2-0.1-0.3-0.1-0.4-0.2 c-0.1-0.1-0.2-0.4-0.2-0.8c0-0.4,0-0.8,0.1-1.2c0.1-0.4,0.1-0.8,0.1-1.2c0-0.4-0.1-0.7-0.2-0.8c-0.1-0.1-0.2-0.1-0.3-0.2 c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2-0.1-0.4-0.1c-0.2,0-0.3-0.1-0.3-0.1c-1.5-0.5-3-0.7-4.4-0.7c-1.4,0-2.8,0.2-4.3,0.6 c0,0-0.1,0-0.3,0.1s-0.3,0.1-0.4,0.1c-0.1,0-0.2,0.1-0.3,0.1c-0.1,0.1-0.2,0.1-0.3,0.2c-0.1,0.1-0.2,0.4-0.2,0.8 c0,0.4,0,0.8,0.1,1.2s0.1,0.8,0.1,1.2c0,0.4-0.1,0.7-0.2,0.8c-0.1,0.1-0.2,0.2-0.4,0.2s-0.4,0.1-0.6,0.1c-0.3,0-0.4,0.1-0.5,0.1 c-0.3,0.1-0.6,0.1-0.9,0.2s-0.7,0.2-1,0.3s-0.7,0.2-0.9,0.2c-0.7,0.2-1.2,0.3-1.4,0.2C9.6,15.3,9.5,15.2,9.4,15.1z M13.6,16.3 c-1.7,0-3,1.4-3,3s1.4,3,3,3s3-1.4,3-3S15.3,16.3,13.6,16.3z M28.7,16.3c-1.7,0-3,1.4-3,3s1.4,3,3,3c1.7,0,3-1.4,3-3 S30.4,16.3,28.7,16.3z M21.2,16.3c-1.7,0-3,1.4-3,3s1.4,3,3,3c1.7,0,3-1.4,3-3S22.8,16.3,21.2,16.3z M13.6,23.8c-1.7,0-3,1.4-3,3 c0,1.7,1.4,3,3,3s3-1.4,3-3C16.6,25.1,15.3,23.8,13.6,23.8z M28.7,23.8c-1.7,0-3,1.4-3,3c0,1.7,1.4,3,3,3c1.7,0,3-1.4,3-3 C31.7,25.1,30.4,23.8,28.7,23.8z M21.2,23.8c-1.7,0-3,1.4-3,3c0,1.7,1.4,3,3,3c1.7,0,3-1.4,3-3C24.2,25.1,22.8,23.8,21.2,23.8z M13.6,31c-1.7,0-3,1.4-3,3c0,1.7,1.4,3,3,3s3-1.4,3-3C16.6,32.4,15.3,31,13.6,31z M28.7,31c-1.7,0-3,1.4-3,3c0,1.7,1.4,3,3,3 c1.7,0,3-1.4,3-3C31.7,32.4,30.4,31,28.7,31z M21.2,31c-1.7,0-3,1.4-3,3c0,1.7,1.4,3,3,3c1.7,0,3-1.4,3-3C24.2,32.4,22.8,31,21.2,31 z'/%3E %3C/svg%3E\""

/***/ }),

/***/ 179:
/***/ (function(module, exports, __webpack_require__) {

__webpack_require__(1519);
__webpack_require__(1520);
__webpack_require__(1521);
__webpack_require__(1522);
__webpack_require__(1523);
__webpack_require__(1524);


/***/ }),

/***/ 18:
/***/ (function(module, exports) {

/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
// css base code, injected by the css-loader
module.exports = function(useSourceMap) {
	var list = [];

	// return the list of modules as css string
	list.toString = function toString() {
		return this.map(function (item) {
			var content = cssWithMappingToString(item, useSourceMap);
			if(item[2]) {
				return "@media " + item[2] + "{" + content + "}";
			} else {
				return content;
			}
		}).join("");
	};

	// import a list of modules into the list
	list.i = function(modules, mediaQuery) {
		if(typeof modules === "string")
			modules = [[null, modules, ""]];
		var alreadyImportedModules = {};
		for(var i = 0; i < this.length; i++) {
			var id = this[i][0];
			if(typeof id === "number")
				alreadyImportedModules[id] = true;
		}
		for(i = 0; i < modules.length; i++) {
			var item = modules[i];
			// skip already imported module
			// this implementation is not 100% perfect for weird media query combinations
			//  when a module is imported multiple times with different media queries.
			//  I hope this will never occur (Hey this way we have smaller bundles)
			if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
				if(mediaQuery && !item[2]) {
					item[2] = mediaQuery;
				} else if(mediaQuery) {
					item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
				}
				list.push(item);
			}
		}
	};
	return list;
};

function cssWithMappingToString(item, useSourceMap) {
	var content = item[1] || '';
	var cssMapping = item[3];
	if (!cssMapping) {
		return content;
	}

	if (useSourceMap && typeof btoa === 'function') {
		var sourceMapping = toComment(cssMapping);
		var sourceURLs = cssMapping.sources.map(function (source) {
			return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'
		});

		return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
	}

	return [content].join('\n');
}

// Adapted from convert-source-map (MIT)
function toComment(sourceMap) {
	// eslint-disable-next-line no-undef
	var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
	var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;

	return '/*# ' + data + ' */';
}


/***/ }),

/***/ 187:
/***/ (function(module, exports) {

module.exports = function escape(url) {
    if (typeof url !== 'string') {
        return url
    }
    // If url is already wrapped in quotes, remove them
    if (/^['"].*['"]$/.test(url)) {
        url = url.slice(1, -1);
    }
    // Should url be wrapped?
    // See https://drafts.csswg.org/css-values-3/#urls
    if (/["'() \t\n]/.test(url)) {
        return '"' + url.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"'
    }

    return url
}


/***/ }),

/***/ 19:
/***/ (function(module, exports, __webpack_require__) {

/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/

var stylesInDom = {};

var	memoize = function (fn) {
	var memo;

	return function () {
		if (typeof memo === "undefined") memo = fn.apply(this, arguments);
		return memo;
	};
};

var isOldIE = memoize(function () {
	// Test for IE <= 9 as proposed by Browserhacks
	// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
	// Tests for existence of standard globals is to allow style-loader
	// to operate correctly into non-standard environments
	// @see https://github.com/webpack-contrib/style-loader/issues/177
	return window && document && document.all && !window.atob;
});

var getElement = (function (fn) {
	var memo = {};

	return function(selector) {
		if (typeof memo[selector] === "undefined") {
			var styleTarget = fn.call(this, selector);
			// Special case to return head of iframe instead of iframe itself
			if (styleTarget instanceof window.HTMLIFrameElement) {
				try {
					// This will throw an exception if access to iframe is blocked
					// due to cross-origin restrictions
					styleTarget = styleTarget.contentDocument.head;
				} catch(e) {
					styleTarget = null;
				}
			}
			memo[selector] = styleTarget;
		}
		return memo[selector]
	};
})(function (target) {
	return document.querySelector(target)
});

var singleton = null;
var	singletonCounter = 0;
var	stylesInsertedAtTop = [];

var	fixUrls = __webpack_require__(74);

module.exports = function(list, options) {
	if (typeof DEBUG !== "undefined" && DEBUG) {
		if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
	}

	options = options || {};

	options.attrs = typeof options.attrs === "object" ? options.attrs : {};

	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
	// tags it will allow on a page
	if (!options.singleton && typeof options.singleton !== "boolean") options.singleton = isOldIE();

	// By default, add <style> tags to the <head> element
	if (!options.insertInto) options.insertInto = "head";

	// By default, add <style> tags to the bottom of the target
	if (!options.insertAt) options.insertAt = "bottom";

	var styles = listToStyles(list, options);

	addStylesToDom(styles, options);

	return function update (newList) {
		var mayRemove = [];

		for (var i = 0; i < styles.length; i++) {
			var item = styles[i];
			var domStyle = stylesInDom[item.id];

			domStyle.refs--;
			mayRemove.push(domStyle);
		}

		if(newList) {
			var newStyles = listToStyles(newList, options);
			addStylesToDom(newStyles, options);
		}

		for (var i = 0; i < mayRemove.length; i++) {
			var domStyle = mayRemove[i];

			if(domStyle.refs === 0) {
				for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();

				delete stylesInDom[domStyle.id];
			}
		}
	};
};

function addStylesToDom (styles, options) {
	for (var i = 0; i < styles.length; i++) {
		var item = styles[i];
		var domStyle = stylesInDom[item.id];

		if(domStyle) {
			domStyle.refs++;

			for(var j = 0; j < domStyle.parts.length; j++) {
				domStyle.parts[j](item.parts[j]);
			}

			for(; j < item.parts.length; j++) {
				domStyle.parts.push(addStyle(item.parts[j], options));
			}
		} else {
			var parts = [];

			for(var j = 0; j < item.parts.length; j++) {
				parts.push(addStyle(item.parts[j], options));
			}

			stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
		}
	}
}

function listToStyles (list, options) {
	var styles = [];
	var newStyles = {};

	for (var i = 0; i < list.length; i++) {
		var item = list[i];
		var id = options.base ? item[0] + options.base : item[0];
		var css = item[1];
		var media = item[2];
		var sourceMap = item[3];
		var part = {css: css, media: media, sourceMap: sourceMap};

		if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});
		else newStyles[id].parts.push(part);
	}

	return styles;
}

function insertStyleElement (options, style) {
	var target = getElement(options.insertInto)

	if (!target) {
		throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");
	}

	var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];

	if (options.insertAt === "top") {
		if (!lastStyleElementInsertedAtTop) {
			target.insertBefore(style, target.firstChild);
		} else if (lastStyleElementInsertedAtTop.nextSibling) {
			target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);
		} else {
			target.appendChild(style);
		}
		stylesInsertedAtTop.push(style);
	} else if (options.insertAt === "bottom") {
		target.appendChild(style);
	} else if (typeof options.insertAt === "object" && options.insertAt.before) {
		var nextSibling = getElement(options.insertInto + " " + options.insertAt.before);
		target.insertBefore(style, nextSibling);
	} else {
		throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");
	}
}

function removeStyleElement (style) {
	if (style.parentNode === null) return false;
	style.parentNode.removeChild(style);

	var idx = stylesInsertedAtTop.indexOf(style);
	if(idx >= 0) {
		stylesInsertedAtTop.splice(idx, 1);
	}
}

function createStyleElement (options) {
	var style = document.createElement("style");

	options.attrs.type = "text/css";

	addAttrs(style, options.attrs);
	insertStyleElement(options, style);

	return style;
}

function createLinkElement (options) {
	var link = document.createElement("link");

	options.attrs.type = "text/css";
	options.attrs.rel = "stylesheet";

	addAttrs(link, options.attrs);
	insertStyleElement(options, link);

	return link;
}

function addAttrs (el, attrs) {
	Object.keys(attrs).forEach(function (key) {
		el.setAttribute(key, attrs[key]);
	});
}

function addStyle (obj, options) {
	var style, update, remove, result;

	// If a transform function was defined, run it on the css
	if (options.transform && obj.css) {
	    result = options.transform(obj.css);

	    if (result) {
	    	// If transform returns a value, use that instead of the original css.
	    	// This allows running runtime transformations on the css.
	    	obj.css = result;
	    } else {
	    	// If the transform function returns a falsy value, don't add this css.
	    	// This allows conditional loading of css
	    	return function() {
	    		// noop
	    	};
	    }
	}

	if (options.singleton) {
		var styleIndex = singletonCounter++;

		style = singleton || (singleton = createStyleElement(options));

		update = applyToSingletonTag.bind(null, style, styleIndex, false);
		remove = applyToSingletonTag.bind(null, style, styleIndex, true);

	} else if (
		obj.sourceMap &&
		typeof URL === "function" &&
		typeof URL.createObjectURL === "function" &&
		typeof URL.revokeObjectURL === "function" &&
		typeof Blob === "function" &&
		typeof btoa === "function"
	) {
		style = createLinkElement(options);
		update = updateLink.bind(null, style, options);
		remove = function () {
			removeStyleElement(style);

			if(style.href) URL.revokeObjectURL(style.href);
		};
	} else {
		style = createStyleElement(options);
		update = applyToTag.bind(null, style);
		remove = function () {
			removeStyleElement(style);
		};
	}

	update(obj);

	return function updateStyle (newObj) {
		if (newObj) {
			if (
				newObj.css === obj.css &&
				newObj.media === obj.media &&
				newObj.sourceMap === obj.sourceMap
			) {
				return;
			}

			update(obj = newObj);
		} else {
			remove();
		}
	};
}

var replaceText = (function () {
	var textStore = [];

	return function (index, replacement) {
		textStore[index] = replacement;

		return textStore.filter(Boolean).join('\n');
	};
})();

function applyToSingletonTag (style, index, remove, obj) {
	var css = remove ? "" : obj.css;

	if (style.styleSheet) {
		style.styleSheet.cssText = replaceText(index, css);
	} else {
		var cssNode = document.createTextNode(css);
		var childNodes = style.childNodes;

		if (childNodes[index]) style.removeChild(childNodes[index]);

		if (childNodes.length) {
			style.insertBefore(cssNode, childNodes[index]);
		} else {
			style.appendChild(cssNode);
		}
	}
}

function applyToTag (style, obj) {
	var css = obj.css;
	var media = obj.media;

	if(media) {
		style.setAttribute("media", media)
	}

	if(style.styleSheet) {
		style.styleSheet.cssText = css;
	} else {
		while(style.firstChild) {
			style.removeChild(style.firstChild);
		}

		style.appendChild(document.createTextNode(css));
	}
}

function updateLink (link, options, obj) {
	var css = obj.css;
	var sourceMap = obj.sourceMap;

	/*
		If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled
		and there is no publicPath defined then lets turn convertToAbsoluteUrls
		on by default.  Otherwise default to the convertToAbsoluteUrls option
		directly
	*/
	var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;

	if (options.convertToAbsoluteUrls || autoFixUrls) {
		css = fixUrls(css);
	}

	if (sourceMap) {
		// http://stackoverflow.com/a/26603875
		css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
	}

	var blob = new Blob([css], { type: "text/css" });

	var oldSrc = link.href;

	link.href = URL.createObjectURL(blob);

	if(oldSrc) URL.revokeObjectURL(oldSrc);
}


/***/ }),

/***/ 235:
/***/ (function(module, exports) {

module.exports = "\"data:image/svg+xml,%3C?xml version='1.0' encoding='utf-8'?%3E %3C!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E %3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 42.5 42.5' style='enable-background:new 0 0 42.5 42.5;' xml:space='preserve' width='42.5' height='42.5'%3E %3Cpath id='Icon_Phone' d='M35.3,29.4c0,0.4-0.1,0.8-0.2,1.4c-0.1,0.6-0.3,1-0.4,1.4c-0.3,0.7-1.1,1.4-2.5,2.1c-1.3,0.7-2.5,1-3.7,1 c-0.4,0-0.7,0-1.1-0.1s-0.7-0.1-1.2-0.3s-0.7-0.2-0.9-0.3c-0.2-0.1-0.6-0.2-1.1-0.4s-0.9-0.3-1-0.4c-1.3-0.5-2.5-1-3.5-1.7 c-1.7-1.1-3.5-2.5-5.3-4.3c-1.8-1.8-3.3-3.6-4.3-5.3c-0.6-1-1.2-2.2-1.7-3.5c0-0.1-0.2-0.4-0.4-1c-0.2-0.5-0.3-0.9-0.4-1.1 S7.4,16.5,7.3,16c-0.1-0.4-0.2-0.8-0.3-1.2C7,14.5,7,14.2,7,13.8c0-1.2,0.3-2.5,1-3.7c0.8-1.4,1.5-2.2,2.1-2.5 c0.3-0.1,0.8-0.3,1.4-0.4S12.6,7,13,7c0.2,0,0.3,0,0.4,0.1c0.2,0.1,0.6,0.6,1.1,1.5c0.1,0.3,0.3,0.6,0.6,1.1 c0.3,0.5,0.5,0.9,0.7,1.3c0.2,0.4,0.4,0.7,0.6,1.1c0,0.1,0.2,0.2,0.4,0.5c0.2,0.3,0.3,0.5,0.4,0.7s0.1,0.4,0.1,0.6 c0,0.3-0.2,0.6-0.6,1c-0.4,0.4-0.8,0.8-1.2,1.1s-0.9,0.7-1.2,1.1c-0.4,0.4-0.6,0.7-0.6,0.9c0,0.1,0,0.3,0.1,0.5 c0.1,0.2,0.1,0.3,0.2,0.4s0.1,0.3,0.3,0.5c0.1,0.2,0.2,0.4,0.2,0.4c1,1.8,2.2,3.4,3.5,4.7c1.3,1.3,2.9,2.5,4.7,3.5 c0,0,0.2,0.1,0.4,0.2c0.2,0.1,0.4,0.2,0.5,0.3s0.2,0.1,0.4,0.2c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.6-0.2,0.9-0.6 c0.4-0.4,0.7-0.8,1.1-1.2c0.3-0.4,0.7-0.9,1.1-1.2c0.4-0.4,0.7-0.6,1-0.6c0.2,0,0.4,0,0.6,0.1s0.4,0.2,0.7,0.4s0.4,0.3,0.5,0.4 c0.3,0.2,0.7,0.4,1.1,0.6c0.4,0.2,0.8,0.4,1.3,0.7c0.5,0.3,0.8,0.5,1.1,0.6c0.9,0.5,1.4,0.8,1.5,1.1C35.3,29.1,35.3,29.2,35.3,29.4z '/%3E %3C/svg%3E\""

/***/ }),

/***/ 74:
/***/ (function(module, exports) {


/**
 * When source maps are enabled, `style-loader` uses a link element with a data-uri to
 * embed the css on the page. This breaks all relative urls because now they are relative to a
 * bundle instead of the current page.
 *
 * One solution is to only use full urls, but that may be impossible.
 *
 * Instead, this function "fixes" the relative urls to be absolute according to the current page location.
 *
 * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.
 *
 */

module.exports = function (css) {
  // get current location
  var location = typeof window !== "undefined" && window.location;

  if (!location) {
    throw new Error("fixUrls requires window.location");
  }

	// blank or null?
	if (!css || typeof css !== "string") {
	  return css;
  }

  var baseUrl = location.protocol + "//" + location.host;
  var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");

	// convert each url(...)
	/*
	This regular expression is just a way to recursively match brackets within
	a string.

	 /url\s*\(  = Match on the word "url" with any whitespace after it and then a parens
	   (  = Start a capturing group
	     (?:  = Start a non-capturing group
	         [^)(]  = Match anything that isn't a parentheses
	         |  = OR
	         \(  = Match a start parentheses
	             (?:  = Start another non-capturing groups
	                 [^)(]+  = Match anything that isn't a parentheses
	                 |  = OR
	                 \(  = Match a start parentheses
	                     [^)(]*  = Match anything that isn't a parentheses
	                 \)  = Match a end parentheses
	             )  = End Group
              *\) = Match anything and then a close parens
          )  = Close non-capturing group
          *  = Match anything
       )  = Close capturing group
	 \)  = Match a close parens

	 /gi  = Get all matches, not the first.  Be case insensitive.
	 */
	var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) {
		// strip quotes (if they exist)
		var unquotedOrigUrl = origUrl
			.trim()
			.replace(/^"(.*)"$/, function(o, $1){ return $1; })
			.replace(/^'(.*)'$/, function(o, $1){ return $1; });

		// already a full url? no change
		if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) {
		  return fullMatch;
		}

		// convert the url to a full url
		var newUrl;

		if (unquotedOrigUrl.indexOf("//") === 0) {
		  	//TODO: should we add protocol?
			newUrl = unquotedOrigUrl;
		} else if (unquotedOrigUrl.indexOf("/") === 0) {
			// path should be relative to the base url
			newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'
		} else {
			// path should be relative to current directory
			newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'
		}

		// send back the fixed url(...)
		return "url(" + JSON.stringify(newUrl) + ")";
	});

	// send back the fixed css
	return fixedCss;
};


/***/ })

}]);